Apache htpasswd安全なパスワードの変更
質問
私の質問は簡単です。
ファイルのコンテンツを表示せずにLinuxのHTPassWDファイルに保存されているパスワードをユーザーに変更できるようにする方法や、ユーザーが他のパスワードを変更できるようにする方法は?
SSHとSpecialEyが設計したユーザーを使用してそのジョブを行うためにスクリプトを作成しようとしましたが、それは今ではリードしています。
助けてください。 Debianサーバー「Lenny」を使用しています。
解決
アパッチ 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
パスワードがコマンドライン引数として使用されないため、シェルスクリプトのプログラム。これは不可能です htpasswd
, 、stdinのようにパスワードを読み取れないので mkpasswd
.