2011-01-19 33 views
8

Câu hỏi của tôi rất đơn giản.Apache htpasswd thay đổi mật khẩu an toàn

Cách cho phép người dùng thay đổi mật khẩu được lưu trữ trong một số tệp htpasswd trong linux mà không tiết lộ nội dung tệp hoặc cho phép người dùng sửa đổi mật khẩu khác?

Tôi đã cố gắng viết một kịch bản để thực hiện công việc đó bằng cách sử dụng ssh và người dùng được thiết kế đặc biệt nhưng nó dẫn đầu hiện tại.

Vui lòng trợ giúp. Tôi đang sử dụng máy chủ Debian "Lenny".

+0

Bạn có chắc chắn muốn gắn bó với htpasswd không? mod_auth trong Apache có thể sử dụng các chương trình phụ trợ khác, cơ sở dữ liệu LDAP (mod_authnz_ldap), cơ sở dữ liệu SQL (mod_authn_dbd), v.v. – regilero

Trả lời

16

Tệp Apache htpasswd không hỗ trợ bất kỳ chức năng bóng nào. Do đó, bạn phải ngăn người dùng truy cập máy chủ web của mình để giữ chúng khỏi tệp mật khẩu. Vì vậy, giải pháp duy nhất là phương pháp tiếp cận dựa trên SSH của bạn hoặc bất kỳ giải pháp từ xa nào khác. Mô tả sau đây sẽ giải thích cách viết kịch bản lệnh SSH để thay đổi mật khẩu chỉ khi người dùng biết mật khẩu cũ của mình. Vấn đề chính là, Apache không cung cấp công cụ dòng lệnh để xác minh mật khẩu trong tệp htpasswd. Nhưng điều này có thể được thực hiện bằng tay.

Mô tả sau giả định rằng người dùng máy chủ web là www-data và thư mục chính của người dùng là /var/www.

Trước tiên, bạn phải tạo một tập tin htpasswd, có nghĩa là có thể ghi bởi người sử dụng máy chủ web:

# ls -la .htpasswd 
-rw-r--r-- 1 www-data root 18 10. Mai 16:30 .htpasswd 

Sau đó, bạn cần phải thêm các phím của tất cả người dùng của bạn vào file authorized_keys của người sử dụng máy chủ web. Bạn phải đặt trước mỗi dòng với tùy chọn command.

# cat .ssh/authorized_keys 
command="/var/www/.htpasswd.sh" ssh-rsa AAAA... [email protected] 

Bất cứ khi nào người dùng kết nối với khóa của mình chỉ .htpasswd.sh được thực thi. Người dùng không có bất kỳ quyền truy cập shell nào vào máy chủ web.

Đây là lệnh để thay đổi mật khẩu:

#! /bin/bash 

HTPASSWD=/var/www/.htpasswd 

die() { echo "$*" >&2 ; exit 1 ; } 

read -p 'Enter user name: ' USER 
read -s -p 'Old password: ' OLDPW ; echo 
read -s -p 'New password: ' NEWPW0 ; echo 
read -s -p 'Re-type new password: ' NEWPW1 ; echo 

if LINE=$(grep ^"$USER": "$HTPASSWD") 
then 
    echo "$LINE" | sed 's/.*:\(..\)\(.\+\)/\1 \2/' | { 
     read SALT CRYPT 
     if [[ "$SALT$CRYPT" = $(echo "$OLDPW" | mkpasswd -sS "$SALT") ]] ; then 
      if [ "$NEWPW0" != "$NEWPW1" ] ; then 
       die "Password verification error!" 
      fi 
      PWS=$(grep -v ^"$USER:" "$HTPASSWD") 
      { 
       echo "$PWS" 
       echo -n "$USER:" 
       echo "$NEWPW0" | mkpasswd -s 
      } > "$HTPASSWD" 
      echo "Updating password for user $USER." 
     else 
      die "Password verification error!" 
     fi 
    } 
else 
    die "Password verification error!" 
fi 

Phần khó là việc xác minh mật khẩu. Nó được thực hiện bằng cách đọc muối cũ và mã hóa mật khẩu cũ với muối cũ. Kết quả được so sánh với mật khẩu được mã hóa cũ trong tệp htpasswd.

Bây giờ người dùng có thể kết nối đến máy chủ web để thay đổi mật khẩu:

$ ssh [email protected] 
Enter user name: szi 
Old password: 
New password: 
Re-type new password: 
Updating password for user szi. 
Connection to localhost closed. 

Mọi người đều có thể thay đổi chỉ Mật khẩu và không ai mình có quyền truy cập vào mật khẩu được mã hóa của những người dùng khác. Giải pháp này có một lợi ích bổ sung về việc sử dụng chương trình htpasswd gốc trong một kịch bản trình bao, bởi vì các mật khẩu không bao giờ được sử dụng làm đối số dòng lệnh. Điều này sẽ không thể thực hiện được với htpasswd, bởi vì nó không thể đọc mật khẩu từ stdin như mkpasswd.

Các vấn đề liên quan