vsftpd 3.x 禁止用户切换(访问)到上一级目录
linux vsftpd,大家在做 vsftpd 的时候,不知道在有没有注意过一个问题,那就是用户可以切换到 ftp 根目录的上一层目录,而且这是默认的设置,不知道设计者这么做,考虑的是什么?有知道的朋友,还请留言,讨论一下。
在 FTP 登录完成后,都可以切换到系统根目录。这里我给大家来试验一下。这里命令行的方式来登录。
C:\Users\ainy>ftp ifool.me 连接到 ifool.me。 220 (vsFTPd 3.0.2) 200 Always in UTF8 mode. 用户(ifool.me:(none)): ainy 331 Please specify the password. 密码: 230 Login successful. ftp> ftp> ftp> cd / 250 Directory successfully changed. ftp> ftp> ftp> dir 200 PORT command successful. Consider using PASV. 150 Here comes the directory listing. drwxr-xr-x 2 0 0 4096 May 14 20:08 bin drwxr-xr-x 3 0 0 4096 Apr 03 20:07 boot drwxr-xr-x 16 0 0 2840 Jul 26 14:28 dev drwxr-xr-x 75 0 0 4096 Aug 16 14:39 etc -rw-r--r-- 1 0 0 5684 Jun 03 01:40 header.php drwxr-xr-x 7 0 0 4096 Aug 16 14:39 home lrwxrwxrwx 1 0 0 31 Apr 03 20:06 initrd.img -> /boot/initrd.img-3.16.0-4-amd64 drwxr-xr-x 13 0 0 4096 May 14 19:47 lib drwxr-xr-x 2 0 0 4096 Apr 03 20:05 lib64 drwx------ 2 0 0 16384 Apr 03 20:04 lost+found drwxr-xr-x 2 0 0 4096 Apr 03 20:05 media drwxr-xr-x 2 0 0 4096 Apr 03 20:05 mnt drwxr-xr-x 2 0 0 4096 May 25 23:32 ntp drwxr-xr-x 2 0 0 4096 Apr 03 20:05 opt dr-xr-xr-x 102 0 0 0 Jul 26 14:25 proc drwx------ 7 0 0 4096 Aug 16 10:16 root drwxr-xr-x 17 0 0 540 Aug 15 23:51 run drwxr-xr-x 2 0 0 4096 Jul 29 18:19 sbin drwxr-xr-x 3 0 0 4096 Aug 15 23:51 srv -rw-r--r-- 1 0 0 108296 Jun 03 01:42 style.css dr-xr-xr-x 13 0 0 0 Jul 26 14:26 sys drwxrwxrwt 11 0 0 4096 Aug 16 14:44 tmp drwxr-xr-x 10 0 0 4096 Apr 03 20:05 usr drwxr-xr-x 11 0 0 4096 May 14 22:35 var lrwxrwxrwx 1 0 0 27 Apr 03 20:06 vmlinuz -> boot/vmlinuz-3.16.0-4-amd64 226 Directory send OK. ftp: 收到 1634 字节,用时 0.19秒 8.74千字节/秒。 ftp>
可以看到,登入 ftp 后,直接 cd / 就切换到了系统的根目录,那么文件是否可以下载呢,再来试验一下
ftp> ftp> ftp> cd /etc/ssh/ 250 Directory successfully changed. ftp> ftp> get sshd_config 200 PORT command successful. Consider using PASV. 150 Opening BINARY mode data connection for sshd_config (2548 bytes). 226 Transfer complete. ftp: 收到 2548 字节,用时 0.00秒 2548000.00千字节/秒。 ftp>
如此可见,用户可以切换到系统任意目录,也可以下载任意文件(当然前提是登录 ftp 的用户对相应的文件有读取权限),这样若是某个 用户 的密码过于简单,则有可能被黑客使用弱口令方式,攻击到 ftp ,这样的话,整个系统都在 默的眼下了,什么文件都可以拿到,因为 linux 系统里绝大部分文件,都是 755 的权限。
既然这样,那必须要禁止切换用户切换
C:\Users\ainy>ftp ifool.me 连接到 ifool.me。 220 (vsFTPd 3.0.2) 200 Always in UTF8 mode. 用户(ifool.me:(none)): ainy 331 Please specify the password. 密码: 230 Login successful. ftp> ftp> pwd 257 "/home/ainy" ftp>
禁止前,使用 pwd 命令,发现所以路径为真实的路径,当然这也是 vsftpd 默认的情况,默认本地用户的目录为自己的家目录。
打开 vsftpd.conf 配置文件,找到如下两行
chroot_list_enable=YES chroot_list_file=/etc/vsftpd.chroot_list
去掉前面的 # 号,若没有这两行,可以手动添加,配置完成以后,创建chroot_list 文件,并重启vsftpd 服务
1touch /etc/vsftpd.chroot_list
2echo "ainy" > /etc/vsftpd.chroot_list
3/etc/init.d/vsftpd restart
/etc/vsftpd.chroot_list 文件,代表的就是禁止哪些用户切换到上层目录,用户只在存在于这个文件里,则不能切换到上层目录,文件一行一个用户。
完成后再次重新登录 ftp 会发现这个用户登录不了了,报一个 500 的错误,具体为500 OOPS: vsftpd: refusing to run with writable root inside chroot()
这个错误我在网上找了一下,只需要在 vsftpd.conf 添加一行
1allow_writeable_chroot=YES
即可解决500 OOPS: vsftpd: refusing to run with writable root inside chroot()的报错,配置文件改完后,再重启服务,然后再来试一下
C:\Users\ainy>ftp ifool.me 连接到 ifool.me。 220 (vsFTPd 3.0.2) 200 Always in UTF8 mode. 用户(ifool.me:(none)): ainy 331 Please specify the password. 密码: 230 Login successful. ftp> ftp> ftp> pwd 257 "/" ftp> ftp> ftp> cd / 250 Directory successfully changed. ftp> ftp> ftp> dir 200 PORT command successful. Consider using PASV. 150 Here comes the directory listing. 226 Directory send OK. ftp> ftp> dir -a 200 PORT command successful. Consider using PASV. 150 Here comes the directory listing. drwxr-xr-x 2 1004 1004 4096 Aug 16 14:39 . drwxr-xr-x 2 1004 1004 4096 Aug 16 14:39 .. -rw-r--r-- 1 1004 1004 220 Nov 13 2014 .bash_logout -rw-r--r-- 1 1004 1004 3515 Nov 13 2014 .bashrc -rw-r--r-- 1 1004 1004 675 Nov 13 2014 .profile 226 Directory send OK. ftp: 收到 323 字节,用时 0.01秒 24.85千字节/秒。 ftp>
这次我们可以看到,登入 ftp 后的目录,就是根目录 / 不管再怎么切换,始终在自己的家目录里,不能切换到上层目录。