Настройка vsftpd с использованием virtual users

В этой заметке я расскажу, как настроить ftp сервер под Ubuntu-подобной системой, используя схему авторизации с виртуальными пользователями через pam. Тестирование проходило на Ubuntu 10.10 (Maverick Meerkat) x64. Как обычно, устанавливаем сервер:

$ apt-get install vsftpd

Сначала приводим в должный вид файл /etc/vsftpd.conf.

Запрещаем анонимуса

# Allow anonymous FTP? (Beware - allowed by default if you comment this out).
anonymous_enable=NO

Это надо включить для использования списка юзеров

# Uncomment this to allow local users to log in.
local_enable=YES

Разрешение на запись

# Uncomment this to enable any form of FTP write command.
write_enable=YES

Запрещаем любые действия анонимам

# Uncomment this to allow the anonymous FTP user to upload files. This only
# has an effect if the above global write enable is activated. Also, you will
# obviously need to create a directory writable by the FTP user.
anon_upload_enable=NO

# Uncomment this if you want the anonymous FTP user to be able to create
# new directories.
anon_mkdir_write_enable=NO
anon_other_write_enable=NO

Строка приветствия

#You may fully customise the login banner string:
ftpd_banner=Тут могла быть ваша реклама.

Запрещаем юзерам "выходить" из назначенной им директории.

# You may restrict local users to their home directories.  See the FAQ for
# the possible risks in this before using chroot_local_user or
# chroot_list_enable below.
chroot_local_user=YES

ДОРАБОТАТЬ Маски создания

pam_service_name=vsftpd

guest_enable=YES
guest_username=virtual
user_config_dir=/etc/vsftpd/users_config

chown_username=virtual
#anon_umask=0007
#file_open_mode=0777
#local_umask=777

anon_umask=0x666
#file_open_mode=0666
#local_umask=555

Создаем директорию, где будут хранится файлы настройки:

$ cd /etc 
$ mkdir vsftpd 
$ chmod 700 vsftpd

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

$ cd vsftpd 
$ touch logins.txt 
$ chmod 600 logins.txt

Файл этот текстовый и имеет такую структуру - <логин> <пароль>. Например:

vasya secretpassword
masha 123

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

$ cd /etc/vsftpd 
$ mkdir users_config

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

convert.sh

#!/bin/bash

db4.8_load -T -t hash -f logins.txt logins.db
chmod 600 logins.db

create.sh

#!/bin/bash

USER=$1
PASS=$2

echo "$USER"+"$PASS"

#Добавление юзера и апдейт базы
echo "$USER" >> logins.txt
echo "$PASS" >> logins.txt
db4.8_load -T -t hash -f logins.txt logins.db
chmod 600 logins.db

#Создание папки
mkdir /home/ftp/$USER
chown virtual:virtual /home/ftp/$USER
chmod 555 /home/ftp/$USER

#Создание конфига
cd /etc/vsftpd/users_config/
touch "$USER"
echo "local_root=/home/ftp/$USER" >> "$USER"
echo "write_enable=YES" >> "$USER"
echo "anon_mkdir_write_enable=YES" >> "$USER"
echo "anon_other_write_enable=YES" >> "$USER"
echo "anon_upload_enable=YES" >> "$USER"
echo "chroot_local_user=YES" >> "$USER"

ДОБАВИТЬ ЧТО ДЕЛАЕТ СКРИПТ

Назначаем права:

$ chmod 700 convert.sh 
$ chmod 700 create.sh

Устанавливаем утилиты BerkleyDB:

$ apt-get install db4.8-util

В момент написания использовались 4.8, как последние. В скрипте соответственно используется db4.8_load. Пробуем отконвертить logins.txt:

./convert.sh

Если отработало без ошибок и появился файл logins.db, то версии Беркли совпадают. Назначим ему права:

$ chmod 600 logins.db

Займемся аутентификацией пользователей. За это отвечает служба PAM. Конфиги pam для каждого клиента (в нашем случае клиент - это сервис vsftpd) лежат в /etc/pam.d. В vsftps.conf мы указали, как наш файл для службы pam будет называться стройкой pam_service_name=vsftpd. приведем его к следующему виду:

# Standard behaviour for ftpd(8).
#auth   required        pam_listfile.so item=user sense=deny file=/etc/ftpusers onerr=succeed

# Note: vsftpd handles anonymous logins on its own. Do not enable pam_ftp.so.

# Standard pam includes
#@include common-account
#@include common-session
#@include common-auth
# auth  required        pam_shells.so

auth required /lib/security/pam_userdb.so db=/etc/vsftpd/logins
account required /lib/security/pam_userdb.so db=/etc/vsftpd/logins

#для x64 систем
auth required /lib/x86_64-linux-gnu/security/pam_userdb.so db=/etc/vsftpd/logins
account required /lib/x86_64-linux-gnu/security/pam_userdb.so db=/etc/vsftpd/logins

#session    required     pam_loginuid.so

Важно, что кроме наших двух строк все остальное закомментировано! Добавим единого пользователя линукс для всех наших "виртуальных" пользователей. Его имя задано в vsftps.conf.

$ useradd -d /home/ftp virtual

Попробуем добавить нескольких пользователей:

$ cd /etc/vsftpd
$ ./create.sh vasya secretpassword 
$ ./create.sh masha 123

Смотрим, чтобы не было ошибок, нормальный вывод скрипта должен быть имя+пароль. Рестартим сервис

$ service vsftpd restart

На этом все, коннектимся!

UPDATE for Ubuntu natty 11.04

После обновления до 11.04 natty не удается залогинится на ftp - password incorrect. Смотрим логи vsftpd:

vsftpd: PAM unable to dlopen(/lib/security/pam_userdb.so): /lib/security/pam_userdb.so: cannot open shared object file: No such file or directory

Видим, что PAM не находит библиотеку pam_userdb.so. Посмотрим, где находится эта библиотека в новой сборке:

$ updatedb
$ locate pam_userdb.so
/lib/x86_64-linux-gnu/security/pam_userdb.so

Обновим файл /etc/pam.d/vsftpd с новым путем к библиотеке. Так же, в 11.04 обновилась библиотека Berkeley DB до версии 5.1, так что мы тоже обновимся:

$ apt-get install db5.1-util

и меняем соответствующим образом скрипт convert.sh: db4.8 заменяем на db5.1

UPDATE vsftpd 2.3.5

В 2.3.5 Крис Эванс (Chris Evans) ужесточил политику безопасности для предотвращения эксплуатации потенциальной уязвимости, которая есть в старых версиях библотеки glibc. В итоге он запретил chroot() в каталог, в котором разрешена запись пользователю.

Теперь, если пользователь может писать в свою директорию (а не в поддиректории в ней) и при этом в нее выполняется chroot (то есть chroot_local_user=YES - пользователь не может по FTP подняться в / в отличие скажем от ssh), то тогда это потенциально небезопасно в связи с последними дырами в libc и следует не давать ему авторизацию.

В итоге virtual users в 2.3.5 не работают. Решить эту проблему без костылей можно только обновлением до версии 3.x.x и параметром в vsftpd.conf:

allow_writeable_chroot=YES

Comments !

blogroll

social