0

proftpd с модами mysql, quota и TLS (SSL) шифрованием в freebsd

Дефолтный конфиг FTP-сервера Proftpd рассчитан на работу с системными пользователями ОС, это не самый удобный и производительный вариант, однако есть альтернатива — использование виртуальных пользователей из базы данных MySQL.
Подразумевается что MySQL сервер уже установлен.
Установка сервера с опциями MYSQL, OPENSSL и QUOTA

proftpd с модами mysql, quota и TLS (SSL) шифрованием в freebsd

cd /usr/ports/ftp/proftpd-mysql
make config

Выбираем опции MYSQL, OPENSSL и QUOTA

make install clean

создаем группу ftpgroup

# правим
vim /etc/group
# добавляем строку
ftpgroup:*:1100:
# идентификатор группы выбираем произвольный, свободный, у меня 1100

и пользователя ftpuser, под которым будут работать все виртуальные пользователи

# правим
vim /etc/passwd
# добавляем строку
ftpuser:*:1100:0:proftpd:/nonexistent:/usr/sbin/nologin
# идентификатор пользователя выбираем произвольный, свободный, у меня 1100

Создаем базу данных ftpdb и пользователя MySQL ftpuserdb, демон proftpd будет использовать его, чтобы соединиться с базой ftpdb.

mysql -u root -p
create database ftpdb;
GRANT SELECT, INSERT, UPDATE, DELETE ON ftpdb.* TO 'ftpuserdb'@'localhost' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;
# заменяем ftpuserdb, localhost, password на свои данные

Создаем таблицы для нашей БД

USE ftpdb;
CREATE TABLE ftpgroup (
groupname varchar(16) NOT NULL default '',
gid smallint(6) NOT NULL default '5500',
members varchar(16) NOT NULL default '',
KEY groupname (groupname)
) TYPE=MyISAM COMMENT='ProFTP group table';

CREATE TABLE ftpquotalimits (
name varchar(30) default NULL,
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 'soft',
bytes_in_avail int(10) unsigned NOT NULL default '0',
bytes_out_avail int(10) unsigned NOT NULL default '0',
bytes_xfer_avail int(10) unsigned 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'
) TYPE=MyISAM;

CREATE TABLE ftpquotatallies (
name varchar(30) NOT NULL default '',
quota_type enum('user','group','class','all') NOT NULL default 'user',
bytes_in_used int(10) unsigned NOT NULL default '0',
bytes_out_used int(10) unsigned NOT NULL default '0',
bytes_xfer_used int(10) unsigned 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'
) TYPE=MyISAM;

CREATE TABLE ftpuser (
id int(10) unsigned NOT NULL auto_increment,
userid varchar(32) NOT NULL default '',
passwd varchar(32) NOT NULL default '',
uid smallint(6) NOT NULL default '5500',
gid smallint(6) NOT NULL default '5500',
homedir varchar(255) NOT NULL default '',
shell varchar(16) NOT NULL default '/sbin/nologin',
count int(11) NOT NULL default '0',
accessed datetime NOT NULL default '0000-00-00 00:00:00',
modified datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (id),
UNIQUE KEY userid (userid)
) TYPE=MyISAM COMMENT='ProFTP user table';
quit;

Конфигурация Proftpd

# Правим
/usr/local/etc/proftpd.conf
ServerName                    "ftpsrv"
ServerType                      standalone
DefaultServer                   on
DeferWelcome                    off
MultilineRFC2228                on
AllowOverwrite                  on

IdentLookups off
UseReverseDNS off

Port                            21
Umask                           022

MaxInstances                    30
CommandBufferSize 512

SystemLog                       /var/log/proftpd.log
TransferLog                     /var/log/xferlog

User                            ftp
Group                           ftp

