Proftpd - настройка FTP-сервера с хранением списка пользователей в БД MySQL и поддержкой TLS шифрования

Версия для печатиОтправить другуPDF version

Proftpd логотип

 

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

Итак, приступаем к установке. Переходим в каталог портов и запускаем установку.

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

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

Options for proftpd-mysql 1.3.2a

[ ] BAN              Include mod_ban (Requires CTRLS)
[ ] CLAMAV           Include mod_clamav
[ ] CTRLS            Include controls
[ ] DIGEST           Include mod_digest
[X] IFSESSION        Include mod_ifsession
[ ] IPV6             Use IPv6
[ ] LDAP             Use LDAP
[ ] LDAP_TLS         Use LDAP TLS (Requires LDAP, OPENSSL)
[ ] NLS              Use nls (builds mod_lang)
[X] OPENSSL          Include mod_tls
[ ] PGSQL            Postgres auth (Can be combined with MYSQL)
[X] QUOTA            Include mod_quota
[ ] QUOTATAB_RADIUS  include mod_quotatab_radius
[ ] RADIUS           Include mod_radius
[X] RATIO            Include mod_ratio
[X] README           Include mod_readme
[X] REWRITE          Include mod_rewrite
[ ] TDS              FreeTDS - Sybase & MS-SQL auth (Exclusive)
[X] WRAP             Include mod_wrap2
[ ] WRAP_FILE        Include mod_wrap2_file
[ ] WRAP_SQL         Include mod_wrap2_sql
[X] MYSQL            MySQL auth (Can be combined with PGSQL)

Обновляем пути:

# rehash

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

# cat /usr/local/etc/proftpd.conf

ServerName                      "Local Ftp Server"
ServerType                      standalone
DefaultServer                   on

ServerIdent on "FTP Server ready"

DeferWelcome                    off

Port                            21
Umask                           002
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
#ExtendedLog                     /var/log/proftpd/paranoid.log ALL default

<Global>
  SQLConnectInfo proftpd@localhost proftpd SQL-Password_here
  SQLAuthTypes Crypt
  SQLUserInfo users username password uid gid homedir NULL
  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>

Стоит отметить, что в файрволе должны быть разблокированы порты 50000-60000 для работы FTP в пассивном режиме. Диапазон портов можно изменить в конфигурационном файле (опция PassivePorts).

Стоит отметить, то, что в целях безопасности, 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]:
Use password-based authentication? [yes]: no
Lock out the account after creation? [no]:
Username   : proftpd
Password   : <disabled>
Full Name  : FTP User
Uid        : 1050
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!
 

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

# mkdir /var/log/proftpd

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

# mysql –u username –p
Enter password:
mysql> create database proftpd;

Query OK, 1 row affected (0.00 sec)
mysql> grant all on proftpd.* to 'proftpd'@'localhost' identified by 'password';

Query OK, 0 rows affected (0.06 sec)
mysql>quit

Далее загружаем уже готовый дамп БД и заливаем этот дамп в созданную БД от имени созданного пользователя :

# wget http://muff.kiev.ua/files/proftpd.sql
--17:43:01--  http://muff.kiev.ua/files/proftpd.sql
Распознаётся muff.kiev.ua... 195.3.159.250
Устанавливается соединение с muff.kiev.ua|195.3.159.250|:80... соединение установлено.
Запрос HTTP послан, ожидается ответ... 200 OK
Длина: 1 710 (1,7K) [text/plain]
 
100%[===============================================>] 1 710         --.--K/s
 
