在使用Linux的时候,难免要进行各种文件的远程传输,比如:网站代码、共享资源等,而最常用的传输方式大概就是FTP了。Linux下可用的FTP服务器有很多,比如vsftp、proftp、uw-ftp等,其中vsftp比较流行。为此,我在自己的CentOS上选择了vsftp,而vsftp支持PAM(pluggableauthenticationmodules),这是MitchellChu比较喜欢的一种方式,接下来就请vsftp先生来玩玩。在Vsftp使用的用户中,支持三种用户模式,分别是:实体用户、匿名用户和虚拟用户(guest,又称访客身份)。实体用户(RealUser)是指自己存在于系统中的用户,存在于/etc/passwd和/etc/shadow文件中。匿名用户(Anonymous)是指客户端不需要提供任何用户身份,ftp为访问者提供了一个名为anonymous的特殊用户供其使用。虚拟用户(VirtualUser)个人理解为介于物理用户和匿名用户之间的用户。原因是:虚拟用户虽然不存在于系统的物理用户文件中,但会记录在系统的其他地方(本文为BerkeleyDB),供vsftp用来对ftp访问者进行必要的认证,认证后完成后,当用户操作该文件时,将使用vsftp的运行用户ftp来执行。由于实体用户在系统中需要真实账户,开放此类权限无疑会增加系统的风险,而虚拟用户使用的是与实体用户不同的用户认证体系,系统中不存在虚拟用户与实体用户的区别。从而降低了FTP给系统带来的风险。在实际生产环境中,可以更加灵活的独立管理虚拟用户。例如,虚拟主机需要为用户提供FTP账号。有了所有这些好处,让我们看看如何配置它!预备BerkeleyDB数据库:用于存储虚拟用户的登录信息。pam_userdb.so:用于验证虚拟用户。db4_utils:将虚拟用户转换为数据库数据的工具。安装所需的包在CentOS中好像默认自带了vsftp,所以不需要安装。如果不确定,可以用which看:whichvsftpd#如果安装了,应该会有类似下面的输出:#/usr/sbin/vsftpd#如果没有安装,会有类似下面的输出如下输出#/usr/bin/which:noxdin(/home/limituser...如果没有安装,请安装:yuminstallvsftpd#或者:yum-yinstallvsftpd当然清除yum缓存也可以:pushd/etc/yum.repos.d/rm-rf*wgethttp://docs.linuxtone.org/soft/lemp/CentOS-Base.repoyumcleanallyum-yinstallvsftpd##这句话还是重点,为了简单起见,我们安装所有需要的即可一次性打包:yuminstalldb4-utilsdb4vsftpd##MitchellChu温馨提示:有些不需要重新安装,请自行增减创建虚拟用户虚拟用户存储在BerkeleyDB数据库中,第一步创建纯文本即可添加用户和密码,用户名和密码各占一行,比如我们要创建:useasp的用户名,密码isblog.useasp.net,并创建一个admin密码为adminpasswd的用户,那么明文会类似如下:pushd/etc/vsftpdcat>vusers.txtuseaspblog.useasp.netadminadminpasswd创建vusers.txt后,第二步我们需要的是将纯文本转换成一个db文件。这时候我们就需要使用db_load:db_load-T-thash-fvusers。txtvsftpd-virtual-users.db为了安全起见,记得设置只root可读写(目前是root):chmod600vsftpd-virtual-users.db然后清理原来的纯文本文件:rmvusers.txt此时,我们将需要登陆FTP的用户准备好。接下来需要配置vsftpd,使vsftpd能够正确识别和支持已经设置好的虚拟用户。VSFTPD虚拟用户配置找到vsftpd.conf配置文件,增加或修改以下配置选项:#禁止匿名登录anonymous_enable=NOanon_upload_enable=YESanon_other_write_enable=YES#启用本地用户local_enable=YES#虚拟用户使用本地用户权限virtual_use_local_privs=YES#Yes写入write_enable=YES#PAM配置pam_service_name=vsftpd#启用虚拟用户guest_enable=YES#用户后缀:与下面的local_root一起使用,将替换为登录用户名$USERuser_sub_token=$USER#根目录local_root=/var/ftp/$USER#启用chroot,登录后会位于指定的根目录chroot_local_user=YES#显示所有用户和组为ftphide_ids=YESvsftpd的配置文件在/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将要使用的配置文件。这个文件是安装后默认的如果你觉得有必要保留原来的配置,可以先做个备份,然后把配置文件的内容改成如下:#%PAM-1.0authrequiredpam_userdb.sodb=/etc/vsftpd/vsftpd-virtual-usersaccountrequiredpam_userdb.sodb=/etc/vsftpd/vsftpd-virtual-users#sessionrequiredpam_loginuid.so启用session,可以把上面的#注释掉,如果是32位系统,有一个网上的配置方法如下:#%PAM-1.0authsufficientpam_userdb.sodb=/etc/vsftpd/vsftpd-virtual-usersaccountsufficientpam_userdb.sodb=/etc/vsftpd/vsftpd-virtual-users由于本人对PAM了解不多linux,不知道required和sufficient的区别,所以这里不好做结论太多,有懂的可以指点一下,谢谢!在PAM配置中,它指示保存帐户的位置。我们配置文件中的路径就是之前使用db_load创建的BerkeleyDB的文件路径。在创建FTP目录之前,vsftpd已经配置好了ftp目录。我们需要先创建FTP根目录和用户需要的目录,因为这些用户一旦登录,就会被vsftpd迁移到指定的主目录。在vsftpd中,我们配置的是/var/ftp,所以我们需要确认这个目录是否存在,如果不存在我们需要创建,然后在这个目录下创建虚拟用户的根目录,以及目录name是用户名。mkdir-p/var/ftp/{useasp,admin}chown-Rftp:ftp/var/ftp为了保证文件能够顺利读取,我们将根目录下的所有文件都做成ftp用户所有——--ftp账号系统已经默认设置好,vsftpd使用该账号进行操作。重启FTP服务,测试FTP。按照以上流程配置好FTP后,我们可以重启vsftpd服务使新的配置生效——如果不能使用该命令,请参考后面的章节省事将vsftpd设置为Starttheserviceatstartup:servicevsftpdrestart重启后,理论上应该可以使用FTP客户端访问FTP服务器了。如果需要测试,也可以在本机直接访问测试:ftp127.0.0.1此时应该可以正常获取返回类似如下:Connectedto127.0.0.1(127.0.0.1).220-欢迎使用MitchellPersonalWebServer(MPWS)220-请使用用户名和密码登录...220-如果您有任何问题,请联系MitchellChu<******@useasp.net>220Name(127.0.0.1:root):useasp331请指定密码。密码:230Loginsuccessful.RemotesystemtypeisUNIX.Usingbinarymodetotransferfiles.ftp>并且在系统日志中应该也能看到登录信息(以下是多个日志文件,有些日志文件如果不配置vsftpd是看不到的):#tail-f/var/日志/secureSep423:36:11CentOSvsftpd[8721]:pam_userdb(vsftpd:auth):user'useasp'grantedaccess#tail-f/var/log/vsftpd.logFriSep423:36:152015[pid8721][useasp]FTResponse:Client"127.0.0.1","150这里是目录列表。"至此,我们就配置好了一个可以正常访问的FTP服务器。打开防火墙,打开给别人使用。以上测试正常后,如果你启用了iptables,那么记得添加规则让你的21、20端口,以及以后被动模式使用的端口范围开放:iptables-AINPUT-mstate--stateNEW-mtcp-ptcp--dport21-jACCEPTiptables-AINPUT-mstate--stateNEW-mtcp-ptcp--dport20-jACCEPTiptables-AINPUT-mstate--stateNEW-mtcp-ptcp--dport65300:65service-jACCEPTiptablessave上面最重要的是我的iptables配置。21和20端口是开放的,20端口是ftp-data用来传输数据的。省事为了不至于每次重启后都爬上机器启动FTP,我们可以设置vsftpd开机启动——如果系统已经有这个服务,忽略:chkconfig--levels345vsftpdonservicevsftpdstart到这里,你就差不多搞定了比较***FTP服务器已启动。后记:以上是配置vsftpd使用虚拟用户的基本过程,但是在配置中,我们总能发现这样那样的问题,所以整个过程需要不断去DEBUG,因为Linux中SELinux的存在,有很多问题问题的根源在于SELinux的设置。如果你需要简单快速,你可以使用下面的命令来解决大部分问题——网上很多朋友都是这样解决的:setenforce0#orsetenforcePermissive当然,如果你像MitchellChu一样,你也可以一个不愿意把事情做的这么简单的人,那么,继续赶路吧……按照上面的方法配置好整个FTP服务器后,或多或少遇到过以下问题,现收集起来供大家参考方便。迟到者(有时间再展开,暂时记录一下):1.找不到各自用户的目录。如果存在这个问题,我们可以尝试在SELinux中设置ftp_home_dir来解决:setsebool-Pftp_home_diron2.无法列出FTP目录的内容,这个问题也是SELinux引起的,可能的原因是vsftpd没有权限对于目录,检查你的权限是否正确,vsftpd使用ftp用户访问,看看你是否设置了错误的权限?3、还是不能列出目录文件,再检查一下目标文件夹的类型是否正确。通常,public_content_r_t是必需的。如果不确定,可以使用如下命令查看:ls-alZ,你会看到类似如下的输出:drwxr-xr-x.rootrootsystem_u:object_r:public_content_t:s0.drwxr-xr-x.rootrootsystem_u:object_r:var_t:s0..drwxr-xr-x.rootrootsystem_u:object_r:var_t:s0useaspdrwxr-xr-x.rootrootsystem_u:object_r:var_t:s0admin可以看到默认是var_t,需要设置一下,这里我们需要用到工具semanage,如果没有,我们需要安装policycoreutils-python:yum-yinstallpolicycoreutils-python因为我使用的是自编译版的Python,导致Semanage无法正常运行,报错:Traceback(mostrecentcalallast):File"/usr/sbin/semanage",line23,in