FTP-сервер на базе Proftpd — различия между версиями

Материал из megapuper
Перейти к: навигация, поиск
(Новая страница: «Озадачился я как-то поставить для любимых юзверей в локалке фтп-сервер, пусть думаю обме…»)
 
 
(не показана 21 промежуточная версия 2 участников)
Строка 2: Строка 2:
 
Чтоб там с пользователями, с записями в базу, с красивой статистикой и т.д. Выбор пал на proftpd. Задумано-сделано. Поехали.
 
Чтоб там с пользователями, с записями в базу, с красивой статистикой и т.д. Выбор пал на proftpd. Задумано-сделано. Поехали.
  
 +
Система FreeBSD 10.2<br/>
 +
Корневой каталог /ftp<br/>
 +
Ставить будем из пакетов(версия 1.3.5a):<br/>
 +
# pkg install proftpd proftpd-mod_sql_mysql-1.3.5a
  
Директорий будет две: '''download(read-only)''' и '''upload(read-write)''', корневая ftp.
 
 
Ставить будем из портов(версия 1.3.4a):
 
# cd /usr/ports/ftp/proftpd
 
# make install clean
 
  
 
Вносим в <code bash>/etc/rc.conf</code>:  
 
Вносим в <code bash>/etc/rc.conf</code>:  
Строка 13: Строка 12:
  
  
Cтартуем:
+
'''Вариант 1. Простейший<br/>'''
# ./proftpd start
 
Starting proftpd.
 
  - Fatal: UseIPv6: Use of the directive requires IPv6 support (--enable-ipv6) on line 19 of '/usr/local/etc/proftpd.conf'
 
 
 
 
 
Не айс. Вроде собирал без IPv6, ну да ладно, просто закомментим в конфиге строчку:
 
#UseIPv6 on
 
 
 
 
 
Дубль два:
 
# ./proftpd start
 
Starting proftpd.
 
- warning: unable to determine IP address of ' '
 
- error: no valid servers configured
 
- Fatal: error processing configuration file '/usr/local/etc/proftpd.conf'
 
 
 
 
 
Снова лезем в конфиг и добавляем:
 
DefaultAddress localhost
 
 
 
 
 
Дубль три:
 
# ./proftpd start
 
Starting proftpd.
 
- setting default address to 127.0.0.1
 
 
 
 
 
Всё стартануло. Проверяем.
 
# netstat -an | grep "*.21"
 
  tcp4 0 0 *.21 *.* LISTEN
 
Работает.
 
 
 
 
 
# proftpd -V - эта команда покажет где находятся конфиги и с какими модулями собран proftpd.
 
 
 
 
 
 
Рихтуем proftpd.conf под наши нужды:
 
Рихтуем proftpd.conf под наши нужды:
 
  ServerName                      "My FTP server"
 
  ServerName                      "My FTP server"
Строка 89: Строка 52:
 
   
 
   
 
  <Anonymous /ftp>
 
  <Anonymous /ftp>
    User                        ftp
+
  User                        ftp
    Group                        ftp
+
  Group                        ftp
 
   
 
   
 
  UserAlias                      anonymous ftp
 
  UserAlias                      anonymous ftp
 
  MaxClients                      10
 
  MaxClients                      10
+
 
<Directory /ftp>
+
Добавляем пользователя '''ftp''' для анонимного входа(без пароля)
        <Limit DELE RMD>
+
  # pw useradd ftp -s /usr/sbin/nologin
                DenyAll
+
В принципе всё. Для простейшего случая, с анонимным пользователем этого достаточно. Можно юзать.
        </Limit>
 
</Directory>
 
 
 
<Directory /ftp/download>
 
        <Limit WRITE DELE RMD MKD>
 
                DenyAll
 
        </Limit>
 
</Directory>
 
 
  <Directory /ftp/upload>
 
        <Limit WRITE MKD>
 
                AllowAll
 
        </Limit>
 
 
 
        <Limit DELE RMD>
 
                DenyAll
 
        </Limit>
 
</Directory>
 
 
</Anonymous>
 
  
  
С помощью '''adduser''' добавляем пользователя '''ftp''' для анонимного входа(без пароля).
+
Теперь переходим к дальнейшей настройке сервера и остальным рюшечкам.  
В принципе всё. Для простейшего случая, с единственным анонимным пользователем этого достаточно. Можно юзать.  
 
  
  
Теперь переходим к дальнейшей настройке сервера и остальным рюшечкам.  
+
'''Вариант 2. Авторизация из файла'''<br/>
 +
Пользователей можно заводить с помощью утилиты ftpasswd.
 +
Заводим юзверя или группу таким образом:(почему-то заводится только в папке в которой находимся)
 +
# ftpasswd --passwd --name ftp_user --file /usr/local/etc/proftpd/ftpd.passwd --uid 2000 --gid 2001 --home /ftp --shell /bin/false
 +
# ftpasswd --group --name ftp_group –-file /usr/local/etc/proftpd/ftpd.group --gid 2001 --member ftp_user
  
  
'''Вариант 1. Авторизация из файла'''<br/>
+
В дальнейшем сменить пароль можно командой:
Пользователей можно заводить с помощью утилиты ftpasswd. Взять её можно в архиве <code bash>/usr/ports/distfiles/proftpd-1.3.3.tar.bz2 /contrib</code>
+
  # ftpasswd --passwd --name=ftp_user --change-password --file=/usr/local/etc/proftpd/ftpd.passwd
