配置 SELinux
设置以下 SELinux 布尔值以禁用 FTP 用户的 SELinux MAC(强制 Linux 控制)。
这是必要的,因为 /var/www/html 目录的 SELinux 文件上下文是 httpd_sys_content_t 。
因此,FTP 用户可能会面临权限问题。
# setsebool -P ftpd_full_access 1
问题
在某些情况下,我们必须给用户 FTP 访问权限,但我们不想使用 FTP 协议访问整个服务器。
对于这种情况,我们为 FTP 用户配置 chroot jail 到他们的主目录。
但有时,我们需要将它们限制在另一个目录中,同时保持它们的主目录完整以供 ssh 访问。
在本文中,我们将介绍如何安装 vsftpd(Very Secure FTP)服务并为 FTP 用户配置 chroot jail,以将他们的 FTP 会话限制到各自的 /var/www/html/[username] 目录。
在本教程中,我们将学习如何将 FTP 用户 chroot 到 /var/www/html 目录。
为 SSL 和 Chroot FTP 配置 VSFTPD 服务
在 vsftpd user_list 文件中添加用户。
我们可以使用 vim 文本编辑器来编辑 user_list 文件。
# vi /etc/vsftpd/user_list
在此文件中添加用户。
# vsftpd userlist # If userlist_deny=NO, only allow users in this file # If userlist_deny=YES (default), never allow users in this file, and # do not even prompt for a password. # Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers # for users that are denied. root bin daemon adm lp sync shutdown halt mail news uucp operator games nobody user1 user2
备份 vsftpd.conf 文件,然后在 vim 文本编辑器中编辑它。
# cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.org # vi /etc/vsftpd/vsftpd.conf
在此文件中找到并设置以下指令。
这些设置与 chroot FTP 和 SSL 配置有关。
userlist_enable=YES userlist_deny=NO ssl_enable=YES ssl_sslv2=NO ssl_sslv3=NO ssl_tlsv1_2=YES rsa_cert_file=/etc/vsftpd/vsftpd.pem rsa_private_key_file=/etc/vsftpd/vsftpd.key allow_anon_ssl=NO force_local_data_ssl=YES force_local_logins_ssl=YES require_ssl_reuse=NO ssl_ciphers=HIGH pasv_min_port=30000 pasv_max_port=31000 debug_ssl=YES chroot_local_user=YES local_root=/var/www/html/$USER user_sub_token=$USER allow_writeable_chroot=YES
在 Linux 操作系统中创建用户
使用 ssh 客户端以 root 用户身份与 apache-01.onitroad.com 连接。
我们需要创建用户才能访问 FTP 服务器。
因此,请在 Linux bash 提示符下执行以下命令来创建用户并设置其各自的密码。
# useradd user1 # echo "linuxpassword" | passwd --stdin user1 Changing password for user user1. passwd: all authentication tokens updated successfully. # useradd user2 # echo "linuxpassword" | passwd --stdin user2 Changing password for user user2. passwd: all authentication tokens updated successfully.
提示:如果我们想禁用这些用户的 SSH 访问,那么我们可以将他们的登录 shell 设置为 /sbin/nologin 。
在 RHEL 8 上安装 VSFTPD 软件
VSFTPD 是包括 RHEL 8 在内的著名 Linux 发行版中默认和首选的 FTP 服务器软件。
如果我们配置了有效的 Red Hat 订阅,则可以从标准 yum 存储库安装软件包。
# dnf install -y vsftpd ...Installed: vsftpd-3.0.3-32.el8.x86_64 Complete!
启动 FTP 服务
启用并启动 FTP 服务。
# systemctl enable --now vsftpd.service Created symlink /etc/systemd/system/multi-user.target.wants/vsftpd.service -> /usr/lib/systemd/system/vsftpd.service.
检查 FTP 服务的状态。
# systemctl status vsftpd -> vsftpd.service - Vsftpd ftp daemon Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; enabled; vendor pres> Active: active (running) since Sun 2021-03-21 09:37:18 EDT; 41s ago Process: 1643 ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf (code=exited> Main PID: 1644 (vsftpd) Tasks: 1 (limit: 5815) Memory: 868.0K CGroup: /system.slice/vsftpd.service ->->1644 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf Mar 21 09:37:18 apache-01.onitroad.com systemd[1]: Starting Vsftpd ftp daemon.> Mar 21 09:37:18 apache-01.onitroad.com systemd[1]: Started Vsftpd ftp daemon.
访问 FTP 服务器
我们需要一个 FTP 客户端来访问 FTP 服务器。
RHEL 8 中的默认 FTP 客户端是 lftp 。
我们可以从标准 yum 存储库安装它。
# dnf install -y lftp
我们现在可以使用 lftp 命令访问 FTP 服务器。
# lftp user1@localhost Password: lftp user1@localhost:~> ls ls: Fatal error: Certificate verification: Not trusted (31:98:F7:05:AB:E2:0B:46:BB:39:BE:93:1F:5B:A8:BD:34:E2:71:63)
认证警告是由于自签名证书。
我们可以通过在 Linux bash 提示符下执行以下命令来抑制 lftp 中的此警告。
#echo "set ssl:verify-certificate no" >> /etc/lftp.conf
现在,再次执行 lftp 命令。
lftp user1@localhost Password: lftp user1@localhost:~> ls -rw-r--r-- 1 0 0 0 Mar 21 13:59 user1_files
我们可以看到 user1 正在登录他自己的 chroot FTP jail,例如:/var/www/html/user1.
同样,以 user2 FTP 用户身份登录。
# lftp user2@localhost Password: lftp user2@localhost:~> ls -rw-r--r-- 1 0 0 0 Mar 21 13:59 user2_files
就像 user1 , user2 登录到他自己的 chroot FTP jail 例如:/var/www/html/user2 。
创建 Chroot FTP 目录
为用户创建 chroot FTP 目录。
# mkdir /var/www/html/user{1..2}
设置 chroot jail 目录的所有权。
# chown -R user1:apache /var/www/html/user1 # chown -R user2:apache /var/www/html/user2
在每个目录中创建一个空文件。
这样就可以通过FTP客户端在登录后区分chroot jail目录。
# touch /var/www/html/user1/user1_files # touch /var/www/html/user2/user2_files
为 FTP 服务创建自签名 SSL 证书
为我们的 FTP 服务器创建一个自签名 SSL 证书。
这是必须的,否则我们将无法以 FTP 用户身份登录。
我们可以执行以下 openssl 命令来生成自签名 SSL 证书和私钥。
# openssl req -x509 -nodes -keyout /etc/vsftpd/vsftpd.key -out /etc/vsftpd/vsftpd.pem -days 365 -newkey rsa:2048 Generating a RSA private key .........+++++ ......+++++ writing new private key to '/etc/vsftpd/vsftpd.key' ---- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ---- Country Name (2 letter code) [XX]:PK State or Province Name (full name) []:Sindh Locality Name (eg, city) [Default City]:Karachi Organization Name (eg, company) [Default Company Ltd]:onitroad Organizational Unit Name (eg, section) []:IT Lab Common Name (eg, your name or your server's hostname) []:apache-01.onitroad.com Email Address []:jackli@apache-01.onitroad.com
提示:如果我们为网络配置了证书颁发机构,则可以生成 CSR(证书签名请求)并从证书颁发机构获取数字签名。
配置 Linux 防火墙
在 Linux 防火墙中允许 FTP 服务端口。
# firewall-cmd --permanent --add-service=ftp success # firewall-cmd --reload success