Обычно, когда клиент входит в систему, он отправляет учетные данные (имя пользователя + пароль) без какой-либо дальнейшей обработки. Затем сервер проверяет, существует ли в его базе данных пользователей запись, соответствующая предоставленным учетным данным.
Чтобы усложнить восстановление пароля в случае взлома базы данных, пароль хранится в хешированной форме. Это означает, что либо клиент, либо сервер хешируют пароль, а затем учетные данные проверяются на соответствие.
Однако, если клиент выполняет хеширование, оно фактически становится бесполезным. Зачем ? Потому что хешированный пароль теперь используется в качестве пароля. Можно украсть базу данных, прочитать хэш и отправить его вместе с именем пользователя, но при этом получить доступ.
Вот почему хеширование должно выполняться на сервере, чтобы без предварительного знания пароля невозможно было войти в систему.
Однако я не могу найти никакого способа добиться этого с помощью модуля PAM, чтобы vsftpd использовал его для входа в систему. Обратите внимание, что я не хочу использовать обычную хеш-функцию, поскольку она не подходит для пароля. Мне нужно использовать KDF, например scrypt или bcrypt.
Должен ли я кодировать свой собственный модуль PAM или мне нужно генерировать хэши htpasswd по запросу?
tl; dr Как выполнить аутентификацию пользователя с хешем пароля на стороне сервера для vsftpd?
crypt()
используемый PAM может поддерживать только BCRYPT, но не SCRYPT (или ни один из них). Во всех случаях вам нужно установить метод только при кодировании пароля, а не при его проверке.
Поскольку vsftp использует файл системных паролей, вам необходимо перенастроить PAM для использования BCRYPT. Это зависит от фактического используемого unix / linux. Как только ваш файл passwd будет содержать $2y$
хэши паролей с префиксом (вы можете сгенерировать их с недавним htpasswd -B
вы сделали).
Некоторые Linux поддерживают authconfig --passalgo=blowfish --update
для других вам нужно найти правильный файл конфигурации PAM и добавить blowfish в строку пароля:
password sufficient /lib/security/pam_unix.so nullok use_authok blowfish shadow