实验环境:
centos 6.4 x86_64
实验目标:
实现在同一跟目录下对admin,upload,download三个虚拟用户的不同权限的控制。具体权限控制列表如下:
用户名 | 权限说明 |
admin | 管理员,可以上传、下载、新建文件夹、删除和更改文件和文件夹名。 |
upload | 不可以下载,可以上传、新建文件夹,但不能删除文件和文件夹,不能重命名原有文件和文件夹; |
download | 只能下载,不能进行其他操作。 |
以上三个虚拟用户均不允许登录系统,并且使用ftp时会被锁定在指定目录内不可进入系统其他目录。
一、安装、配置vsftpd
为了方便我这里采用yum的方式安装vsftpd
[root@centi-c /]# yum -y install vsftpd [root@centi-c /]# cd /etc/vsftpd/ [root@centi-c vsftpd]# cp vsftpd.conf vsftpd.conf.bak [root@centi-c vsftpd]# service vsftpd start Starting vsftpd forvsftpd: [ OK ] #添加一个不能登录系统的用户,用来做虚拟用户映射 [root@centi-c vsftpd]# useradd –s /sbin/nologin –d /home/www2013 -M www2013 [root@centi-c vsftpd]# passwd www2013 #创建虚拟用户列表,分别是upload、download和admin [root@centi-c vsftpd]# touch /etc/vsftpd/vu_list.txt [root@centi-c vsftpd]# echo upload >>/etc/vsftpd/vu_list.txt [root@centi-c vsftpd]# echo 111111 >>/etc/vsftpd/vu_list.txt [root@centi-c vsftpd]# echo download >>/etc/vsftpd/vu_list.txt [root@centi-c vsftpd]# echo 111111 >>/etc/vsftpd/vu_list.txt [root@centi-c vsftpd]# echo admin >>/etc/vsftpd/vu_list.txt [root@centi-c vsftpd]# echo 111111 >>/etc/vsftpd/vu_list.txt #查看列表内容 [root@centi-c vsftpd]# cat /etc/vsftpd/vu_list.txt upload 111111 download 111111 admin 111111 #保存虚拟帐号和密码的文本文件无法被系统帐号直接调用,需要创建用于系统认证的db文件 [root@centi-c vsftpd]# db_load -T -t hash -f /etc/vsftpd/vu_list.txt /etc/vsftpd/vu_list.db #创建db文件需要db4支持,如果系统没安装请安装 [root@centi-c vsftpd]# yum -y install db4 db4-devel db4-utils #修改db文件的权限,以免被非法用户修改 [root@centi-c vsftpd]# chmod 600 /etc/vsftpd/vu_list.db
配置PAM文件
由于服务器通过调用系统PAM模块来对客户端进行身份验证,因此需要修改指定的配置文件来调整认证方式。PAM模块的配置文件路径为:/etc/pam.d/,这个目录下存放只许多与用户认证有关的配置文件。
[root@centi-c pam.d]# ls chfn fingerprint-auth passwd runuser smtp.postfix su-l chsh fingerprint-auth-ac password-auth runuser-l sshd system-auth config-util login password-auth-ac smartcard-auth su system-auth-ac crond newrole remote smartcard-auth-ac sudo vsftpd cvs other run_init smtp sudo-i
编辑vsftpd文件
32位系统添加:
auth required /lib/security/pam_userdb.so db=/etc/vsftpd/vu_list account required /lib/security/pam_userdb.so db=/etc/vsftpd/vu_list
64位系统添加:
auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/vu_list account required /lib64/security/pam_userdb.so db=/etc/vsftpd/vu_list
两行内容。
[root@centi-c pam.d]# vi vsftpd #%PAM-1.0 session optional pam_keyinit.so force revoke auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusersonerr=succeed auth required pam_shells.so auth include system-auth account include system-auth session include system-auth session required pam_loginuid.so auth required /lib/security/pam_userdb.so db=/etc/vsftpd/vu_list account required /lib/security/pam_userdb.so db=/etc/vsftpd/vu_list
创建虚拟用户配置文件:
#创建conf文件夹 [root@centi-c pam.d]# cd /etc/vsftpd [root@centi-c vsftpd]# mkdir conf [root@centi-c vsftpd]# cd conf #创建admin用户的配置文件 [root@centi-c conf]# cat >>admin<< EOF > anon_world_readable_only=NO > write_enable=YES > anon_mkdir_write_enable=YES > anon_other_write_enable=YES > anon_upload_enable=YES > EOF #创建upload用户的配置文件 [root@centi-c conf]# cat >>upload<< EOF > write_enable=NO > anon_upload_enable=YES > anon_mkdir_write_enable=YES > anon_world_readable_only=NO >download_enable=NO > EOF #创建download用户的配置文件 [root@centi-c conf]# cat >>download<< EOF > anon_world_readable_only=NO > EOF
修改vsftpd.conf文件
#修改内容如下 [root@centi-c conf]# cd .. [root@centi-c vsftpd]# vi vsftpd.conf anonymous_enable=NO local_enable=YES anon_mkdir_write_enable=NO dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES chown_uploads=NO chroot_local_user=YES chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list # To fixed 500 OOPS: vsftpd: refusing to run with writable root inside chroot () allow_writable_root=YES xferlog_file=/var/log/vsftpd.log xferlog_std_format=YES nopriv_user=www2013 async_abor_enable=YES ascii_upload_enable=YES ascii_download_enable=YES ftpd_banner=Welcome to blah FTP service ^_^ ls_recurse_enable=NO listen=YES pam_service_name=vsftpd userlist_enable=YES tcp_wrappers=YES local_root=/home/www2013 guest_enable=YES guest_username=www2013 virtual_use_local_privs=YES user_config_dir=/etc/vsftpd/conf
如果不加这一段的话会报如下错误:
To fixed 500 OOPS: vsftpd: refusing to run with writable root inside chroot ()
具体原因请看这里:Ben Scobie’s Blog
具体测试过程就不一一列举了,有空再添加。
部分错误解决方法:
1.530 Permission denied.
解决过程如下:
[root@centi-c vsftpd]# ftp 127.0.0.1 Connected to 127.0.0.1 (127.0.0.1). 220 Welcome to blah FTP service ^_^ Name (127.0.0.1:root): admin 331 Please specify the password. Password: 530 Permission denied. Login failed. ftp> bye 221 Goodbye. #查看secure日志后,错误原因一目了然 [root@centi-c vsftpd]# tail -f /var/log/secure Jul 5 10:09:30 centi-c vsftpd[36501]: PAM unable to dlopen(/lib/security/pam_userdb.so): /lib/security/pam_userdb.so: cannot openshared object file: No such fileor directory Jul 5 10:09:30 centi-c vsftpd[36501]: PAM adding faulty module: /lib/security/pam_userdb.so Jul 5 10:16:34 centi-c vsftpd[36501]: PAM unable to dlopen(/lib/security/pam_userdb.so): /lib/security/pam_userdb.so: cannot openshared object file: No such fileor directory Jul 5 10:16:34 centi-c vsftpd[36501]: PAM adding faulty module: /lib/security/pam_userdb.so Jul 5 10:16:39 centi-c vsftpd[36501]: PAM unable to dlopen(/lib/security/pam_userdb.so): /lib/security/pam_userdb.so: cannot openshared object file: No such fileor directory Jul 5 10:16:39 centi-c vsftpd[36501]: PAM adding faulty module: /lib/security/pam_userdb.so Jul 5 10:16:53 centi-c vsftpd[36501]: PAM unable to dlopen(/lib/security/pam_userdb.so): /lib/security/pam_userdb.so: cannot openshared object file: No such fileor directory Jul 5 10:16:53 centi-c vsftpd[36501]: PAM adding faulty module: /lib/security/pam_userdb.so Jul 5 10:26:48 centi-c vsftpd[37818]: PAM unable to dlopen(/lib/security/pam_userdb.so): /lib/security/pam_userdb.so: cannot openshared object file: No such fileor directory Jul 5 10:26:48 centi-c vsftpd[37818]: PAM adding faulty module: /lib/security/pam_userdb.so
修改/etc/pam.d/vsftpd文件,将
auth required /lib/security/pam_userdb.so db=/etc/vsftpd/vu_list account required /lib/security/pam_userdb.so db=/etc/vsftpd/vu_list
改为:
auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/vu_list account required /lib64/security/pam_userdb.so db=/etc/vsftpd/vu_list
重启sftpd服务,就可以正常登录了
2.chroot_list_enable和chroot_local_user取值的不同组合情况:
参数 | 取值 | 取值 | 取值 | 取值 |
chroot_list_enable | YES | YES | NO | NO |
chroot_local_user | YES | NO | YES | NO |
意义 | 文件中列出的用户根目录为系统根目录,其它用户根目录为自己主目录。 | 文件中列出的用户根目录为自己主目录,其它用户根目录为系统根目录。 | 全部用户根目录都是自己主目录。 | 全部用户根目录都是系统根目录。 |
参考资料:http://blog.csdn.net/pigchan/article/details/4768717