FTP сервер на базе ProFTPd с хранением списка пользователей в базе данных MySQL на FreeBSD

Лидерами среди FTP-серверов на сегодняшний день являются pure-ftpd и proftpd. В последнее время использую proftpd с хранением списка пользователей в MySQL (как-то неохота заводить системных пользователей, если нужен всего лишь доступ по FTP. Итак, приступаем к установке. Переходим в каталог портов и запускаем установку.

# cd /usr/ports/ftp/proftpd/
# make install clean

Мой набор опций следующий:

Options for proftpd 1.3.4b
[ ] IPV6 IPv6 protocol
[ ] MEMCACHE Memcache support using libmemcached
[ ] HTMLDOCS Include HTML documentation
[*] NLS Native Language Support
[*] PCRE Use Perl Compatible Regular Expressions

После этого необходимо собрать так же модуль, отвечающий за поддержку mysql

# cd /usr/ports/databases/proftpd-mod_sql_mysql
# make install clean

Редактируем /usr/local/etc/proftpd.conf и приводим его к следующему виду:

# cat /usr/local/etc/proftpd.conf
ServerName "TradeNarK Ftp Server"
ServerType standalone
DefaultServer on
ServerIdent on "FTP Server ready"
DeferWelcome off
Port 21
Umask 022
TimeoutLogin 300
TimeoutIdle 36000
TimeoutNoTransfer 36000
TimeoutStalled 36000
TimeoutSession 0
User proftpd
Group proftpd
MaxInstances 100
MaxClientsPerHost 100
AllowRetrieveRestart on
AllowStoreRestart on
AllowOverwrite on
AllowOverride off
RootLogin off
IdentLookups off
UseReverseDNS off
DenyFilter \*.*/
TimesGMT off
DefaultRoot ~
RLimitCPU 1200 1200
RLimitMemory 256M 256M
RLimitOpenFiles 1024 1024
PassivePorts 50000 60000
LogFormat default "%h %l %u %t \"%r\" %s %b"
LogFormat auth "%v [%P] %h %t \"%r\" %s"
LogFormat write "%h %l %u %t \"%r\" %s %b"
SystemLog /var/log/proftpd/proftpd.log
TransferLog /var/log/proftpd/xfer.log
ExtendedLog /var/log/proftpd/access.log WRITE,READ write
ExtendedLog /var/log/proftpd/auth.log AUTH auth
LoadModule mod_sql.c
LoadModule mod_sql_mysql.c
<Global>
SQLConnectInfo proftpd@localhost proftpd proftpd_password
SQLAuthTypes Crypt
SQLUserInfo users username password uid gid homedir NULL
SQLDefaultGID 1112
SQLDefaultUID 1112
RequireValidShell off
SQLAuthenticate users*
SQLLogFile /var/log/proftpd.log
SQLNamedQuery getcount SELECT "count, username from users where username='%u'"
SQLNamedQuery updatecount UPDATE "count=count+1 WHERE username='%u'" users
SQLShowInfo PASS "230" "You've logged on %{getcount} times, %u"
SQLLog PASS updatecount
</Global>

Мы указали в настройках что сервер будет работать на 21 порту в активном режиме и на диапазоне 50000-60000 в пассивном
Эти порты следует открыть в фаерволе. Для PF это делается следующим правилом:

pass in quick on $ext_if proto tcp from any to $ext_if port { 21, 50000:60000 }

Стоит отметить, то, что в целях безопасности, Proftpd мы будем запускать от имени непривилегированного пользователя. Соответственно займемся созданием этого пользователя

# adduser
Username: proftpd
Full name: FTP User
Uid (Leave empty for default):
Login group [proftpd]:
Login group is proftpd. Invite proftpd into other groups? []:
Login class [default]:
Shell (sh csh tcsh bash nologin) [sh]: nologin
Home directory [/home/proftpd]:
Home directory permissions (Leave empty for default):
Use password-based authentication? [yes]: no
Lock out the account after creation? [no]:
Username : proftpd
Password : <disabled>
Full Name : FTP User
Uid : 1112
Class :
Groups : proftpd
Home : /home/proftpd
Shell : /usr/sbin/nologin
Locked : no
OK? (yes/no): yes
adduser: INFO: Successfully added (proftpd) to the user database.
Add another user? (yes/no): no
Goodbye!

ВАЖНО!
Идентификатор пользователя и группы proftpd у вас будет свой. Соответственно при добавлении пользователя необходимо использовать его. Определить UID можно следующим способом:

# cat /etc/passwd | grep proftpd
proftpd:*:1112:1112:FTP User:/home/proftpd:/usr/sbin/nologin

Далее необходимо создать каталог, где будут храниться логи нашего FTP-сервера.

# mkdir /var/log/proftpd

Далее создаем БД MySQL и пользователя с полными правами доступа на созданную БД и…

# fetch https://tradenark.com.ua/files/proftpd.sql
# mysql -u proftpd -p proftpd < proftpd.sql

Далее создадим каталог и тестового пользователя FTP, указав директорией пользователя созданный каталог:

# mkdir -p /home/gleb/ftp
# chown -R proftpd:proftpd /home/gleb/ftp
# mysql -u proftpd -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 74435 to server version: 4.1.22 Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
INSERT INTO `proftpd`.`users` (`username` , `descr` , `password` , `uid` , `gid` , `homedir` , `shell` , `count` ) VALUES ('test', 'Test user', ENCRYPT( 'FTP-password_here' ) , '1112', '1112', '/home/gleb/ftp', NULL , '0' );
Query OK, 1 row affected (0.00 sec);
quit
Bye

Далее добавляем в /etc/rc.conf параметры запуска демона Proftpd:

# echo '# FTP' >> /etc/rc.conf
# echo 'proftpd_enable="YES"' >> /etc/rc.conf

Вроде все, взлетаем:

#/usr/local/etc/rc.d/proftpd start
Starting proftpd.

Теперь проверим, как функционирует наш FTP-сервер:

# telnet localhost 21
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 FTP Server ready
quit
221 Goodbye.

Отлично. Сервер успешно отвечает на запросы.

Советую каждому пользователю назначать отдельный каталог. «Выше» своего каталога они не выйдут (опция DefaultRoot в конфигурационном файле).

Записал небольшую инструкцию для наглядности.

пруфлинк тут

FTP сервер на базе ProFTPd с хранением списка пользователей в базе данных MySQL на FreeBSD: 1 комментарий

  1. Уведомление: FTP сервер с виртуальными пользователями в MySQL на Ubuntu 12.04 | Воронов Глеб | TradeNarK LLC

Добавить комментарий