Установка и конфигурирование защищенного FTP-SSL сервера

Сервис предлагается поднять на ProFTPd.
Собирать будем из исходников, так как в репозитарии собраны в основном «порезанные» версии.
Версия: 1.3.2b, последний стабильный релиз на 08.12.2009

Дополнительные модули:

mod_shaper — Необходимо скопировать mod_shaper.c в proftpd_src/contrib.
mod_sql
mod_ssl

Установка:

<div>wget ftp://ftp.proftpd.org/distrib/source/proftpd-1.3.2b.tar.bz2
 tar  xjf proftpd-1.3.2b.tar.bz2
 cd  proftpd-1.3.2b
 install_user=ftp install_group=ftp ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --disable-auth-file --disable-ipv6 --with-modules=mod_tls:mod_ctrls_admin:mod_sql:mod_sql_mysql:mod_shaper:mod_ifsession  --with-includes=/usr/include/mysql:/usr/include/openssl --with-libraries=/usr/lib/mysql:/usr/lib/openssl --enable-auth-pam=no --disable-ident  --enable-openssl --enable-timeout-login --enable-timeout-ident --enable-ctrls --enable-nls
 make
 make install
 cp  contrib/dist/rpm/proftpd.init.d /etc/init.d/ftpd
 chmod  +x /etc/init.d/ftpd
 mysqlimport -u ftpd -p ftpd /usr/src/proftpd.sql
 chmod 777 /srv/ftp
 chown ftp:ftp /srv/ftp</div>

Структура SQL в файле: /usr/src/proftpd.sql

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

 --
 -- База данных: `vsftpd`
 --

 -- --------------------------------------------------------

 --
 -- Структура таблицы `groups`
 --

 CREATE TABLE IF NOT EXISTS `groups` (
 `groupname` varchar(30) NOT NULL,
 `gid` int(11) NOT NULL DEFAULT '0',
 `members` varchar(255) DEFAULT NULL
 ) ENGINE=MyISAM DEFAULT CHARSET=utf8;

 -- --------------------------------------------------------

 --
 -- Структура таблицы `quotalimits`
 --

 CREATE TABLE IF NOT EXISTS `quotalimits` (
 `name` varchar(30) DEFAULT NULL,
 `quota_type` enum('user','group','class','all') NOT NULL DEFAULT 'user',
 `per_session` enum('false','true') NOT NULL DEFAULT 'false',
 `limit_type` enum('soft','hard') NOT NULL DEFAULT 'soft',
 `bytes_in_avail` float NOT NULL  DEFAULT '0',
 `bytes_out_avail` float NOT NULL  DEFAULT '0',
 `bytes_xfer_avail` float NOT NULL  DEFAULT '0',
 `files_in_avail` int(10) UNSIGNED NOT NULL DEFAULT '0',
 `files_out_avail` int(10) UNSIGNED NOT NULL DEFAULT '0',
 `files_xfer_avail` int(10) UNSIGNED NOT NULL DEFAULT '0'
 ) ENGINE=MyISAM DEFAULT CHARSET=utf8;

 -- --------------------------------------------------------

 --
 -- Структура таблицы `quotatallies`
 --

 CREATE TABLE IF NOT EXISTS `quotatallies` (
 `name` varchar(30) NOT NULL,
 `quota_type` enum('user','group','class','all') NOT NULL DEFAULT 'user',
 `bytes_in_used` float NOT NULL  DEFAULT '0',
 `bytes_out_used` float NOT NULL  DEFAULT '0',
 `bytes_xfer_used` float NOT NULL  DEFAULT '0',
 `files_in_used` int(10) UNSIGNED NOT NULL DEFAULT '0',
 `files_out_used` int(10) UNSIGNED NOT NULL DEFAULT '0',
 `files_xfer_used` int(10) UNSIGNED NOT NULL DEFAULT '0'
 ) ENGINE=MyISAM DEFAULT CHARSET=utf8;

 -- --------------------------------------------------------

 --
 -- Структура таблицы `users`
 --

 CREATE TABLE IF NOT EXISTS `users` (
 `userid` varchar(30) NOT NULL,
 `passwd` varchar(80) NOT NULL,
 `uid` int(11) DEFAULT NULL,
 `gid` int(11) DEFAULT NULL,
 `homedir` varchar(255) DEFAULT NULL,
 `shell` varchar(255) DEFAULT NULL,
 UNIQUE KEY `userid` (`userid`)
 ) ENGINE=MyISAM DEFAULT CHARSET=utf8;

