Задача: Быстро поднять 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