私の質問は簡単です。Apache htpasswd安全なパスワードの変更
ファイルの内容を明らかにせずに、ユーザーがhtpasswdファイルに保存されているパスワードを変更できるようにする方法や、他のパスワードを変更できるようにする方法はありますか?
私はsshとspecialy設計のユーザーを使ってその仕事をするスクリプトを書こうとしましたが、それは今やリードしています。
助けてください。 私はDebianサーバ "Lenny"を使用しています。
私の質問は簡単です。Apache htpasswd安全なパスワードの変更
ファイルの内容を明らかにせずに、ユーザーがhtpasswdファイルに保存されているパスワードを変更できるようにする方法や、他のパスワードを変更できるようにする方法はありますか?
私はsshとspecialy設計のユーザーを使ってその仕事をするスクリプトを書こうとしましたが、それは今やリードしています。
助けてください。 私はDebianサーバ "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
その後、あなたはWebサーバの利用者のauthorized_keys
ファイルにすべてのユーザーのキーを追加する必要があります。それぞれの行の先頭にcommand
オプションを付ける必要があります。
# cat .ssh/authorized_keys
command="/var/www/.htpasswd.sh" ssh-rsa AAAA... [email protected]
ユーザーが自分のキーに接続するたびに、.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 [email protected]
Enter user name: szi
Old password:
New password:
Re-type new password:
Updating password for user szi.
Connection to localhost closed.
みんなは彼自身のパスワードを変更することができますし、誰もが、他のユーザの暗号化されたパスワードにアクセスすることができません。この解決法は、パスワードがコマンドライン引数として決して使用されないので、シェルスクリプトで元のhtpasswd
プログラムを使用することについて追加の利点があります。 htpasswd
では、mkpasswd
などの標準入力からパスワードを読み取ることができないため、これはできません。
本当にhtpasswdに固執してもよろしいですか? Apacheのmod_authは、他のバックエンド、LDAPデータベース(mod_authnz_ldap)、SQLデータベース(mod_authn_dbd)などを使用できます。 – regilero