вторник, 30 июня 2020 г.

Установка FTP-сервера на Centos 7 с ауентификацией

Всем доброго времени суток!
Периодически у Администраторов возникает задача поднять FTP сервер с авторизацией, и при этом что бы пользователи в зависимости от логина попадали в свои домашние папки.
Такая задача появилась и у меня.



В интернете был найден вполне вменяемый мануал как это сделать
https://serveradmin.ru/ustanovka-i-nastroyka-ftp-servera-na-centos-7/

Однако, нашлись небольшие трудности, ответы на которые я нашел в этой статье
https://itdraft.ru/2018/07/23/ustanovka-i-nastrojka-ftp-servera-vsftpd-na-centos-7-lokalnye-polzovateli/

Для того, что бы отложилось в памяти, я перенесу сюда с поправками.

Для начала устанавливаем CentOS7, и обновляем ее.

#yum update -y
Далее я отключаю Selinux. Это конечно не совсем верно :).

Устанавливаем vsftpd:

# yum -y install vsftpd

Переходим к настройке. Будем настраивать работу ftp сервера с системными пользователями. Пользователю root разрешаю ходить по всему серверу. Всем остальным пользователям только в свои домашние директории. Анонимных пользователей выключаем.
Далее можно очистить каталог /etc/vsftpd. Для спокойствия оргиниальный конфиг можно куда нибудь сохранить.

# rm -rf /etc/vsftpd/*

Создаем новый файл конфигурации /etc/vsftpd/vsftpd.conf

# vi /etc/vsftpd/vsftpd.conf
 И вписываем туда следующую конфиурацию.

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

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

# Имя pam сервиса для vsftpd
pam_service_name=vsftpd

# Входящие соединения контроллируются через tcp_wrappers для CentOS8 параметр NO
tcp_wrappers=YES
#tcp_wrappers=NO
# Запрещает подключение анонимных пользователей
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

Пользователя создаем без оболочки. Тут сразу можно указать в качестве домашней директории необходимый каталог, в котором будет работать пользователь. Пользователь будет создан со стандартным домашним каталогом в /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 'ftp-user' >> /etc/vsftpd/user_list

Этим списком мы можем ограничить доступ к ftp серверу системных пользователей, которым туда ходить не нужно. Осталось только создать файл для логов:

# touch /var/log/vsftpd.log && chmod 600 /var/log/vsftpd.log
Теперь необходимо добавить правило в файерволл


# firewall-cmd --permanent --add-port=21/tcp
# firewall-cmd --permanent --add-port=49000-55000/tcp
# firewall-cmd --reload
 На данном этапе я хотел бы добавить следующий момент. После запуска возникают проблемы с авторизацией.

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

# egrep -v "^#|^$" /etc/pam.d/vsftpd
...
auth       required     pam_shells.so
...

Это означает, что только пользователям с доступом к оболочкам должен быть разрешен доступ
А добавляли мы пользователя как раз с параметром: -s /sbin/nologin
Комментируем эту строчку: auth required pam_shells.so

Все готово для работы. Добавляем 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

Все в порядке, можно подключаться клиентом.

Теперь немного об автоматизации добавления пользователей. Привожу текст скрипта для добавления пользователей.

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

# vi /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 /ftp/$NAME

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

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

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

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

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

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

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

# chmod +x /home/add_ftp_user.sh
Теперь, что бы добавить нового FTP-пользователя надо выполнить команду
# сd /home
# ./add_ftp_user.sh username userpass

Где username и userpass это имя и пароль пользователя FTP.
Вот на этом пожалуй и все.






2 комментария:

  1. Настройка vsftpd в Centos 8
    Для настройки ftp сервера в Centos 8, необходимо выполнить :

    Параметр tcp_wrappers необходимо отключить, т.е. указать NO. В Centos 8 нет его поддержки.

    ОтветитьУдалить
  2. Если хочется расширенных логов то в конце конфига основного добавляем
    log_ftp_protocol=YES
    xferlog_std_format=NO

    ОтветитьУдалить

При обновлении VCenter 6.7 до VCenter 7.0 ошибка Host not found

 Всем доброго времени суток! При обновлении VCenter 6.7 до версии 7.0 пришлось столкнуться со следующей ошибкой при обновлении , точнее в пр...