Apache htpasswd安全密码更改

Rus*_*rse 8 apache bash .htpasswd

我的问题很简单.

如何允许用户更改存储在linux中的某些htpasswd文件中的密码而不泄露文件内容或允许用户修改其他密码?

我尝试使用ssh和specialy设计的用户编写一个脚本来完成这项工作,但现在它会引导.

请帮忙.我正在使用Debian服务器"Lenny".

cev*_*ing 16

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
Run Code Online (Sandbox Code Playgroud)

然后,您必须将所有用户的密钥添加到authorized_keysWeb服务器用户的文件中.您必须为每行添加command选项前缀.

# cat .ssh/authorized_keys 
command="/var/www/.htpasswd.sh" ssh-rsa AAAA... user@host
Run Code Online (Sandbox Code Playgroud)

每当用户使用他的密钥连接时,只会.htpasswd.sh执行.用户没有对Web服务器的任何shell访问权限.

这是更改密码的脚本:

#! /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
Run Code Online (Sandbox Code Playgroud)

棘手的部分是密码验证.它是通过读取旧盐并使用旧盐加密旧密码来完成的.将结果与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.
Run Code Online (Sandbox Code Playgroud)

每个人都只能更改自己的密码,没有人可以访问其他用户的加密密码.此解决htpasswd方案在shell脚本中使用原始程序具有额外的好处,因为密码永远不会用作命令行参数.这是不可能的htpasswd,因为它无法从stdin中读取密码mkpasswd.