Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Администрирование *NIX систем > Авторизация в ProFTPD по учетным записям форума. |
Автор: Imple 21.12.2009, 14:29 | ||||||||
Авторизация пользователей в ProFTPD по учетным записям форума Недавно появилась необходимость запретить вход кому попало на FTP сервер, то есть заблокировать вход под anonymous. Но содержать отдельную базу с FTP пользователями неудобно, а более того неэффективно. Думал-думал, и решил авторизировать пользователей по учетной записи форума, в моем случае SMF. Пользователи хранятся в MySQL таблице smf_members, имя пользователя в memberName, а пароль в passwd. У ProFTPD есть хорошо документированная возможность получать учетные данные с PostgreSQL / MySQL. Но вот беда, у форума пароли хранятся в хеше SHA1, да и в начало пароля добавляется имя пользователя в нижнем регистре. А ProFTPD ожидает, что ему из SQL-запроса к базе вернется пароль в форматах MySQL PASSWORD(), Crypt, либо Plaintext. Само собой, никакого SHA1 там нет, не говоря уже о том, что к паролю еще добавляется имя пользователя. Гуглил день, другой, все жалуются на подобное, а готового решения никто не предлагает. Ну, наше дело не хитрое. Значит, что мы имеем? Есть параметр SQLAuthTypes, который указывает, каким методом криптован пароль. Нужного мне варианта нет, значит открываем исходники. С домашнего сайта ProFTPD был скачен последний RC-билд, на этот момент proftpd-1.3.3rc3. Беглый осмотр contrib/mod_sql.c и contrib/mod_sql.h, показал, что есть механизм добавления своих методов авторизации функцией:
Интересно. Немного побегав по исходникам, найдя достаточно примеров вызова этой функции (что странно, ничего этого толком недокументированно, да и в интернетах по запросу "proftpd sql_register_authtype" 0 результатов), стало ясно, что все сводится к созданию callback функции, которая принимает в качестве параметров пароль в чистом виде, и хеш полученный из mysql, проверяет соответствует ли пароль хешу, и return’ом возвращает результат проверки. Ну, вроде бы звучит несложно. Создал кустарный модуль contrib/mod_sql_auth_smf.c следующего содержания:
В этом модуле я средствами OpenSSL реализовал хеширование SHA1 чистого пароля, сверку с полученным хешем, и возвратом результата проверки в mod_sql.c. Скомпилировал, не забыв добавить опцию к configure --with-shared=mod_sql_auth_smf, изменил параметр в proftpd.conf SQLAuthTypes на SMF и добавил строчку LoadModule mod_sql_mysql.c. Собралось, проверил, работает! Но только в том случае, если пользователь User1 с паролем PassWd22, укажет в качестве пароля user1PassWd22. Ну, это уже проще. Найдя вызов callback функции в mod_sql.c, изменил ее с такого вида:
На такой:
Вот и все, цель достигнута. Если кого-то интересуют подробности настройки ProFTPD для работы с MySQL, тонкости компиляции, отвечу в комментариях. Цель данной статьи – не дать полное пошаговое руководство с нуля, а кратко показать как можно с небольшими знаниями C, заставить ProFTPD авторизировать пользователей по учетным данным любого форума, блога, и так далее. |
Автор: SparF 27.12.2009, 20:39 |
Спасибо. решение и правда интересное. Единственная просьба. Чтобы это решение не затерялось в интернете - отпишите его, пожалуйста, в официальную рассылку ProFTPD. В случае, если его включат в релиз - это спасет множество пользователей от сборки (пересборки) вручную и необходимости отслеживать новостные рассылки на тему "а не появилась ли критичная дыра в proftpd - и не придется ли мне пересобирать его...". Что, согласитесь, достаточно важно. |
Автор: Imple 27.12.2009, 20:43 |
SparF, согласен, но нужно немного вылизать код. Будет свободная минутка, займусь, отправлю. Спасибо Вам за интерес к статье. ![]() |