Отличная тема, отличный перевод, отличная комбинация FTP и базы (на мой взгляд)
. К сожалению уже старая, а более новой и столь же удачной не нашел, потому хотел бы подчеркнуть некоторые, уже выше описанные, моменты, и добавит кое что от себя, после установки на версию Ubuntu 10.04.
Надеюсь ни у кого проблем с редактированием файла proftpd.conf не возникает, только добавлю, т.к. в существующей (обновленной) версии proftpd, работа с базой данных ведется по конфигу из отдельного файла (sql.conf), то в proftpd.conf обязательно разкоментировать строку
Include /etc/proftpd/sql.conf, а сам файл sql.conf должен быть следующего вида:
содержимое файла примерное, взял со своего, работающего, сервера
#
# Proftpd sample configuration for SQL-based authentication.
#
# (This is not to be used if you prefer a PAM-based SQL authentication)
#
<IfModule mod_sql.c>
SQLBackend mysql
# The passwords in MySQL are encrypted using CRYPT
SQLAuthTypes Plaintext Crypt
SQLAuthenticate users groups
# used to connect to the database
# databasename@host database_user user_password
SQLConnectInfo ftp@localhost proftpd пароль #вписать свой пароль от пользователя proftpd, базы данных
# Here we tell ProFTPd the names of the database columns in the "usertable"
# we want it to interact with. Match the names with those in the db
SQLUserInfo ftpuser userid passwd uid gid homedir shell
# Here we tell ProFTPd the names of the database columns in the "grouptable"
# we want it to interact with. Again the names match with those in the db
SQLGroupInfo ftpgroup groupname gid members
# set min UID and GID - otherwise these are 999 each
SQLMinID 500
# create a user's home directory on demand if it doesn't exist
CreateHome on
# Update count every time user logs in
SQLLog PASS updatecount
#следующие две строки аналогичны
#SQLNamedQuery updatecount UPDATE "count=count+1, accessed=now() WHERE userid='%u'" ftpuser #оригинал, на моём сервере не заработало
SQLNamedQuery count UPDATE "count=1 WHERE username='%u'" proftpd #измененная, в моём случае, рабочий вариант
# Update modified everytime user uploads or deletes a file
SQLLog STOR,DELE modified
SQLNamedQuery modified UPDATE "modified=now() WHERE userid='%u'" ftpuser
</IfModule>
#данное разделение блоков требуется для правильной работы квот, иначе будет ругаться на запросы БД
<IfModule mod_quota.c>
# User quotas
# ===========
QuotaEngine on
QuotaDirectoryTally on
QuotaDisplayUnits Mb
QuotaShowQuotas on
SQLNamedQuery get-quota-limit SELECT "name, quota_type, per_session, limit_type,
bytes_in_avail, bytes_out_avail, bytes_xfer_avail, files_in_avail,
files_out_avail, files_xfer_avail FROM ftpquotalimits WHERE name = '%{0}' AND
quota_type = '%{1}'"
SQLNamedQuery get-quota-tally SELECT "name, quota_type, bytes_in_used,
bytes_out_used, bytes_xfer_used, files_in_used, files_out_used, files_xfer_used
FROM ftpquotatallies WHERE name = '%{0}' AND quota_type = '%{1}'"
SQLNamedQuery update-quota-tally UPDATE "bytes_in_used = bytes_in_used + %{0},
bytes_out_used = bytes_out_used + %{1}, bytes_xfer_used = bytes_xfer_used + %{2},
files_in_used = files_in_used + %{3}, files_out_used = files_out_used + %{4},
files_xfer_used = files_xfer_used + %{5} WHERE name = '%{6}' AND quota_type =
'%{7}'" ftpquotatallies
SQLNamedQuery insert-quota-tally INSERT "%{0}, %{1}, %{2}, %{3}, %{4}, %{5},
%{6}, %{7}" ftpquotatallies
QuotaLimitTable sql:/get-quota-limit
QuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tally
RootLogin off
RequireValidShell off
</IfModule>
для тех, кто уже установил по инструкции и столкнулся с ошибками, могу лишь напомнить:
1)обязательно выполнить
sudo apt-get install proftpd-mod-mysql
apt-get install proftpd-mysql - не работает
это добавит модули для работы с БД
2)
потом в файле /etc/proftpd/modules.conf раскомментировать несколько строк:
# Install one of proftpd-mod-mysql, proftpd-mod-pgsql or any other
# SQL backend engine to use this module and the required backend.
# This module must be mandatory loaded before anyone of
# the existent SQL backeds.
LoadModule mod_sql.c
и
# Install proftpd-mod-pgsql or proftpd-mod-mysql to use this
LoadModule mod_quotatab_sql.c
LoadModule mod_quotatab_radius.c
LoadModule mod_wrap.c
LoadModule mod_rewrite.c
LoadModule mod_load.c
LoadModule mod_ban.c
LoadModule mod_wrap2.c
LoadModule mod_wrap2_file.c
# Install proftpd-mod-pgsql or proftpd-mod-mysql to use this
LoadModule mod_wrap2_sql.c
LoadModule mod_dynmasq.c
эти 2 пункта и
в proftpd.conf обязательно разкоментировать строку Include /etc/proftpd/sql.conf
должи избавить от ошибки:
Fatal: unknown configuration directive ' SQLAuthTypes' on line [номер строки] of '/etc/proftpd/proftpd.conf'
3) от ошибок:
- Fatal: SQLNamedQuery: expected 'UPDATE' query-string table-name on line [номер строки] of '/etc/proftpd/sql.conf'
и
- Fatal: unknown configuration directive 'bytes_in_avail,' on line 77 of '/etc/proftpd/sql.conf'
избавят соответствующие исправления в коде файла
sql.conf приведенные мною выше.
И еще.
Зачем хранить пароли учеток в открытом виде, если их можно шифровать?
А сделать это можно двумя функцуиями:
1) в файле sql.conf изменить строку:
SQLAuthTypes Plaintext Crypt
на
SQLAuthTypes Crypt
и в запросах, вместо простого ввода пароля:
INSERT INTO `ftpuser` (`id`, `userid`, `passwd`,..., 'пароль',...);
писать
INSERT INTO `ftpuser` (`id`, `userid`, `passwd`,..., ENCRYPT('пароль'),...)
2) ту же строку меняем на
SQLAuthTypes Backend
а в запросах (приведенных выше), вместо ENCRYPT пишем PASSWORD
INSERT INTO `ftpuser` (`id`, `userid`, `passwd`,..., PASSWORD('пароль'),...)
Способы отличаются лишь методом шифрования.
Первый работает точно, второй, пароли шифрует, но, к сожалению, мой FTP клиент не понимает его... разбираюсь.