Установка Proftpd с хранением пользователей в MySQL и не только.

В любой мало-мальской организации, в которой есть локальная сеть имеется сервер хранения файлов, такая файлопомойка, основная задача которой иметь побольше места. Реализовывается это по разному, некоторые просто расшаривают папку в сети, некоторые делают доступ по FTP. Как дать общий доступ к папке, думаю расказывать не стоит, а вот об ftp можно написать, кому-то может пригодится, да и я если забуду, будет куда заглянуть.

Устанавливаем proftpd, при установке отмечаем что нужно, и незабываем про поддержку MySQL:

# cd /usr/ports/proftpd
# make install clean

Правим конфиг proftpd.conf

ee /usr/local/etc/proftpd.conf

Примерно так:

proftpd.conf

ServerName              "FTP-server"
ServerType              standalone
DefaultServer           on
ServerAdmin             Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.
Port                    21
Umask                   022
MaxInstances            30
User                    nobody
Group                   nogroup
TransferLog /usr/home/log/proftpd-tranfer.log
SystemLog /usr/home/log/proftpd-error.log
CreateHome on
LoadModule mod_sql.c
LoadModule mod_sql_mysql.c
SQLBackend mysql
SQLAuthTypes            Plaintext
SQLAuthenticate         users
SQLConnectInfo          proftpd_bd@localhost:3306 proftpd_user proftpd_password
SQLUserInfo             `users_table` `username` `password` `uid` `gid` \
                        `homedir` `shell`
RequireValidShell off
SQLLogFile      /usr/home/log/proftpd.log
SQLLog          PASS            counter_login
SQLNamedQuery   counter_login   UPDATE "`last_login`=UNIX_TIMESTAMP(), \
                                `login_count`=`login_count`+1 WHERE \
                                `username`='%u'" `users_table`
SQLLog          ERR_PASS        counter_err
SQLNamedQuery   counter_err     UPDATE "`last_err_login`=UNIX_TIMESTAMP(), \
                                `err_login_count`=`err_login_count`+1 WHERE \
                                `username`='%U'" `users_table`
SQLLog          RETR,STOR               log_story_transfer
SQLNamedQuery   log_story_transfer      INSERT "'',\
                                        UNIX_TIMESTAMP(),'%u',\
                                        '%f', '%b', '%h', \
                                        '%a', '%m', '%T'" \
                                        `xfer_table`
SQLLOG          ERR_RETR,ERR_STOR,ERR_DELE,ERR_RMD,ERR_RNTO\
                                        log_err_modify
                                        SQLNamedQuery   log_err_modify          INSERT "'',\
                                        UNIX_TIMESTAMP(),\
                                        '%u', '%f', '%h', \
                                        '%a', '%m'" `xfer_errors`
UseReverseDNS     off
IdentLookups      off
DefaultRoot            ~
<directory> 
    AllowOverwrite on 
    <limit write=""> AllowAll </limit>
    <limit read=""> AllowAll </limit> 
</directory>
<anonymous usr="" home="" ftp=""> 
    User ftp Group ftp UserAliasanonymous ftp MaxClients 10 "Sorry, max %m users - try again later"         <limit write=""> DenyAll </limit> 
</anonymous>

Далее создаем базу данных в mysql сервере, с нужными параметрами строки SQLConnectInfo в конфиге proftpd.conf. Создаем таблицы:

SQL Запрос

--
-- Table structure for table `users_table`
--

DROP TABLE IF EXISTS `users_table`;
CREATE TABLE `users_table` (
  `unic_id` int(11) NOT NULL auto_increment,
  `username` varchar(20) NOT NULL,
  `password` varchar(20) NOT NULL,
  `groupname` varchar(24) NOT NULL,
  `uid` int(11) NOT NULL,
  `gid` int(11) NOT NULL,
  `homedir` varchar(50) NOT NULL,
  `shell` varchar(20) NOT NULL,
  `last_login` int(15) NOT NULL,
  `login_count` int(15) NOT NULL,
  `last_err_login` int(15) NOT NULL,
  `err_login_count` int(15) NOT NULL,
  PRIMARY KEY  (`unic_id`)
) ENGINE=MyISAM COMMENT='Таблица пользователей';

--
-- Dumping data for table `users_table`
--

