Установка и настройка vsftpd на CentOS 7
Меня попросили в разделе с заказами написать статью на тему ftp сервера. Я планировал ее написать ранее, но все откладывал, а теперь решил сделать это. В качестве примера я возьму ftp сервер — vsftpd, систему — CentOS 7. Рассмотрю несколько разных вариантов настройки — простой и более сложный.
Содержание:
- 1 Введение
- 2 Простая настройка ftp в CentOS 7
- 3 Настройка vsftpd с виртуальными пользователями
- 4 Хранение vsftpd пользователей в mysql
- 5 Заключение
- 6 Видео
- 7 Дополнительные материалы по CentOS
Введение
По моим наблюдениям, популярность ftp серверов с каждым годом падает. Сам я очень редко им пользуюсь и на свои сервера чаще всего не устанавливаю. Так как я работаю с серверами, к которым имею доступ по ssh, необходимости в ftp нет, использую SFTP.
Серьезную конкуренцию ftp создали облачные сервисы для хранения файлов. Чтобы кому-то передать файл, достаточно его расшарить на облачном хранилище и отправить человеку ссылку.
Тем не менее, в некоторых случаях может понадобиться ftp сервер. Доступ к такому серверу часто дают тогда, когда нужно, чтобы к вам кто-то что-то закачал большого объема. Так же ftp доступ дают некоторые хостинг компании, когда вы у них заказываете сервер для бэкапов. Например, ihor, которым я постоянно пользуюсь, предлагает услугу пространство для бэкапа именно по протоколу ftp.
Так что хоть ftp и потерял популярность, но не перестал быть актуальным. Рассмотрим настройку ftp сервера на примере vsftpd. Сделаем несколько конфигураций:
- Самая быстрая и простая. В качестве пользователей ftp будут системные пользователи.
- Более сложная конфигурация, где пользователи будут виртуальные, хранить их будем в отдельном файле.
- Вариант с виртуальными пользователями, но хранить мы их будем в mysql базе.
Работать будем на следующем сервере:
Простая настройка ftp в CentOS 7
Если у вас уже есть готовый сервер, то сразу приступайте к установке vsftpd. Если нет, то рекомендую две подходящие статьи для предварительной подготовки: подробная установка centos 7 и базовая настройка сервера.
Начинаем традиционно с обновления системы:
# yum -y update
Устанавливаем vsftpd:
# yum -y install vsftpd
Переходим к настройке. Я использую следующую схему работы ftp сервера с системными пользователями. Пользователю root разрешаю ходить по всему серверу. Всем остальным пользователям только в свои домашние директории. Анонимных пользователей отключаю.
Очистим каталог /etc/vsftpd, нам ничего не нужно из того, что там есть по-умолчанию. Можете сохранить куда-нибудь оригинальный конфиг, нам он не понадобится.
# rm -rf /etc/vsftpd/*
Открываем конфиг сервера /etc/vsftpd/vsftpd.conf
# mcedit /etc/vsftpd/vsftpd.conf
и приводим его к следующему виду vsftpd.conf. Не вывожу файл сюда, чтобы не растягивать страницу, конфигов в статье будет много. В файле даны подробные комментарии к каждому параметру.
Создаем необходимых пользователей, файлы и каталоги для установленной конфигурации. Добавим тестового пользователя ftp в систему:
# useradd -s /sbin/nologin ftp-user
# passwd ftp-user
Пользователя создаем без оболочки. Тут сразу можно указать в качестве домашней директории необходимый каталог, в котором будет работать пользователь. Я специально этого не делаю, чтобы продемонстрировать работу пользовательских настроек в отдельном файле. Пользователь будет создан со стандартным домашним каталогом в /home, но при работе по ftp он будет направлен в другой каталог, который мы ему укажем через файл пользовательских настроек vsftpd.
Создаем каталог для персональных настроек пользователей:
# mkdir /etc/vsftpd/users
В каталоге можно будет создать отдельно файлы с именами пользователей и передать им персональные параметры. Для примера создадим файл с именем пользователя ftp-user и укажем его домашний каталог:
# touch /etc/vsftpd/users/ftp-user
# echo 'local_root=/ftp/ftp-user/' >> /etc/vsftpd/users/ftp-user
Не забываем создать этот каталог и назначить ему владельца:
# mkdir /ftp && chmod 0777 /ftp
# mkdir /ftp/ftp-user && chown ftp-user. /ftp/ftp-user/
Создаем файл c пользователями, которым можно выходить за пределы домашнего каталога:
# touch /etc/vsftpd/chroot_list
Добавляем туда рута:
# echo 'root' >> /etc/vsftpd/chroot_list
Создаем файл со списком пользователей ftp, которым разрешен доступ к серверу:
# touch /etc/vsftpd/user_list
# echo 'root' >> /etc/vsftpd/user_list && echo 'ftp-user' >> /etc/vsftpd/user_list
Этим списком мы можем ограничить доступ к ftp серверу системных пользователей, которым туда ходить не нужно. Осталось только создать файл для логов:
# touch /var/log/vsftpd.log && chmod 600 /var/log/vsftpd.log
Все готово для работы. Добавляем vsftpd в автозагрузку и запускаем:
# systemctl enable vsftpd
# systemctl start vsftpd
Проверяем, запустился ли он:
# netstat -tulnp | grep vsftpd
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 19505/vsftpd
Все в порядке, можно подключаться клиентом.
Я зашел пользователем root и смог прогуляться по всей файловой системе.
Пользователь ftp-user ограничен своим домашним каталогом, указанном в индивидуальном файле с параметрами. Выйти за его пределы он не может. В лог файле отражены все действия пользователей на сервере: загрузка и скачивание файлов.
Обращаю внимание, что это мой опыт работы с vsftpd. Давать доступ системному руту по ftp ко всей файловой системе весьма опасно, нужно пользоваться осторожно. Я уже точно не помню, зачем я так делал, остались заметки с давних времен. Рассматривайте это просто как демонстрацию возможностей и используйте эти функции так, как вам нужно.
Настройка vsftpd с виртуальными пользователями
Рассмотрим вариант, когда пользователи ftp сервера не должны пересекаться с локальными. В данном примере будут работать только виртуальные пользователи. Я мельком проверил, можно ли настроить и тех и других, оказалось, что можно. Но там надо аккуратно с правами разбираться и со списками разрешенных пользователей. Я решил, что не буду описывать эту ситуацию, так как не очень представлю, когда она может пригодиться. Если кому-то надо, то на базе этой статьи он сам сможет разобраться.
Чтобы авторизовать виртуальных пользователей, установим дополнительный пакет compat-db:
# yum -y install compat-db
На всякий случай сохраните оригинальный pam.d файл, если захотите снова вернуться к системным пользователям:
# cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd.orig
Нужно изменить pam файл /etc/pam.d/vsftpd, приведя его к следующему виду:
# mcedit /etc/pam.d/vsftpd
auth required pam_userdb.so db=/etc/vsftpd/virt_users
account required pam_userdb.so db=/etc/vsftpd/virt_users
session required pam_loginuid.so
# mcedit /etc/vsftpd/vsftpd.conf
Рисуем следующий конфиг для vsftpd vsftpd.conf
Создаем файл с виртуальными пользователями:
# touch /etc/vsftpd/virt_users
Добавляем туда в первую строку имя пользователя, во вторую его пароль. В конце не забудьте перейти на новую строку, это важно. Файл должен быть примерно таким:
ftp-virt1
password1
ftp-virt2
password2
Сохраняем файл и генерируем локальное хранилище учеток:
# db_load -T -t hash -f /etc/vsftpd/virt_users /etc/vsftpd/virt_users.db
У вас должен появиться файл virt_users.db.
Нужно создать каталоги для этих пользователей:
# mkdir /ftp/ftp-virt1 /ftp/ftp-virt2
Для папки /ftp надо назначить соответствующего владельца, от которого ftp сервер будет пускать виртуальных пользователей:
# chown -R ftp. /ftp
На этом настройка виртуальных пользователей ftp закончена. Перезапускаем vsftpd и пробуем залогиниться:
# systemctl restart vsftpd
Я набросал небольшой скрипт, чтобы было удобно добавлять новых пользователей, предлагаю воспользоваться:
# mcedit /etc/vsftpd/add_virt_user.sh
#!/bin/sh
echo -n "Enter name of virtual user: "
read virtuser
echo -n "Enter password: "
read virtpass
mkdir /ftp/$virtuser
chown ftp. /ftp/$virtuser
touch /etc/vsftpd/users/$virtuser
echo "$virtuser" >> /etc/vsftpd/virt_users
echo "$virtpass" >> /etc/vsftpd/virt_users
db_load -T -t hash -f /etc/vsftpd/virt_users /etc/vsftpd/virt_users.db
Делаете файл исполняемым и запускаете:
# chmod 0700 /etc/vsftpd/add_virt_user.sh
# /etc/vsftpd/add_virt_user.sh
Enter name of virtual user: ftp-virt2
Enter password: 123456
Все, пользователь добавлен, можно сразу им заходить. Вот так легко и просто настраиваются виртуальные пользователи в vsftpd. Рассмотрим теперь третий вариант, когда эти пользователи хранятся в mysql базе.
Хранение vsftpd пользователей в mysql
Настройка не отличается от предыдущего раздела. Конфиг один в один совпадает. Изменится только файл в pam.d. Но перед тем, как его изменить, выполним подготовительные настройки. Первым делом нам понадобится mariadb, устанавливаем ее:
# yum install -y mariadb mariadb-server
Запускаем и добавляем ее в автозагрузку:
# systemctl start mariadb
# systemctl enable mariadb.service
Выполняем скрипт первоначальной настройки mysql:
# /usr/bin/mysql_secure_installation
Подробнее о настройке mysql рассказано в статье про настройку web сервера на centos. Если вам в будущем понадобится веб сервер, можете сразу его настроить, а заодно поставить phpmyadmin, дальнейшие действия проще будет выполнить там. Но я сейчас не буду на этом останавливаться, сделаем все в консоли.
Подключаемся к mysql:
# mysql -u root -p
Создаем пользователя и базу данных для хранения учетных записей пользователей ftp:
> CREATE DATABASE vsftpd;
> GRANT SELECT ON vsftpd.* TO 'vsftpd'@'localhost' IDENTIFIED BY '12345';
> FLUSH PRIVILEGES;
vsftpd | имя пользователя и базы |
12345 | пароль пользователя |
Создаем таблицу учеток:
> USE vsftpd;
> CREATE TABLE `accounts` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`username` VARCHAR( 30 ) NOT NULL ,
`pass` VARCHAR( 50 ) NOT NULL ,
UNIQUE (`username`)
) ENGINE = MYISAM ;
Создадим сразу одного пользователя:
> INSERT INTO accounts (username, pass) VALUES('ftp-mysql', md5('123'));
ftp-mysql | имя пользователя |
123 | пароль |
Список пользователей можно посмотреть с помощью команды:
> select * from accounts;
+----+-----------+----------------------------------+
| id | username | pass |
+----+-----------+----------------------------------+
| 1 | ftp-mysql | 202cb962ac59075b964b07152d234b70 |
+----+-----------+----------------------------------+
1 row in set (0.01 sec)
Выходим из консоли mysql и создаем каталог для нового пользователя:
# mkdir /ftp/ftp-mysql && chown ftp. /ftp/ftp-mysql
Для авторизации пользователей vsftpd через mysql нам необходимо установить pam_mysql. Тут я столкнулся серьезной проблемой. Во-первых, в стандартном репозитории его нет. Раньше он был в репозитории epel, но начиная с 7-й версии его оттуда убрали. Причина в том, что он очень старый, 2008-го года или еще раньше, если я не ошибаюсь. С тех пор он не обновляется. В centos решили, что этот модуль уже не нужен, он морально устарел, а хранить учетные записи в mysql плохая идея. В тренде сейчас ldap, надо там хранить учетки. В принципе, это разумно. Но отказываться от привычной mysql все равно не хочется.
Мне пришлось прилично загуглиться в буржунет и найти там информацию. Я узнал, что для CentOS 7 подойдет вот эта версия pam_mysql-0.7-0.16.rc1.fc20.x86_64.rpm. Было очень много битых ссылок, но все же я нашел рабочую. На всякий случай сохраняю ее у себя. Так что ставим модуль pam_mysql для centos 7 с моего сайта:
# rpm -Uvh //serveradmin.ru/files/pam_mysql-0.7-0.16.rc1.fc20.x86_64.rpm
Теперь редактируем файл /etc/pam.d/vsftpd. В интернете много примеров конфигурации. Опытным путем собрал рабочий вариант:
# mcedit /etc/pam.d/vsftpd
session optional pam_keyinit.so force revoke
auth required pam_mysql.so user=vsftpd passwd=12345 host=localhost db=vsftpd table=accounts usercolumn=username passwdcolumn=pass crypt=3
account required pam_mysql.so user=vsftpd passwd=12345 host=localhost db=vsftpd table=accounts usercolumn=username passwdcolumn=pass crypt=3
Сохраняем файл, перезапускаем на всякий случай vsftpd и пробуем зайти свежесозданным пользователем.
# systemctl restart vsftpd
У меня все получилось. Если будут какие-то проблемы, то смотрите в первую очередь на работу mysql_pam в логе /var/log/audit/auditlog. У меня были такие ошибки, когда я настраивал авторизацию и она не работала:
type=USER_AUTH msg=audit(1459442408.756:724): pid=21483 uid=0 auid=4294967295 ses=4294967295 msg='op=PAM:authentication grantors=? acct="ftp-mysql" exe="/usr/sbin/vsftpd" hostname=192.168.1.100 addr=192.168.1.100 terminal=ftp res=failed'
После правильной настройки, появились такие записи:
type=CRED_ACQ msg=audit(1459442810.698:735): pid=21564 uid=0 auid=4294967295 ses=4294967295 msg='op=PAM:setcred grantors=pam_mysql acct="ftp-mysql" exe="/usr/sbin/vsftpd" hostname=192.168.1.100 addr=192.168.1.100 terminal=ftp res=success'
В логе /var/log/secure тоже может быть полезная информация. У меня было так:
Mar 31 19:39:44 vsftpd[21475]: pam_mysql - MySQL error(Unknown column 'passwd' in 'field list')
С пробелами в строках была путаница, пока не исправил, не работало ничего. Но потом все заработало.
На этом у меня сегодня все. Можно скрипт набросать для удобного добавления пользователей в базу, но мне уже лениво. Может кто-нибудь другой в комментариях поделится.
Заключение
Мы подробно рассмотрели вопрос использования vsftpd сервера с различной настройкой учетных записей. По мне удобнее всего работать с виртуальными пользователями в локальной не mysql базе. Но если используется какая-нибудь панель управления сервером, то удобно засунуть всех пользователей в базу.
Когда я настраивал публичный хостинг, то использовал самописные скрипты для создания каталогов виртуальных хостов, добавления настроек в апач и создание пользователей ftp с доступом к своим сайтам. Там без ftp не обойтись, так как его постоянно просят веб мастера. В планах есть написать статью на эту тему, но пока руки не доходят.
Видео
- Как установить или обновить php 7 на CentOS 7
- Backup linux сервера с помощью Duplicity
- Установка Ruby на CentOS 7
- Установка и настройка удаленного доступа на CentOS 7 с помощью Webmin
- Установка phpmyadmin на CentOS 7
- Как настроить сетевые параметры в Debian
- Настройка почтового сервера iRedMail на CentOS 7
- Настройка pptp сервера на Debian
- Настройка syslog-ng для централизованного сбора логов
- Спам запросов к al_profileEdit.php на веб сервере