Содержание конфигурационного файла /etc/proftpd.conf:

</pre>
<div># This is a basic ProFTPD configuration file  (rename it to
 #  'proftpd.conf' for actual use.  It establishes a single server
 # and a  single anonymous login.  It assumes that you have a user/group
 # "nobody"  and "ftp" for normal operation and anon.

 ServerName                      "FTPd  server"
 ServerIdent                     on "Welcome  to FTPd server"
 ServerAdmin                     linux-team@vester.ru
 ServerType                      standalone
 DefaultServer                   on

 ListOptions                     "-a"

 AllowRetrieveRestart            on
 AllowStoreRestart               on
 AllowOverwrite                  on

 TimeoutIdle 600
 TimeoutNoTransfer 300
 TimeoutSession 0

 TimesGMT off

 IdentLookups                    off
 UseReverseDNS                   off

 #Umask                            0007 0007
 Umask                           0027 0027

 # Port 21  is the standard FTP port.
 Port                            21
 #PassivePorts                     60000 60100

 # Umask 022  is a good standard umask to prevent new dirs and files
 # from  being group and world writable.
 #Umask                            022

 # To  prevent DoS attacks, set the maximum number of child processes
 # to 30.   If you need to allow more than 30 concurrent connections
 # at once,  simply increase this value.  Note that this ONLY works
 # in  standalone mode, in inetd mode you should use an inetd server
 # that  allows you to limit maximum number of processes per service
 # (such as  xinetd).
 MaxInstances                    70
 MaxClientsPerUser               8
 MaxClientsPerHost               5
 MaxClients                      70

 # To  prevent DoS attacks, numbers of logins
 MaxLoginAttempts                5

 # Set the  user and group under which the server will run.
 User                            ftp
 Group                           ftp

 # To cause  every FTP user to be "jailed" (chrooted) into their home
 #  directory, uncomment this line.
 DefaultRoot ~
 #!staff

 # Normally,  we want files to be overwriteable.
 AllowOverwrite          on

 # Bar use  of SITE CHMOD by default
 <Limit  SITE_CHMOD>
 DenyAll
 </Limit>

 ###########################################################################
 SQLAuthTypes            Plaintext
 SQLAuthenticate         users groups usersetfast groupsetfast
 SQLConnectInfo          ftpd_db@localhost ftpd_user ftpd_password
 SQLMinUserUID           500
 SQLMinUserGID           24
 SQLDefaultUID           40
 SQLDefaultGID           49

 #mysql>  show fields from users;
 #+---------+--------------+------+-----+---------+-------+
 #| Field   |  Type         | Null | Key | Default | Extra |
 #+---------+--------------+------+-----+---------+-------+
 #| userid   | varchar(30)  |      | PRI |         |       |
 #| passwd   | varchar(80)  |      |     |         |       |
 #| uid     |  int(11)      | YES  | MUL | NULL    |       |
 #| gid     |  int(11)      | YES  |     | NULL    |       |
 #| homedir |  varchar(255) | YES  |     | NULL    |       |
 #| shell   |  varchar(255) | YES  |     | NULL    |       |
 #+---------+--------------+------+-----+---------+-------+
 SQLUserInfo             users userid passwd uid gid homedir shell

 #mysql>  show fields from groups;
 #+-----------+--------------+------+-----+---------+-------+
 #| Field      | Type         | Null | Key | Default | Extra |
 #+-----------+--------------+------+-----+---------+-------+
 #|  groupname | varchar(30)  |      |     |         |       |
 #| gid        | int(11)      |      |     | 0       |       |
 #| members    | varchar(255) | YES  |     | NULL    |       |
 #+-----------+--------------+------+-----+---------+-------+
 SQLGroupInfo groups  groupname gid members

 #  SQLLogFile              /var/log/proftpd/sql.log

 RequireValidShell off

 #------------------------mysql

 # Charset

 <IfModule  mod_lang.c>
 UseEncoding utf8 cp1251
 </IfModule>

 #CharsetLocal  UTF-8
 #CharsetRemote  CP1251
 #ICONV_LOCAL  CP1251
 #ICONV_REMOTE  CP1251
 #
 # Logging  options
 #
 TransferLog                 /var/log/proftpd/xferlog

 # Some  logging formats
 #
 LogFormat            default "%t %h  %l %u \"%r\" %s %b"
 LogFormat            auth    "%t %h  %v [%P] \"%r\" %s"
 LogFormat            write   "%t %h %l %u  \"%r\" %s %b"

 # Log  file/dir access
 ExtendedLog                 /var/log/proftpd/access_log    WRITE,READ write

 # Record  all logins
 ExtendedLog                 /var/log/proftpd/auth_log      AUTH auth

 # Paranoia  logging level....
 ExtendedLog                 /var/log/proftpd/paranoid_log  ALL default

 #########################################################################
 <Anonymous  /srv/ftp/ANONIMOUS>
 # Allow  logins if they are disabled above.
 <Limit  LOGIN>
 DenyAll
 #AllowAll
 </Limit>

 # Maximum  clients with message
 MaxClients                    3  "Sorry, max %m users -- try again  later"

 User                          ftp
 Group                         ftp
 # We want  clients to be able to login with "anonymous" as well as "ftp"
 UserAlias                     anonymous ftp

 # Limit  WRITE everywhere in the anonymous chroot
 <Limit  WRITE>
 DenyAll
 </Limit>

 # An  upload directory that allows storing files but not retrieving
 # or  creating directories.
 <Directory  uploads/*>
 <Limit  READ>
 DenyAll
 </Limit>

 <Limit  STOR>
 DenyAll
 </Limit>
 </Directory>

 <Directory  /srv/ftp/ANONIMOUS/Vester>
 <Limit  DIRS READ>
 DenyAll
 #Order  allow,deny
 #Allow  from 10.0.0.0/8,192.168.0.0/16,172.16.0.0/12,195.242.142.0/23
 #Deny  from all
 </Limit>
 </Directory>

 </Anonymous>

 #ControlsEngine         on
 #ControlsACLs           all allow user root
 #ControlsMaxClients     2
 #ControlsLog            /var/log/proftpd/controls.log
 #ControlsInterval       5
 #ControlsSocketACL      allow user root

 #############################################################
 ### USERs  marketing
 #       ShaperEngine off
 #DebugLevel  10

 <Directory  /WWWs/sp>
 Umask 0007 0007
 </Directory></div>
<pre>

Добавление функционала SSL/TLS (FTPs)

Проверяем доступные методы шифрования

</pre>
<div>[root@bordeaux2 tls]# openssl ciphers -v</div>
<div>

Создаем self-designed сертификат:

</pre>
<div>[root@bordeaux2 ~]# cd /etc/proftpd/
 <bash>

 <bash>
 [root@bordeaux2  proftpd]# vim ftp.cnf

 ----- BEGIN:ftp.cnf -----
 # create  RSA certs - Server
 RANDFILE = ./openssl.rnd

 [ req ]
 default_bits = 1024
 encrypt_key = yes
 distinguished_name = req_dn
 x509_extensions = cert_type

 [  req_dn ]
 countryName = Country Name (2  letter code)
 countryName_default = NO

 stateOrProvinceName             = State or Province Name (full name)
 stateOrProvinceName_default     = Kaliningrad

 localityName                    = Locality Name (eg, city)
 localityName_default            = Kaliningrad

 organizationName                = Organization Name (eg, company)
 organizationName_default        = Vester Ltd.

 organizationalUnitName          = Organizational Unit Name (eg, section)
 organizationalUnitName_default  = ftps.vester.ru

 commonName                      = Common Name (FQDN of your server)
 commonName_default              = ftps.vester.ru

 emailAddress                    = Email Address
 emailAddress_default            = linux-team@vester.ru

 [  cert_type ]
 nsCertType = server
 ----- END:ftp.cnf -----</div>
<div>
/usr/bin/openssl req -new -x509 -days  365 -nodes \
 -config ./ftp.cnf -out /etc/proftpd/proftps.pem \
 -keyout /etc/proftpd/proftps.pem
/usr/bin/openssl gendh 1024 >> /etc/proftpd/proftps.pem
/usr/bin/openssl x509 -subject -dates -fingerprint  -noout -in /etc/proftpd/proftps.pem

Проверяем валидность сертификата:

[root@bordeaux2 ~]# openssl verify  /etc/proftpd/proftps.pem

 /etc/proftpd/proftps.pem: /C=RU/ST=Kaliningrad/L=Kaliningrad/O=Vester Ltd./OU=ftps.vester.ru/CN=ftps.vester.ru/emailAddress=linux-team@vester.ru
 error 18 at 0 depth  lookup:self signed certificate
 OK

Вносим изменения в конфигурационный файл ProFTPd сервера:

</pre>
</pre>
</pre>
</pre>
<div># TLS/SSL over FTP mod
 <IfModule  mod_tls.c>
 TLSEngine on
 TLSLog /var/log/proftpd/ftps.log

 #  Support both SSLv3 and TLSv1
 TLSProtocol SSLv3 TLSv1

 # Are  clients required to use FTP over TLS when talking to this server?
 TLSRequired off

 #  Server's certificate
 TLSRSACertificateFile /etc/proftpd/proftps.pem
 TLSRSACertificateKeyFile /etc/proftpd/proftps.pem

 # CA  the server trusts
 TLSCACertificateFile /etc/proftpd/proftps.pem

 #  Authenticate clients that want to use FTP over TLS?
 TLSVerifyClient off

 # Allow  SSL/TLS renegotiations when the client requests them, but
 # do  not force the renegotations.  Some clients do not support
 #  SSL/TLS renegotiations; when mod_tls forces a renegotiation, these
 #  clients will close the data connection, or there will be a timeout
 # on an  idle data connection.
 TLSRenegotiate required off

 </IfModule></div>
<pre>
<pre>
<pre>
<pre>

Проверяем работу FTPs:

<div>[root@bordeaux2 proftpd]# openssl s_client -connect  127.0.0.1:21 -starttls ftp</div>

При правильной настройке видим следующее:


CONNECTED(00000003)
 depth=0 /C=RU/ST=Kaliningrad/L=Kaliningrad/O=Vester Ltd./OU=ftps.vester.ru/CN=ftps.vester.ru/emailAddress=linux-team@vester.ru
 verify error:num=18:self signed certificate
 verify return:1
 depth=0 /C=RU/ST=Kaliningrad/L=Kaliningrad/O=Vester Ltd./OU=ftps.vester.ru/CN=ftps.vester.ru/emailAddress=linux-team@vester.ru
 verify return:1
 ---
 Certificate chain
 0 s:/C=RU/ST=Kaliningrad/L=Kaliningrad/O=Vester Ltd./OU=ftps.vester.ru/CN=ftps.vester.ru/emailAddress=linux-team@vester.ru
 i:/C=RU/ST=Kaliningrad/L=Kaliningrad/O=Vester Ltd./OU=ftps.vester.ru/CN=ftps.vester.ru/emailAddress=linux-team@vester.ru
 ---
 Server certificate
 -----BEGIN CERTIFICATE-----
 MIIC4TCCAkqgAwIBAgIJAI2/WFO6AiKyMA0GCSqGSIb3DQEBBQUAMIGmMQswCQYD
 VQQGEwJSVTEUMBIGA1UECBMLS2FsaW5pbmdyYWQxFDASBgNVBAcTC0thbGluaW5n
 cmFkMRQwEgYDVQQKEwtWZXN0ZXIgTHRkLjEXMBUGA1UECxMOZnRwcy52ZXN0ZXIu
 cnUxFzAVBgNVBAMTDmZ0cHMudmVzdGVyLnJ1MSMwIQYJKoZIhvcNAQkBFhRsaW51
 eC10ZWFtQHZlc3Rlci5ydTAeFw0wOTEyMDgwOTIxMzlaFw0xMDEyMDgwOTIxMzla
 MIGmMQswCQYDVQQGEwJSVTEUMBIGA1UECBMLS2FsaW5pbmdyYWQxFDASBgNVBAcT
 C0thbGluaW5ncmFkMRQwEgYDVQQKEwtWZXN0ZXIgTHRkLjEXMBUGA1UECxMOZnRw
 cy52ZXN0ZXIucnUxFzAVBgNVBAMTDmZ0cHMudmVzdGVyLnJ1MSMwIQYJKoZIhvcN
 AQkBFhRsaW51eC10ZWFtQHZlc3Rlci5ydTCBnzANBgkqhkiG9w0BAQEFAAOBjQAw
 gYkCgYEA3tR/tjEKgrxjFtGypLCoBCvaVERkIOd4Bx2rFdiuTvbt/DIeVe5hLUkp
 Y94TTwhWqfBVpPmaMZLwLmmqnQdJ4W1HVJHRLRTRrzzYa8E+cBVZEcaOTQ4umFtK
 Nlrny9lkd3E4zkLwx0a5rnP+1NPdnXlgF4nj8QrK2VphXZOy6D0CAwEAAaMVMBMw
 EQYJYIZIAYb4QgEBBAQDAgZAMA0GCSqGSIb3DQEBBQUAA4GBAHqIPvmH+av9Ne/7
 RZ1szCX4H21Gt22JFeSEMmii9oCJh0fQNc5qFT2f6OTwsaQaZ80JS+zRvrnZzWAL
 eT0RJ7mxFh2h+oPM3gL3lFoWm2A2cGw16pyAgBLO5TpVLMZhZwWK9kiG5p+y51uW
 ZO5Mp4dKeu5Y1O/DGNL+oMG6Tno4
 -----END CERTIFICATE-----
 subject=/C=RU/ST=Kaliningrad/L=Kaliningrad/O=Vester Ltd./OU=ftps.vester.ru/CN=ftps.vester.ru/emailAddress=linux-team@vester.ru
 issuer=/C=RU/ST=Kaliningrad/L=Kaliningrad/O=Vester Ltd./OU=ftps.vester.ru/CN=ftps.vester.ru/emailAddress=linux-team@vester.ru
 ---
 Acceptable client certificate CA names
 /C=RU/ST=Kaliningrad/L=Kaliningrad/O=Vester Ltd./OU=ftps.vester.ru/CN=ftps.vester.ru/emailAddress=linux-team@vester.ru
 ---
 SSL handshake has read 1547 bytes  and written 338 bytes
 ---
 New, TLSv1/SSLv3,  Cipher is DHE-RSA-AES256-SHA
 Server public key is 1024 bit
 Compression: NONE
 Expansion: NONE
 SSL-Session:
 Protocol  : TLSv1
 Cipher    : DHE-RSA-AES256-SHA
 Session-ID:  073853CF7C2760B43B8802FEDCD1805F6C853631B57F9CA4075CE519749BCF8E
 Session-ID-ctx:
 Master-Key:  8EBF2BD6C8548006F6A33CFD0B0A9BAD37138A6E0CEF6444C34E913722A312D0779FC6F154C5232D12C586F3B67C4715
 Key-Arg   : None
 Krb5 Principal: None
 Start Time: 1260264283
 Timeout   : 300 (sec)
 Verify return  code: 18 (self signed certificate)
 ---
 220 Welcome to Vester FTPd  server

Related posts:

  1. Asterisk – храним CDR в БД MySQL. Asterisk. Настройка. Статья#1. Складываем CDR в MySQL. Должны быть установлены...
  2. OpenVPN. Объединение филиалов и ЦО. Сегодня речь пойдет о использовании продукта OpenVPN для объединения нескольких...
  3. Безопасность Unix системы представляем: Fail2ban После того, как Ваш сервер становится объектом всяческих попыток несанкционированного...
  4. Настройка OpenVPN сервера на Linksys WRT54GL Настройка OpenVPN сервера на Linksys WRT54GL. Интересное решение для удаленного...
  5. Подготовка промышленного сервера на CentOS 5 Политика безопасности Этап: Физическая защита Отключение USB mass storage Права...
You can leave a response, or trackback from your own site.

Оставить комментарий

*