I am LAZY bones ? all linux

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 中去!

最后修改时间: 2010年03月15日 17:06

本文章发表于: 2010年03月15日 17:06 | 所属分类:故障分析. | 您可以在此订阅本文章的所有评论. | 您也可以发表评论, 或从您的网站trackback.

6 个评论 关于: “vsftpd只能匿名登录,本地用户出现530错误的一个实例”

  1. yunt 在 2010年03月15日 17:28 说:回复

    mark一下,vsftpd要求还真是苛刻…

  2. hitsmaxft 在 2010年03月15日 20:20 说:回复

    曾经搭建ftp的时候让我郁闷了好久,在man里面看了好久才找到答案。

  3. wywgk 在 2010年10月26日 10:03 说:回复

    找了N多方法,就楼主的这个方法生效了,感谢

  4. fjguoxs 在 2014年05月25日 11:33 说:回复

    分析的真好,真解决了,谢谢!

  5. fkwebs 在 2015年07月31日 11:11 说:回复

    大神,已经成功谢谢帮助~

  6. ss 在 2017年05月03日 10:40 说:回复

    大神,找了半天,终于找到原因了

发表评论