Chroot 用户 VSFTPD,无法进入文件夹

Chroot 用户 VSFTPD,无法进入文件夹

我正尝试通过 Filezilla 以本地用户身份进入 NGINX 文件夹。

我的服务器的操作系统是 CentOS 7。我通过以下方式在其上安装了 vsftpd:

#Install VSFTP
sudo yum -y install vsftpd
#Make Log file
sudo mkdir /var/log/vsftpd
sudo touch /var/log/vsftpd/vsftpd.log
sudo chmod 0777 /var/log/vsftpd/vsftpd.log
#Make SSL/TLS certificate; Pem file
sudo openssl req -x509 -days 365 -newkey rsa:2048 -nodes -keyout /etc/vsftpd/vsftpd.pem -out /etc/vsftpd/vsftpd.pem
#Update the SELinux boolean values for FTP service;  getsebool -a | grep ftp
sudo setsebool -P ftp_home_dir on
#Place "free" Users in Allow list
sudo echo "bla_user" > /etc/vsftpd.chroot_list

这是我的 /etc/vsftpd/vsftpd.conf 文件:

#Banner
ftpd_banner=Welcome to FTP service
#Pam service name
pam_service_name=vsftpd
#Tuning FTP users
anonymous_enable=NO
#Connect Local users; TLS/SSL/FTPS
local_enable=YES
#Check shell
check_shell=NO
#Write permissions
write_enable=YES
#Enable Chroot; Some Users are "free"
chroot_local_user=YES
chroot_list_enable=YES
#List of "free" Users
chroot_list_file=/etc/vsftpd.chroot_list
#Root dir
local_root=/usr/share/nginx/html/
#Ascii mode
ascii_upload_enable=YES
ascii_download_enable=YES
#Enable TLS/SSL
ssl_enable=YES
#Force Users to use TLS encryption
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
require_ssl_reuse=NO
ssl_ciphers=HIGH
#Specify SSL certificate/private key; Pem file
rsa_cert_file=/etc/vsftpd/vsftpd.pem
rsa_private_key_file=/etc/vsftpd/vsftpd.pem
#Define port range for Passive mode connections
pasv_max_port=51000
pasv_min_port=50000
pasv_address=<My router IP>
pasv_addr_resolve=NO
#Client session is timed out after 300 seconds
idle_session_timeout=300
#Maximum number of connections per IP, helps against DoS/DDoS attacks
max_per_ip=50
#Show hidden files and the "." and ".." folders
force_dot_files=YES
#Use localtime
use_localtime=YES
#Make files Executable
file_open_mode=0777
#Enable logging
xferlog_enable=YES
xferlog_std_format=NO
xferlog_file=/var/log/vsftpd/vsftpd.log
log_ftp_protocol=YES
debug_ssl=YES

我为 chrooted 用户创建了一个目录(这个目录不应该是免费的)等,如下所示:

#Make dir
sudo mkdir /usr/share/nginx/html/test_user
#Make SFTP User
sudo useradd -d /usr/share/nginx/html/test_user -s /usr/sbin/nologin test_user
#Define Password
sudo passwd ksuser
#Place ftp user in NGINX group
sudo usermod -aG nginx test_user

然后我像这样启动服务:

#Start services
sudo systemctl start vsftpd
sudo systemctl enable vsftpd
sudo firewall-cmd --permanent --add-port=21/tcp
sudo firewall-cmd --permanent --add-service=ftp
sudo firewall-cmd --permanent --add-port=51000/tcp
#Restart firewall
sudo firewall-cmd --reload

但是当我尝试使用 Filezilla 登录时,我得到:

230 Login successful, 200 PROT now Private ect.

但最终我得到的是:

Connection lost, and Receiving folders failed

我尝试按照 HBruijn 的建议打开端口并重新加载防火墙。我还运行了 Mircea 建议的 audit2why 命令:

#Allow access
sudo setsebool -P nis_enabled 1
#Allow ftpd to connect all unreserved
sudo setsebool -P ftpd_connect_all_unreserved 1

我仍然无法进入我的文件夹。可能是我的路由器的问题,还是我应该使用 setsebool 打开更多功能?这是我的布尔列表:

ftp_home_dir --> on
ftpd_anon_write --> off
ftpd_connect_all_unreserved --> on
ftpd_connect_db --> off
ftpd_full_access --> off
ftpd_use_cifs --> off
ftpd_use_fusefs --> off
ftpd_use_nfs --> off
ftpd_use_passive_mode --> off
httpd_can_connect_ftp --> off
httpd_enable_ftp_server --> off
sftpd_anon_write --> off
sftpd_enable_homedirs --> off
sftpd_full_access --> off
sftpd_write_ssh_home --> off
tftp_anon_write --> off
tftp_home_dir --> off

答案1

您在 vsftpd.conf 中定义了 50000-51000 的被动端口范围,但在防火墙配置中仅明确打开单个端口 51000。

由于您使用 TLS 来保护连接,因此正常的 netfilter FTP 辅助模块无法动态打开相关的被动端口。

解决方法:开放正确的端口范围。

 sudo firewall-cmd --permanent --add-port=50000-51000/tcp

答案2

首先,您应该排除 SELinux 问题。在 /var/log/audit/audit.log 中搜索 ftp 条目:

audit2why < /var/log/audit/audit.log

检查 vsftpd 日志是否有任何错误。

如果没有任何效果,请使用stracevfstp 并尝试找出问题所在。

为 /usr/share/nginx/html/ 文件设置了哪个 SELinux 上下文?运行以下命令查看:

ls -lZd /usr/share/nginx/html/

相关内容