2011-01-19 16 views
8

Soruma soru sormak çok kolay.Apache htpasswd güvenli parola değişikliği

Kullanıcıların, dosya içeriğini göstermeden ya da kullanıcıların diğer şifreleri değiştirmelerine izin vermeden, linux'daki bazı htpasswd dosyalarında saklanan parolalarını değiştirmelerine nasıl izin verilir?

Bu işi ssh ve özel olarak tasarlanmış bir kullanıcıyla yapmak için bir komut dosyası yazmaya çalıştım ancak şimdi yönlendiriyor.

Lütfen

Yardım edin. Debian sunucusu "Lenny" kullanıyorum.

+0

htpasswd'ye yapıştırmak istediğinizden emin misiniz? Apache'de mod_auth diğer backends, LDAP veritabanı (mod_authnz_ldap), SQL veritabanı (mod_authn_dbd) vb. kullanabilir. – regilero

cevap

16

Apache htpasswd dosyasının gölge işlevi desteklemiyor. Bunun için, kullanıcıların web sunucunuza erişerek şifre dosyasından uzak tutulmasını engellemeniz gerekir. Tek çözüm, SSH tabanlı yaklaşımınız veya başka herhangi bir uzak çözümdür. Aşağıdaki açıklama, kullanıcının eski parolasını bilmesi durumunda parolayı değiştirmek için bir SSH komut komut dosyasının nasıl yazılacağını açıklayacaktır. En önemli sorun, Apache'nin htpasswd dosyasındaki bir şifreyi doğrulamak için bir komut satırı aracı sağlamasıdır. Ama bu el ile yapılabilir.

Aşağıdaki açıklama, web sunucusu kullanıcısının www-data olduğunu ve kullanıcının giriş dizininin /var/www olduğunu varsayar.

Önce bir htpasswd dosyası oluşturmak zorunda olduğu web sunucusu kullanıcı tarafından yazılabilir:

# ls -la .htpasswd 
-rw-r--r-- 1 www-data root 18 10. Mai 16:30 .htpasswd 

Sonra web sunucusu kullanıcının authorized_keys dosyaya tüm kullanıcıların anahtarlarını eklemek zorunda. Her satıra command seçeneği ile önek eklemeniz gerekir.
# cat .ssh/authorized_keys 
command="/var/www/.htpasswd.sh" ssh-rsa AAAA... [email protected] 

bir kullanıcı sadece .htpasswd.sh işletilirse onun anahtarla bağlandığı zaman. Kullanıcıların web sunucusuna herhangi bir kabuk erişimi yoktur.

#! /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 

zor kısmı şifre doğrulaması geçerli:

Bu

şifresini değiştirmek için komut dosyasıdır. Eski tuzu okuyarak ve eski şifreyi eski tuzla şifreleyerek yapılır. Sonuç, htpasswd dosyasındaki eski şifreli parola ile karşılaştırılır.

Şimdi kullanıcı şifresini değiştirmek için web sunucusuna bağlanabilir:

$ ssh [email protected] 
Enter user name: szi 
Old password: 
New password: 
Re-type new password: 
Updating password for user szi. 
Connection to localhost closed. 

Herkes sadece kendi şifre ve kimse değiştirmek diğer kullanıcıların şifrelenmiş parolaları erişimi olan olabilir. Bu çözüm, bir kabuk komut dosyasında orijinal htpasswd programını kullanmanın ek bir yararı vardır, çünkü parolalar hiçbir zaman komut satırı bağımsız değişkeni olarak kullanılmaz. Bu, mkpasswd gibi stdin'den şifreyi okuyamayacağı için htpasswd ile mümkün olmaz.