Настройка vsftpd с хранением учеток в MySQL

18.01.2010 2 Автор Vovanys

Для «производственных» нужд стало необходимо заливать на сайты по FTP файлы.

В качестве FTP сервера было решено поставить vsftpd, а хранить учетные записи в mysql для удобства добавления учеток.


В данном примере имя логина равно названию папки где хранится ваш сайт, папка и т.д.

Установка:

apt-get install vsftpd libpam-mysql

Если mysql не установлен его необходимо поставить (apt-get install mysql-server).

Создаем базу и учетную запись в mysql для vsftpd:

mysql -p вводим пароль root mysql сервера
CREATE DATABASE vsftpd;
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON vsftpd.* TO 'vsftpd'@'localhost' IDENTIFIED BY 'пароль_для_vsftpd';

Выбираем базу и создаем таблицу:

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 ;
\q

Если длина логина в 30 символов вас не устраивает можете поменять этот параметр.

Создаем в системе пользователя vsftpd и делаем ему домашнуюю директорию /var/www:

useradd --home /var/www --gid nogroup -m --shell /bin/false vsftpd

Делаем резервную копию файла настроек:

cp /etc/vsftpd.conf /etc/vsftpd.conf_back

Очищаем файл:

echo -n > /etc/vsftpd.conf

Редактируем:

mcedit /etc/vsftpd.conf

Вставляем следующее:

listen=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
nopriv_user=vsftpd
chroot_local_user=YES
secure_chroot_dir=/var/run/vsftpd
pam_service_name=vsftpd
guest_enable=YES
guest_username=vsftpd
local_root=/var/www/$USER
user_sub_token=$USER
virtual_use_local_privs=YES
user_config_dir=/etc/vsftpd_user_conf

Если необходимо «перевесить» порт ftp добавляем:

listen_port=порт

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

mkdir /etc/vsftpd_user_conf

Редактируем PAM модуль который отвечает за авторизацию пользователей через mysql, предварительно сделав backup :

cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd_back

echo -n > /etc/pam.d/vsftpd

mcedit /etc/pam.d/vsftpd

Вставляем:

auth required pam_mysql.so user=vsftpd passwd=пароль_для_vsftpd host=localhost db=vsftpd table=accounts usercolumn=username passwdcolumn=pass crypt=2
account required pam_mysql.so user=vsftpd passwd=пароль_для_vsftpd host=localhost db=vsftpd table=accounts usercolumn=username passwdcolumn=pass crypt=2

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

/etc/init.d/vsftpd restart

Сервер готов к работе достаточно создать виртуальных пользователей и можно работать.

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

mysql -p вводим пароль root mysql сервера
USE vsftpd;
INSERT INTO accounts (username, pass) VALUES('логин', PASSWORD('пароль'));
\q

Логин будет равен папке которая лежит в папке /var/www т.е. если вы создали учетку test.com то папка в /var/www будет тоже test.com.

Заводить учетки можно не только таким образом, можно используя любую администрировалку mysql, либо через php скрипт и т.д.

Создаем эту самую папку в /var/www и меняем права:

mkdir /var/www/логин
chown vsftpd:nogroup /var/www/логин

P.S. Перезапускать FTP сервер после добавления учеток и создания папки не нужно.