CentOS安装配置vsftp虚拟用户登录

系统 Linux 系统运维
虚拟用户个人理解是一种介于实体用户和匿名用户之间的用户。原因是:虚拟用户虽然在系统的实体用户文件中不存在,但是会在系统的其他地方进行记录(本文是Berkeley DB),以供vsftp用来对ftp访问者进行必要的鉴权,而鉴权完毕之后,该用户操作文件之时,将是使用vsftp的运行用户ftp进行的。

[[150070]]

在使用Linux时,难免要进行各种文件的远程传输,比如:网站的代码,共享资源等,而这其中用的最多的传输方法大概就是FTP了。Linux下可用FTP服务端是非常多的,vsftp, proftp, uw-ftp等,其中vsftp流行度比较广,冲着这个,本人在自己的CentOS上也就选择了vsftp,而且,vsftp支持PAM(pluggable authentication modules)下虚拟用户设置,这正是Mitchell Chu比较喜欢的一种方式,接下来就请vsftp君上场。

Vsftp使用的用户中,支持三种用户模式,分别是:实体用户,匿名用户和虚拟用户(guest, 亦称访客身份)。实体用户(Real User)是指用户本身存在于系统中的用户,他们存在于/etc/passwd和/etc/shadow文件中。匿名用户(Anonymous)是指客户 端无需提供任何用户身份,ftp为访问者提供一个名为anonymous的特殊用户以供其使用。虚拟用户(Virtual User)个人理解是一种介于实体用户和匿名用户之间的用户。原因是:虚拟用户虽然在系统的实体用户文件中不存在,但是会在系统的其他地方进行记录(本文是Berkeley DB),以供vsftp用来对ftp访问者进行必要的鉴权,而鉴权完毕之后,该用户操作文件之时,将是使用vsftp的运行用户ftp进行的。由于实体用户需要的是系统真实帐户,开放这种权限无疑会增加系统的风险,而虚拟用户使用的是和实体用户不同的用户验证体系,并且,在系统中并不实际存在虚拟用户到实体用户的映射关系,因此降低了FTP给系统带来的风险性,在实际生产环境中,虚拟用户可以更加灵活的进行独立管理,比如:虚拟主机需要给用户提供FTP帐 户。有这么些好处之后,让我们看看是如何配置吧!

预备式

Berkeley DB 数据库:用来存储虚拟用户的登录信息。

pam_userdb.so:用来验证虚拟用户。

db4_utils:用来转换虚拟用户到DB数据的工具。 

安装需要的包

CentOS中好像是默认自带vsftp的,因此,无需安装,如果你不确认,可以用which看下:

  1. which vsftpd 
  2.   
  3. # 如果安装好了的话,应该是有类似下面的输出: 
  4. # /usr/sbin/vsftpd 
  5. # 如果没安装,则类似下面的输出 
  6. # /usr/bin/which: no xd in (/home/limituser... 

没有安装的话,请安装:

  1. yum install vsftpd  
  2. # 或者: yum -y install vsftpd 

当然,清空下yum的缓存亦可:

  1. pushd /etc/yum.repos.d/ 
  2. rm -rf * 
  3. wget http://docs.linuxtone.org/soft/lemp/CentOS-Base.repo 
  4. yum clean all  
  5.  
  6. yum -y install vsftpd ## 这句还是重点. 

为了简单,我们可以一次性安装所有需要的包:

  1. yum install db4-utils db4 vsftpd 
  2.   
  3. ## Mitchell Chu提醒:有的就不用再安装了,请自行增减 

创建虚拟用户

虚拟用户我们使用Berkeley DB数据库来存储。***步是创建纯文本来添加用户和密码,用户名和密码各占一行。比如我们要创建:useasp的用户名,密码是blog.useasp.net,并且创建一个admin密码是adminpasswd的用户,那么,纯文本将类似如下:

  1. pushd /etc/vsftpd 
  2. cat >vusers.txt 
  3. useasp 
  4. blog.useasp.net 
  5. admin 
  6. adminpasswd 

创建好vusers.txt后,我们需要的第二步是将纯文本转换为db文件,这时候需要使用到db_load了:

  1. db_load -T -t hash -f vusers.txt vsftpd-virtual-users.db 

为了安全起见,记得设置仅root可读写(当前是root):

  1. chmod 600 vsftpd-virtual-users.db 

再清理掉原来的纯文本文件:

  1. rm vusers.txt 

此时,我们已经将需要登录FTP的用户已经准备好了,接下来就需要去配置vsftpd,让vsftpd能够正确的识别并支持已经设置好虚拟用户了。 

VSFTPD虚拟用户的配置

