В любой мало-мальской организации, в которой есть локальная сеть имеется сервер хранения файлов, такая файлопомойка, основная задача которой иметь побольше места. Реализовывается это по разному, некоторые просто расшаривают папку в сети, некоторые делают доступ по 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