Запускаем и заводим юзверя или группу таким образом:  
 
  # ftpasswd --passwd --name ftp_user --file /etc/proftpd/ftpd.passwd --uid 2000 --gid 2001 --home /ftp --shell /bin/false
 
# ftpasswd --group --name ftp_group –-file /etc/proftpd/ftpd.group --gid 2001 --member ftp_user
 
  
  
 
в proftpd.conf добавляем:  
 
в proftpd.conf добавляем:  
  AuthUserFile  /etc/proftpd/ftpd.passwd
+
  AuthUserFile  /usr/local/etc/proftpd/ftpd.passwd
  uthGroupFile /etc/proftpd/ftpd.group
+
  AuthGroupFile /usr/local/etc/proftpd/ftpd.group
  
  
Ну и собственно права для папок (предварительно завёл пользователя boss).  
+
Ну и собственно примерные права для папок(предварительно заведём пользователя boss).
 
  <Directory /ftp/download>
 
  <Directory /ftp/download>
 
         <Limit WRITE DELE RMD MKD>
 
         <Limit WRITE DELE RMD MKD>
Строка 157: Строка 100:
 
  </Directory>
 
  </Directory>
  
 +
Итоговый конфиг<br/>
 +
<spoiler>
 +
ServerName                      "Megapuper FTP Server"
 +
ServerType                      standalone
 +
DefaultServer                  on
 +
ScoreboardFile                  /var/run/proftpd/proftpd.scoreboard
 +
DefaultAddress                  localhost
 +
Port                            21
 +
PassivePorts                    60000 65000
 +
Umask                          022
 +
MaxInstances                    30
 +
CommandBufferSize              512
 +
AllowOverwrite                  on
 +
AllowRetrieveRestart            on
 +
AllowStoreRestart              on
 +
TimeoutNoTransfer              300
 +
User                            nobody
 +
Group                          nogroup
 +
 +
### Security
 +
AllowForeignAddress            off
 +
DenyFilter                      \*.*/
 +
MaxClientsPerHost              2 "The %m client are already connected from your host, it is not authorized any more"
 +
MaxLoginAttempts                5 "It is too much attempts to enter "
 +
PathDenyFilter                  "(^\.ftpaccess$)"
 +
RequireValidShell              off
 +
 +
### Logs
 +
DebugLevel                      1
 +
TransferLog                    /var/log/proftpd/proftpd-transfer.log
 +
ExtendedLog                    /var/log/proftpd/proftpd-extended.log
 +
SystemLog                      /var/log/proftpd/proftpd-system.log
 +
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"
 +
 +
<IfModule mod_lang.c>
 +
  UseEncoding utf8 cp1251
 +
</IfModule>
 +
 +
AuthUserFile  /usr/local/etc/ftpd.passwd
 +
AuthGroupFile  /usr/local/etc/ftpd.group
 +
 +
DefaultRoot    /ftp
 +
 +
<Anonymous /ftp>
 +
    User                        ftp
 +
    Group                        ftp
 +
 +
UserAlias                      anonymous ftp
 +
MaxClients                      10
 +
 +
<Directory /ftp>
 +
        <Limit DELE RMD MKD>
 +
                DenyAll
 +
        </Limit>
 +
</Directory>
 +
 +
<Directory /ftp/download>
 +
        <Limit WRITE DELE RMD MKD>
 +
              DenyAll
 +
        </Limit>
 +
</Directory>
 +
 +
<Directory /ftp/upload>
 +
        <Limit WRITE MKD>
 +
              AllowAll
 +
        </Limit>
 +
 +
        <Limit DELE RMD>
 +
              DenyAll
 +
        </Limit>
 +
</Directory>
 +
 +
</Anonymous>
 +
</spoiler>
  
 
'''Вариант 2. Авторизация из MySQL и админка'''<br/>
 
'''Вариант 2. Авторизация из MySQL и админка'''<br/>
Строка 162: Строка 181:
  
 
Создаём базу proftpd:
 
Создаём базу proftpd:
  mysql> create database proftpd;
+
  mysql> create database proftpd character set utf8 collate utf8_general_ci;
  
  
 
Заводим пользователя proftpd
 
Заводим пользователя proftpd
  mysql> grant all on proftpd.* to proftpd@localhost identified by 'password';
+
  mysql> grant all on proftpd.* to proftpd@localhost identified by '<font color=blue>ПАРОЛЬ</font>';
 
 
 
 
В конфиг добавляем следующее:
 
LoadModule              mod_sql.c
 
LoadModule              mod_sql_mysql.c
 
SQLBackend              mysql
 
#В каком виде хранятся пароли, в данном случае - открытым текстом
 
#SQLAuthTypes            backend
 
SQLAuthTypes            Plaintext
 
SQLAuthenticate        users
 
 
SQLConnectInfo          proftpd@localhost:3306 proftpd password
 
SQLLogFile              /var/log/proftpd/proftpd_mysql.log
 
