МИГРИРУЕМ С vsFTPd на ProFTPd ( Ububnta 12.04/Ubunta 12.10, ProFTPd 1.3.4b Включая квотирование )
После нескольких дней неудач установить vsFTPd на Ubuntu 12.x принял решение о мигрировании
1. Удаляем/сносим vsftpd
sudo service vsftpd stop
sudo apt-get autoremove vsftpd
2. Устанавливаем ProFTPd (из репозитария Ubuntu версия 1.3.4a) с модулем MySQL
sudo apt-get install proftpd-basic proftpd-mod-mysql
3. Конфигурим основной конфиг ProFTPd /etc/proftpd/proftpd.conf
...
# Подключение файла конфигурации для SQL
Include /etc/proftpd/sql.conf
AuthOrder mod_sql.c
RequireValidShell off
...
#Каждый пользователь строго в своей папке
DefaultRoot ~
...
#Добавим поддержку кодировки кириллицы из оболочки в 1251 в UTF8 при записи на сервер
<IfModule mod_lang.c>
LangEngine on
UseEncoding utf-8 cp1251
</IfModule>
4. Под MySQL конфигурим modules.conf и sql.conf (Позже, для 1.3.4b modules.conf не понадобится)
4.1. modules.conf
...
# Install one of proftpd-mod-mysql, proftpd-mod-pgsql or any other
# SQL backend engine to use this module and the required backend.
# This module must be mandatory loaded before anyone of
# the existent SQL backeds.
LoadModule mod_sql.c
...
# Install proftpd-mod-mysql and decomment the previous
# mod_sql.c module to use this.
LoadModule mod_sql_mysql.c
....
4.2. sql.conf
#
<IfModule mod_sql.c>
#SQLBackend mysql
## Режим работы модуля
# on=auth+log
# auth - используется только для аутентификации
# log - используется только для логирования
# default = on
SQLEngine on
## Режим аутентификации
# on = users+groups
# users - авторизация пользователей без использования групп
# default = on
SQLAuthenticate users
## Метод аутентификации
# Plaintext - пароль храниться открытым текстом в бд
# Crypt - зашифрован функцией ENCRYPT('mypassword')
# Backend зашифрован функцией PASSWORD('mypassword')
# default = none
SQLAuthTypes Crypt
## Данные для подключения к БД (бывшая vsftpd база с одноимённым пользователем vsftpd и паролем vsftpdpass)
SQLConnectInfo vsftpd@localhost vsftpd vsftpdpass
## Информация о таблице пользователей
# В vsftpd был "усечённый" вариант подключения - имя/пароль
# SQLUserInfo `имя таблицы` `поле с именем пользователя` `поле с паролем` ...
# default = users userid passwd uid gid homedir shell
SQLUserInfo users username password uid gid home shell
## Информация о таблице групп
#SQLGroupInfo groups groupname gid members
## Минимальный UID.
# default = 999
#SQLMinUserUID 999
## Минимальный GID
# default = 999
#SQLMinUserGID 999
</IfModule>
5. Создаём таблицы MySQL на доступ и квоты (Если квоты не нужны, то оставьте только таблицу users и из п.6 внесите одного пользователя для теста, после чего выполните перезапуск демона – см. п.
CREATE TABLE users (
primary_key int not null auto_increment primary key,
username varchar(20) not null,
password varchar(50) not null,
uid int not null,
gid int not null,
homedir varchar(50) not null,
shell varchar(20) not null
);
CREATE TABLE quotalimits (
name VARCHAR(30),
quota_type ENUM("user", "group", "class", "all") NOT NULL,
per_session ENUM("false", "true") NOT NULL,
limit_type ENUM("soft", "hard") NOT NULL,
bytes_in_avail FLOAT NOT NULL,
bytes_out_avail FLOAT NOT NULL,
bytes_xfer_avail FLOAT NOT NULL,
files_in_avail INT UNSIGNED NOT NULL,
files_out_avail INT UNSIGNED NOT NULL,
files_xfer_avail INT UNSIGNED NOT NULL
);
CREATE TABLE quotatallies (
name VARCHAR(30) NOT NULL,
quota_type ENUM("user", "group", "class", "all") NOT NULL,
bytes_in_used FLOAT NOT NULL,
bytes_out_used FLOAT NOT NULL,
bytes_xfer_used FLOAT NOT NULL,
files_in_used INT UNSIGNED NOT NULL,
files_out_used INT UNSIGNED NOT NULL,
files_xfer_used INT UNSIGNED NOT NULL
);
6. Заполняем таблицы
6.1. Пользователи FTP-сервера (реальные - берём GID и UID из /etc/pass ), а виртуальных по GID и UID цепляем к одному реальному, например бывшему vsftpd
insert into users values (NULL,'vsftpd',ENCRYPT('vsftpdpass'),'1010','65533','/home/vsftpd','/bin/false');
#uid gid сохраняем реального пользователя/группы (в нашем случае vsftpd)
insert into users values (NULL,'user_www',ENCRYPT('user01pass'),'1010','65533','/home/vsftpd/www','/bin/false');
insert into users values (NULL,'user_www2',ENCRYPT('user02pass'),'1010','65533','/home/vsftpd/www2','/bin/false');
6.2. Квоты (в Кб)
Подобие "root" только для ftp - ограничения квоты нет
insert into quotalimits values ('vsftpd','user','false','hard','0','0','0','0','0','0');
Квота виртуального пользователя в 100 Кб и 1Гб (!!!если единица квотирования будет килобайтом, смотри ниже настройки mod_quotatab.c)
insert into quotalimits values ('user_www','user','false','hard','100','0','0','0','0','0');
insert into quotalimits values ('user_www2','user','false','hard','1048576','0','0','0','0','0');
7. Делаем настройки квотирования
Дописываем в конец основного конфигурационного файла proftpd.conf
(!все команды в одну строчку)
<IfModule mod_quotatab.c>
## Данные для подключения к БД
#SQLConnectInfo vsftpd@localhost vsftpd vftpsdpa2012
# config quotas
# ===========
QuotaEngine on<><------># включить квоту
QuotaDirectoryTally on
#Можно Байты, Килобайты, Мегабайты
QuotaDisplayUnits Kb
QuotaShowQuotas on
SQLNamedQuery get-quota-limit SELECT "name, quota_type, per_session, limit_type, bytes_in_avail, bytes_out_avail, bytes_xfer_avail, files_in_avail, files_out
SQLNamedQuery get-quota-tally SELECT "name, quota_type, bytes_in_used, bytes_out_used, bytes_xfer_used, files_in_used, files_out_used, files_xfer_used FROM q
SQLNamedQuery update-quota-tally UPDATE "bytes_in_used = bytes_in_used + %{0}, bytes_out_used = bytes_out_used + %{1}, bytes_xfer_used = bytes_xfer_used + %{
SQLNamedQuery insert-quota-tally INSERT "%{0}, %{1}, %{2}, %{3}, %{4}, %{5}, %{6}, %{7}" quotatallies
QuotaLimitTable sql:/get-quota-limit
QuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tally
QuotaLog /var/log/proftpd/quota.log
#----------------------------- end config --------------------------------
</IfModule>
8. Предварительный тест
Перезапускаем демона ProFTPd
sudo /etc/init.d/proftpd restart
Заходим в FTP-оболочку нашим указанным пользователем, например user_www
Стоит помнить, что мы присвоили оставшиеся от vsftpd права (sudo chown vsftpd:nogroup /home/vsftpd/www )
Обязательно смотрим логи, в частности /var/log/proftpd/quota.log
-----------------------------------
окт. 30 02:42:35 mod_quotatab/1.3.0[8404]: error: unsupported limit table type: 'sql'
окт. 30 02:42:35 mod_quotatab/1.3.0[8404]: error: unable to open QuotaLimitTable: Операция не позволяется
окт. 30 02:42:35 mod_quotatab/1.3.0[8404]: error: unsupported tally table type: 'sql'
окт. 30 02:42:35 mod_quotatab/1.3.0[8404]: error: unable to open QuotaTallyTable: Операция не позволяется
окт. 29 22:42:35 mod_quotatab/1.3.0[8404]: turning QuotaEngine off
-----------------------------------
Это мой бывший лог, что означало, что нет поддержки таблицы квотирования из-за неподключенного mod_quotatab модуля.
9. Создаём модуль квотирования
9.1. Ставим всё необходимое для компиляции и линковки
sudo apt-get install build-essential
9.2. Дополняем вспомогательные пакеты SSL-доступа, криптографии, мускл-клиента
sudo apt-get install libssl0.9.8 libssl1.0.0 libcap2 libmysqlclient-dev
9.3. Отдельно ТАЩИМ библиотеку mysql-connector-c-6.0.2.tar.gz
Идём на сайт мускульного коннектора
http://www.mysql.com/downloads/connector/c/#downloadsВыбираем платформу source code, качаем mysql-connector-c-6.0.2.tar.gz
Через наш рабочий FTP «затаскиваем» например в /var/source (sudo mkdir /var/source копируем cp -r /home/vsftpd/www/* /var/source/)
Распаковываем sudo tar –xvf mysql-connector-c-6.0.2.tar.gz
“Запоминаем” доступ к мускульным файлам включения и библиотек ( /var/source/mysql-connector-c-6.0.2/include /var/source/mysql-connector-c-6.0.2/libmysql )
9.4. Тащим исходник ProFTPd
sudo cd /var/source
sudo wget
ftp://ftp.proftpd.org/distrib/source/proftpd-1.3.4b.tar.gzsudo tar –xvf proftpd-1.3.4b.tar.gz
9.5. Конфигурируем компиляцию
./configure --with-modules=mod_sql:mod_sql_mysql:mod_quotatab:mod_quotatab_sql --with-includes=/var/source/mysql-connector-c-6.0.2/include --with-libraries=/var/source/mysql-connector-c-6.0.2/libmysql --with-libdir=/usr/lib/x86_64-linux-gnu
9.6. Делаем компиляцию и компановку
make
9.7. Делаем инсталляцию
make install
9.8. Меняем демона A на B (останавливаем, удаляем старого, на его место копируем нового)
sudo /etc/init.d/proftpd stop
sudo rm –r /usr/sbin/proftpd
sudo cp –r /var/source/ /proftpd-1.3.4b/ proftpd/usr/sbin/proftpd
9.9. Закомментируем модуль modules.conf в основном файле proftp.conf
(!видимо для B он не нужен, в противном случае лезут ошибки запуска)
# Includes DSO modules
#Include /etc/proftpd/ modules.conf
9.10 Стартуем демона
sudo /etc/init.d/proftpd start
9.11 Тест квоты
Тупо качаем до 100 Кб и смотрим запреты. «Непомещающиеся в квоту» должны стать в 0 Кб размером
9.12 Обязательно смотрим логи, в частности /var/log/proftpd/quota.log
------------------------
Oct 30 19:40:26 mod_quotatab/1.3.0[22399]: quotatab write(): limit exceeded, returning Disk quota exceeded
Oct 30 19:40:26 mod_quotatab/1.3.0[22399]: STOR: quota reached: used 0.00 of 0.00 upload Mb
Oct 30 19:40:26 mod_quotatab/1.3.0[22399]: STOR: quota reached: 'access.log' removed
Oct 30 19:44:43 mod_quotatab/1.3.0[22404]: found limit entry for user 'user_www'
Oct 30 19:44:43 mod_quotatab/1.3.0[22404]: creating new tally entry to match limit entry
Oct 30 19:44:43 mod_quotatab/1.3.0[22404]: created tally entry for user 'user_www'
Oct 30 19:44:43 mod_quotatab/1.3.0[22404]: quotatab fs registered
------------------------
10. Вроде всё хорошо, но русские файлы в CuteFTP выглядят русскими, а в самой Ubuntu крокозябры. А вот с «А»-версией было всё хорошо.