Люблю я всякие web-интерфейсы для управления различными сервисами. И захотелось мне управлять фтпешником из браузера. Ну там юзеров добавить/удалить, статистику посмотреть и т.п. Да и порой добавлять/удалять юзеров не входит в задачи, да и накладно это по времени. А вот другой сотрудник-коллега, будет это делать с важными видом
.
Беглый поиск решений вывел меня на связку proftpd + mysql +
proFTPd Administrator. Да вот незадача последний релиз последнего зверька был в далеком 2006. Сколько уже мускулов поменялось, даже владельцы сменились. Да и сам proftpd подрос за это время. Завести удалось и по этому оставляю здесь подробное описание как я это сделал. Сервис подымался для потребностей локальной сети. В тексте присутствуют ссылки на мой githab, на который я залил proFTPd Administrator с подправленными конфигурационными файлами. При редактировании файлов я использовал редактор nano, вы можете использовать удобное для вас средство. Поехали.
1. Ставим свежую
Ubuntu Server 64-bit. Во время установки из дополнительных пакетов выбираем только ssh-server.
2. Устанавливаем все необходимые пакеты:
# sudo apt-get install apache2 apache2-utils php5 php5-mysql mysql-server mysql-client proftpd proftpd-mod-mysql
Не забываем
запомнить/записать пароль mysql. На вопрос как запускть proftpd, выбираем
самостоятельно.
3. Настраиваем
apache2, создав конфигурационный файл предварительно создав необходимые каталоги:
# cd /var/www/html/
# mkdir proftpdadmin
# cd /etc/apache2/sites-available/
# nano proftpdadmin.conf
Добавляем в открытый файл следующее:
Alias /proftpdadmin /var/www/html/proftpdadmin
<Directory /var/www/html/proftpdadmin/>
Options +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
Создаем необходимую ссылку и перегружаем apache2:
# ln -s /etc/apache2/sites-available/proftpdadmin.conf /etc/apache2/sites-enabled/proftpdadmin.conf
# service apache2 restart
4. На моей виртуальной машине возникли
проблемы с нехваткой памяти при выполнение скриптов proFTPd Administrator. Для решения этой проблемы меняем в конфиге php:
# nano /etc/php5/apache2/php.ini
это
memory_limit = 128M
на это
memory_limit = 512M
На всякий перегружаем apache2:
# service apache2 restart
5. Развертывание
proFTPd Administrator. Примеры конфигурационных файлов и скрипт создания бд нашего зверька немного устарели по этому я изменил их подстроив под новые реалии.
5.1. По этому качаем proFTPd Administrator с моего github (залил как смог) и распаковываем в нужную директорию и устанавливаем нужные права:
# cd /var/www/html/
# wget https://github.com/inhab-magnus/proftpdadmin/archive/master.zip
# unzip master.zip
# mv proftpdadmin-master/ proftpdadmin/
# cd proftpdadmin/
# chmod o+w configuration.xml
# chmod -R o+w logs
5.2. Создаем каталоги в которых будут находиться файлы пользователей:
# cd /
# mkdir ftp
# cd ftp
# mkdir incoming
# chmod o+w incoming
5.3. Заливаем скелет базы в mysql предварительно изменив последнее слово скрипта
db_structure.sql, на свой (придумываем и запоминаем)
пароль доступа к бд proFTPd Administrator:
# cd /var/www/html/proftpdadmin/misc/database_structure_mysql/
# nano db_structure.sql
CREATE DATABASE proftpd_admin;
USE proftpd_admin;
CREATE TABLE usertable (
userid text,
passwd text,
homedir text,
shell text,
uid int(11) NOT NULL auto_increment,
gid int(11) default NULL,
count int(11) NOT NULL default '0',
lastlogin datetime NOT NULL default '0000-00-00 00:00:00',
lastlogout datetime NOT NULL default '0000-00-00 00:00:00',
expiration datetime NOT NULL default '0000-00-00 00:00:00',
disabled tinyint(4) default '0',
det_name tinytext,
det_mail tinytext,
det_adress tinytext,
det_notes tinytext,
PRIMARY KEY (uid)
) ENGINE=MyISAM;
CREATE TABLE grouptable (
groupname text,
gid int(11) NOT NULL auto_increment,
members text,
description tinytext,
PRIMARY KEY (gid),
UNIQUE KEY gid_2 (gid),
KEY gid (gid)
) ENGINE=MyISAM;
CREATE TABLE xfer_stat (
userid text,
file text,
size bigint(20) default '0',
address_full text,
address_ip text,
command text,
timespent text,
time text,
cmd text,
dunno text
) ENGINE=MyISAM;
CREATE TABLE `ftpquotalimits` (
`name` varchar(30) NOT NULL default '',
`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 'hard',
`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',
PRIMARY KEY (`name`)
) ENGINE=MyISAM;
CREATE TABLE `ftpquotatallies` (
`name` varchar(30) NOT NULL default '',
`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;
INSERT INTO usertable (uid) VALUES (9999);
DELETE FROM usertable WHERE uid=9999;
INSERT INTO grouptable (gid) VALUES (9999);
DELETE FROM grouptable WHERE gid=9999;
INSERT INTO grouptable (groupname, description) VALUES ("admins", "Administrators");
INSERT INTO grouptable (groupname, description) VALUES ("users", "Ordinary users");
GRANT ALL ON proftpd_admin.* TO proftpd@localhost IDENTIFIED BY 'parol';
Заливаем скелет
# mysql -u root -p < db_structure.sql
6. Настройка proftpd. В конфигурационных файлах этого сервиса я не силен. Но была найдена необходимая комбинация при их изменениях. Если вы не хотите править конфигурационные файлы вручную просто скопируйте их в папку конфигурационных файлов proftpd, предварительно сделав копии оригинальных файлов. И тогда можете пропустить подпункты этого раздела.
# cd /etc/proftpd/
# mkdir bak
# mv proftpd.conf modules.conf sql.conf /etc/proftpd/bak/
# cd /var/www/html/proftpdadmin/misc/sample_config/
# cp proftpd.conf modules.conf sql.conf /etc/proftpd/
В файл
sql.conf изменяем в параметре SQLConnectInfo последнее слово на
пароль из п. 5.2.:
# nano /etc/proftpd/sql.conf
Перегружаем proftpd:
# service proftpd restart
У меня возникли проблемы со стартом сервиса, я её решил путем перезагрузки сервиса несколько раз, до тех пор пока он как бы задумается перед стартом. Проверить запущен ли сервис вы можете командой:
# ps aux | grep proftpd
При этом вы должны получить примерно такие две строчки:
proftpd 924 0.0 0.2 127152 4400 ? Ss 19:04 0:00 proftpd: (accepting connections)
root 1406 0.0 0.1 12964 2148 pts/1 S+ 19:24 0:00 grep --color=auto proftpd
6.1. Правим
proftpd.conf:
# nano /etc/proftpd/proftpd.conf
Добавляем в файл
proftpd.conf следующее:
ServerIdent on "FTP Server ready."
ServerAdmin root@localhost
AccessGrantMsg "User %u logged in."
DefaultRoot ~ !test_user
IdentLookups off
UseReverseDNS off
Umask 022
ListOptions "-a"
RootLogin off
MaxLoginAttempts 25
MaxClientsPerHost 25
AllowRetrieveRestart on
AllowStoreRestart on
MaxInstances 20
TimeoutStalled 300
UseSendfile no
ScoreboardFile /var/run/proftpd.score
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»
ExtendedLog /var/log/proftpd/access.log WRITE,READ write
ExtendedLog /var/log/proftpd/auth.log AUTH auth
Include /etc/proftpd/modules.conf
Include /etc/proftpd/sql.conf
<Global>
AllowOverwrite yes
<Limit ALL SITE_CHMOD>
AllowAll
</Limit>
</Global>
<Directory /ftp/*>
AllowOverwrite off
HideNoAccess off
<Limit READ>
AllowAll
</Limit>
<Limit WRITE>
DenyGroup !admins
</Limit>
</Directory>
<Directory /ftp/incoming/*>
AllowOverwrite on
HideNoAccess on
<Limit READ>
DenyGroup !admins
</Limit>
<Limit STOR MKD>
AllowAll
</Limit>
</Directory>
6.2. Правим
modules.conf:
nano /etc/proftpd/modules.conf
В файле
modules.conf раскомментируем строки:
LoadModule mod_sql.c
LoadModule mod_sql_mysql.c
6.3. Правим
sql.conf:
nano /etc/proftpd/sql.conf
В файл
sql.conf добавляем следующее изменив в третей строчке последнее слово на
пароль из п. 5.2.:
SQLBackend mysql
SQLAuthTypes Backend
SQLConnectInfo proftpd_admin@localhost proftpd parol
SQLUserInfo usertable userid passwd uid gid homedir shell
RequireValidShell off
SQLGroupInfo grouptable groupname gid members
SQLAuthenticate users groups
SQLUserInfo usertable userid passwd uid gid homedir shell
SQLGroupInfo grouptable groupname gid members
SQLUserWhereClause "disabled=0 and (NOW()<=expiration or expiration=-1 or expiration=0)"
# Log the user logging in
SQLLog PASS counter
SQLNamedQuery counter UPDATE "lastlogin=now(), count=count+1 WHERE userid='%u'" usertable
# logout log
SQLLog EXIT time_logout
SQLNamedQuery time_logout UPDATE "lastlogout=now() WHERE userid='%u'" usertable
# display last login time when PASS command is given
SQLNamedQuery login_time SELECT "lastlogin from usertable where userid='%u'"
SQLShowInfo PASS "230" "Last login was: %{login_time}"
# xfer Log in mysql
SQLLog RETR,STOR transfer1
SQLNamedQuery transfer1 INSERT "'%u', '%f', '%b', '%h', '%a', '%m', '%T', now(), 'c', NULL" xfer_stat
SQLLOG ERR_RETR,ERR_STOR transfer2
SQLNamedQuery transfer2 INSERT "'%u', '%f', '%b', '%h', '%a', '%m', '%T', now(), 'i', NULL" xfer_stat
6.4. Перегружаем proftpd:
# service proftpd restart
У меня возникли проблемы со стартом сервиса, я её решил путем перезагрузкой сервиса несколько раз, до тех пор пока он как бы задумается перед стартом. Проверить запущен ли сервис вы можете командой:
ps aux | grep proftpd
При этом вы должны получить примерно такие две строчки:
proftpd 924 0.0 0.2 127152 4400 ? Ss 19:04 0:00 proftpd: (accepting connections)
root 1406 0.0 0.1 12964 2148 pts/1 S+ 19:24 0:00 grep --color=auto proftpd
7. Завершающий этап -- настройка proFTPd Administrator через web-интерфейс. Заходим по по адресу http://ваш_ip/proftpdadmin/. В web-интерфейсе переходим Configure-->Database и заполняем поля по листингу ниже:
Username: proftpd
Password: пароль из п. 5.2.
Hostname: localhost
Database: proftpd_admin
Жмем Submit. Если все правильно, исчезнет сообщение об ошибке.
Все, настройка завершена, вам осталось только завести пользователей и попробовать подключиться.
Например создаем пользователя user1. Заполняем поле Home directory так: Home directory: /ftp/user1. Создаем директорию с нужными правами:
# cd ftp
# mkdir user1
# chmod o+w user1
Пробуем подключиться.
С директориями и правами я еще не до конца разобрался. Буду дополнять статью.
Так же данный зверек не имеет парольной защиты.
Рекомендую сделать доступ к web-интерфейсу по паролю. Мануалов в инете предостаточно. Будет время я добавлю этот нюанс в статью.
Используемые материалы:
РазДваТриЗамечания, пожелания и предложения приветствуются.