SQLUserInfo            `users` `userid` `passwd` `uid` `gid` `homedir` `shell`
 
 
SQLLog          PASS            counter_login
 
SQLLog          ERR_PASS        counter_err
 
SQLLog          RETR,STOR      log_story_transfer
 
SQLLOG          ERR_RETR,ERR_STOR,ERR_DELE,ERR_RMD,ERR_RNTO log_err_modify
 
 
SQLNamedQuery  counter_login          UPDATE "`last_login`=UNIX_TIMESTAMP(),`count`=`count`+1 WHERE `userid`='%u'" `users`
 
SQLNamedQuery  counter_err            UPDATE "`last_err_login`=UNIX_TIMESTAMP(),`err_login_count`=`err_login_count`+1 WHERE `userid`='%U'" `users`
 
SQLNamedQuery  log_story_transfer      INSERT "'',UNIX_TIMESTAMP(),'%u','%f', '%b', '%h','%a', '%m', '%T'"`xfer_table`
 
SQLNamedQuery  log_err_modify          INSERT "'',UNIX_TIMESTAMP(),'%u', '%f', '%h','%a', '%m'" `xfer_errors`
 
 
 
  
  
 +
Создаём таблицы
 
  CREATE TABLE IF NOT EXISTS `users` (
 
  CREATE TABLE IF NOT EXISTS `users` (
   `userid` varchar(30) CHARACTER SET cp1251 COLLATE cp1251_bin NOT NULL COMMENT '',
+
   `userid` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
   `name` varchar(255) DEFAULT NULL COMMENT '',
+
   `name` varchar(255) DEFAULT NULL,
   `mail` varchar(255) CHARACTER SET cp1251 COLLATE cp1251_bin NOT NULL COMMENT '',
+
   `mail` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
 
   `uid` int(11) DEFAULT '2000',
 
   `uid` int(11) DEFAULT '2000',
 
   `gid` int(11) DEFAULT '2001',
 
   `gid` int(11) DEFAULT '2001',
   `passwd` varchar(120) CHARACTER SET cp1251 COLLATE cp1251_bin NOT NULL COMMENT '',
+
   `passwd` varchar(120) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
   `shell` varchar(30) CHARACTER SET cp1251 COLLATE cp1251_bin NOT NULL DEFAULT '/bin/nonexistent',
+
   `shell` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '/bin/nonexistent',
   `homedir` varchar(255) CHARACTER SET cp1251 COLLATE cp1251_bin NOT NULL DEFAULT '/ftp' COMMENT '',
+
   `homedir` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '/ftp',
   `note` text CHARACTER SET cp1251 COLLATE cp1251_bin,
+
   `note` text CHARACTER SET utf8 COLLATE utf8_general_ci,
 
   `last_login` int(15) NOT NULL,
 
   `last_login` int(15) NOT NULL,
   `count` int(11) NOT NULL DEFAULT '0' COMMENT '',
+
   `count` int(11) NOT NULL DEFAULT '0',
 
   `last_err_login` int(15) NOT NULL,
 
   `last_err_login` int(15) NOT NULL,
 
   `err_login_count` int(15) NOT NULL,
 
   `err_login_count` int(15) NOT NULL,
   `admin` int(1) NOT NULL DEFAULT '0' COMMENT '',
+
   `admin` int(1) NOT NULL DEFAULT '0',
   `closed` int(1) NOT NULL DEFAULT '1' COMMENT '',
+
   `closed` int(1) NOT NULL DEFAULT '1',
   `groupname` varchar(24) DEFAULT 'unregistered' COMMENT '',
+
   `groupname` varchar(24) DEFAULT 'unregistered',
 
   PRIMARY KEY (`userid`),
 
   PRIMARY KEY (`userid`),
 
   KEY `groupname` (`groupname`),
 
   KEY `groupname` (`groupname`),
Строка 218: Строка 213:
 
   KEY `passwd` (`passwd`),
 
   KEY `passwd` (`passwd`),
 
   KEY `name` (`name`)
 
   KEY `name` (`name`)
  ) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
+
  ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
 
    
 
    
 
  CREATE TABLE IF NOT EXISTS `xfer_errors` (
 
  CREATE TABLE IF NOT EXISTS `xfer_errors` (
 
   `unic_id` int(32) NOT NULL AUTO_INCREMENT,
 
   `unic_id` int(32) NOT NULL AUTO_INCREMENT,
 
   `timestamp` int(15) NOT NULL,
 
   `timestamp` int(15) NOT NULL,
   `user_name` varchar(64) COLLATE cp1251_bin NOT NULL,
+
   `user_name` varchar(64) COLLATE utf8_general_ci NOT NULL,
   `file_and_path` tinytext COLLATE cp1251_bin NOT NULL,
+
   `file_and_path` tinytext COLLATE utf8_general_ci NOT NULL,
   `client_name` varchar(127) COLLATE cp1251_bin NOT NULL,
+
   `client_name` varchar(127) COLLATE utf8_general_ci NOT NULL,
   `client_IP` varchar(15) COLLATE cp1251_bin NOT NULL,
+
   `client_IP` varchar(15) COLLATE utf8_general_ci NOT NULL,
   `client_command` varchar(5) COLLATE cp1251_bin NOT NULL,
+
   `client_command` varchar(5) COLLATE utf8_general_ci NOT NULL,
 
   PRIMARY KEY (`unic_id`),
 
   PRIMARY KEY (`unic_id`),
 
   KEY `user_name` (`user_name`),
 
   KEY `user_name` (`user_name`),
Строка 233: Строка 228:
 
   KEY `client_IP` (`client_IP`),
 
   KEY `client_IP` (`client_IP`),
 
   KEY `client_command` (`client_command`)
 
   KEY `client_command` (`client_command`)
  ) ENGINE=MyISAM DEFAULT CHARSET=cp1251 COLLATE=cp1251_bin;
+
  ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
 
    
 
    
 
  CREATE TABLE IF NOT EXISTS `xfer_table` (
 
  CREATE TABLE IF NOT EXISTS `xfer_table` (
 
   `unic_id` int(32) NOT NULL AUTO_INCREMENT,
 
   `unic_id` int(32) NOT NULL AUTO_INCREMENT,
 
   `timestamp` int(15) NOT NULL,
 
   `timestamp` int(15) NOT NULL,
   `user_name` varchar(64) COLLATE cp1251_bin NOT NULL,
+
   `user_name` varchar(64) COLLATE utf8_general_ci NOT NULL,
   `file_and_path` tinytext COLLATE cp1251_bin NOT NULL,
+
   `file_and_path` tinytext COLLATE utf8_general_ci NOT NULL,
 
   `bytes` int(15) NOT NULL DEFAULT '0',
 
   `bytes` int(15) NOT NULL DEFAULT '0',
   `client_name` varchar(127) COLLATE cp1251_bin NOT NULL,
+
   `client_name` varchar(127) COLLATE utf8_general_ci NOT NULL,
   `client_IP` varchar(15) COLLATE cp1251_bin NOT NULL,
+
   `client_IP` varchar(15) COLLATE utf8_general_ci NOT NULL,
   `client_command` varchar(5) COLLATE cp1251_bin NOT NULL,
+
   `client_command` varchar(5) COLLATE utf8_general_ci NOT NULL,
   `send_time` varchar(9) COLLATE cp1251_bin NOT NULL DEFAULT '0',
+
   `send_time` varchar(9) COLLATE utf8_general_ci NOT NULL DEFAULT '0',
 
   PRIMARY KEY (`unic_id`),
 
   PRIMARY KEY (`unic_id`),
 
   KEY `timestamp` (`timestamp`),
 
   KEY `timestamp` (`timestamp`),
Строка 252: Строка 247:
 
   KEY `client_command` (`client_command`),
 
   KEY `client_command` (`client_command`),
 
   KEY `send_time` (`send_time`)
 
   KEY `send_time` (`send_time`)
  ) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 COLLATE=cp1251_bin;
+
  ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
 
    
 
    
 
  CREATE TABLE IF NOT EXISTS `quotalimits` (
 
  CREATE TABLE IF NOT EXISTS `quotalimits` (
Строка 266: Строка 261:
 
   `files_xfer_avail` int(10) unsigned NOT NULL DEFAULT '0',
 
   `files_xfer_avail` int(10) unsigned NOT NULL DEFAULT '0',
 
   PRIMARY KEY (`userid`)
 
   PRIMARY KEY (`userid`)
  ) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
+
  ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;
 
   
 
   
 
  CREATE TABLE IF NOT EXISTS `quotatallies` (
 
  CREATE TABLE IF NOT EXISTS `quotatallies` (
Строка 278: Строка 273:
 
   `files_xfer_used` int(10) unsigned NOT NULL DEFAULT '0',
 
   `files_xfer_used` int(10) unsigned NOT NULL DEFAULT '0',
 
   PRIMARY KEY (`userid`)
 
   PRIMARY KEY (`userid`)
  ) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
+
  ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;
  
 +
 +
В конфиг добавляем следующее:
 +
LoadModule              mod_sql.c
 +
LoadModule              mod_sql_mysql.c
 +
SQLBackend              mysql
 +
#В каком виде хранятся пароли, в данном случае - открытым текстом
 +
#SQLAuthTypes            backend
 +
SQLAuthTypes            Plaintext
 +
SQLAuthenticate        users
 +
 +
SQLConnectInfo          <font color=blue>USER</font>@localhost:3306 <font color=blue>DB</font> <font color=blue>PASSWORD</font>
 +
SQLLogFile              /var/log/proftpd/proftpd_mysql.log
 +
SQLUserInfo            `users` `userid` `passwd` `uid` `gid` `homedir` `shell`
 +
 +
SQLLog          PASS            counter_login
 +
SQLLog          ERR_PASS        counter_err
 +
SQLLog          RETR,STOR      log_story_transfer
 +
SQLLOG          ERR_RETR,ERR_STOR,ERR_DELE,ERR_RMD,ERR_RNTO log_err_modify
 +
 +
SQLNamedQuery  counter_login          UPDATE "`last_login`=UNIX_TIMESTAMP(),`count`=`count`+1 WHERE `userid`='%u'" `users`
 +
SQLNamedQuery  counter_err            UPDATE "`last_err_login`=UNIX_TIMESTAMP(),`err_login_count`=`err_login_count`+1 WHERE `userid`='%U'" `users`
 +
SQLNamedQuery  log_story_transfer      INSERT "NULL, UNIX_TIMESTAMP(), '%u', '%f', '%b', '%h', '%a', '%m', '%T'"`xfer_table`
 +
SQLNamedQuery  log_err_modify          INSERT "NULL, UNIX_TIMESTAMP(), '%u', '%f', '%h', '%a', '%m'" `xfer_errors`
 +
 +
 +
Итоговый(примерный) конфиг<br/>
 +
<spoiler>
 +
ServerName                      "Megapuper FTP Server"
 +
ServerType                      standalone
 +
DefaultServer                  on
 +
ScoreboardFile                  /var/run/proftpd/proftpd.scoreboard
 +
DefaultAddress                  localhost
 +
Port                            21
 +
PassivePorts                    60000 65000
 +
Umask                          022
 +
MaxInstances                    30
 +
CommandBufferSize              512
 +
AllowOverwrite                  on
 +
AllowRetrieveRestart            on
 +
AllowStoreRestart              on
 +
TimeoutNoTransfer              300
 +
User                            nobody
 +
Group                          nogroup
 +
 +
### Security
 +
AllowForeignAddress            off
 +
DenyFilter                      \*.*/
 +
MaxClientsPerHost              2 "The %m client are already connected from your host, it is not authorized any more"
 +
MaxLoginAttempts                20 "It is too much attempts to enter "
 +
PathDenyFilter                  "(^\.ftpaccess$)"
 +
RequireValidShell              off
 +
AuthPAM                        off
 +
 +
### Logs
 +
DebugLevel                      1
 +
#SQLLogFile                    /var/log/proftpd/proftpd_mysql.log
 +
TransferLog                    /var/log/proftpd/proftpd-transfer.log
 +
ExtendedLog                    /var/log/proftpd/proftpd-extended.log
 +
SystemLog                      /var/log/proftpd/proftpd-system.log
 +
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"
 +
 +
<IfModule mod_lang.c>
 +
  UseEncoding utf8 cp1251
 +
</IfModule>
 +
 +
### Auth from MySQL
 +
LoadModule              mod_sql.c
 +
LoadModule              mod_sql_mysql.c
 +
SQLBackend              mysql
 +
 +
SQLAuthTypes            Plaintext
 +
SQLAuthenticate        users
 +
SQLConnectInfo          proftpd@localhost:3306 proftpd ef445EFd3
 +
SQLUserInfo            `users` `userid` `passwd` `uid` `gid` `homedir` `shell`
 +
 +
SQLLog          PASS                                            counter_login
 +
SQLLog          ERR_PASS                                        counter_err
 +
SQLLog          RETR,STOR                                      log_story_transfer
 +
SQLLOG          ERR_RETR,ERR_STOR,ERR_DELE,ERR_RMD,ERR_RNTO    log_err_modify
 +
 +
SQLNamedQuery  counter_login          UPDATE "`last_login`=UNIX_TIMESTAMP(),`count`=`count`+1 WHERE `userid`='%u'" `users`
 +
SQLNamedQuery  counter_err            UPDATE "`last_err_login`=UNIX_TIMESTAMP(),`err_login_count`=`err_login_count`+1 WHERE `userid`='%U'" `users`
 +
SQLNamedQuery  log_story_transfer      INSERT "'',UNIX_TIMESTAMP(),'%u','%f', '%b', '%h','%a', '%m', '%T'" `xfer_table`
 +
SQLNamedQuery  log_err_modify          INSERT "'',UNIX_TIMESTAMP(),'%u', '%f', '%h','%a', '%m'" `xfer_errors`
 +
 +
DefaultRoot    /ftp
 +
 +
<Anonymous /ftp>
 +
    User                        ftp
 +
    Group                        ftp
 +
 +
UserAlias                      anonymous ftp
 +
MaxClients                      10
 +
 +
        <Limit LOGIN>
 +
                Order Allow,Deny
 +
                #комментим чтоб аноним коннектился только с локалки
 +
                #AllowAll
 +
                Allow from 192.168.0.
 +
                Deny from all
 +
        </Limit>
 +
 +
                <Directory /ftp>
 +
                        <Limit WRITE DELE RMD MKD>
 +
                        DenyAll
 +
                        </Limit>
 +
                </Directory>
 +
 +
                <Directory /ftp/upload>
 +
                        <Limit WRITE MKD>
 +
                        AllowAll
 +
                        </Limit>
 +
                        <Limit DELE RMD>
 +
                        DenyAll
 +
                        </Limit>
 +
                </Directory>
 +
</Anonymous>
 +
 +
<Directory /ftp>
 +
          <Limit WRITE DELE RMD MKD>
 +
                  DenyAll
 +
          </Limit>
 +
</Directory>
 +
 +
<Directory /ftp/upload>
 +
        <Limit WRITE MKD>
 +
                AllowAll
 +
                DenyAll
 +
        </Limit>
 +
        <Limit DELE RMD>
 +
                AllowUser finn
 +
                DenyAll
 +
        </Limit>
 +
</Directory>
 +
</spoiler>
  
 
Добавляем админа:  
 
Добавляем админа:  
 
  mysql> INSERT INTO `users` (`userid`, `name`, `mail`, `uid`, `gid`, `passwd`, `shell`, `homedir`, `note`, `last_login`, `count`, `last_err_login`, `err_login_count`, `admin`, `closed`, `groupname`) VALUES ('admin', 'admin',
 
  mysql> INSERT INTO `users` (`userid`, `name`, `mail`, `uid`, `gid`, `passwd`, `shell`, `homedir`, `note`, `last_login`, `count`, `last_err_login`, `err_login_count`, `admin`, `closed`, `groupname`) VALUES ('admin', 'admin',
  'admin@domain', 2000, 2001, 'password', '/bin/nonexistent', '/ftp', '', 0, 0, 0, 0, 1, 0, 'admin');
+
  'admin@domain', 2000, 2001, 'password', '/bin/nonexistent', '/ftp', 'admin', 0, 0, 0, 0, 1, 0, 'admin');
 
   
 
   
 
Делаем ему шифрованный пароль(если надо):
 
mysql> UPDATE users SET passwd=PASSWORD('password') WHERE name='admin';
 
 
  
 
Скачиваем архив proma.tar и кидаем его содержимое в нужный каталог веб-сервера. Вносим в <code bash>config.inc.php</code> параметры подключения к БД. Теперь можно залогиниться в админку.  
 
Скачиваем архив proma.tar и кидаем его содержимое в нужный каталог веб-сервера. Вносим в <code bash>config.inc.php</code> параметры подключения к БД. Теперь можно залогиниться в админку.  
  
  
<font color=red>P.S.</font> Чтобы не было проблем с отображением русских букв, добавим в конфиг следующее:
+
<font color=red>P.S.</font> Добавляем в <code bash>/etc/my.cnf</code>, потому как русские имена файлов в базу записываются в кодировке cp1251
<IfModule mod_lang.c>
+
  [client]
  UseEncoding koi8-r cp1251
+
default-character-set=cp1251
  </IfModule>
 
Эта директива сообщит серверу, что локальная кодировка на FreeBSD - koi8-r(eсли она у нас действительно такая), удаленная у клиента cp1251, поэтому при записи файлов с русскими названиями будет произведена конвертация кодировки из одной кодовой страницы в другую.
 
  
  
Строка 326: Строка 452:
 
  должно быть:
 
  должно быть:
 
  $query .= ", $table_users.$users_passwd = '$new_passwd1'";
 
  $query .= ", $table_users.$users_passwd = '$new_passwd1'";
 
 
<font color=red>P.S.</font> Незабываем в конфиге proftpd.conf сделать авторизацию по открытому паролю(если надо):
 
SQLAuthTypes Plaintext
 
 
 
<font color=red>P.S.</font> Ошибки вида:
 
mod_sql/4.3: no SQL backends registered
 
mod_sql.c: error initializing session
 
 
 
Лечатся сборкой <code bash>/usr/ports/databases/proftpd-mod_sql_mysql/</code> и добавлением в конфиг строчек:
 
LoadModule mod_sql.c
 
LoadModule mod_sql_mysql.c
 
SQLBackend mysql
 
  
  
Строка 347: Строка 458:
 
* ftpwho - показывает информацию о каждом текущем соединении (-v показывает также текущую рабочую директорию).
 
* ftpwho - показывает информацию о каждом текущем соединении (-v показывает также текущую рабочую директорию).
 
* ftptop - аналог программы top для процессов ProFTPD.  
 
* ftptop - аналог программы top для процессов ProFTPD.  
 +
* proftpd -V  - показывает как собран пакет
 +
* proftpd -q -d 10 - посмотреть как запускается
  
  
Прикручиваем смотрелку логов.
+
Прикручиваем смотрелку логов.<br/>
Взять можно здесь: http://www.lissyara.su/articles/freebsd/programms/proftpd+mysql/
 
Меняем в скрипте данные для подключения к БД и всё.
 

Текущая версия на 12:21, 27 января 2016

Озадачился я как-то поставить для любимых юзверей в локалке фтп-сервер, пусть думаю обмениваются своим любимым поревом.
Чтоб там с пользователями, с записями в базу, с красивой статистикой и т.д. Выбор пал на proftpd. Задумано-сделано. Поехали.

Система FreeBSD 10.2
Корневой каталог /ftp
Ставить будем из пакетов(версия 1.3.5a):

# pkg install proftpd proftpd-mod_sql_mysql-1.3.5a


Вносим в /etc/rc.conf:

proftpd_enable="YES"


Вариант 1. Простейший
Рихтуем proftpd.conf под наши нужды:

ServerName                      "My FTP server"
ServerType                      standalone
DefaultServer                   on
ScoreboardFile                  /var/run/proftpd/proftpd.scoreboard
DefaultAddress                  localhost
Port                            21
Umask                           022
MaxInstances                    30
CommandBufferSize               512
AllowOverwrite                  on
AllowRetrieveRestart            on
AllowStoreRestart               on
TimeoutNoTransfer               300

User                            nobody
Group                           nogroup

#Загоняем всех подключившихся в папку ftp
DefaultRoot  /ftp
 
### Security
AllowForeignAddress             off
DenyFilter                      \*.*/
MaxClientsPerHost               2 "The %m client are already connected from your host, it is not authorized any more"
MaxLoginAttempts                20 "It is too much attempts to enter "
PathDenyFilter                  "(^\.ftpaccess$)"
RequireValidShell               off

### Логи
DebugLevel                      1
TransferLog                     /var/log/proftpd/proftpd-transfer.log
ExtendedLog                     /var/log/proftpd/proftpd-extended.log
SystemLog                       /var/log/proftpd/proftpd-system.log
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"

<Anonymous /ftp>
  User                         ftp
  Group                        ftp

UserAlias                       anonymous ftp
MaxClients                      10

Добавляем пользователя ftp для анонимного входа(без пароля)

# pw useradd ftp -s /usr/sbin/nologin

В принципе всё. Для простейшего случая, с анонимным пользователем этого достаточно. Можно юзать.


Теперь переходим к дальнейшей настройке сервера и остальным рюшечкам.


Вариант 2. Авторизация из файла
Пользователей можно заводить с помощью утилиты ftpasswd. Заводим юзверя или группу таким образом:(почему-то заводится только в папке в которой находимся)

# ftpasswd --passwd --name ftp_user --file /usr/local/etc/proftpd/ftpd.passwd --uid 2000 --gid 2001 --home /ftp --shell /bin/false
# ftpasswd --group --name ftp_group –-file /usr/local/etc/proftpd/ftpd.group --gid 2001 --member ftp_user


В дальнейшем сменить пароль можно командой:

# ftpasswd --passwd --name=ftp_user --change-password --file=/usr/local/etc/proftpd/ftpd.passwd


в proftpd.conf добавляем:

AuthUserFile  /usr/local/etc/proftpd/ftpd.passwd
AuthGroupFile  /usr/local/etc/proftpd/ftpd.group


Ну и собственно примерные права для папок(предварительно заведём пользователя boss).

<Directory /ftp/download>
        <Limit WRITE DELE RMD MKD>
                DenyAll
        </Limit>
</Directory>

<Directory /ftp/upload>
        <Limit WRITE MKD>
               AllowAll
        </Limit>

        <Limit DELE RMD>
               AllowUser boss
               DenyAll
       </Limit>
</Directory>

Итоговый конфиг
Spoiler


Вариант 2. Авторизация из MySQL и админка
(Взято и адаптировано отсюда http://www.lissyara.su/articles/freebsd/programms/proftpd+mysql/)

Создаём базу proftpd:

mysql> create database proftpd character set utf8 collate utf8_general_ci;


Заводим пользователя proftpd

mysql> grant all on proftpd.* to proftpd@localhost identified by 'ПАРОЛЬ';


Создаём таблицы

CREATE TABLE IF NOT EXISTS `users` (
  `userid` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  `mail` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `uid` int(11) DEFAULT '2000',
  `gid` int(11) DEFAULT '2001',
  `passwd` varchar(120) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `shell` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '/bin/nonexistent',
  `homedir` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '/ftp',
  `note` text CHARACTER SET utf8 COLLATE utf8_general_ci,
  `last_login` int(15) NOT NULL,
  `count` int(11) NOT NULL DEFAULT '0',
  `last_err_login` int(15) NOT NULL,
  `err_login_count` int(15) NOT NULL,
  `admin` int(1) NOT NULL DEFAULT '0',
  `closed` int(1) NOT NULL DEFAULT '1',
  `groupname` varchar(24) DEFAULT 'unregistered',
  PRIMARY KEY (`userid`),
  KEY `groupname` (`groupname`),
  KEY `closed` (`closed`),
  KEY `admin` (`admin`),
  KEY `count` (`count`),
  KEY `passwd` (`passwd`),
  KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
 
CREATE TABLE IF NOT EXISTS `xfer_errors` (
  `unic_id` int(32) NOT NULL AUTO_INCREMENT,
  `timestamp` int(15) NOT NULL,
  `user_name` varchar(64) COLLATE utf8_general_ci NOT NULL,
  `file_and_path` tinytext COLLATE utf8_general_ci NOT NULL,
  `client_name` varchar(127) COLLATE utf8_general_ci NOT NULL,
  `client_IP` varchar(15) COLLATE utf8_general_ci NOT NULL,
  `client_command` varchar(5) COLLATE utf8_general_ci NOT NULL,
  PRIMARY KEY (`unic_id`),
  KEY `user_name` (`user_name`),
  KEY `client_name` (`client_name`),
  KEY `client_IP` (`client_IP`),
  KEY `client_command` (`client_command`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
 
CREATE TABLE IF NOT EXISTS `xfer_table` (
  `unic_id` int(32) NOT NULL AUTO_INCREMENT,
  `timestamp` int(15) NOT NULL,
  `user_name` varchar(64) COLLATE utf8_general_ci NOT NULL,
  `file_and_path` tinytext COLLATE utf8_general_ci NOT NULL,
  `bytes` int(15) NOT NULL DEFAULT '0',
  `client_name` varchar(127) COLLATE utf8_general_ci NOT NULL,
  `client_IP` varchar(15) COLLATE utf8_general_ci NOT NULL,
  `client_command` varchar(5) COLLATE utf8_general_ci NOT NULL,
  `send_time` varchar(9) COLLATE utf8_general_ci NOT NULL DEFAULT '0',
  PRIMARY KEY (`unic_id`),
  KEY `timestamp` (`timestamp`),
  KEY `user_name` (`user_name`),
  KEY `client_name` (`client_name`),
  KEY `client_IP` (`client_IP`),
  KEY `client_command` (`client_command`),
  KEY `send_time` (`send_time`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
 
CREATE TABLE IF NOT EXISTS `quotalimits` (
  `userid` varchar(30) NOT NULL,
  `quota_type` enum('user','group','class','all') NOT NULL,
  `per_session` enum('false','true') NOT NULL DEFAULT 'false',
  `limit_type` enum('soft','hard') NOT NULL DEFAULT 'hard',
  `bytes_in_avail` float NOT NULL DEFAULT '1.57286e+08',
  `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',
  PRIMARY KEY (`userid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;

CREATE TABLE IF NOT EXISTS `quotatallies` (
  `userid` varchar(30) NOT NULL,
  `quota_type` enum('user','group','class','all') NOT NULL,
  `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',
  PRIMARY KEY (`userid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;


В конфиг добавляем следующее:

LoadModule              mod_sql.c
LoadModule              mod_sql_mysql.c
SQLBackend              mysql
#В каком виде хранятся пароли, в данном случае - открытым текстом
#SQLAuthTypes            backend
SQLAuthTypes            Plaintext
SQLAuthenticate         users

SQLConnectInfo          USER@localhost:3306 DB PASSWORD
SQLLogFile              /var/log/proftpd/proftpd_mysql.log
SQLUserInfo             `users` `userid` `passwd` `uid` `gid` `homedir` `shell`

SQLLog          PASS            counter_login
SQLLog          ERR_PASS        counter_err
SQLLog          RETR,STOR       log_story_transfer
SQLLOG          ERR_RETR,ERR_STOR,ERR_DELE,ERR_RMD,ERR_RNTO log_err_modify 

SQLNamedQuery   counter_login           UPDATE "`last_login`=UNIX_TIMESTAMP(),`count`=`count`+1 WHERE `userid`='%u'" `users`
SQLNamedQuery   counter_err             UPDATE "`last_err_login`=UNIX_TIMESTAMP(),`err_login_count`=`err_login_count`+1 WHERE `userid`='%U'" `users`
SQLNamedQuery   log_story_transfer      INSERT "NULL, UNIX_TIMESTAMP(), '%u', '%f', '%b', '%h', '%a', '%m', '%T'"`xfer_table`
SQLNamedQuery   log_err_modify          INSERT "NULL, UNIX_TIMESTAMP(), '%u', '%f', '%h', '%a', '%m'" `xfer_errors`


Итоговый(примерный) конфиг
Spoiler


Добавляем админа:

mysql> INSERT INTO `users` (`userid`, `name`, `mail`, `uid`, `gid`, `passwd`, `shell`, `homedir`, `note`, `last_login`, `count`, `last_err_login`, `err_login_count`, `admin`, `closed`, `groupname`) VALUES ('admin', 'admin',
'admin@domain', 2000, 2001, 'password', '/bin/nonexistent', '/ftp', 'admin', 0, 0, 0, 0, 1, 0, 'admin');

Скачиваем архив proma.tar и кидаем его содержимое в нужный каталог веб-сервера. Вносим в config.inc.php параметры подключения к БД. Теперь можно залогиниться в админку.


P.S. Добавляем в /etc/my.cnf, потому как русские имена файлов в базу записываются в кодировке cp1251

[client]
default-character-set=cp1251


P.S. Чтобы админка пускала админа с открытым паролем, в файлике /libs/auth.lib.php в 31 строке вносим изменения:

вместо:
$users_passwd = PASSWORD('$passwd')";

должно быть:
$users_passwd = '$passwd'";


P.S. Чтобы пароли для пользователей фтп создавались в открытом виде, в файлике register.inc.php в 35 строке вносим изменения:

вместо:
} else {
$query = "SELECT PASSWORD('$passwd1')";
$result = mysql_query($query) or die("Database query failed.");

должно быть:
} else {
$query = "SELECT '$passwd1'";
$result = mysql_query($query) or die("Database query failed.");


P.S.Чтобы при смене пароля они тоже отображались в базе в открытом виде, в файлике /libs/admin.lib.php делаем следующие изменения в строке 375:

вместо
$query .= ", $table_users.$users_passwd = PASSWORD('$new_passwd1')";
 
должно быть:
$query .= ", $table_users.$users_passwd = '$new_passwd1'";


Полезности:

  • ftpcount - показывает число соединений в настоящий момент (с разбивкой по виртуальным хостам).
  • ftpwho - показывает информацию о каждом текущем соединении (-v показывает также текущую рабочую директорию).
  • ftptop - аналог программы top для процессов ProFTPD.
  • proftpd -V - показывает как собран пакет
  • proftpd -q -d 10 - посмотреть как запускается


Прикручиваем смотрелку логов.