关于vsftpd匿名+虚拟用户的一些认识 » 荒野无灯weblog

Keep It Simple, Stupid.

荒野无灯weblog

关于vsftpd匿名+虚拟用户的一些认识

先前在ubuntu 10.04 server 上配置好的vsftpd 匿名+虚拟用户认证,把配置copy到
现用的Archlinux下面来做测试,发现匿名用户居然不启作用。。。

用xp来登录ftp ,发现提示 500 错误: 不能更改目录到 /srv/ftp
为什么我明明配置了
anon_root=/home/ftp/public
却不起作用呢?

[root@huangye etc]# cat /etc/passwd | grep "ftp"
vsftpd:x:1001:1001::/srv/ftp:/bin/false
ftp:x:1002:1002::/home/ftp:/bin/false

发现默认的匿名ftp用户的根目录居然是 /srv/ftp ,难怪提示这个错误。
不过,在ubuntu 10.04 server 上,passwd 文件中同样如此,匿名用户
却能正常使用。
在我的archlinux中,我把上面的/srv/ftp 修改为 /home/ftp后匿名访问就
OK了。真是奇怪了。
还有就是,vsftpd匿名用户的root不能让其它用户也有写权限,即777是肯定不行的。

根据vsftpd的man手册,anoymous 和 ftp 都可作用匿名ftp登录的用户名
由于ftp是默认的匿名用户的username ,因此系统中必须存在这个用户,
如不存在可用命令建立:

sudo useradd ftp -m -U -s /bin/false

ftp 这个用户名也可以指定为别的,配置参数是 ftp_username

ftp_username
This is the name of the user we use for handling anonymous FTP.
The home directory of this user is the root of the anonymous FTP
area.
Default: ftp

关于vsftpd里面的用户
其实vsftpd里面分三种用户:匿名/虚拟/本地
当启用了虚拟用户后,本地用户的登录默认就被屏蔽了。
但是虚拟用户实际上是以本地用户(由guest_username这个配置项来指定用户名)来登录的。

要启用虚拟用户(guest_enable=YES),本地用户必须被启用(local_enable=YES)
,虚拟用户默认是同匿名用户拥有一样的权限。
若要改变这个,则virtual_use_local_privs=YES
让虚拟用户拥有和本地用户一样的权限,即本地用户拥有读写权限的文件,虚拟用户
也照样拥有。
如果默认我们给虚拟用户所有的权限,那么我们要限制单个虚拟用户的权限就得通过
指定用户配置文件目录,然后在此目录下新建与用户名相同的配置文件。
vsftpd这一点很强大,可以用白名单或者黑名单,基于黑白名单同时存在来控制用户
可以执行的ftp命令。( cmds_allowed 和 cmds_denied )

可以通过tcp_wrapper来限制用户的登录区域(IP范围)
tcp_wrapper 就是tcp封装,是运行在介于防火墙和内部服务间的一个模块
只要支持tcp封装的服务,我们都可以使用tcp封装来控制他
查看一个服务是不是支持tcp_wrapper的方法:
ldd `which vsftpd` | grep libwrap
看是否有libwrap.so.0

[admin@huangye etc]$ ldd `which vsftpd` | grep "libwrap"
    libwrap.so.0 => /usr/lib/libwrap.so.0 (0xb7828000)

strings `which vsftpd` | grep host

[admin@huangye etc]$ strings `which vsftpd` | grep "host"
sock_host
hosts_access
gethostbyname
gethostbyname(): neither IPv4 nor IPv6
cannot resolve host:

确定你的编译版支持tcp wrapper后,开启此功能:
tcp_wrappers=YES
使用tcp_wrapper就需要两个配置文件:

/etc/hosts.deny
/etc/hosts.allow

详细介绍请man hosts.deny
默认hosts.deny中有一条:
ALL: ALL
这样是禁用所有IP访问所有DAEMONS。
因此,启动tcp wrapper后,要能正常访问,
必须添加相应的daemon,client 对到 hosts.allow 文件中。
如允许所有ip访问vsftpd:
vsftpd:ALL

可以通过chroot来禁用ftp用户跳转到不应该去的地方,比如 /etc
要使用chroot功能,有两种办法,一是开启chroot_list 功能,二是开启
chroot_local_user功能。
默认的secure_chroot_dir为/usr/share/empty ,我们可以手动指定。

sudo mkdir /var/run/vsftpd

注意此目录一定不能让vsftpd这个用户有写权限。
secure_chroot_dir=/var/run/vsftpd
1.开启chroot_list功能,且新建chroot_list文件放在 /etc/vsftpd/目录下面

chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list

cut  -d  :  -f  1  /etc/passwd  >> chroot_list

-d 是列分隔符,-f 是指定第几列(从1开始)
这样所有用户就进去了。
2.直接
chroot_local_user=YES

参考资料:
RHCE课程-RH253Linux服务器架设笔记一-VSFTPD的配置(2) – 王乾De技术Blog[爱生活,爱学习] – 51CTO技术博客

Tagged in : vsftpd,anoymous,virtual user

All Comments (0)
Gravatar image
No Comments