vsftpd安装详解

    windows服务器下的ftp server以前用的是filezilla,linux下还是使用vsftpd,环境centos 6.x。

1、安装软件

rpm -qa vsftpd
yum install vsftpd

 

2、编辑配置文件

vim /etc/vsftpd/vsftpd.conf

vim命令行模式下输入:1,$d清空配置信息

将以下配置信息粘进去就好了

listen=YES
background=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
anon_upload_enable=NO
anon_mkdir_write_enable=NO
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
chown_uploads=NO
xferlog_file=/var/log/vsftpd.log
xferlog_std_format=YES
async_abor_enable=YES
ascii_upload_enable=YES
ascii_download_enable=YES
ftpd_banner=Welcome to FTP servers
pam_service_name=vsftpd
chroot_local_user=NO
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/vsftpd.chroot_list

添加用户列表文件并启动服务

touch /etc/vsftpd/vsftpd.chroot_list
service vsftpd start

 

3、添加用户和目录

useradd ftptest -d /home/ftptest
chown -R ftptest /home/ftptest
passwd ftptest

将新建的用户添加到chroot_list中

echo  'ftptest'>> /etc/vsftpd/vsftpd.chroot_list
service vsftpd restart

开启服务端口

vim /etc/sysconfig/iptables  
-A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT  
service iptables restart  

 

4、测试连接

选用ftp客户端(我自己用的是chinaftp)

结果报了“cannot change directory /home/ftptest”错误

设置selinux如下:

[ftptest@kristoffer home]$ getsebool -a | grep ftp
allow_ftpd_anon_write --> off
allow_ftpd_full_access --> off
allow_ftpd_use_cifs --> off
allow_ftpd_use_nfs --> off
ftp_home_dir --> off
ftpd_connect_db --> off
ftpd_use_passive_mode --> off
httpd_enable_ftp_server --> off
tftp_anon_write --> off
[ftptest@kristoffer home]$ setsebool -P ftpd_home_dir 1
[ftptest@kristoffer home]$ setsebool -P allow_ftpd_full_access 1


测试连接 OK!

5、vsftpd虚拟用户的配置

    vsftpd中的用户有三种形式,第一种是匿名用户,第二种本地用户,第三种虚拟用户。采用虚拟用户可以很好地保证操作系统的安全性,在大量FTP用户帐号的情况下,减轻操作系统的负担,还有虚拟用户的帐号权限设置更加方便,存储位置更加灵活。

    PAM(Plugable Authentication Module,可拔插认证模块)是一种完成通用认证功能的程序,它可以被程序调用,是vsftpd支持的认证方式。现在开始配置:

    cd ~到用户根目录,vim ftp_user.txt,设置用户和密码,奇数行是用户偶数行是密码:

user1
password1
user2
password2
user2
password2

    通过rpm -qa | grep db4查看系统是否安装了db4,db4、db4-devel、db4-utils如果都在了就没问题

    然后就是生成数据库并设置文件权限

db_load -T -t hash -f ./ftp_user.txt /etc/vsftpd/ftp_user.db
chmod 600 /etc/vsftpd/ftp_user.db

    然后vim新建/etc/pam.d/vsftpd_login文件(pam运行的脚本),输入内容如下:

auth required pam_userdb.so db=/etc/vsftpd/ftp_user
account required pam_userdb.so db=/etc/vsftpd/ftp_user

    pam_userdb.so在32位服务器是位于/lib/security/,在64位服务器是位于/lib64/security/

    建立所有FTP虚拟用户帐号使用的操作系统帐号,并设置帐号的工作目录和权限:

useradd -d /home/myweb -s /sbin/nologin ftp_virt
chmod 700 /home/myweb

    配置vsftpd.conf,添加虚拟用户:

guest_enable=YES
guest_username=ftp_virt
pam_service_name=vsftpd_login

    操作系统本身有一套控制用户权限的机制,当vsftpd采用本地用户登录时,本地用户对文件的权限是由操作系统规定的,如果要求所有的虚拟用户对操作系统的权限是一样的,可以在vsftpd.conf中使用virtual_use_local_privs=YES配置,其功能是使虚拟用户权限与操作系统中所对应的用户的权限一样,这样就可以通过设置本地用户权限来决定虚拟用户的权限。但如果不同用户采用不同的权限策略,应该在vsftpd.conf中添加user_config_dir=/etc/vsftpd,然后创建独立目录:mkdir /var/ftp/dir1,mkdir /var/ftp/dir2。设置两个目录的权限chown ftp_virt mkdir /var/ftp/dir1,chown ftp_virt mkdir /var/ftp/dir2。最后,在/etc/vsftpd目录下建立3个文件,文件名为3个对应的虚拟帐号:

#vim /etc/vsftpd/user1
local_root=/var/ftp/dir1
#vim /etc/vsftpd/user2
local_root=/var/ftp/dir2
#vim /etc/vsftpd/user3
local_root=/var/ftp/dir3
write_enable=YES
anonymous_enable=NO 
anon_world_readable_only=NO 
anon_upload_enable=YES 
anon_mkdir_write_enable=YES
anon_other_write_enable=YES 
local_umask=022
download_enable=Yes    
重启测试连接,如果不能连接尝试iptables -F或关闭SELinux后能否连上。 通常情况下同时设置INPUT表和OUTPUT表就能实现PORT模式的连接。
-A INPUT -p tcp --dport 21 -j ACCEPT
-A OUTPUT -p tcp --dport 21 -j ACCEPT

     发现虚拟用户用IE做客户端会出现将目录指向系统根目录的危险BUG,所以将vsftpd.conf中的chroot_local_user=YES注释去掉,将用户访问目录限制在当前用户目录。


版权声明:本文为kevinkristoffer原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。