Thank you for reading this post, don't forget to subscribe!
Оригинал статьи:
FTP-сервер VSFTPd и virtual users MySQL на CentOS 7, Web-админка для VSFTP
Установка Apache, PHP, MySQL
Добавляем репозиторий EPEL и обновляемся
1 2 |
[root@localhost]# yum install epel-release [root@localhost]# yum update |
Ставим софт для удобства работы
1 |
[root@localhost]# yum install nano htop mc wget |
Устанавливаем MySQL-сервер MariaDB, Web-сервер Apache и PHP
Ставим Apache
1 |
[root@localhost]# yum install httpd |
Добавляем сервер в автозагрузку и запускаем его
1 2 |
[root@localhost]# systemctl enable httpd.service [root@localhost]# systemctl start httpd.service |
Ставим MariaDB
1 |
[root@localhost]# yum install mariadb-server mariadb |
Добавляем сервер в автозагрузку и запускаем его
1 2 |
[root@localhost]# systemctl enable mariadb.service [root@localhost]# systemctl start mariadb.service |
Запускаем встроенный сценарий безопасности
1 |
[root@localhost]# mysql_secure_installation |
Вначале будет запрошен root-пароль, но т.к. в новой установке его нет, просто жмем Enter
После этого сценарий предложит создать root-пароль и задаст ряд вопросов.
[codesyntax lang="php"]
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 |
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY! In order to log into MariaDB to secure it, we'll need the current password for the root user. If you've just installed MariaDB, and you haven't set the root password yet, the password will be blank, so you should just press enter here. Enter current password for root (enter for none): OK, successfully used password, moving on… Setting the root password ensures that nobody can log into the MariaDB root user without the proper authorisation. You already have a root password set, so you can safely answer 'n'. Change the root password? [Y/n] n … skipping. By default, a MariaDB installation has an anonymous user, allowing anyone to log into MariaDB without having to have a user account created for them. This is intended only for testing, and to make the installation go a bit smoother. You should remove them before moving into a production environment. Remove anonymous users? [Y/n] y … Success! Normally, root should only be allowed to connect from 'localhost'. This ensures that someone cannot guess at the root password from the network. Disallow root login remotely? [Y/n] y … Success! By default, MariaDB comes with a database named 'test' that anyone can access. This is also intended only for testing, and should be removed before moving into a production environment. Remove test database and access to it? [Y/n] y - Dropping test database… … Success! - Removing privileges on test database… … Success! Reloading the privilege tables will ensure that all changes made so far will take effect immediately. Reload privilege tables now? [Y/n] y … Success! Cleaning up… All done! If you've completed all of the above steps, your MariaDB installation should now be secure. Thanks for using MariaDB! |
[/codesyntax]
Добавляем репозиторий REMI
1 |
[root@localhost]# rpm -ivh http://rpms.remirepo.net/enterprise/remi-release-7.rpm |
Устанавливаем утилиту для работы с репозиториями
1 |
[root@localhost]# yum install yum-utils |
Подключаем репозиторий для установки php версии 7.2
1 |
[root@localhost]# yum-config-manager --enable remi-php72 |
Устанавливаем php и дополнительные библиотеки для него
1 |
[root@localhost]# yum install php php-xml php-soap php-xmlrpc php-mbstring php-json php-gd php-mcrypt php-common php-devel php-fpm php-pdo php-mysqlnd php-imap php-embedded php-ldap php-odbc curl curl-devel |
Перезапускаем Apache
1 |
[root@localhost]# systemctl restart httpd.service |
Отключение Selinux
Отключаем Selinux
1 2 |
[root@localhost]# setenforce 0 [root@localhost]# nano /etc/selinux/config |
И редактируем следующую строку:
1 2 3 |
... SELINUX=disabled ... |
Настройка Apache
Настраиваем Apache, добавим vhosts — несколько сайтов на одном ip-адресе
1 2 3 |
[root@localhost]# nano /etc/httpd/conf.d/vhosts.conf # Загрузка моих vhosts IncludeOptional vhosts.d/*.conf |
Создаем каталог, где будут лежать конфигурации vhosts
1 |
[root@localhost]# mkdir /etc/httpd/vhosts.d |
Создаем конфигурационный файл для локального IP
[codesyntax lang="php"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
[root@localhost]# nano /etc/httpd/vhosts.d/192.168.1.19.conf <VirtualHost 192.168.1.19:80> ServerAdmin admin@test.ru 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> |
[/codesyntax]
Создаем необходимые каталоги и выставляем права доступа
1 2 3 |
[root@localhost]# mkdir -p /var/www/192.168.1.19/html [root@localhost]# mkdir -p /var/www/192.168.1.19/logs [root@localhost]# chown -R apache:apache /var/www/192.168.1.19/ |
Перезапускаем Apache
1 |
[root@localhost]# systemctl restart httpd.service |
Установка VSFTPd
Устанавливаем FTP-сервер
1 |
[root@localhost]# yum install vsftpd |
Редактируем конфигурационный файл
[codesyntax lang="php"]
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 |
[root@localhost ~]# cat /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 |
[/codesyntax]
Открываем порты 20-21 (активный режим работы ftp-сервера) и 40900-40999 (пассивный режим работы ftp-сервера)
1 2 3 |
[root@localhost]# firewall-cmd --permanent --add-port=20-21/tcp [root@localhost]# firewall-cmd --permanent --add-port=40900-40999/tcp [root@localhost]# firewall-cmd --reload |
Добавляем сервер в автозагрузку, запускаем его и проверяем статус
1 2 3 |
[root@localhost]# systemctl enable vsftpd [root@localhost]# systemctl start vsftpd [root@localhost]# 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-админки
[codesyntax lang="php"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
> 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 ; |
[/codesyntax]
Мой dump базы данных
[codesyntax lang="php"]
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'), 'admin@test.ru', '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; |
[/codesyntax]
Выходим из MySQL
1 |
> \q |
Устанавливаем модуль pam_mysql
1 |
[root@localhost]# 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 |
[root@localhost]# mv /etc/pam.d/vsftpd /etc/pam.d/vsftpd.back |
Создаем новый pam файл
cat /etc/pam.d/vsftpd
[codesyntax lang="php"]
1 2 3 |
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 |
[/codesyntax]
- user=vsftpd_user — логин ароль для подключения к базе данных;
- passwd=passwordftp — пароль для подключения к базе данных;
- db=vsftpd — имя созданной базы данных;
- table=users — таблица с пользователями;
- usercolumn=username — название колонки, из которого извлекаем логин;
- passwdcolumn=password — название колонки, из которого извлекаем пароль;
Создаем файл с логами для vsftpd и выставляем на него права
1 |
[root@localhost]# touch /var/log/vsftpd.log && chmod 600 /var/log/vsftpd.log |
Создаем файл, в котором будет перечислен список пользователей, которым разрешен выход из домашнего каталога. И добавляем в него пользователя root
1 2 |
[root@localhost]# touch /etc/vsftpd/chroot_list [root@localhost]# echo 'root' >> /etc/vsftpd/chroot_list |
Задаем пользователя и группу для директории, где будут хранится каталоги FTP-пользователей
1 |
[root@localhost]# chown -R apache:apache /home/ftp |
Web-Админка для VSFTP
Web админку можно скачать по ссылке ниже
https://github.com/bullvinkl/ftpadmin
Основной функционал админки:
- Добавить FTP-пользователя
- Удалить FTP-пользователя
- Поменять пароль FTP-пользователю
Дополнительный функционал админки:
- Пользователь может быть постоянный или временный. Временный автоматически удаляется через месяц
- Чтобы продлить срок действия аккаунта временного пользователя, надо обновить ему пароль, тогда аккаунт будет действовать еще месяц.
- При добавлении пользователя пароль генерируется автоматически, его можно перегенерировать, но вручную пароль вводить нельзя
- При добавлении пользователя вы можете указать e-mail. На него будет высылаться вся информация (логин/пароль при первом добавлении, новый пароль при изменении, предупреждение об удалении временного аккаунта за день до удаления, информирование об окончательном удалении временного аккаунта)
- Такие-же письма высылаются администратору Web-админки (e-mail задается в php)