在配置vsftpd的过程中,听信了网上的谗言,把vsftpd配了一遍,发现配完,虚拟用户和本地用户不能共存,即虚拟用户可以登录ftp,但是本地用 户不能登录的ftp。折腾了很久,包括上网找过很多内容都找不到解决方法,大家貌似都没有这样的问题,或者找不到解决办法(在看众多教程中貌似有看到过和 本方法一样的配置,但是那份内容里面完全没有提到/etc/pam.d/vsftpd里面为什么要这样写)。在洗澡过程中想了想,既然本地用户无法登录, 那应该是pam验证的时候就没有给本地用户过。实验证明人在洗澡的时候是最清醒的时候。哈哈!回来实验,发现如果把/etc/pam.d/vsftpd 中的

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

注 释掉,然后把里面其它的内容都打开注释(网上大部分教程教建立虚拟用户时,都说把上面两句加入/etc/pam.d/vsftpd中,然后把里面的其它东 西注释掉),这时候再尝试,发现本地用户能登录!!!这也证明了是pam模块认证的问题让虚拟用户和本地用户不能共存。所以就去了解了一下pam配置的内 容,如下网址:

http://www.ibm.com/developerworks/cn/linux/l-pam/

里面提到:
Required:堆栈中的所有 Required 模块必须看作一个成功的结果。如果一个或多个 Required 模块失败,则实现堆栈中的所有 Required 模块,但是将返回第一个错误。

也 就意味着,required需要所有内容都满足才行,当我们前两条配置虚拟用户登录验证通过后,继续向下面的配置条目进行验证,验证是否是本地用户时结果 发现不是,又因为,验证本地用户的control_flag(见上网址中解释)也为required,所以这时候,就会返回错误,也即验证不成功。

所以我们不能同时设置虚拟用户和本地用户的control_flag为required。按照上面的网址所说:
Sufficient:如果标记为 sufficient 的模块成功并且先前没有 Required 或 sufficient 模块失败,则忽略堆栈中的所有其余模块并返回成功。

我们可以把虚拟用户的验证配置放在最前面,且把control_flag设为sufficient。这样的话,如果遇到是虚拟用户,那么可以通过验证,如果是本地用户,忽略掉sufficient的两条配置规则,只要满足required就行,所以也能通过验证。

如下为/etc/pam.d/vsftpd的内容:
#%PAM-1.0
auth sufficient pam_userdb.so db=/etc/vsftpd/vuser_passwd
account sufficient pam_userdb.so db=/etc/vsftpd/vuser_passwd

session optional pam_keyinit.so force revoke
auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
auth required pam_shells.so
auth include password-auth
account include password-auth
session required pam_loginuid.so
session include password-auth

上 面两行为后面加上,虚拟用户pam认证需要的配置条目,下面为原来vsftpd的认证配置规则,可以看到,本地用户用的是password-auth,从 这里可以看出如果要虚拟用户和本地用户共存,两部分都不能注释。网上说的注释掉下面的部分,这种情况本地用户都不能登录。