Вопрос

Мой вопрос простой.

Как позволить пользователям изменять свои пароли, хранящиеся в некотором файле HTPASSWD в Linux, не выявляя содержимое файлов или позволяет пользователям изменять другие пароли?

Я попытался написать сценарий, чтобы выполнить эту работу, используя SSH и конкретного пользователя, но он ведет.

Пожалуйста помоги. Я использую Debian Server "Lenny".

Это было полезно?

Решение

Апач htpasswd Файл не поддерживает каких -либо теневых функций. Поэтому вы должны предотвратить доступ к вашему веб -серверу пользователям, чтобы держать их подальше от файла пароля. Таким образом, единственным решением является ваш подход на основе SSH или любое другое удаленное решение. Следующее описание объясняет, как написать сценарий команды SSH, чтобы изменить пароль, только если пользователь знает свой старый пароль. Основная проблема заключается в том, что Apache не предоставляет инструмент командной строки для проверки пароля в 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... user@host

Всякий раз, когда пользователь подключается со своим ключом только .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 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top