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

  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '2:5c48d6c9b98c3809e543d72d0323a795' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: UPDATE cache_filter SET data = '<p class=\"rtecenter\"><img alt=\"Proftpd логотип\" width=\"140\" height=\"85\" src=\"http://muff.kiev.ua/files/proftpd-logo.jpg\" /></p>\n<p class=\"rtejustify\">&nbsp;</p>\n<p class=\"rtejustify\">Лидерами среди FTP-серверов на сегодняшний день являются pure-ftpd и proftpd. В последнее время использую proftpd с хранением списка пользователей в MySQL (как-то неохота заводить системных пользователей, если нужен всего лишь доступ по FTP).</p>\n<p class=\"rtejustify\">Итак,&nbsp;приступаем к установке. Переходим в каталог портов и запускаем установку.</p>\n<table border=\"1\" cellspacing=\"1\" cellpadding=\"1\" width=\"100%\">\n<tbody>\n<tr>\n<td>\n<p class=\"rtejustify\"># <strong>cd /usr/ports/ftp/proftpd-mysql/</strong><br />\n # <strong>make install clean</strong></p>\n</td>\n</tr>\n</tbody>\n</table>\n<p class=\"rtejustify\">Мой набор опций следующий:</p>\n<table border=\"1\" cellspacing=\"1\" cellpadding=\"1\" width=\"100%\">\n<tbody>\n<tr>\n<td>\n<p class=\"rtecenter\"><strong>Options for proftpd-mysql 1.3.2a</strong></p>\n<pre>\n[ ] BAN Include mod_ban (Requires CTRLS)\n[ ] CLAMAV Include mod_clamav\n[ ] CTRLS Include controls\n[ ] DIGEST Include mod_digest\n[X] IFSESSION Include mod_ifsession\n[ ] IPV6 Use IPv6\n[ ] LDAP Use LDAP\n[ ] LDAP_TLS Use LDAP TLS (Requires LDAP, OPENSSL)\n[ ] NLS Use nls (builds mod_lang)\n[X] OPENSSL Include mod_tls\n[ ] PGSQL Postgres auth (Can be combined with MYSQL)\n[X] QUOTA Include mod_quota\n[ ] QUOTATAB_RADIUS include mod_quotatab_radius\n[ ] RADIUS Include mod_radius\n[X] RATIO Include mod_ratio\n[X] README Include mod_readme\n[X] REWRITE Include mod_rewrite\n[ ] TDS FreeTDS - Sybase &amp; MS-SQL auth (Exclusive)\n[X] WRAP Include mod_wrap2\n[ ] WRAP_FILE Include mod_wrap2_file\n[ ] WRAP_SQL Include mod_wrap2_sql\n[X] MYSQL MySQL auth (Can be combined with PGSQL)</pre></td>\n</tr>\n</tbody>\n</table>\n<p class=\"rtejustify\">Обновляем пути:</p>\n<table border=\"1\" cellspacing=\"1\" cellpadding=\"1\" width=\"100%\">\n<tbody>\n<tr>\n<td class=\"rtejustify\"># <strong>rehash</strong></td>\n</tr>\n</tbody>\n</table>\n<p class=\"rtejustify\">Редактируем /usr/local/etc/proftpd.conf и приводим его к следующему виду:</p>\n<table border=\"1\" cellspacing=\"1\" cellpadding=\"1\" width=\"100%\">\n<tbody>\n<tr>\n<td>\n<p class=\"rtejustify\"><strong># cat /usr/local/etc/proftpd.conf</strong></p>\n<p class=\"rtejustify\">ServerName&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;Local Ftp Server&quot;<br />\n ServerType&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; standalone<br />\n DefaultServer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; on</p>\n<p class=\"rtejustify\">ServerIdent on &quot;FTP Server ready&quot;</p>\n<p class=\"rtejustify\">DeferWelcome&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; off</p>\n<p class=\"rtejustify\">Port&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 21<br />\n Umask&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 002<br />\n TimeoutLogin&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 300<br />\n TimeoutIdle&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 36000<br />\n TimeoutNoTransfer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 36000<br />\n TimeoutStalled&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 36000<br />\n TimeoutSession&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0</p>\n<p class=\"rtejustify\">User&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; proftpd<br />\n Group&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; proftpd</p>\n<p class=\"rtejustify\">MaxInstances&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 100<br />\n MaxClientsPerHost&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 100</p>\n<p class=\"rtejustify\">AllowRetrieveRestart&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; on<br />\n AllowStoreRestart&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; on<br />\n AllowOverwrite&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; on<br />\n AllowOverride&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; off</p>\n<p class=\"rtejustify\">RootLogin&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; off<br />\n IdentLookups&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; off<br />\n UseReverseDNS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; off<br />\n DenyFilter&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \\*.*/<br />\n TimesGMT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; off</p>\n<p class=\"rtejustify\">DefaultRoot&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ~</p>\n<p class=\"rtejustify\">RLimitCPU&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1200 1200<br />\n RLimitMemory&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 256M 256M<br />\n RLimitOpenFiles&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1024 1024</p>\n<p class=\"rtejustify\">PassivePorts&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 50000 60000</p>\n<p class=\"rtejustify\">LogFormat&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; default &quot;%h %l %u %t \\&quot;%r\\&quot; %s %b&quot;<br />\n LogFormat&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; auth&nbsp;&nbsp;&nbsp; &quot;%v [%P] %h %t \\&quot;%r\\&quot; %s&quot;<br />\n LogFormat&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; write&nbsp;&nbsp; &quot;%h %l %u %t \\&quot;%r\\&quot; %s %b&quot;</p>\n<p class=\"rtejustify\">SystemLog&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /var/log/proftpd/proftpd.log<br />\n TransferLog&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /var/log/proftpd/xfer.log<br />\n ExtendedLog&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /var/log/proftpd/access.log WRITE,READ write<br />\n ExtendedLog&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /var/log/proftpd/auth.log AUTH auth<br />\n #ExtendedLog&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /var/log/proftpd/paranoid.log ALL default</p>\n<p class=\"rtejustify\">&lt;Global&gt;<br />\n &nbsp; SQLConnectInfo proftpd@localhost proftpd&nbsp;<span style=\"color: #ff0000\"><strong>SQL-Password_here</strong></span><br />\n &nbsp; SQLAuthTypes Crypt<br />\n &nbsp; SQLUserInfo users username password uid gid homedir NULL<br />\n &nbsp; RequireValidShell off<br />\n &nbsp;&nbsp;SQLAuthenticate users*<br />\n &nbsp; SQLLogFile /var/log/proftpd.log<br />\n &nbsp; SQLNamedQuery getcount SELECT &quot;count, username from users where username=\'%u\'&quot;<br />\n &nbsp; SQLNamedQuery updatecount UPDATE &quot;count=count+1 WHERE username=\'%u\'&quot; users<br />\n &nbsp; SQLShowInfo PASS &quot;230&quot; &quot;You\'ve logged on %{getcount} times, %u&quot;<br />\n &nbsp; SQLLog PASS updatecount<br />\n &lt;/Global&gt;</p>\n</td>\n</tr>\n</tbody>\n</table>\n<p class=\"rtejustify\">Стоит отметить, что в файрволе должны быть разблокированы порты 50000-60000 для работы FTP в пассивном режиме. Диапазон портов можно изменить в конфигурационном файле (опция PassivePorts).</p>\n<p class=\"rtejustify\">Стоит отметить,&nbsp;то, что&nbsp;в целях безопасности,&nbsp;Proftpd мы будем запускать от имени непривилегированного пользователя. Соответственно займемся созданием этого пользователя <img alt=\"\" src=\"http://muff.kiev.ua/modules/fckeditor/fckeditor/editor/images/smiley/msn/wink_smile.gif\" />.</p>\n<table border=\"1\" cellspacing=\"1\" cellpadding=\"1\" width=\"100%\">\n<tbody>\n<tr>\n<td class=\"rtejustify\"><strong># adduser</strong><br />\n Username: <strong>proftpd<br />\n </strong>Full name: FTP User<br />\n Uid (Leave empty for default):<br />\n Login group [proftpd]:<br />\n Login group is proftpd. Invite proftpd into other groups? []:<br />\n Login class [default]:<br />\n Shell (sh csh tcsh bash nologin) [sh]: <strong>nologin</strong><br />\n Home directory [/home/proftpd]:<br />\n Use password-based authentication? [yes]: <strong>no<br />\n </strong>Lock out the account after creation? [no]:<br />\n Username&nbsp;&nbsp; : proftpd<br />\n Password&nbsp;&nbsp; : &lt;disabled&gt;<br />\n Full Name&nbsp; : FTP User<br />\n Uid&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 1050<br />\n Class&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :<br />\n Groups&nbsp;&nbsp;&nbsp;&nbsp; : proftpd<br />\n Home&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : /home/proftpd<br />\n Shell&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : /usr/sbin/nologin<br />\n Locked&nbsp;&nbsp;&nbsp;&nbsp; :&nbsp; no<br />\n OK? (yes/no): <strong>yes</strong><br />\n adduser: INFO: Successfully added (proftpd) to the user database.<br />\n Add another user? (yes/no): no<br />\n Goodbye!<br />\n &nbsp;</td>\n</tr>\n</tbody>\n</table>\n<p class=\"rtejustify\">Далее необходимо создать каталог, где будут храниться логи нашего FTP-сервера.</p>\n<table border=\"1\" cellspacing=\"1\" cellpadding=\"1\" width=\"100%\">\n<tbody>\n<tr>\n<td class=\"rtejustify\"># <strong>mkdir /var/log/proftpd</strong></td>\n</tr>\n</tbody>\n</table>\n<p class=\"rtejustify\">Далее создаем БД MySQL&nbsp;и пользователя с полными правами доступа на созданную БД.</p>\n<table border=\"1\" cellspacing=\"1\" cellpadding=\"1\" width=\"100%\">\n<tbody>\n<tr>\n<td>\n<p class=\"rtejustify\"><strong>#&nbsp;mysql &ndash;u username &ndash;p<br />\n </strong>Enter password:<br />\n <strong>mysql&gt; create database proftpd;</strong></p>\n<p class=\"rtejustify\">Query OK, 1 row affected (0.00 sec)<br />\n <strong>mysql&gt; grant all on proftpd.* to \'proftpd\'@\'localhost\' identified by \'<span style=\"color: #ff0000\">password</span>\';</strong></p>\n<p class=\"rtejustify\">Query OK, 0 rows affected (0.06 sec)<br />\n <strong>mysql&gt;quit</strong></p>\n</td>\n</tr>\n</tbody>\n</table>\n<p class=\"rtejustify\">Далее загружаем уже готовый&nbsp;дамп БД и заливаем этот дамп в созданную БД от имени созданного пользователя <img alt=\"\" src=\"http://muff.kiev.ua/modules/fckeditor/fckeditor/editor/images/smiley/msn/wink_smile.gif\" />:</p>\n<table border=\"1\" cellspacing=\"1\" cellpadding=\"1\" width=\"100%\">\n<tbody>\n<tr>\n<td>\n<div class=\"rtejustify\"><strong># wget http://muff.kiev.ua/files/proftpd.sql</strong><br />\n --17:43:01--&nbsp; <a href=\"http://muff.kiev.ua/files/proftpd.sql\" title=\"http://muff.kiev.ua/files/proftpd.sql\">http://muff.kiev.ua/files/proftpd.sql</a><br />\n Распознаётся muff.kiev.ua... 195.3.159.250<br />\n Устанавливается соединение с muff.kiev.ua|195.3.159.250|:80... соединение установлено.<br />\n Запрос HTTP послан, ожидается ответ... 200 OK<br />\n Длина: 1 710 (1,7K) [text/plain]</div>\n<div class=\"rtejustify\">&nbsp;</div>\n<div class=\"rtejustify\">100%[===============================================&gt;] 1 710&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --.--K/s</div>\n<div class=\"rtejustify\">&nbsp;</div>\n<div class=\"rtejustify\">17:43:01 (14,83 MB/s) - `proftpd.sql\' сохранён [1710/1710]</div>\n<div class=\"rtejustify\"><strong># mysql -u proftpd -p proftpd &lt; proftpd.sql<br />\n </strong>Enter password:</div>\n</td>\n</tr>\n</tbody>\n</table>\n<p class=\"rtejustify\">&nbsp;Далее создадим каталог и тестового пользователя FTP, указав директорией пользователя созданный каталог:</p>\n<table border=\"1\" cellspacing=\"1\" cellpadding=\"1\" width=\"100%\">\n<tbody>\n<tr>\n<td>\n<p class=\"rtejustify\"><strong># mkdir -p /var/ftp/test</strong><br />\n <strong># chown -R proftpd:proftpd /var/ftp/</strong><br />\n <strong># mysql -u proftpd -p</strong><br />\n Enter password:<br />\n Welcome to the MySQL monitor.&nbsp; Commands end with ; or \\g.<br />\n Your MySQL connection id is 74435 to server version: 4.1.22</p>\n<div class=\"rtejustify\">Type \'help;\' or \'\\h\' for help. Type \'\\c\' to clear the buffer.</div>\n<div class=\"rtejustify\">&nbsp;</div>\n<div class=\"rtejustify\">mysql&gt; <strong>INSERT INTO `proftpd`.`users` (`username` , `descr` , `password` , `uid` , `gid` , `homedir` , `shell` , `count`&nbsp; ) VALUES (\'test\', \'Test user\', ENCRYPT( \'<span style=\"color: #ff0000\">FTP-password_here</span>\' ) , \'<span style=\"color: #ff0000\">1050</span>\', \'<span style=\"color: #ff0000\">1050</span>\', \'<span style=\"color: #ff0000\">/var/ftp/test</span>\', NULL , \'0\' );</strong><br />\n Query OK, 1 row affected (0.00 sec)</div>\n<div class=\"rtejustify\">&nbsp;</div>\n<div class=\"rtejustify\">mysql&gt; <strong>quit</strong><br />\n Bye</div>\n</td>\n</tr>\n</tbody>\n</table>\n<p class=\"rtejustify\">&nbsp;Далее добавляем в /etc/rc.conf параметры запуска демона Proftpd:</p>\n<table border=\"1\" cellspacing=\"1\" cellpadding=\"1\" width=\"100%\">\n<tbody>\n<tr>\n<td class=\"rtejustify\"># <strong>echo \'# FTP\' &gt;&gt; /etc/rc.conf<br />\n </strong># <strong>echo \'proftpd_enable=&quot;YES&quot;\' &gt;&gt; /etc/rc.conf</strong></td>\n</tr>\n</tbody>\n</table>\n<p class=\"rtejustify\">Кажется ничего не забыли... Пытаемся запустить FTP-сервер:</p>\n<table border=\"1\" cellspacing=\"1\" cellpadding=\"1\" width=\"100%\">\n<tbody>\n<tr>\n<td class=\"rtejustify\"><strong># sh /usr/local/etc/rc.d/proftpd start<br />\n </strong>Starting proftpd.</td>\n</tr>\n</tbody>\n</table>\n<p class=\"rtejustify\">Теперь проверим,&nbsp;как функционирует наш FTP-сервер. Все ли в порядке, а то всякое может быть ;)</p>\n<p class=\"rtejustify\">Для начала попробуем приконектиться на 21 порт:</p>\n<table border=\"1\" cellspacing=\"1\" cellpadding=\"1\" width=\"100%\">\n<tbody>\n<tr>\n<td>\n<p class=\"rtejustify\"><strong># telnet localhost 21</strong><br />\n Trying ::1...<br />\n Trying 127.0.0.1...<br />\n Connected to localhost<br />\n Escape character is \'^]\'.<br />\n 220 ProFTPD 1.3.2a Server (Local Ftp Server) [127.0.0.1]</p>\n<p class=\"rtejustify\"><strong>quit</strong><br />\n 221 Goodbye.<br />\n Connection closed by foreign host.</p>\n</td>\n</tr>\n</tbody>\n</table>\n<p class=\"rtejustify\">Отлично. Сервер успешно отвечает на запросы. Теперь попробуем залить файл на сервер:</p>\n<table border=\"1\" cellspacing=\"1\" cellpadding=\"1\" width=\"100%\">\n<tbody>\n<tr>\n<td>\n<div class=\"rtejustify\">Microsoft Windows XP [Версия 5.1.2600]</div>\n<div class=\"rtejustify\">(С) Корпорация Майкрософт, 1985-2001.</div>\n<div class=\"rtejustify\">C:\\&gt;<br />\n C:\\&gt;<strong>ftp x.x.x.x</strong></div>\n<div class=\"rtejustify\">Связь с x.x.x.x.</div>\n<div class=\"rtejustify\">220 ProFTPD 1.3.2a Server (Local Ftp Server) [x.x.x.x]<br />\n Пользователь (x.x.x.x:(none)): <strong>test</strong><br />\n 331 Password required for test<br />\n Пароль:<br />\n 230-You\'ve logged on&nbsp;1 times, test<br />\n 230 User test logged in<br />\n ftp&gt; <strong>binary</strong><br />\n 200 Type set to I<br />\n ftp&gt; <strong>put test.zip</strong><br />\n 200 PORT command successful<br />\n 150 Opening BINARY mode data connection for test.zip</div>\n<div class=\"rtejustify\">226 Transfer complete<br />\n ftp: 2406400 байт отправлено за 38,55 (сек) со скоростью 62,43 (КБ/сек).</div>\n<div class=\"rtejustify\">ftp&gt; <strong>quit</strong><br />\n 221 Goodbye.</div>\n</td>\n</tr>\n</tbody>\n</table>\n<p class=\"rtejustify\">Поздравляю. FTP-cервер успешно протестирован и готов к работе. Этого достаточно, для нормальной работы. Далее будут описаны некоторые расширения.</p>\n<p class=\"rtejustify\"><strong>SSL</strong></p>\n<p class=\"rtejustify\">Теперь займемся организацией TLS шифрования.</p>\n<p class=\"rtejustify\">Создадим (если не существует)&nbsp;каталог для хранения сертификатов:</p>\n<table border=\"1\" cellspacing=\"1\" cellpadding=\"1\" width=\"100%\">\n<tbody>\n<tr>\n<td>\n<p class=\"rtejustify\"># <strong>mkdir /etc/ssl/certs</strong></p>\n<p class=\"rtejustify\"># <strong>cd /etc/ssl/certs</strong></p>\n</td>\n</tr>\n</tbody>\n</table>\n<p class=\"rtejustify\">Сгенерируем SSL-сертификат:</p>\n<table border=\"1\" cellspacing=\"1\" cellpadding=\"1\" width=\"100%\">\n<tbody>\n<tr>\n<td class=\"rtejustify\"><strong># openssl req -new -x509 -days 365 -nodes -out /etc/ssl/certs/proftpd.cert.pem -keyout /etc/ssl/certs/proftpd.key.pem<br />\n </strong>Generating a 1024 bit RSA private key<br />\n ................................++++++<br />\n .......++++++<br />\n writing new private key to \'/etc/ssl/certs/proftpd.key.pem\'<br />\n -----<br />\n You are about to be asked to enter information that will be incorporated<br />\n into your certificate request.<br />\n What you are about to enter is what is called a Distinguished Name or a DN.<br />\n There are quite a few fields but you can leave some blank<br />\n For some fields there will be a default value,<br />\n If you enter \'.\', the field will be left blank.<br />\n -----<br />\n Country Name (2 letter code) [AU]:<strong>UA</strong><br />\n State or Province Name (full name) [Some-State]:<strong>Kiev Region</strong><br />\n Locality Name (eg, city) []:<strong>Kiev</strong><br />\n Organization Name (eg, company) [Internet Widgits Pty Ltd]:<strong>Somebody Organization Name</strong><br />\n Organizational Unit Name (eg, section) []:<strong>IT Department<br />\n </strong>Common Name (eg, YOUR name) []:<strong>ftp.domain.com</strong><br />\n Email Address []:<span class=\"spamspan\"><span class=\"u\">username</span> [at] <span class=\"d\">domain [dot] com</span><span class=\"t\"> (<strong><span class=\"spamspan\"><span class=\"u\">username</span> [at] <span class=\"d\">domain [dot] com</span></span></strong>)</span></span></td>\n</tr>\n</tbody>\n</table>\n<p class=\"rtejustify\">&nbsp;Lобавляем в&nbsp;/usr/local/etc/proftpd.conf следующую секцию:</p>\n<table border=\"1\" cellspacing=\"1\" cellpadding=\"1\" width=\"100%\">\n<tbody>\n<tr>\n<td>\n<p class=\"rtejustify\">&lt;IfModule mod_tls.c&gt;<br />\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TLSEngine on<br />\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TLSLog /var/log/proftpd/tls.log<br />\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TLSProtocol SSLv3<br />\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TLSOptions NoCertRequest<br />\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TLSRSACertificateFile /etc/ssl/certs/proftpd.cert.pem<br />\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TLSRSACertificateKeyFile /etc/ssl/certs/proftpd.key.pem<br />\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TLSVerifyClient on<br />\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TLSRequired off<br />\n &lt;/IfModule&gt;</p>\n</td>\n</tr>\n</tbody>\n</table>\n<p class=\"rtejustify\">Перезапускаем Proftpd и наслаждаемся результатом <img alt=\"\" src=\"http://muff.kiev.ua/modules/fckeditor/fckeditor/editor/images/smiley/msn/wink_smile.gif\" /></p>\n<hr />\n<p class=\"rtejustify\"><span style=\"color: #ff0000\"><strong>ВАЖНО!</strong></span></p>\n<ol>\n<li class=\"rtejustify\">На что следует обратить внимание, так это на то, что пароли следует криптовать, поскольку в опциях коннекта к базе тип запроса &quot;Crypt&quot;. Если добавляете пользователей с помощью PhpMyAdmin, то в поле напротив пароля выбираем функцию &quot;ENCRYPT&quot;.</li>\n<li class=\"rtejustify\">Идентификатор пользователя и групы proftpd у вас будет свой. Соответственно при добавлении пользователя необходимо использовать его. Определить UID&nbsp;можно следующим способом:<br />\n<table border=\"1\" cellspacing=\"1\" cellpadding=\"1\" width=\"100%\">\n<tbody>\n<tr>\n<td class=\"rtejustify\"><strong># cat /etc/passwd | grep proftpd</strong><br />\n proftpd:*:<span style=\"color: #ff0000\"><strong>1050</strong></span>:<span style=\"color: #ff0000\"><strong>1050</strong></span>:FTP User:/home/proftpd:/usr/sbin/nologin</td>\n</tr>\n</tbody>\n</table>\n</li>\n<li class=\"rtejustify\">Советую каждому пользователю назначать отдельный каталог. &quot;Выше&quot; своего каталога они не выйдут (опция DefaultRoot&nbsp;в конфигурационном файле).</li>\n</ol>\n<p class=\"rtejustify\">&nbsp;</p>\n', created = 1767585650, expire = 1767672050, headers = '', serialized = 0 WHERE cid = '2:5c48d6c9b98c3809e543d72d0323a795' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 112.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '2:0b301caadd1379d500a281da1bcc26ec' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: UPDATE cache_filter SET data = '<p>Стать классная, я по ней настраивал не один раз (автору отдельный респект). Но собирая в очередной раз напоролся на ошибку&nbsp;</p>\n<p><strong>Fatal: unknown configuration directive \'SQLConnectInfo\' on line 80 of \'/usr/local/etc/proftpd.conf\'</strong></p>\n<p>Немного погуглив выяснил, что&nbsp;&nbsp;с выходом версии 1.3.4, немного изменилась установка порта. Теперь mod_sql нужно ставить отдельно из портов.</p>\n<p>Помогла эта ссылка&nbsp;<a href=\"http://netspider.com.ua/index.php/2012/02/04/proftpd-1-3-4/\">http://netspider.com.ua/index.php/2012/02/04/proftpd-1-3-4/</a>&nbsp; .</p>\n<p>Если не сложно, подправте статью под новый вариант. Спасибо.</p>\n', created = 1767585650, expire = 1767672050, headers = '', serialized = 0 WHERE cid = '2:0b301caadd1379d500a281da1bcc26ec' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 112.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '2:b68bdae4bf69e5e9f8ecad2198042281' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: UPDATE cache_filter SET data = '<p>Если планы не изменятся, то должен на этой неделе сетапить ФТПшник, соответственно внесу изменения в статью.</p>\n<p>&nbsp;</p>\n', created = 1767585650, expire = 1767672050, headers = '', serialized = 0 WHERE cid = '2:b68bdae4bf69e5e9f8ecad2198042281' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 112.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '2:b1f58154e0889ad9e13f315115f79cf2' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: UPDATE cache_filter SET data = '<p>&nbsp;</p>\n<p>&nbsp;</p>\n', created = 1767585650, expire = 1767672050, headers = '', serialized = 0 WHERE cid = '2:b1f58154e0889ad9e13f315115f79cf2' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 112.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '2:c641f25eef1ff06af247048b1db2aeb9' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: UPDATE cache_filter SET data = '<p>При установке данной связки необходимо дополнительно устанавливать порт databases/proftpd-mod_sql_mysql<br />\nПри этом необходимо в конфиг добавить следующее</p>\n<p>\n<strong><em>LoadModule mod_sql.c<br />\nLoadModule mod_sql_mysql.c</em></strong></p>\n<p>&nbsp;</p>\n<p>Перезапустить сервис Proftpd и радоваться его работе...</p>\n', created = 1767585650, expire = 1767672050, headers = '', serialized = 0 WHERE cid = '2:c641f25eef1ff06af247048b1db2aeb9' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 112.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '2:07243fc0252056071eaa62af8c18d662' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: UPDATE cache_filter SET data = '<p class=\"rtecenter\"><a class=\"thickbox\" href=\"/files/imagepicker/1/wake_up_ua.png\"><img alt=\"Вставай, Україно!\" class=\"imgp_img\" src=\"/files/imagepicker/1/thumbs/wake_up_ua.png\" style=\"height:200px; width:150px\" /></a></p>\n', created = 1767585650, expire = 1767672050, headers = '', serialized = 0 WHERE cid = '2:07243fc0252056071eaa62af8c18d662' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 112.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '3:cc913d232116f0426090404133377d88' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '2:d9a86123bfcbc57878743027b584400b' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: UPDATE cache_filter SET data = '<p class=\"rtecenter\"><a href=\"http://muff.kiev.ua/rss.xml\"><img alt=\"RSS\" width=\"160\" height=\"60\" src=\"http://muff.kiev.ua/files/muf-rss.png\" /></a></p>\n', created = 1767585650, expire = 1767672050, headers = '', serialized = 0 WHERE cid = '2:d9a86123bfcbc57878743027b584400b' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 112.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '3:39649256b636e3d5ded656bc52bd8c01' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
Версия для печатиОтправить другу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 в конфигурационном файле).

 

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

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 и радоваться его работе...

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

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

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

Литература

Выражение Админа "завести нового пользователя" не означает смерть последнего на российских болотах.