2011-01-19 17 views
8

मेरा प्रश्न सरल है।अपाचे htpasswd सुरक्षित पासवर्ड परिवर्तन

उपयोगकर्ताओं को फ़ाइलों को प्रकट किए बिना लिनक्स में कुछ htpasswd फ़ाइल में संग्रहीत पासवर्ड बदलने या उपयोगकर्ताओं को अन्य पासवर्ड संशोधित करने की अनुमति देने के लिए कैसे अनुमति दें?

मैंने एसएसएच और विशेष रूप से डिज़ाइन किए गए उपयोगकर्ता का उपयोग करके उस नौकरी को करने के लिए एक स्क्रिप्ट लिखने की कोशिश की लेकिन यह अब भी आगे बढ़ता है।

कृपया मदद करें। मैं डेबियन सर्वर "लेनी" का उपयोग कर रहा हूं।

+0

क्या आप वाकई htpasswd से चिपकना चाहते हैं? अपाचे में mod_auth अन्य बैकएंड, एलडीएपी डेटाबेस (mod_authnz_ldap), SQL डेटाबेस (mod_authn_dbd) इत्यादि का उपयोग कर सकते हैं। – regilero

उत्तर

16

अपाचे htpasswd फ़ाइल किसी भी छाया कार्यक्षमता का समर्थन नहीं करती है। इसके लिए आपको उपयोगकर्ताओं को पासवर्ड फ़ाइल से दूर रखने के लिए अपने वेब सर्वर तक पहुंचने से रोकना होगा। तो आपका एसएसएच आधारित दृष्टिकोण या कोई अन्य दूरस्थ समाधान ही एकमात्र समाधान है। निम्न वर्णन पासवर्ड को बदलने के लिए एसएसएच कमांड स्क्रिप्ट को लिखने के तरीके को समझाएगा, यदि उपयोगकर्ता अपना पुराना पासवर्ड जानता है। बड़ी समस्या यह है कि अपाचे htpasswd फ़ाइल में पासवर्ड सत्यापित करने के लिए कमांड लाइन उपकरण प्रदान नहीं करता है। लेकिन यह हाथ से किया जा सकता है।

निम्नलिखित वर्णन मानते हैं कि वेब सर्वर उपयोगकर्ता www-data है और यह कि उपयोगकर्ता की होम निर्देशिका /var/www है।

सबसे पहले आप एक htpasswd फ़ाइल बनाने के लिए है, कि वेब सर्वर उपयोगकर्ता द्वारा लिखने योग्य है:

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

तो फिर तुम वेब सर्वर उपयोगकर्ता की authorized_keys फाइल करने के लिए अपने सभी उपयोगकर्ताओं की चाबी जोड़ने के लिए। आपको command विकल्प के साथ प्रत्येक पंक्ति को उपसर्ग करना होगा।

# cat .ssh/authorized_keys 
command="/var/www/.htpasswd.sh" ssh-rsa AAAA... [email protected] 

एक उपयोगकर्ता अपने प्रमुख केवल .htpasswd.sh निष्पादित हो जाता है के साथ जोड़ता है जब भी। उपयोगकर्ताओं के पास वेब सर्वर पर कोई खोल पहुंच नहीं है।

#! /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 फ़ाइल में पुराने एन्क्रिप्टेड पासवर्ड से तुलना की जाती है।

अब उपयोगकर्ता क्रम में वेब सर्वर से कनेक्ट पासवर्ड बदलने के लिए कर सकते हैं:

$ 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 जैसे stdin से पासवर्ड नहीं पढ़ सकता है।

संबंधित मुद्दे