🐹 CentOS 7: Установка и настройка vsFTPd .

Содержание:

1. Введение.
2. Простая настройка ftp.

2.1. Не работает авторизация, ошибка 530.
2.2. Смена стандартного порта vsftpd.
2.3. Инструкция по добавлению новых пользователей.
2.4. Bash-скрипт добавления пользователей.

3. Настройка vsftpd с виртуальными пользователями.
4. Хранение vsftpd пользователей в mysql.
5. Заключение.
6. Оригиналы источников информации.


1. Введение.

По моим наблюдениям, популярность ftp-серверов с каждым годом падает. Сам я очень редко им пользуюсь и на свои сервера чаще всего не устанавливаю. Так как я работаю с серверами, к которым имею доступ по ssh, необходимости в ftp нет, использую SFTP.

Серьезную конкуренцию ftp создали облачные сервисы для хранения файлов. Чтобы кому-то передать файл, достаточно его расшарить на облачном хранилище и отправить человеку ссылку.

Тем не менее, в некоторых случаях может понадобиться ftp-сервер. Доступ к такому серверу часто дают тогда, когда нужно, чтобы к вам кто-то что-то закачал большого объема. Так же ftp доступ дают некоторые хостинг компании, когда вы у них заказываете сервер для бэкапов.

Так что хоть ftp и потерял популярность, но не перестал быть актуальным. Рассмотрим настройку ftp-сервера на примере vsftpd.

Сделаем несколько конфигураций:

  • Самая быстрая и простая. В качестве пользователей ftp будут системные пользователи.
  • Более сложная конфигурация, где пользователи будут виртуальные, хранить их будем в отдельном файле.
  • Вариант с виртуальными пользователями, но хранить мы их будем в mysql базе.

2. Простая настройка ftp.

Если у вас уже есть готовый сервер, то сразу приступайте к установке 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. Не вывожу файл сюда, чтобы не растягивать страницу, конфигов в статье будет много. В файле даны подробные комментарии к каждому параметру.

vsftpd.conf
# Запуск сервера в режиме службы
listen=YES

# Работа в фоновом режиме
background=YES

# Имя 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

# Порты для пассивного режима работы
pasv_min_port=49000
pasv_max_port=55000

Создаем необходимых пользователей, файлы и каталоги для установленной конфигурации. Добавим тестового пользователя ftp в систему:

# useradd -s /sbin/nologin ftp-user
# passwd ftp-user

Пользователя создаем без оболочки! Это важный момент. Обратите на это внимание. Далее ftp-система его не пропустит, пока мы не поправим конфигурационный файл /etc/pam.d/vsftpd. Как это сделать рассмотрим ниже по тексту, после основной части инструкции по настройке ftp-соединения.

Тут сразу можно указать в качестве домашней директории необходимый каталог, в котором будет работать пользователь. Я специально этого не делаю, чтобы продемонстрировать работу пользовательских настроек в отдельном файле. Пользователь будет создан со стандартным домашним каталогом в /home, но при работе по ftp он будет направлен в другой каталог, который мы ему укажем через файл пользовательских настроек vsftpd.

Создаем каталог для персональных настроек пользователей:

# mkdir -p /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

Статус службы:

# systemctl status vsftpd


Проверяем, запустился ли vsftpd на 21 порту:

# netstat -tulnp | grep vsftpd

Все в порядке, можно подключаться клиентом, по перед этим в iptables нужно открыть следующие порты:

-A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 20 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 49000:55000 -j ACCEPT

Если вы пользуетесь другим межсетевым экраном, то сделайте открытие указанных портов по аналогии.

Я зашел пользователем root и смог прогуляться по всей файловой системе.

Пользователь ftp-user ограничен своим домашним каталогом, указанном в индивидуальном файле с параметрами. Выйти за его пределы он не может. В лог файле отражены все действия пользователей на сервере: загрузка и скачивание файлов.

