FTP登录(vsftpd)报错500 OOPS: vsftpd: refusing to run with writable root inside chroot()的问题
1)我添加了2个常规的用户,分别通过 -d 指定各自的用户主目录:
[root@localhost data]# mkdir -p /data/ftp
[root@localhost data]# useradd ftpuser01 -d /data/ftp/ftpuser01
[root@localhost data]# useradd ftpuser02 -d /data/ftp/ftpuser02
[root@localhost data]# passwd ftpuser01
[root@localhost data]# passwd ftpuser02
创建用户后会自动生成用户名对应的目录:
[root@localhost data]# ls -l
total 0
drwxr-xr-x 4 root root 40 Apr 2 20:53 ftp
[root@localhost data]# ls -l ftp/
total 0
drwx------ 2 ftpuser01 ftpuser01 62 Apr 2 20:53 ftpuser01
drwx------ 2 ftpuser02 ftpuser02 62 Apr 2 20:53 ftpuser02
[root@localhost data]#
查看 /etc/passwd:
[root@localhost data]# cat /etc/passwd |grep ftpuser*
ftpuser01:x:1001:1001::/data/ftp/ftpuser01:/bin/bash
ftpuser02:x:1002:1002::/data/ftp/ftpuser02:/bin/bash
2)FTP配置文件的主要参数配置如下--FTP配置为不锁定用户主目录即允许chroot(my-cfg-mode1):
2.1)配置 /etc/vsftpd/vsftpd.conf
[root@localhost data]# vi /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES
##local_root 注释掉/不指定local_root参数,则默认为各自FTP登录用户的用户主目录
##local_root=/data/ftp/ftpuser01
write_enable=YES
# my-settings
# my-cfg-mode1:
# 1)chroot_local_user=YES => 锁定/限制用户在本用户主目录下(adduser 不指定 -d 时默认主目录为 /home/userName)、禁止切换到上层系统目录
# 2)chroot_list_enable=YES => 例外用户列表功能是否启用:YES-开启, NO-关闭
# 3)chroot_list_file=/etc/vsftpd/chroot_list => 例外用户列表配置文件:用户若不加入例外配置列表 chroot_list 则无法 chroot()、无法访问用户主目录外的其他目录
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
# my-settings
# my-cfg-mode2:
# 1)chroot_local_user=YES => 锁定/限制用户在本用户主目录下(adduser 不指定 -d 时默认主目录为 /home/userName)、禁止切换到上层系统目录
# 2)chroot_list_enable=NO => 例外用户列表功能是否启用:YES-开启, NO-关闭
# 3)chroot_list_file=/etc/vsftpd/chroot_list => 例外用户列表配置文件,例外用户列表功能关闭时(chroot_list_enable=NO)用不到 chroot_list
#chroot_local_user=YES
#chroot_list_enable=NO
#chroot_list_file=/etc/vsftpd/chroot_list
##allow_writeable_chroot=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
2.2)配置例外用户列表 chroot_list
[root@localhost data]# echo "ftpuser01" >> /etc/vsftpd/chroot_list
[root@localhost data]# echo "ftpuser02" >> /etc/vsftpd/chroot_list
3)重启vsftpd服务:
[root@localhost data]# service vsftpd restart
4)FTP客户端登录:
登录成功,登录后的当前目录位于用户的主目录下,允许 cd 到上层系统目录(允许切换到上层系统目录)、没有锁定在用户主目录下:
[root@localhost data]# ftp 192.168.1.82
Connected to 192.168.1.82 (192.168.1.82).
220 (vsFTPd 3.0.2)
Name (192.168.1.82:root): ftpuser01
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/data/ftp/ftpuser01"
ftp> cd /opt
250 Directory successfully changed.
ftp> cd /home
250 Directory successfully changed.
ftp> bye
221 Goodbye.
[root@localhost data]#
[root@localhost data]# ftp 192.168.1.82
Connected to 192.168.1.82 (192.168.1.82).
220 (vsFTPd 3.0.2)
Name (192.168.1.82:root): ftpuser02
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/data/ftp/ftpuser02"
ftp> cd /opt
250 Directory successfully changed.
ftp>
可是,考虑到安全性,接下来我尝试修改vsftpd.conf配置,将设置为锁定FTP登录用户在用户主目录下(禁止切换到上层系统目录),却遇到配置完成后FTP登录报错:
500 OOPS: vsftpd: refusing to run with writable root inside chroot() 的问题。
5)FTP配置文件的主要参数配置如下--FTP配置为锁定用户主目录即禁止chroot(my-cfg-mode2):
2.1)配置 /etc/vsftpd/vsftpd.conf
[root@localhost data]# vi /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES
##local_root 注释掉/不指定local_root参数,则默认为各自FTP登录用户的用户主目录
##local_root=/data/ftp/ftpuser01
write_enable=YES
# my-settings
# my-cfg-mode1:
# 1)chroot_local_user=YES => 锁定/限制用户在本用户主目录下(adduser 不指定 -d 时默认主目录为 /home/userName)、禁止切换到上层系统目录
# 2)chroot_list_enable=YES => 例外用户列表功能是否启用:YES-开启, NO-关闭
# 3)chroot_list_file=/etc/vsftpd/chroot_list => 例外用户列表配置文件:用户若不加入例外配置列表 chroot_list 则无法 chroot()、无法访问用户主目录外的其他目录
#chroot_local_user=YES
#chroot_list_enable=YES
#chroot_list_file=/etc/vsftpd/chroot_list
# my-settings
# my-cfg-mode2:
# 1)chroot_local_user=YES => 锁定/限制用户在本用户主目录下(adduser 不指定 -d 时默认主目录为 /home/userName)、禁止切换到上层系统目录
# 2)chroot_list_enable=NO => 例外用户列表功能是否启用:YES-开启, NO-关闭
# 3)chroot_list_file=/etc/vsftpd/chroot_list => 例外用户列表配置文件,例外用户列表功能关闭时(chroot_list_enable=NO)用不到 chroot_list
chroot_local_user=YES
chroot_list_enable=NO
chroot_list_file=/etc/vsftpd/chroot_list
#allow_writeable_chroot=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
2.2)配置例外用户列表 chroot_list
这里清空或者不清空,其实都无所谓,因为 chroot_list_enable=NO 时根本就用不到 chroot_list
[root@localhost data]# echo "" > /etc/vsftpd/chroot_list
6)重启vsftpd服务:
[root@localhost data]# service vsftpd restart
7)再次FTP客户端登录:
登录失败,报错:500 OOPS: vsftpd: refusing to run with writable root inside chroot()
[root@localhost data]# ftp 192.168.1.82
Connected to 192.168.1.82 (192.168.1.82).
220 (vsFTPd 3.0.2)
Name (192.168.1.82:root): ftpuser01
331 Please specify the password.
Password:
500 OOPS: vsftpd: refusing to run with writable root inside chroot()
Login failed.
421 Service not available, remote server has closed connection
ftp> bye
[root@localhost data]# ftp 192.168.1.82
Connected to 192.168.1.82 (192.168.1.82).
220 (vsFTPd 3.0.2)
Name (192.168.1.82:root): ftpuser02
331 Please specify the password.
Password:
500 OOPS: vsftpd: refusing to run with writable root inside chroot()
Login failed.
421 Service not available, remote server has closed connection
ftp> bye
[root@localhost data]#
最终查找资料,定位原因如下:
当配置 chroot_local_user=YES 锁定用户登录 FTP 后,只能到自己的主目录下,不能随便切换到其它目录。
但是普通系统用户默认是可以在自己的主目录里写文件的,vsftp 出于安全性要求,如果配置为锁定了用户的 FTP 登录目录,则所在目录不能有写权限。
解决方案:
方案1:去掉FTP主目录的写权限(主目录只允许读)、单独创建可写的子目录:
修改前先查看目录权限:
[root@localhost data]# ls -l
total 0
drwxr-xr-x 4 root root 40 Apr 2 20:53 ftp
[root@localhost data]# ls -l ftp/
total 0
drwx------ 2 ftpuser01 ftpuser01 62 Apr 2 20:53 ftpuser01
drwx------ 2 ftpuser02 ftpuser02 62 Apr 2 20:53 ftpuser02
[root@localhost data]#
去掉用户FTP主目录的写权限:
[root@localhost data]# chmod u-w /data/ftp/ftpuser01
[root@localhost data]# chmod u-w /data/ftp/ftpuser02
[root@localhost data]# ls -l ftp/
total 0
dr-x------ 2 ftpuser01 ftpuser01 62 Apr 2 20:53 ftpuser01
dr-x------ 2 ftpuser02 ftpuser02 62 Apr 2 20:53 ftpuser02
[root@localhost data]#
再尝试FTP客户端登录成功:
[root@localhost data]#
[root@localhost data]# ftp 192.168.1.82
Connected to 192.168.1.82 (192.168.1.82).
220 (vsFTPd 3.0.2)
Name (192.168.1.82:root): ftpuser01
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/"
ftp> bye
221 Goodbye.
[root@localhost data]# ftp 192.168.1.82
Connected to 192.168.1.82 (192.168.1.82).
220 (vsFTPd 3.0.2)
Name (192.168.1.82:root): ftpuser02
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/"
ftp> bye
221 Goodbye.
[root@localhost data]#
创建一个可写的子目录 write:
[root@localhost data]# mkdir -p /data/ftp/ftpuser01/write
[root@localhost data]# chown -R ftpuser01:ftpuser01 /data/ftp/ftpuser01/write
[root@localhost data]# ls -l ftp/
total 0
dr-x------ 3 ftpuser01 ftpuser01 75 Apr 2 22:23 ftpuser01
dr-x------ 2 ftpuser02 ftpuser02 62 Apr 2 20:53 ftpuser02
[root@localhost data]# ls -l ftp/ftpuser01/
total 0
drwxr-xr-x 2 ftpuser01 ftpuser01 6 Apr 2 22:23 write
[root@localhost data]#
[root@localhost data]# mkdir -p /data/ftp/ftpuser02/write
[root@localhost data]# chown -R ftpuser02:ftpuser02 /data/ftp/ftpuser02/write
[root@localhost data]# ls -l ftp/
total 0
dr-x------ 3 ftpuser01 ftpuser01 75 Apr 2 22:23 ftpuser01
dr-x------ 3 ftpuser02 ftpuser02 75 Apr 2 22:28 ftpuser02
[root@localhost data]# ls -l ftp/ftpuser02/
total 0
drwxr-xr-x 2 ftpuser02 ftpuser02 6 Apr 2 22:28 write
[root@localhost data]#
方案2:修改FTP配置、强制允许写FTP主目录
[root@localhost data]# vi /etc/vsftpd/vsftpd.conf
#允许主目录可写(要保证:目录必须要有写权限):
allow_writeable_chroot=YES
修改后重启vsftpd服务。
方案3:
配置FTP为不锁定/限制用户在本用户主目录下,允许切换到上层系统目录,则能成功登录。但考虑安全性,一般不推荐该方案。