Для быстрой настройки 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
Вместо иксов, конечно же, будет стоять настоящий хэш. Хотя ведь какому-то паролю соответствует именно такой!