FTP-сервер на базе Proftpd — различия между версиями
Root (обсуждение | вклад) |
Root (обсуждение | вклад) |
||
(не показано 18 промежуточных версий 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 | ||
− | |||
− | |||
− | |||
− | |||
− | |||
Вносим в <code bash>/etc/rc.conf</code>: | Вносим в <code bash>/etc/rc.conf</code>: | ||
Строка 13: | Строка 12: | ||
− | + | '''Вариант 1. Простейший<br/>''' | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
Рихтуем proftpd.conf под наши нужды: | Рихтуем proftpd.conf под наши нужды: | ||
ServerName "My FTP server" | ServerName "My FTP server" | ||
Строка 89: | Строка 52: | ||
<Anonymous /ftp> | <Anonymous /ftp> | ||
− | + | User ftp | |
− | + | Group ftp | |
UserAlias anonymous ftp | UserAlias anonymous ftp | ||
MaxClients 10 | MaxClients 10 | ||
− | + | ||
− | + | Добавляем пользователя '''ftp''' для анонимного входа(без пароля) | |
− | + | # pw useradd ftp -s /usr/sbin/nologin | |
− | + | В принципе всё. Для простейшего случая, с анонимным пользователем этого достаточно. Можно юзать. | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | Теперь переходим к дальнейшей настройке сервера и остальным рюшечкам. | |
− | |||
− | + | '''Вариант 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 | ||
− | + | В дальнейшем сменить пароль можно командой: | |
− | + | # ftpasswd --passwd --name=ftp_user --change-password --file=/usr/local/etc/proftpd/ftpd.passwd | |
− | |||
− | # ftpasswd --passwd --name ftp_user -- | ||
− | |||
в proftpd.conf добавляем: | в proftpd.conf добавляем: | ||
− | AuthUserFile /etc/proftpd/ftpd.passwd | + | AuthUserFile /usr/local/etc/proftpd/ftpd.passwd |
− | + | AuthGroupFile /usr/local/etc/proftpd/ftpd.group | |
− | Ну и собственно права для папок (предварительно | + | Ну и собственно примерные права для папок(предварительно заведём пользователя 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 ' | + | mysql> grant all on proftpd.* to proftpd@localhost identified by '<font color=blue>ПАРОЛЬ</font>'; |
Создаём таблицы | Создаём таблицы | ||
CREATE TABLE IF NOT EXISTS `users` ( | CREATE TABLE IF NOT EXISTS `users` ( | ||
− | `userid` varchar(30) CHARACTER SET | + | `userid` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, |
− | `name` varchar(255) DEFAULT NULL | + | `name` varchar(255) DEFAULT NULL, |
− | `mail` varchar(255) CHARACTER SET | + | `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 | + | `passwd` varchar(120) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, |
− | `shell` varchar(30) CHARACTER SET | + | `shell` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '/bin/nonexistent', |
− | `homedir` varchar(255) CHARACTER SET | + | `homedir` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '/ftp', |
− | `note` text CHARACTER SET | + | `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 | + | `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 | + | `admin` int(1) NOT NULL DEFAULT '0', |
− | `closed` int(1) NOT NULL DEFAULT '1 | + | `closed` int(1) NOT NULL DEFAULT '1', |
− | `groupname` varchar(24) DEFAULT 'unregistered | + | `groupname` varchar(24) DEFAULT 'unregistered', |
PRIMARY KEY (`userid`), | PRIMARY KEY (`userid`), | ||
KEY `groupname` (`groupname`), | KEY `groupname` (`groupname`), | ||
Строка 194: | Строка 213: | ||
KEY `passwd` (`passwd`), | KEY `passwd` (`passwd`), | ||
KEY `name` (`name`) | KEY `name` (`name`) | ||
− | ) ENGINE=MyISAM DEFAULT CHARSET= | + | ) 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 | + | `user_name` varchar(64) COLLATE utf8_general_ci NOT NULL, |
− | `file_and_path` tinytext COLLATE | + | `file_and_path` tinytext COLLATE utf8_general_ci NOT NULL, |
− | `client_name` varchar(127) COLLATE | + | `client_name` varchar(127) COLLATE utf8_general_ci NOT NULL, |
− | `client_IP` varchar(15) COLLATE | + | `client_IP` varchar(15) COLLATE utf8_general_ci NOT NULL, |
− | `client_command` varchar(5) COLLATE | + | `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`), | ||
Строка 209: | Строка 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= | + | ) 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 | + | `user_name` varchar(64) COLLATE utf8_general_ci NOT NULL, |
− | `file_and_path` tinytext COLLATE | + | `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 | + | `client_name` varchar(127) COLLATE utf8_general_ci NOT NULL, |
− | `client_IP` varchar(15) COLLATE | + | `client_IP` varchar(15) COLLATE utf8_general_ci NOT NULL, |
− | `client_command` varchar(5) COLLATE | + | `client_command` varchar(5) COLLATE utf8_general_ci NOT NULL, |
− | `send_time` varchar(9) COLLATE | + | `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`), | ||
Строка 228: | Строка 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= | + | ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; |
CREATE TABLE IF NOT EXISTS `quotalimits` ( | CREATE TABLE IF NOT EXISTS `quotalimits` ( | ||
Строка 242: | Строка 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= | + | ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ; |
CREATE TABLE IF NOT EXISTS `quotatallies` ( | CREATE TABLE IF NOT EXISTS `quotatallies` ( | ||
Строка 254: | Строка 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= | + | ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ; |
Строка 266: | Строка 285: | ||
SQLAuthenticate users | SQLAuthenticate users | ||
− | SQLConnectInfo | + | 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 | SQLLogFile /var/log/proftpd/proftpd_mysql.log | ||
SQLUserInfo `users` `userid` `passwd` `uid` `gid` `homedir` `shell` | SQLUserInfo `users` `userid` `passwd` `uid` `gid` `homedir` `shell` | ||
Строка 277: | Строка 296: | ||
SQLNamedQuery counter_login UPDATE "`last_login`=UNIX_TIMESTAMP(),`count`=`count`+1 WHERE `userid`='%u'" `users` | 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 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_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` | 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'); |
− | |||
− | |||
− | |||
− | |||
Скачиваем архив 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 |
− | + | [client] | |
− | + | default-character-set=cp1251 | |
− | |||
− | |||
Строка 326: | Строка 452: | ||
должно быть: | должно быть: | ||
$query .= ", $table_users.$users_passwd = '$new_passwd1'"; | $query .= ", $table_users.$users_passwd = '$new_passwd1'"; | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
Строка 346: | Строка 458: | ||
* ftpwho - показывает информацию о каждом текущем соединении (-v показывает также текущую рабочую директорию). | * ftpwho - показывает информацию о каждом текущем соединении (-v показывает также текущую рабочую директорию). | ||
* ftptop - аналог программы top для процессов ProFTPD. | * ftptop - аналог программы top для процессов ProFTPD. | ||
+ | * proftpd -V - показывает как собран пакет | ||
+ | * proftpd -q -d 10 - посмотреть как запускается | ||
− | Прикручиваем смотрелку логов. | + | Прикручиваем смотрелку логов.<br/> |
− | |||
− |
Текущая версия на 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 - посмотреть как запускается
Прикручиваем смотрелку логов.