0

vsftpd + mysql

Задача: Быстро поднять ftp сервер.

В срочном порядке понадобился ftp сервер. Сначала я срочно передал нужную информацию. А потом допилил немного конфиг. В итоге быстро и просто получил ftp сервер с виртуальными пользователями.

Делалось второпях. За источниками информации не следил, поэтому просто кратко опишу как что было.

Ставлю vsftpd из портов:
# cd /usr/ports/ftp/vsftpd/
# make config
# make install clean

У меня установленный mysql сервер уже есть, поэтому пока собирается vsftpd создаю все необходимое:

# mysql -u root -p
Enter password:
mysql> create table `accounts` (`id` int not null auto_increment primary key, `username` varchar(30) not null, `password` varchar(50) not null, unique(`username`)) engine=MYISAM;
mysq> grant all privileges on *.vsftpd to vsftpd@localhost identified by [password];

Тем временем порт собрался — приступаю к написанию конфига /usr/local/etc/vsftpd.conf

# start as daemon
listen=YES
background=YES
# port
listen_port=21
# min and max passive ports
pasv_min_port=50000
pasv_max_port=50019
# log format
xferlog_enable=YES
xferlog_std_format=YES
# log file
xferlog_file=/var/log/vsftpd.log
# log request
log_ftp_protocol=YES
# messages for directories
#dirmessage_enable=YES 
# ftp banner
ftpd_banner=Welcome to FTP
# ftp chroot user
ftp_username=ftp
# allow recursive ls -R
ls_recurse_enable=YES
# show ftp, not id owner
hide_ids=YES
# bite/s for anon and local users
anon_max_rate=8192000
local_max_rate=10000000
# max connects
max_clients=10
# max connects from ip
max_per_ip=3
# -- anonymous settings --
# allow anonymous
anonymous_enable=YES
# default dir for anon user
anon_root=/usr/ports/distfiles
# no password for anon user
no_anon_password=YES
# enable local users. Need for virtusers
local_enable=YES
# deny upload for anon user
anon_upload_enable=NO
# deny create dir for anon user
anon_mkdir_write_enable=NO
# deny rename and delete for anon user
anon_other_write_enable=NO
# mask for local user (-rw-r--r--)
local_umask=022
# -- virtual users --
# enable virtual users
guest_enable=YES
# virtual users as this user
guest_username=vsftpd
# virtual users like local users
virtual_use_local_privs=YES
# file for autificate virtual users /etc/pam.d/
pam_service_name=vsftpd
# virtual users home directory
user_sub_token=$USER
local_root=/home/vsftpd/$USER
# allow user write/change his information on ftp server
# Tuning: "cmd_allowed=PWSV,RETR,QUIT"
write_enable=YES
# chroot local user
chroot_local_user=YES
# directory for chrooting
secure_chroot_dir=/home/vsftpd
# chroot and list not chroot users
chroot_list_enable=YES
chroot_list_file=/usr/local/etc/vsftpd.chroot_list
allow_writeable_chroot=YES

Более подробная информация, как всегда, в man vsftpd.conf

Для того, что бы подружить MySQL и vsftpd мне необходим pam модуль. Ставлю:
# cd /usr/ports/security/pam-mysql
# make install clean

Согласно

# file for autificate virtual users /etc/pam.d/
pam_service_name=vsftpd

создаю /etc/pam.d/vsftpd следующего содержания:

auth required /usr/local/lib/pam_mysql.so user=vsftpd passwd=[password] host=localhost db=vsftpd table=accounts  usercolumn=username passwdcolumn=password crypt=3
account required /usr/local/lib/pam_mysql.so user=vsftpd passwd=[password] host=localhost db=vsftpd table=accounts usercolumn=username passwdcolumn=password crypt=3

Теперь завожу нового пользователя в mysql:
# mysql -u vsftpd -p[password]
mysql> insert into accounts (username, password) values (test,md5(test));
mysql> exit;

Создаю этому пользователю домашнюю директорию:
# mkdir /home/vsftpd/test
# chown vsftpd:nobody /home/vsftpd/test

Стартую vsftpd
# /usr/local/etc/rc.d/vsftpd start

Теперь проверяю работоспособность.
# ftp test@localhost
Trying 127.0.0.1:21 ...
Connected to localhost.
220 Welcome to FTP
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>

Все отлично.
ToDo нужно добавить поле status, для того чтобы отключать пользователей
ToDo нужно сделать скрипты для управления пользвателями
ToDo нужно сделать SSL при авторизации пользователей. Нефиг пароли в открытую кидать
ToDo можно сделать логирование в базу данных MySQL

Alexey Egorychev

FreeBSD and Linux sysadmin. Know many systems like mailsystems, DB, WWW stack. Automation with salt, ansible. Monitoring with nagios, zabbix.