2011-01-19 28 views
8

私の質問は簡単です。Apache htpasswd安全なパスワードの変更

ファイルの内容を明らかにせずに、ユーザーがhtpasswdファイルに保存されているパスワードを変更できるようにする方法や、他のパスワードを変更できるようにする方法はありますか?

私はsshとspecialy設計のユーザーを使ってその仕事をするスクリプトを書こうとしましたが、それは今やリードしています。

助けてください。 私はDebianサーバ "Lenny"を使用しています。

+0

本当にhtpasswdに固執してもよろしいですか? Apacheのmod_authは、他のバックエンド、LDAPデータベース(mod_authnz_ldap)、SQLデータベース(mod_authn_dbd)などを使用できます。 – regilero

答えて

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 

その後、あなたは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などの標準入力からパスワードを読み取ることができないため、これはできません。

関連する問題