Обращаю внимание, что это мой опыт работы с vsftpd. Давать доступ системному руту по ftp ко всей файловой системе весьма опасно, нужно пользоваться осторожно. Я уже точно не помню, зачем я так делал, остались заметки с давних времен. Рассматривайте это просто как демонстрацию возможностей и используйте эти функции так, как вам нужно.

2.1. Не работает авторизация, ошибка 530.

Ранее я обратил ваше внимание, что мы создаем пользователя без оболочки. По умолчанию в vsftpd стоит запрет на пропуск таких типов пользователей к файловой системе. Для того, чтобы все исправно заработало, требуется снять данное ограничение.

Пример такого ограничения. Не работает авторизация в vsftpd:

530 Login incorrect

Решение:

Данная ошибка получается из-за того, что в файле /etc/pam.d/vsftpd присутствует строчка:

# egrep -v "^#|^$" /etc/pam.d/vsftpd

...
auth       required     pam_shells.so
...

Она означает, что только пользователям с доступом к оболочкам должен быть разрешен доступ.

А добавляли мы пользователя как раз с параметром: -s /sbin/nologin:

# useradd -s /sbin/nologin ftpuser

Комментирует эту строчку: auth required pam_shells.so и перезапускаем vsftpd:

# mcedit /etc/pam.d/vsftpd

# auth required pam_shells.so

# systemctl restart vsftpd

2.2. Смена стандартного порта vsftpd.

Если потребуется сменить стандартный порт vsftpd на какой нибудь другой, то надо добавить к конфигурацию выше всего 1 строку отвечающий за эту функцию.

Перед строкой ‘connect_from_port_20=YES‘ написать ‘listen_port=ваш_порт‘.

Можно и 20-й порт променять, на любой другой. Просто напишите вместо ‘20‘, любую другую цифру порта.

# Слушать любой желаемый порт
listen_port=21

# Указывает исходящим с сервера соединениям использовать 20-й порт
connect_from_port_20=YES

После этого перезапустите службу:

# systemctl restart vsftpd

2.3. Инструкция по добавлению новых пользователей.

Добавляем пользователя в систему:

# useradd -s /sbin/nologin testuser
# passwd testuser

Создаем каталог пользователя и задаем владельца:

# mkdir /home/vsftpd/testuser
# chown test:test /home/vsftpd/testuser

Создаем папку, где будут отдельные конфиги пользователей:

# touch /etc/vsftpd/users/testuser

Задаем в конфиге домашний ftp-каталог:

# echo 'local_root=/home/vsftpd/testuser/' >> /etc/vsftpd/users/testuser

Задаем разрешенных пользователей:

# echo 'testuser' >> /etc/vsftpd/user_list

Перезапускаем vsftpd:

# systemctl restart vsftpd

2.4. Bash-скрипт добавления пользователей.

Создаем bash-скрипт add_ftp_user.sh:

# nano /home/add_ftp_user.sh

#!/bin/bash

NAME=$1
PASS=$2

echo "USAGE: add_ftp_user.sh [username] [password]"

# проверка входных параметров
if [ -z "$NAME" ]; then
    echo "Error: username is not set"
    exit
fi

if [ -z "$PASS" ]; then
    echo "Error: password not set"
    exit
fi

# создаем системных пользователей
echo "Creating user: $NAME"
echo "With password: $PASS"

useradd -s /sbin/nologin -p `openssl passwd -1 $PASS` $NAME

# сохраняем данные в файл /etc/vsftpd/new_ftp_users_list
echo "user: $NAME, pass: $PASS" >> /etc/vsftpd/new_ftp_users_list

# создаем ftp-директорию пользователя
mkdir /home/vsftpd/$NAME

# назначаем владельца
chown $NAME:$NAME /home/vsftpd/$NAME

# создаем пустой конфигурационный файл
touch /etc/vsftpd/users/$NAME

# прописываем домашний каталог
echo "local_root=/home/vsftpd/$NAME/" >> /etc/vsftpd/users/$NAME

# добавляем пользователя в список разрешенных для подключения
echo "$NAME" >> /etc/vsftpd/user_list

# задаем права каталога пользователя
chmod 0777 /home/vsftpd/$NAME