找到vsftpd.conf配置文件,添加或修改下面这些配置选项:

  1. # 禁止匿名登录 
  2. anonymous_enable=NO 
  3. anon_upload_enable=YES 
  4. anon_other_write_enable=YES 
  5. # 启用本地用户 
  6. local_enable=YES 
  7. # 虚拟用户使用本地用户权限 
  8. virtual_use_local_privs=YES 
  9. # 可写 
  10. write_enable=YES 
  11. # PAM配置 
  12. pam_service_name=vsftpd 
  13. # 启用虚拟用户 
  14. guest_enable=YES 
  15. # 用户后缀: 配合下面local_root使用,将会用登录的用户名替换掉$USER 
  16. user_sub_token=$USER 
  17. # 根目录 
  18. local_root=/var/ftp/$USER 
  19. # 启用chroot,登录后会被定位到指定根目录 
  20. chroot_local_user=YES 
  21. # 将所有的用户和组显示为ftp 
  22. hide_ids=YES 

vsftpd的配置文件是在/etc/vsftpd/vsftpd.conf,原有配置项可以保留默认值,如果需要日志,vsftpd有两个日志可供使用,一个是标准xferlog格式的,一个是vsftpd格式的,可读性后者更好,当然,你也可以两个日志都启用,要启用可以设置:xferlog_enable, xferlog_std_format, xferlog_file, vsftpd_log_file等参数以获得需要的日志效果。 

#p#

虚拟用户的PAM配置

要针对虚拟用户启用PAM,我们还需要对PAM尽心配置,在上面的vsftpd配置文件中,我们使用pam_service_name来配置了PAM将使用的配置文件,这个文件安装后是默认存在的,如果你觉得有必要保留原来的配置,可以先行备份一份,而后配置文件内容改为如下:

  1. #%PAM-1.0 
  2. auth       required     pam_userdb.so db=/etc/vsftpd/vsftpd-virtual-users 
  3. account    required     pam_userdb.so db=/etc/vsftpd/vsftpd-virtual-users 
  4. #session    required     pam_loginuid.so 

要启用session可以将上面的#注释掉,如果是在32位系统下,网上有一个配置方法是下面这种:

  1. #%PAM-1.0 
  2. auth       sufficient     pam_userdb.so db=/etc/vsftpd/vsftpd-virtual-users 
  3. account    sufficient     pam_userdb.so db=/etc/vsftpd/vsftpd-virtual-users 

由于本人对Linux下的PAM并不是很了解,并不太了解requiredsufficient的区别,这里不好做过多的论断,有了解的可以指点一下,谢谢!

PAM配置里面,是指明账户保存的所在位置,我们配置文件里面的路径即是前面使用db_load创建的Berkeley DB的文件路径。 

创建FTP目录

前面vsftpd已经配置了ftp的目录,我们需要先行创建FTP根目录,和用户需要的目录,因为一旦这些用户登录,将会被vsftpd重新定位到指定的home目录下的,vsftpd中我们配置的是/var/ftp,因此我们需要确认此目录是否存在,不存在我们就需要创建,而后,在此目录下创建虚拟用户的根目录,目录名称就是用户名称。

  1. mkdir -p /var/ftp/{useasp,admin} 
  2. chown -R ftp:ftp /var/ftp 

为了保证能够顺利读取到文件,我们将根目录下的所有文件都变成ftp这个用户所有——ftp账户系统已经默认设置好了,vsftpd就是使用这个账户来操作的。 

重启FTP服务,测试FTP

按上面的流程配置完后,我们就可以重新启动vsftpd服务,让新的配置生效——如果你没有办法使用此命令,请参看后面的省却麻烦一节,将vsftpd设置成为开机启动服务:

  1. service vsftpd restart 

重启之后,理论上来说,应该就能使用FTP客户端访问FTP服务器了,如果需要测试,你也可以直接在本机访问测试下:

  1. ftp 127.0.0.1 

此时应该能够得到正常返回,类似如下:

  1. Connected to 127.0.0.1 (127.0.0.1). 
  2. 220-Welcome to Mitchell Personal Web Server(MPWS) 
  3. 220-Please use user name and password to login... 
  4. 220-if you have any question, please contact MitchellChu<******@useasp.net> 
  5. 220 
  6. Name (127.0.0.1:root):useasp 
  7. 331 Please specify the password
  8. Password
  9. 230 Login successful. 
  10. Remote system type is UNIX. 
  11. Using binary mode to transfer files. 
  12. ftp> 

而在系统的日志中应该也能看到登录信息(以下是多个日志文件,和有的如果没有配置vsftpd的日志文件将无法看到):

  1. # tail -f /var/log/secure 
  2. Sep  4 23:36:11 CentOS vsftpd[8721]: pam_userdb(vsftpd:auth): user 'useasp' granted access 
  3.   
  4. # tail -f /var/log/vsftpd.log 
  5. Fri Sep  4 23:36:15 2015 [pid 8721] [useasp] FTP response: Client "127.0.0.1""150 Here comes the directory listing." 

 到此,我们就已经配置了一个可以正常访问的FTP服务器了。 

