1. 确保SELinux处于Enforcing模式(推荐)
SELinux的Enforcing模式会主动强制执行安全策略,是协同vsftpd工作的最佳状态。通过sestatus命令查看当前模式(显示Enforcing即为生效);若需临时切换至Enforcing,执行setenforce 1;若需永久生效,编辑/etc/selinux/config文件,将SELINUX=的值改为Enforcing。
2. 配置SELinux端口标签
vsftpd默认使用21端口(控制连接),若启用被动模式(PASV)还需开放数据端口(如10000-10100)。需将这些端口标记为ftp_port_t类型,允许SELinux允许vsftpd访问:
# 添加控制端口(21)
sudo semanage port -a -t ftp_port_t -p tcp 21
# 添加数据端口范围(示例:10000-10100)
sudo semanage port -a -t ftp_port_t -p tcp 10000-10100
# 验证端口标签
sudo semanage port -l | grep ftp_port_t
此步骤解决了“端口未授权”的SELinux拒绝问题。
3. 调整SELinux布尔值(关键权限开关)
SELinux通过布尔值(Boolean)控制ftp服务的特定权限,需根据需求启用以下关键布尔值:
ftp_home_dir(允许访问家目录)、allow_ftpd_full_access(允许完全访问,谨慎使用,建议设为off):sudo setsebool -P ftp_home_dir on
sudo setsebool -P allow_ftpd_full_access off
allow_ftpd_anon_write(需配合匿名目录权限设置):sudo setsebool -P allow_ftpd_anon_write on
布尔值的-P参数表示永久生效,避免重启失效。
4. 设置正确的SELinux安全上下文
FTP用户的家目录及文件需具备正确的SELinux类型(home_root_t或public_content_rw_t),否则会出现“权限拒绝”错误:
/home/username):sudo restorecon -Rv /home/youruser
/var/ftp/upload):sudo chcon -Rv --type=public_content_rw_t /var/ftp/upload
其中--type需根据目录用途选择:public_content_rw_t(公共读写)、ftp_home_t(家目录)。5. 配置vsftpd与SELinux协同的选项
在vsftpd配置文件(/etc/vsftpd/vsftpd.conf)中,需开启以下选项以配合SELinux:
chroot_local_user=YES:将本地用户限制在家目录(增强安全性);allow_writeable_chroot=YES:允许chroot目录可写(若用户需上传文件,必须开启,否则会因SELinux限制导致无法写入)。sudo systemctl restart vsftpd
6. 监控与调试SELinux问题
若遇到SELinux拒绝访问的问题,可通过以下命令排查:
sudo tail -f /var/log/audit/audit.log(过滤avc类型的拒绝事件);sudo ausearch -m avc -ts recent(显示最近的AVC拒绝事件);audit2allow工具根据日志生成自定义策略(谨慎使用,避免过度放宽权限):sudo ausearch -m avc -ts recent | audit2allow -M mypolicy
sudo semodule -i mypolicy.pp
此步骤帮助快速定位并解决SELinux与vsftpd的协同问题。