# перезапускаем службу vsftp
systemctl restart vsftpd

Делаем его исполняемым:

# chmod +x /home/add_ftp_user.sh

Теперь, что бы добавить нового ftp-пользователя надо выполнить команду:

# сd /home
# ./add_ftp_user.sh %user% %pass%

, где
%user% — логин
%pass% — пароль

3. Настройка vsftpd с виртуальными пользователями.

Рассмотрим вариант, когда пользователи ftp-сервера не должны пересекаться с локальными. В данном примере будут работать только виртуальные пользователи. Я мельком проверил, можно ли настроить и тех и других, оказалось, что можно, но там надо аккуратно с правами разбираться и со списками разрешенных пользователей. Я решил, что не буду описывать эту ситуацию, так как не очень представлю, когда она может пригодиться. Если кому-то надо, то на базе этой статьи он сам сможет разобраться.

Чтобы авторизовать виртуальных пользователей, установим дополнительный пакет compat-db:

# yum -y install compat-db

На всякий случай сохраните оригинальный pam.d файл, если захотите снова вернуться к системным пользователям:

# cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd.original_config

Нужно изменить pam.d файл /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
# Запуск сервера в режиме службы
listen=YES

# Работа в фоновом режиме
background=YES

# Разрешить подключаться виртуальным пользователям
guest_enable=YES

# Системный пользователь от имени которого подключаются виртуальные
guest_username=ftp

# Виртуальные пользователи имеют те же привелегии, что и локальные
virtual_use_local_privs=YES

# Автоматическое назначение домашнего каталога для виртуальных пользователей
user_sub_token=$USER
local_root=/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

# Директория с настройками пользователей
user_config_dir=/etc/vsftpd/users

# Показывать файлы, начинающиеся с точки
force_dot_files=YES

# Маска прав доступа к создаваемым файлам
local_umask=022

# Порты для пассивного режима работы
pasv_min_port=49000
pasv_max_port=55000

Создаем файл с виртуальными пользователями:

# touch /etc/vsftpd/virt_users

# mcedit /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 -p /ftp/ftp-virt1 /ftp/ftp-virt2

Для папки /ftp надо назначить соответствующего владельца, от которого ftp-сервер будет пускать виртуальных пользователей:

# chown -R ftp. /ftp

На этом настройка виртуальных пользователей FTP закончена. Перезапускаем vsftpd и пробуем залогиниться:

# systemctl restart vsftpd

Я набросал небольшой скрипт, чтобы было удобно добавлять новых пользователей, предлагаю воспользоваться:

# mcedit /etc/vsftpd/add_virt_user.sh

add_virt_user.sh
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 базе.

4. Хранение 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 7. Если вам в будущем понадобится web-сервер, можете сразу его настроить, а заодно поставить 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 ;

Обратите внимание на кавычки при копировании. Если будут ошибки в синтаксисе mysql, вам нужно будет их удалить и проставить заново.

Создадим сразу одного пользователя:

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 7 решили, что этот модуль уже не нужен, он морально устарел, а хранить учетные записи в 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’)

С пробелами в строках была путаница, пока не исправил, не работало ничего, но потом все заработало.

На этом у меня сегодня все!

5. Заключение.

Мы подробно рассмотрели вопрос использования vsftpd сервера с различной настройкой учетных записей. По мне удобнее всего работать с виртуальными пользователями в локальной не mysql базе. Но если используется какая-нибудь панель управления сервером, то удобно засунуть всех пользователей в базу.

Когда я настраивал публичный хостинг, то использовал самописные скрипты для создания каталогов виртуальных хостов, добавления настроек в апач и создание пользователей ftp с доступом к своим сайтам. Там без ftp не обойтись, так как его постоянно просят web-мастера.

6. Оригиналы источников информации.

  1. serveradmin.ru «Установка и настройка vsftpd на CentOS 7» от 31.03.2016.
  2. sysadmin-komi.ru «Смена стандартного порта vsftpd».
  3. itdraft.ru «Установка и настройка FTP-сервера VSFTPd на Centos 7. Локальные пользователи».