首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Apache htpasswd安全密码更改

问Apache htpasswd安全密码更改
EN

Stack Overflow用户
提问于 2011-01-19 22:33:54
回答 1查看 16.8K关注 0票数 8

我的问题很简单。

如何在不泄露文件内容的情况下,允许用户修改存储在linux的某个htpasswd文件中的密码,或者修改其他密码?

我试着用ssh和专门设计的user编写一个脚本来完成这项工作,但是没有成功。

请帮帮忙。我使用的是Debian服务器"Lenny“。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-05-10 23:41:06

Apache htpasswd文件不支持任何影子功能。因此,您必须阻止用户访问您的web服务器,以使他们远离密码文件。因此,惟一的解决方案是基于SSH的方法或任何其他远程解决方案。下面的描述将解释如何编写SSH命令脚本,以便仅当用户知道其旧密码时才更改密码。主要问题是,Apache没有提供命令行工具来验证htpasswd文件中的密码。但这是可以手工完成的。

以下描述假定web服务器用户为www-data,用户的主目录为/var/www。

首先,您必须创建一个可由web服务器用户写入的htpasswd文件:

代码语言:javascript
复制
# ls -la .htpasswd
-rw-r--r-- 1 www-data root 18 10. Mai 16:30 .htpasswd

然后,您必须将所有用户的密钥添加到web服务器用户的authorized_keys文件中。您必须在每行前面加上command选项。

代码语言:javascript
复制
# cat .ssh/authorized_keys 
command="/var/www/.htpasswd.sh" ssh-rsa AAAA... user@host

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

以下是更改密码的脚本:

代码语言:javascript
复制
#! /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服务器以更改密码:

代码语言:javascript
复制
$ 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.

每个人都只能更改自己的密码,没有人可以访问其他用户的加密密码。与在shell脚本中使用原始htpasswd程序相比,此解决方案还有一个额外的好处,因为密码永远不会用作命令行参数。这在htpasswd中是不可能的,因为它不能像mkpasswd那样从标准输入中读取密码。

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4736413

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档