17:43:01 (14,83 MB/s) - `proftpd.sql' сохранён [1710/1710]
# mysql -u proftpd -p proftpd < proftpd.sql
Enter password:

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

# mkdir -p /var/ftp/test
# chown -R proftpd:proftpd /var/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.
 
mysql> INSERT INTO `proftpd`.`users` (`username` , `descr` , `password` , `uid` , `gid` , `homedir` , `shell` , `count`  ) VALUES ('test', 'Test user', ENCRYPT( 'FTP-password_here' ) , '1050', '1050', '/var/ftp/test', NULL , '0' );
Query OK, 1 row affected (0.00 sec)
 
mysql> quit
Bye

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

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

Кажется ничего не забыли... Пытаемся запустить FTP-сервер:

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

Теперь проверим, как функционирует наш FTP-сервер. Все ли в порядке, а то всякое может быть ;)

Для начала попробуем приконектиться на 21 порт:

# telnet localhost 21
Trying ::1...
Trying 127.0.0.1...
Connected to localhost
Escape character is '^]'.
220 ProFTPD 1.3.2a Server (Local Ftp Server) [127.0.0.1]

quit
221 Goodbye.
Connection closed by foreign host.

Отлично. Сервер успешно отвечает на запросы. Теперь попробуем залить файл на сервер:

Microsoft Windows XP [Версия 5.1.2600]
(С) Корпорация Майкрософт, 1985-2001.
C:\>
C:\>ftp x.x.x.x
Связь с x.x.x.x.
220 ProFTPD 1.3.2a Server (Local Ftp Server) [x.x.x.x]
Пользователь (x.x.x.x:(none)): test
331 Password required for test
Пароль:
230-You've logged on 1 times, test
230 User test logged in
ftp> binary
200 Type set to I
ftp> put test.zip
200 PORT command successful
150 Opening BINARY mode data connection for test.zip
226 Transfer complete
ftp: 2406400 байт отправлено за 38,55 (сек) со скоростью 62,43 (КБ/сек).
ftp> quit
221 Goodbye.

Поздравляю. FTP-cервер успешно протестирован и готов к работе. Этого достаточно, для нормальной работы. Далее будут описаны некоторые расширения.

SSL

Теперь займемся организацией TLS шифрования.

Создадим (если не существует) каталог для хранения сертификатов:

# mkdir /etc/ssl/certs

# cd /etc/ssl/certs

Сгенерируем SSL-сертификат:

# openssl req -new -x509 -days 365 -nodes -out /etc/ssl/certs/proftpd.cert.pem -keyout /etc/ssl/certs/proftpd.key.pem
Generating a 1024 bit RSA private key
................................++++++
.......++++++
writing new private key to '/etc/ssl/certs/proftpd.key.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:UA
State or Province Name (full name) [Some-State]:Kiev Region
Locality Name (eg, city) []:Kiev
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Somebody Organization Name
Organizational Unit Name (eg, section) []:IT Department
Common Name (eg, YOUR name) []:ftp.domain.com
Email Address []:username [at] domain [dot] com (username [at] domain [dot] com)

 Lобавляем в /usr/local/etc/proftpd.conf следующую секцию:

<IfModule mod_tls.c>
        TLSEngine on
        TLSLog /var/log/proftpd/tls.log
        TLSProtocol SSLv3
        TLSOptions NoCertRequest
        TLSRSACertificateFile /etc/ssl/certs/proftpd.cert.pem
        TLSRSACertificateKeyFile /etc/ssl/certs/proftpd.key.pem
        TLSVerifyClient on
        TLSRequired off
</IfModule>

Перезапускаем Proftpd и наслаждаемся результатом


ВАЖНО!

  1. На что следует обратить внимание, так это на то, что пароли следует криптовать, поскольку в опциях коннекта к базе тип запроса "Crypt". Если добавляете пользователей с помощью PhpMyAdmin, то в поле напротив пароля выбираем функцию "ENCRYPT".
  2. Идентификатор пользователя и групы proftpd у вас будет свой. Соответственно при добавлении пользователя необходимо использовать его. Определить UID можно следующим способом:
    # cat /etc/passwd | grep proftpd
    proftpd:*:1050:1050:FTP User:/home/proftpd:/usr/sbin/nologin
  3. Советую каждому пользователю назначать отдельный каталог. "Выше" своего каталога они не выйдут (опция DefaultRoot в конфигурационном файле).

 

Ваша оценка: Нет Средняя: 5 (6 голосов)

Re: Proftpd - настройка FTP-сервера с хранением списка ...

Стать классная, я по ней настраивал не один раз (автору отдельный респект). Но собирая в очередной раз напоролся на ошибку 

Fatal: unknown configuration directive 'SQLConnectInfo' on line 80 of '/usr/local/etc/proftpd.conf'

Немного погуглив выяснил, что  с выходом версии 1.3.4, немного изменилась установка порта. Теперь mod_sql нужно ставить отдельно из портов.

Помогла эта ссылка http://netspider.com.ua/index.php/2012/02/04/proftpd-1-3-4/  .

Если не сложно, подправте статью под новый вариант. Спасибо.

Re: Proftpd - настройка FTP-сервера с хранением списка ...

Если планы не изменятся, то должен на этой неделе сетапить ФТПшник, соответственно внесу изменения в статью.

 

Re: Proftpd - настройка FTP-сервера с хранением списка ...

При установке данной связки необходимо дополнительно устанавливать порт databases/proftpd-mod_sql_mysql
При этом необходимо в конфиг добавить следующее

LoadModule mod_sql.c
LoadModule mod_sql_mysql.c

 

Перезапустить сервис Proftpd и радоваться его работе...

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".

Вставай, Україно!

Литература

Юниксов развелось... Виндоусу упасть некуда...