FTP-сервер VSFTP и virtual users MySQL на CentOS 7, Web-админка для VSFTP
VSFTP (Very Secure FTP Daemon) - это сервер FTP с высокими требованиями к безопасности, разработанный для операционных систем, подобных UNIX. Он обеспечивает безопасную передачу файлов между клиентом и сервером, защищает пароли и данные от несанкционированного доступа.
Установка Apache, PHP, MySQL
Добавляем репозиторий EPEL и обновляемся
1
2
$ sudo yum install epel-release
$ sudo yum update
Ставим софт для удобства работы
1
$ sudo yum install nano htop mc wget
Устанавливаем MySQL-сервер MariaDB, Web-сервер Apache и PHP. Инструкцию по установке можно прочитать по ссылкам ниже:
Перезапускаем Apache
1
$ sudo systemctl restart httpd.service
Отключение Selinux
Отключаем SElinux
1
2
3
4
5
$ sudo setenforce 0
$ sudo nano /etc/selinux/config
...
SELINUX=disabled
...
Настройка Apache
Настраиваем Apache, добавим vhosts
- несколько сайтов на одном ip-адресе
1
2
3
4
$ sudo nano /etc/httpd/conf.d/vhosts.conf
...
# Загрузка моих vhosts
IncludeOptional vhosts.d/*.conf
Создаем каталог, где будут лежать конфигурации vhosts
1
$ sudo mkdir /etc/httpd/vhosts.d
Создаем конфигурационный файл для локального IP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ sudo nano /etc/httpd/vhosts.d/192.168.1.19.conf
<VirtualHost 192.168.1.19:80>
ServerAdmin [email protected]
DocumentRoot "/var/www/192.168.1.19/html/"
ServerName 192.168.1.19
ErrorLog "/var/www/192.168.1.19/logs/error_log"
CustomLog "/var/www/192.168.1.19/logs/access_log" combined
<Directory "/var/www/192.168.1.19/html/">
DirectoryIndex index.html index.php
Options FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
Создаем необходимые каталоги и выставляем права доступа
1
2
3
$ sudo mkdir -p /var/www/192.168.1.19/html
$ sudo mkdir -p /var/www/192.168.1.19/logs
$ sudo chown -R apache:apache /var/www/192.168.1.19/
Перезапускаем Apache
1
$ sudo systemctl restart httpd.service
Установка VSFTP
Устанавливаем FTP-сервер
1
$ sudo yum install vsftpd
Редактируем конфигурационный файл
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
$ sudo nano /etc/vsftpd/vsftpd.conf
# Запуск сервера в режиме службы
listen=YES
# Работа в фоновом режиме
background=YES
# Разрешить подключаться виртуальным пользователям
guest_enable=YES
# Системный пользователь от имени котрого подключаются виртуальные
guest_username=apache
# Виртуальные пользователи имеют те же привелегии, что и локальные
virtual_use_local_privs=YES
# Автоматическое назначение домашнего каталога для виртуальных пользователей
user_sub_token=$USER
local_root=/home/ftp/$USER
# Имя pam сервиса для vsftpd
pam_service_name=vsftpd
# Входящие соединения контроллируются через tcp_wrappers
tcp_wrappers=YES
# Запрещает подключение анонимных пользователей
anonymous_enable=NO
# Каталог, куда будут попадать анонимные пользователи, если они разрешены
#anon_root=/ftp
# Разрешает вход для локальных пользователей
local_enable=YES
# Разрешены команды на запись и изменение
write_enable=YES
# Указывает исходящим с сервера соединениям использовать 20-й порт
connect_from_port_20=YES
# Логирование всех действий на сервере
xferlog_enable=YES
# Путь к лог-файлу
xferlog_file=/var/log/vsftpd.log
# Включение специальных ftp команд, некоторые клиенты без этого могут зависать
async_abor_enable=YES
# Локальные пользователи по-умолчанию не могут выходить за пределы своего домашнего каталога
chroot_local_user=YES
# Разрешить список пользователей, которые могут выходить за пределы домашнего каталога
chroot_list_enable=YES
# Список пользователей, которым разрешен выход из домашнего каталога
chroot_list_file=/etc/vsftpd/chroot_list
# Разрешить запись в корень chroot каталога пользователя
allow_writeable_chroot=YES
# Контроль доступа к серверу через отдельный список пользователей
#userlist_enable=YES
# Файл со списками разрешенных к подключению пользователей
#userlist_file=/etc/vsftpd/user_list
# Пользователь будет отклонен, если его нет в user_list
#userlist_deny=NO
# Директория с настройками пользователей
user_config_dir=/etc/vsftpd/users
# Показывать файлы, начинающиеся с точки
force_dot_files=YES
# Маска прав доступа к создаваемым файлам
local_umask=022
# Приветствие
ftpd_banner=Welcome to FTP service.
#set maximum allowed connections per single IP address (0 = no limits)
max_per_ip=10
# Порты для пассивного режима работы
pasv_min_port=40900
pasv_max_port=40999
data_connection_timeout=900
idle_session_timeout=900
Открываем порты 20-21 (активный режим работы ftp-сервера) и 40900-40999 (пассивный режим работы ftp-сервера)
1
2
3
$ sudo firewall-cmd --permanent --add-port=20-21/tcp
$ sudo firewall-cmd --permanent --add-port=40900-40999/tcp
$ sudo firewall-cmd --reload
Добавляем сервер в автозагрузку, запускаем его и проверяем статус
1
2
3
$ sudo systemctl enable vsftpd
$ sudo systemctl start vsftpd
$ sudo systemctl status vsftpd
Настройка MySQL
Подключаемся к MySQL
1
mysql -u root -p
Создаем базу данных и пользователя с правами только на эту базу
1
2
3
> CREATE DATABASE vsftpd;
> GRANT SELECT ON vsftpd.* TO 'vsftpd'@'localhost' IDENTIFIED BY 'passwordftp';
> USE vsftpd;
Выбираем эту базу и создаем таблицу. Структура таблицы задана с учетом использования функционала web-админки
1
2
3
4
5
6
7
8
9
10
11
12
13
> USE vsftpd;
> CREATE TABLE `users` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`username` VARCHAR( 30 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL ,
`password` VARCHAR( 50 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL ,
`email` varchar(80) CHARACTER SET utf8 NOT NULL,
`date` datetime NOT NULL,
`date_end` date NOT NULL,
`temp` int(1) NOT NULL,
`dir` varchar(80) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`local_ip` varchar(30) CHARACTER SET utf8 NOT NULL,
UNIQUE (`username`)
) ENGINE = MYISAM ;
Мой dump базы данных
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
-- Хост: localhost
-- Время создания: Июл 27 2018 г., 12:08
-- Версия сервера: 5.5.56-MariaDB
-- Версия PHP: 7.2.3
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+00:00";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;
--
-- База данных: `vsftpd`
--
-- --------------------------------------------------------
--
-- Структура таблицы `users`
--
CREATE TABLE `users` (
`id` int(11) NOT NULL,
`username` varchar(30) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`password` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`email` varchar(80) CHARACTER SET utf8 NOT NULL,
`date` datetime NOT NULL,
`date_end` date NOT NULL,
`temp` int(1) NOT NULL,
`dir` varchar(80) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`local_ip` varchar(30) CHARACTER SET utf8 NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
--
-- Дамп данных таблицы `users`
--
INSERT INTO `users` (`id`, `username`, `password`, `email`, `date`, `date_end`, `temp`, `dir`, `local_ip`) VALUES
(104, 'user', md5('password'), '[email protected]', '2018-03-12 13:39:24', '2018-04-12', 0, '/home/ftp/user', '');
--
-- Индексы сохранённых таблиц
--
--
-- Индексы таблицы `users`
--
ALTER TABLE `users`
ADD PRIMARY KEY (`id`),
ADD UNIQUE KEY `username` (`username`);
--
-- AUTO_INCREMENT для сохранённых таблиц
--
--
-- AUTO_INCREMENT для таблицы `users`
--
ALTER TABLE `users`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=143;
COMMIT;
Выходим из MySQL
1
> \q
Устанавливаем модуль pam_mysql
1
$ sudo rpm -Uvh ftp://ftp.pbone.net/mirror/archive.fedoraproject.org/fedora/linux/releases/20/Everything/x86_64/os/Packages/p/pam_mysql-0.7-0.16.rc1.fc20.x86_64.rpm
Сохраняем копию pam
файла
1
$ sudo mv /etc/pam.d/vsftpd /etc/pam.d/vsftpd.back
Создаем новый pam
файл
1
2
3
4
$ sudo nano /etc/pam.d/vsftpd
session optional pam_keyinit.so force revoke
auth required pam_mysql.so user=vsftpd_user passwd=passwordftp host=localhost db=vsftpd table=users usercolumn=username passwdcolumn=password crypt=3
account required pam_mysql.so user=vsftpd_user passwd=passwordftp host=localhost db=vsftpd table=users usercolumn=username passwdcolumn=password crypt=3
где
user=vsftpd_user
- логин ароль для подключения к базе данных;passwd=passwordftp
- пароль для подключения к базе данных;db=vsftpd
- имя созданной базы данных;table=users
- таблица с пользователями;usercolumn=username
- название колонки, из которого извлекаем логин;passwdcolumn=password
- название колонки, из которого извлекаем пароль;
Создаем файл с логами для vsftpd
и выставляем на него права
1
$ sudo touch /var/log/vsftpd.log && chmod 600 /var/log/vsftpd.log
Создаем файл, в котором будет перечислен список пользователей, которым разрешен выход из домашнего каталога. И добавляем в него пользователя root
1
2
$ sudo touch /etc/vsftpd/chroot_list
$ echo 'root' | sudo tee -a /etc/vsftpd/chroot_list
Задаем пользователя и группу для директории, где будут хранится каталоги FTP-пользователей
1
$ sudo chown -R apache:apache /home/ftp
Web-Админка для VSFTP
Web админку можно скачать по ссылке ниже
Основной функционал админки:
- Добавить FTP-пользователя
- Удалить FTP-пользователя
- Поменять пароль FTP-пользователю
Дополнительный функционал админки:
- Пользователь может быть постоянный или временный. Временный автоматически удаляется через месяц
- Чтобы продлить срок действия аккаунта временного пользователя, надо обновить ему пароль, тогда аккаунт будет действовать еще месяц.
- При добавлении пользователя пароль генерируется автоматически, его можно перегенерировать, но вручную пароль вводить нельзя
- При добавлении пользователя вы можете указать e-mail. На него будет высылаться вся информация (логин/пароль при первом добавлении, новый пароль при изменении, предупреждение об удалении временного аккаунта за день до удаления, информирование об окончательном удалении временного аккаунта)
- Такие-же письма высылаются администратору Web-админки (e-mail задается в php)