I am LAZY bones? AN ancient AND boring SITE

2010年 03月 15日 的归档

vsftpd只能匿名登录,本地用户出现530错误的一个实例

网上很多教程,在介绍vsftpd的本地用户的配置的时候,大意都是这样的:

建立一个xxx用户,家目录为/yyy/zzz,并把这个用户的shell(/etc/passwd里对应行的最后一列)设置成/sbin/nologin或者是/bin/false,再设置一个密码。
然后修改vsftpd的配置文件,一般是/etc/vsftpd.conf,加上:

local_enable=YES
write_enable=YES
local_umask=022

然后重启vsftpd就可以了。

对于出现530 Login incorrect. 的解释一般是两种:
1. xxx用户对 /yyy/zzz 没有权限。
2. xxx用户被加到 /etc/vsftpd.user_list 列表里了。
但是我今天的操作中,这个新建的用户并没有发现以上两种现象,仍然出现了可恶的530错误,但是匿名用户正常登录。
折腾半天以后,发现用一个shell是/bin/bash的用户却是可以登录ftp的。于是,试着把xxx用户的shell也改成/bin/bash,果然也可以登录了。但是这样显然还没有解决我的问题,因为这样一来,xxx这个用户都可以通过ssh登录服务器了,安全就没有保障了。
于是再找更详细的原因,终于发现了:
其实vsftpd对本地用户鉴权的过程中是可以检查用户shell的合法性的,而且默认就启用了。虽然你可以在配置文件中通过添加

check_shell=NO

来取消vsftpd对shell的检测,但是这个配置项要生效却有个前提:编译的时候不能包含PAM特性(一种*nix系统中的插件式身份鉴别模块),而ubuntu等发行版的二进制包并不能满足这点,所以除非你是自己编译的vsftpd,这个配置项是没有多少用的。
要解决这个问题,还得继续问:vsftpd是怎么检查一个shell是否合法呢?其实这个答案很简单,vsftpd读取 /etc/shells 这个文件,如果用户的shell在这个文件里存在,就认为合法,否则即使你输入了正确的密码,仍然会给你一个530,哈哈。
所以,解决办法就是:把 /sbin/nologin 或者是 /bin/false 加到 /etc/shells 中去!