Linux SFTP配置中SELinux的正确用法
一、前置原则与目录权限
- 保持 SELinux 为 enforcing,不要为了“能连上”而改成 permissive/disabled。
- 使用 internal-sftp 并做 Chroot 时,Chroot 根目录必须由 root:root 拥有,权限一般为 755;可写目录单独建在根下,由业务用户所有,例如:
- 创建用户与组:groupadd sftp;useradd -g sftp -s /sbin/nologin sftpuser
- 建立目录:mkdir -p /data/sftp/sftpuser/upload
- 设置根目录:chown root:sftp /data/sftp/sftpuser;chmod 755 /data/sftp/sftpuser
- 设置可写目录:chown sftpuser:sftp /data/sftp/sftpuser/upload;chmod 755 /data/sftp/sftpuser/upload
- 上述权限正确是 SELinux 生效的前提,否则即使 SELinux 策略正确也可能被系统权限直接拒绝。
二、sshd_config 关键配置
- 启用内置 SFTP 并对目标用户/组做限制(示例为按组限制):
- Subsystem sftp internal-sftp
- Match Group sftp
- ChrootDirectory /data/sftp/%u
- ForceCommand internal-sftp
- AllowTcpForwarding no
- X11Forwarding no
- 修改后执行:systemctl restart sshd。以上配置与目录权限配合,可实现仅 SFTP 访问且限制在各自根目录内。
三、SELinux 布尔值与上下文修复
- 允许 SFTP 访问用户家目录(若你的 SFTP 根目录位于家目录下,此项常见为必需):
- setsebool -P sftp_home_dir on
- 为自定义上传目录设置正确的 SELinux 类型(以用户家目录下的 uploads 为例):
- semanage fcontext -a -t ssh_home_t “/home/([^/]+)/uploads(/.*)?”
- restorecon -Rv /home
- 若上传目录不在家目录,而是如 /data/sftp 这类自定义路径,可将其上下文设置为与 /var/www 一致(示例思路):
- chcon -Rv --reference=/var/www/html /data/sftp
- 修改后无需重启系统,但需重启 sshd 使会话生效:systemctl restart sshd。
四、验证与排错
- 连接测试:sftp sftpuser@your_server_ip;登录后尝试 cd /、ls、put/get,确认仅可访问被允许的目录。
- 日志排查:
- 认证与命令日志:tail -f /var/log/secure
- SELinux 拒绝日志:ausearch -m avc -ts recent 或 journalctl -xe | grep -i selinux
- 常见症状与修复要点:
- “Permission denied” 同时出现在系统日志与 SELinux 日志:优先核对目录属主/权限与 Chroot 根是否为 root:root,755。
- “Operation not permitted” 且 SELinux 有 AVC 拒绝:按上文为对应目录设置 ssh_home_t 或参考 /var/www 的上下文,执行 restorecon 后重试。
- 家目录或 .ssh 相关访问异常:确认 sftp_home_dir 布尔值为 on,并对 .ssh 设置正确上下文(如 ssh_home_t)。
五、不建议的做法
- 通过关闭或放宽 SELinux(如把 SELINUX=enforcing 改为 permissive/disabled)来“解决”SFTP 问题,会带来不必要的系统风险;应优先通过布尔值与文件上下文的正确配置来达成目标。