DefaultRoot ~
SQLAuthTypes            Plaintext Crypt
SQLAuthenticate         users* groups*
SQLConnectInfo  ftpdb@localhost ftpuserdb password
SQLUserInfo     ftpuser userid passwd uid gid homedir shell
SQLGroupInfo    ftpgroup groupname gid members

CreateHome on
CreateHome on
SQLLog PASS updatecount
SQLNamedQuery updatecount UPDATE "count=count+1, accessed=now() WHERE userid='%u'" ftpuser
SQLLog  STOR,DELE modified
SQLNamedQuery modified UPDATE "modified=now() WHERE userid='%u'" ftpuser
QuotaEngine on
QuotaDirectoryTally on
QuotaDisplayUnits Mb
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_avail, files_xfer_avail FROM ftpquotalimits WHERE name = '%{0}' AND quota_type = '%{1}'"
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 ftpquotatallies WHERE name = '%{0}' AND quota_type = '%{1}'"
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 + %{2}, files_in_used = files_in_used + %{3}, files_out_used = files_out_used + %{4}, files_xfer_used = files_xfer_used + %{5} WHERE name = '%{6}' AND quota_type = '%{7}'" ftpquotatallies
SQLNamedQuery insert-quota-tally INSERT "%{0}, %{1}, %{2}, %{3}, %{4}, %{5}, %{6}, %{7}" ftpquotatallies
QuotaLimitTable sql:/get-quota-limitQuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tally
RootLogin off
RequireValidShell off

RootLogin off
MaxLoginAttempts 5
UseFtpUsers on

AllowRetrieveRestart on
AllowStoreRestart on

LoginPasswordPrompt on
DirFakeGroup on
MaxClients 15
tcpNoDelay on

DeleteAbortedStores on
RequireValidShell off
AllowOverwrite On
AllowForeignAddress On
MaxClientsPerUser 10
MaxHostsPerUser 10

# если вы используете NAT/Firewall раскомментируйте следующие строки и замените yourdomain.ru (на ваш домен), xxx.xxx.xxx.xxx (на ваш ip адрес "внешний"), 60000 65535 (на ваш диапазон открытых портов для пассивного режима работы ftp) на свои.
# MasqueradeAddress yourdomain.ru
# MasqueradeAddress xxx.xxx.xxx.xxx
# PassivePorts 60000 65535

Меняем password, на свой пароль для MySQL пользователя ftpuserdb в строке SQLConnectInfo!
Перезапускаем демон proftpd:

/usr/local/etc/rc.d/proftpd restart

Заполнение базы данных

mysql -u root -p
USE ftp;

Добавим запись в таблицу ftpgroup. Она содержит поля groupname, groupid и username (замените groupid, на тот который вы указанный при создании пользователя)

INSERT INTO `ftpgroup` (`groupname`, `gid`, `members`) VALUES
('ftpgroup', 1100, 'ftpuser');

Для создания нового виртуального пользователя ftp, добавим запись в таблицах ftpquotalimits и ftpuser

INSERT INTO `ftpquotalimits` (`name`, `quota_type`, `per_session`, `limit_type`,
`bytes_in_avail`, `bytes_out_avail`, `bytes_xfer_avail`, `files_in_avail`,
`files_out_avail`, `files_xfer_avail`) VALUES ('exampleuser', 'user', 'true', 'hard', 15728640, 0, 0, 0, 0, 0);
INSERT INTO `ftpuser` (`id`, `userid`, `passwd`, `uid`, `gid`, `homedir`, `shell`, `count`, `accessed`, `modified`)
VALUES (1, 'exampleuser', 'secret', 1100, 1100, '/home/www.example.com', '/sbin/nologin', 0, '', '');
quit;

не забываем менять groupid и userid

Логинимся и проверяем. Если ничего не вышло — смотрим лог

tail -n 50 -f /var/log/proftpd.log

Про SSL шифрование напишу чуть позже

Настройка и администрирование Windows/Linux, сетевого оборудования D-link, cisco | hotbits.ru

XpycT

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *