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
.
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