开启防火墙,开放给别人用吧

上面测试正常后,如果你开启了iptables,那么,记得添加规则,让你的21,20端口,以后被动模式时使用的端口范围开放出来吧:

  1. iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT 
  2. iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 20 -j ACCEPT 
  3. iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 65300:65360 -j ACCEPT 
  4. service iptables save 

上面的是我的iptables的配置,开放了21和20端口,20端口是ftp-data用的,用来传输数据。 

省却麻烦

为了不用每次重启之后都爬上机器上开启FTP,我们可以将vsftpd设置为开机启动——如果系统已经有了这个服务,忽略:

  1. chkconfig --levels 345 vsftpd on 
  2. service vsftpd start 

至此,就差不多得到一个比较***的FTP Server了。 

后记:

上面是配置vsftpd使用虚拟用户的基本流程,但在配置中,我们总是能发现这样或者那样的问题,因此就需要我们不断的去DEBUG整个流程,由于Linux中有SELinux的存在,很多问题的根源还是在于SELinux的设置,如果你需要简单快捷,那么使用下面这个命令即可解决大部分问题——网上很多朋友也正是这样解决的:

  1. setenforce 0 
  2. or 
  3. setenforce Permissive 

当然,如果你和Mitchell Chu一样,也是个不愿意如此简单了事的人儿,那么,咱们继续踏上征程……在按上面的方法配置好整个FTP服务器之后,本人也或多或少碰到如下的这些问题,现在汇集起来,方便后来者(若有时间,会展开来讲,暂且记录下):

1.不能定位到各自用户的目录,这个问题的存在,我们可以尝试设置SELinux中的ftp_home_dir来解决:

  1. setsebool -P ftp_home_dir on 

2.不能列出FTP目录内容,这个问题也是SELinux引起的,可能的原因是vsftpd对于目录并没有权限,检查下自己的权限是否正确,vsftpd使用的是ftp用户访问,看看自己是否设置错权限了?

3.还是不能列出目录文件,再看看目标文件夹的类型对不对,一般需要的是public_content_r_t,如果你不确认,可以使用下面的命令查看:

  1. ls -alZ 

你将看到类似如下的输出:

  1. drwxr-xr-x. root root system_u:object_r:public_content_t:s0 . 
  2. drwxr-xr-x. root root system_u:object_r:var_t:s0       .. 
  3. drwxr-xr-x. root root system_u:object_r:var_t:s0 useasp 
  4. drwxr-xr-x. root root system_u:object_r:var_t:s0 admin 

可以看到,默认的是var_t,我们需要设置一下,这里需要用到工具semanage,如果没有,需要安装policycoreutils-python

  1. yum -y install policycoreutils-python 

 因为我使用了自行编译的Python版本,导致semanage不能正常运行,报错:

  1. Traceback (most recent call last): 
  2.   File "/usr/sbin/semanage", line 23, in <module> 
  3.     import policycoreutils.default_encoding_utf8 
  4. ImportError: No module named policycoreutils.default_encoding_utf8 

修正后,直接使用semanage来设置:

  1. restorecon -R -v /var/ftp/{useasp,admin} 

4.不能上传文件,不能创建文件夹,还是SELinux的问题啊,设置:

  1. setsebool -P allow_ftpd_anon_write on 

5.还不能上传文件?试试:

  1. semanage fcontext -a -t public_content_rw_t "/var/ftp(/.*)?" 
  2. restorecon -R -v /var/ftp/{useasp,admin} 

这个和上面的设置差不多,只是权限更大,请谨慎操作!

责任编辑:火凤凰 来源: Mitchell Chu博客
相关推荐

2012-06-19 15:51:22

集群系列2

2011-03-02 10:09:53

CentosPureftp

2011-03-02 09:47:51

PureftpCentos

2012-03-18 22:33:15

centosxen

2010-02-26 14:03:11

Fedora vsft

2010-02-22 16:49:35

CentOS vsft

2011-03-11 12:57:30

CentosLAMP

2010-01-13 11:17:50

2011-04-01 12:22:35

2009-06-11 13:43:21

jBPM用户指南jBPM 4.0

2010-03-29 14:48:58

CentOS系统

2010-02-22 18:27:14

CentOS vsft

2010-01-13 15:50:23

CentOS安装

2010-01-14 13:47:30

CentOS extm

2010-01-13 13:38:16

CentOS vsft

2011-02-23 09:55:33

Centos安装vsftpd

2012-10-11 14:59:31

CentosFastDFS

2010-01-14 14:51:07

CentOS安装配置

2012-06-13 09:56:53

2010-02-22 18:35:01

点赞
收藏

51CTO技术栈公众号