Apache htpasswd безопасная смена пароля - PullRequest
8 голосов
/ 19 января 2011

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

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

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

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

1 Ответ

16 голосов
/ 10 мая 2011

Файл Apache 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, потому что он не может прочитать пароль от стандартного ввода, как mkpasswd.

...