В заметке я расскажу, как сформировать хэш пароля пользователя для быстрой настройки FTP-сервера ProFTPD в linux (на примере Ubuntu).

Для быстрой настройки ProFTPD можно задать пароли unix-пользователей для FTP-сервера. При наличии Webmin задаем пароли в разделе Authentication - User passwords overrides:

 

Физически это выливается в добавление параметра UserPassword в секцию Global конфигурационного файла /etc/proftpd/proftpd.conf, но каким образом там берется хэш? Толком ничего в интернете не нашел, полез в исходники самого Webmin. Нашел фрагмент кода:

$salt = substr(time(), 0, 2);
push(@rv, $in{"UserPassword_n_$i"}.' '.&unix_crypt($in{"UserPassword_p_$i"}, $salt));

Из этого фрагмента узнаем две вещи: соль - это первые две цифры так называемой отметки времени unix, а для хэширования используется стандартная функция crypt (это, впрочем, указано в описании директивы). Я провел небольшое исследование и выяснил, что такая соль - это самодеятельность Webmin и в принципе можно использовать свою строку из двух символов (однобайтных, конечно - т.е. цифры, английские буквы, знаки препинания), поскольку соль включается в вывод функции. Именно из-за соли меня смущал вывод ftpasswd, который не совпадал с Webmin'овским. Таким образом, для генерации хэша все же подходит команда:

$ ftpasswd --hash --des

Тем более что соль она "придумывает" сама. Скажу больше: подходят и другие варианты хэширования - md5 (по умолчанию), sha256 или sha512, которые вообще-то и следует использовать (о чем предупреждает утилита).

Бонусом - еще одно исследование по поводу первых цифр отметки времени, а также альтернативные способы хэширования через crypt (непосредственно из командной строки ее не вызовешь).

$ date +%s
1549542516
$ date --date='@1500000000'
Fri Jul 14 05:40:00 MSK 2017
$ date --date='@1600000000'
Sun Sep 13 15:26:40 MSK 2020

Отсюда следует, что Webmin с 05:40:00 14.07.2017 по 13.09.2020 15:26:40 по Москве будет использовать в качестве соли строку "15". Хорошо, возьмем ее и приведем еще пару примеров.

Openssl, которая по идее должна быть установлена:

$ openssl passwd -crypt -salt 15

PHP (вместо password надо написать настоящий пароль):

$ php -r "print(crypt('password','15') . \"\n\");"

Итак, вне зависимости от способа получения хэша, его остается лишь указать нужному пользователю в директиве UserPasswod. Допустим, для пользователя www-data:

UserPassword www-data xxxxxxxxxxxxx

Вместо иксов, конечно же, будет стоять настоящий хэш. Хотя ведь какому-то паролю соответствует именно такой! wink


Категория: Решение проблем | Опубликовано 07.02.2019 | Редакция от 08.02.2019

Похожие материалы:


Комментарии, обсуждение

комментарии простроенны на платформе Disqus