vsftpd中启用www-data的登录

目的

允许www-data登录vsftpd,但不允许www-data登录shell

手段

利用vsftpd中的虚拟用户,并严格限制权限

调研分析

关于vsftpd的配置依旧是各种一搜一大把,但是大多都是说HOW, 从来很少有说WHY的。这里我按照我的想法说一说。

看到很多人使用libpam-mysql来认证,而不使用pam文件,我觉得是有问题的。
这样做的唯一好处是增减用户可能相对更加方便,但安全性,呵呵~
且不说pam-mysql是一个非常古老的包,2006年释出0.7RC1后一直没有更新。
然而把mysql数据库密码明文写在配置文件里合适吗?真的合适吗?真的真的合适吗?
甚至还有教程教人把root密码写过去,这简直就是坑害程序员专业版之焚书坑儒!!

再来看看另一条道路,使用pam_userdb,需额外安装db-util包,
而且每次修改要重新db_dump出用户文件并用db_load重新生成.bdb
为什么导出与生成都不要输密码啊?因为db-util压根没有加密。
人家的参数是-t btree | hash | recno | queue,嗷嗷嗷!!

现在我们假设pam认证的配置里必须拥有密码,因为依赖第三方认证系统需要额外的授权,
而我们不希望将这一授权的密码再度保存在配置文件里。
我能想到的解决方案只有一个:就是使用非对称密钥认证。(和SSL证书不要搞混了哦)
FTP用户需要通过私钥来验证自己,而服务器端即使是配置文件里也只保留公钥,我觉得这是最好的形式。
然而,我擦,这种方式FTPS协议居然不支持,FTPS的客户端根本没有提交私钥的项。

这样看来,所保存密码(假设必须保存)的适用范围就是越窄越好,
最好就是只有vsftpd使用,和其他一切无关。这样看来pam_userdb使用hash并没有什么不对。

我的方案

我考虑了很久,认为一个白名单是必须的,然而使用pam_userdb的确有些过于麻烦。 由于只是想开启www-data的登录,并非新增其它用户。我使用两项pam配置搞定 1.用户与密码必须位于/etc/passwd中 2.如果用户是www-data,忽略shell的验证

实践

# Standard behaviour for ftpd(8).
auth	required	pam_listfile.so item=user sense=deny file=/etc/ftpusers onerr=succeed

# Note: vsftpd handles anonymous logins on its own. Do not enable pam_ftp.so.

auth	required	pam_localuser.so
auth	sufficient	pam_listfile.so item=user sense=allow file=/etc/ftpusers_allow onerr=succeed

# Standard pam includes
@include common-account
@include common-session
@include common-auth
auth	required	pam_shells.so