INSERT INTO `users_table` VALUES (1,'ftpuser','123','ftp',
1001,1001,'/usr/home/ftpuser','/sbin/nologin',0,0,0,0);
INSERT INTO `users_table` VALUES(2, 'admin','123', 'ftp',
'1000', '1000', '/usr/users/admin', '/sbin/nologin',0,0,0,0)

--
-- Table structure for table `xfer_errors`
--

DROP TABLE IF EXISTS `xfer_errors`;
CREATE TABLE `xfer_errors` (
  `unic_id` int(32) NOT NULL auto_increment,
  `timestamp` int(15) NOT NULL,
  `user_name` varchar(64) NOT NULL,
  `file_and_path` tinytext NOT NULL,
  `client_name` varchar(127) NOT NULL,
  `client_IP` varchar(15) NOT NULL,
  `client_command` varchar(5) NOT NULL,
  PRIMARY KEY  (`unic_id`)
) ENGINE=MyISAM COMMENT='Таблица ошибок при работе';

--
-- Dumping data for table `xfer_errors`
--

--
-- Table structure for table `xfer_table`
--

DROP TABLE IF EXISTS `xfer_table`;
CREATE TABLE `xfer_table` (
  `unic_id` int(32) NOT NULL auto_increment,
  `timestamp` int(15) NOT NULL,
  `user_name` varchar(64) NOT NULL,
  `file_and_path` tinytext NOT NULL,
  `bytes` int(15) NOT NULL default '0',
  `client_name` varchar(127) NOT NULL,
  `client_IP` varchar(15) NOT NULL,
  `client_command` varchar(5) NOT NULL,
  `send_time` varchar(9) NOT NULL default '0',
  PRIMARY KEY  (`unic_id`)
) ENGINE=MyISAM COMMENT='Таблица, чё приняли-передали';

--
-- Dumping data for table `xfer_table`
--

Разрешаем в /etc/rc.conf:

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

и запускаем:

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

В общем-то всё. Если что-то не работает смотрим логи MySQL - правильные ли запросы идут к БД, идут ли они вообще, также смотрим /var/log/messages.

В крайнем случае запускаем proftpd с параметрами типа -q -d 10...

P.S. надо сразу отметить, что если создаётся учётка для пользователя, который есть в системе (в данном примере - ftpuser) и ему необходимо дать те же права, что у него есть - то имя пользователя и пароль должны совпадать с системными.

P.S.2 Кстати, если вместо Plaintext поставить Backend то можно в БД хранить пароли зашифрованные средствами самого MySQL (функция PASSWORD()).

P.S.3 Если пароли зашифрованы - то пользователь автоматом chroot`ится - ибо для проверки системного пароля он должен быть в БД не зашифрованным.

И еще: Возможные проблемы с запуском...

"Unknown configration directiove 'SQLConnectInfo' in line...

решение нашлось, возможно необходимо установить:

# cd /usr/ports/databases/proftpd-mod_sql_mysql/
# make install clean

Иногда хранение пользователей в базе не требуется, к примеру если FTP используется одним - двумя людьми для узких задач. Ниже приведу простой конфиг для быстрого и простого запуска FTP сервера.

Simple proftpd.conf

ServerName                      "FTP forewer"
ServerType                      standalone
DefaultServer                   on
ScoreboardFile          /var/run/proftpd/proftpd.scoreboard

Port                    21
Umask                   022
MaxInstances            30
CommandBufferSize       512

# Set the user and group under which the server will run.
User                    nobody
Group                   nogroup
DefaultRoot ~

# Bar use of SITE CHMOD by default
<limit site_chmod=""> AllowAll </limit>

# Timeouts
TimeoutIdle              3600
TimeoutLogin             3600
TimeoutNoTransfer        3600
TimeoutStalled           3600
TimeoutSession           3600

# Name remote user
IdentLookups off

# Reversy poisk IP
UseReverseDns off

# MaxClients
MaxClients                10 "Sorry, max %m users, try again later."

# Proverka comand
AllowFilter               ^[-A-Za-z0-9_.(),/]*$

# Peresilka server-server
AllowForeignAddress       off

# Razreshit .ftaccess
AllowOverride             on

# Razreshit perepisivat fail
AllowOverwrite            on

СТАТЬИ

МАНУАЛЫ

СХЕМЫ