说明:
ftp有三种登录方式:匿名登录、本地用户登录和虚拟用户登录。匿名登录:在登录FTP时使用默认的用户名,一般是ftp或anonymous;本地用户登录:使用系统用户登录,在/etc/passwd中;虚拟用户登录:这是ftp专有用户,有两种方式实现虚拟用户,本地数据文件和数据库服务器。
ftp虚拟用户是FTP服务器的专有用户,使用虚拟用户登录ftp,只能访问FTP服务器提供的资源,大大增强了系统的安全。
本文实现本地文件验证虚拟用户,虚拟用户依托在本地用户www。这样更新代码到站点目录就不会出现权限问题(例如站点目录为www.www,755,虚拟用户依托在其它本地用户,如vsftpd,就会出现无法上传)。上传的文件,目录属主属组都是www。
centos系统,vsftpd没有安装的yum install vsftpd就可以了,目前在考虑是否有安全方面的问题。
实现:
1.添加虚拟用户口令文件
# vim /etc/vsftpd/vsftpuser.txt //添加虚拟用户名和密码,一行用户名,一行密码,依此,奇数行为用户名,偶数行为密码 bob 123456 mark 123456
2.生成虚拟用户口令认证文件 //将刚添加的vsftpuser.txt虚拟用户口令文件转换成系统识别的口令认证文件。
首先查看系统有没有安装生成口令认证文件所需的软件db4-utils。
# rpm -qa|grep db4-utils # rpm –ivh db4-utils-4.3.29-9.fc6.i386.rpm # db_load -T -t hash -f /etc/vsftpd/vsftpuser.txt /etc/vsftpd/vsftpuser.db //使用db_load命令生成虚拟用户口令认证文件
3.编辑vsftpd的pam认证文件
# vim /etc/pam.d/vsftpd.v //将里面其他的都注释掉,添加以下内容 32位系统: auth required /lib/security/pam_userdb.so db=/etc/vsftpd/vsftpuser //db=...与第2步生成的虚拟用户口令认证文件名一致 account required /lib/security/pam_userdb.so db=/etc/vsftpd/vsftpuser 64位系统: auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftpuser account required /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftpuser
4.建立本地映射用户并设置宿主目录权限,所有的ftp虚拟用户需要使用一个本地用户,这个系统用户不需要密码
# grep www /etc/passwd www:x:508:509::/home/www:/sbin/nologin //正常是通过useradd –d /home/vftpsite –s /sbin/nologin vsftpuser添加vsftpuser用户,我这里,因为虚拟用户依托在www,就直接使用www用户 # chmod 700 /home/www //未确认,此家目录是否一定需要存在
5.配置vsftpd.conf
# vim /etc/vsftpd/vsftpd.conf chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list //这二项指定只有chroot_list内的用户无法切出家目录 userlist_enable=YES userlist_deny=NO userlist_file=/etc/vsftpd/user_allow_list //这三项指定只有user_allow_list内的用户可以登陆ftp guest_enable=YES //开启虚拟用户 guest_username=www //ftp虚拟用户对应的系统用户www pam_service_name=/etc/pam.d/vsftpd.v //pam认证文件,为第3步生成的vsftpd的pam认证文件 user_config_dir=/etc/vsftpd/user_config_dir //指定虚拟用户配置文件,user_config_dir是文件夹 virtual_use_local_privs=YES 设置为YES时,虚拟用户使用与本地用户相同权限,设置为NO时,虚拟用户使用与匿名用户相同权限 (必须开启)
6.添加/etc/vsftpd/chroot_list,user_allow_list用户
# vim /etc/vsftpd/chroot_list //添加无法切出家目录的用户,一行一个用户,内容如下 bob mark
# vim /etc/vsftpd/user_allow_list //添加可以登录vsftpd的用户,一行一个用户,内容如下 bob mark
7.针对不同的虚拟用户设置不同的权限
# mkdir /etc/vsftpd/user_config_dir //将所有虚拟用户的权限设置统一放在/etc/vsftpd/user_config_dir,需要vsftpd.conf配置user_config_dir项
# vim /etc/vsftpd/user_config_dir/bob //为虚拟用户bob建立单独的配置文件,文件名称和用户名相同,内容如下 local_root=/home/www/bob //设置虚拟用户登录后的主目录 anon_world_readable_only=NO //具有浏览FTP目录和下载权限 anon_upload_enable=YES //具有上传文件权限 anon_mkdir_write_enable=YES //具有建立和删除目录的权利 anon_other_write_enable=YES //具有文件改名和删除文件的权利
# vim /etc/vsftpd/user_config_dir/mark //为虚拟用户mark建立单独的配置文件 local_root=/home/www/mark
8. 重启vsftpd服务
# /etc/init.d/vsftpd restart
9. 测试虚拟用户登录FTP
# ftp 127.0.0.1 //连接到127.0.0.1 220 Welcome to *** FTP server 用户(127.0.0.1(none)):markwang 331 Please specify the password. 密码: 230 Login successful.
附录:
附录1.目前vsftpd.conf的配置
#the information about ftpd ftpd_banner=welcome to FTP Server! #banner_file=/etc/vsftpd/welcome.txt listen=YES dirmessage_enable=YES xferlog_enable=YES xferlog_file=/var/log/vsftpd.log xferlog_std_format=YES connect_from_port_20=YES pasv_min_port=30000 pasv_max_port=30999 idle_session_timeout=600 data_connection_timeout=300 ascii_upload_enable=YES ascii_download_enable=YES chown_uploads=YES chown_username=root #the settings about anonymous anonymous_enable=NO anon_umask=022 anon_upload_enable=NO anon_mkdir_write_enable=NO local_enable=YES write_enable=YES local_umask=022 file_open_mode=0666 chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list pam_service_name=/etc/pam.d/vsftpd.v # to decide whether the local user have the permission to access the ftp userlist_enable=YES userlist_deny=NO userlist_file=/etc/vsftpd/user_allow_list #tcp_wrappers=YES max_clients=10 max_per_ip=5 local_max_rate=50000 use_localtime=YES guest_enable=YES guest_username=www virtual_use_local_privs=YES user_config_dir=/etc/vsftpd/user_config_dir ssl_enable=NO allow_anon_ssl=NO force_local_data_ssl=YES force_local_logins_ssl=YES ssl_tlsv1=YES ssl_sslv2=YES ssl_sslv3=YES rsa_cert_file=/etc/vsftpd/vsftpd.pem
最后ssl部分为安全认证方面的,可以不要