Apache Htpasswd安全密码更改
题
我的问题很简单。
如何允许用户更改在Linux中的某些HTPassWD文件中存储的密码,而无需透露文件内容或允许用户修改其他密码?
我试图编写一个脚本来使用SSH和特定设计的用户来完成该工作,但现在引导。
请帮忙。我正在使用Debian Server“ Lenny”。
解决方案
apache htpasswd
文件不支持任何阴影功能。因此,您必须防止用户访问您的Web服务器,以使其远离密码文件。因此,唯一的解决方案是您的基于SSH的方法或任何其他远程解决方案。以下说明将说明如何仅在用户知道其旧密码的情况下编写SSH命令脚本以更改密码。主要问题是,Apache不提供命令行工具来验证密码 htpasswd
文件。但这可以手工完成。
以下说明假设Web服务器用户是 www-data
并且用户的主目录是 /var/www
.
首先,您必须创建一个由Web服务器用户写作的HTPassWD文件:
# ls -la .htpasswd
-rw-r--r-- 1 www-data root 18 10. Mai 16:30 .htpasswd
然后,您必须将所有用户的键添加到 authorized_keys
Web服务器用户的文件。您必须将每行前缀 command
选项。
# cat .ssh/authorized_keys
command="/var/www/.htpasswd.sh" ssh-rsa AAAA... user@host
每当用户仅使用他的密钥连接时 .htpasswd.sh
被执行。用户无法访问Web服务器。
这是更改密码的脚本:
#! /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
棘手的部分是密码验证。它是通过阅读旧盐并用旧盐加密旧密码来完成的。结果与旧加密密码进行了比较。 htpasswd
文件。
现在,用户可以连接到Web服务器以更改密码:
$ ssh www-data@localhost
Enter user name: szi
Old password:
New password:
Re-type new password:
Updating password for user szi.
Connection to localhost closed.
每个人都只能更改自己的密码,没有人可以访问其他用户的加密密码。该解决方案在使用原始的方面有一个额外的好处 htpasswd
在shell脚本中编程,因为密码从未用作命令行参数。这是不可能的 htpasswd
, ,因为它无法读取stdin的密码 mkpasswd
.
不隶属于 StackOverflow