SFTP配置CentOS的安全性
小樊
41
2026-01-08 00:35:51
CentOS 上 SFTP 安全配置实操指南
一 基线加固与最小权限配置
- 安装并启用 OpenSSH 服务,确保开机自启:
- 安装:sudo yum install -y openssh-server
- 启动与开机自启:sudo systemctl start sshd && sudo systemctl enable sshd
- 备份并编辑 /etc/ssh/sshd_config,建议的全局基线(按需微调):
- 禁用 root 登录:PermitRootLogin no
- 仅启用密钥认证(完成密钥部署后再关闭密码):PasswordAuthentication no、PubkeyAuthentication yes
- 限制认证尝试与保活:MaxAuthTries 3、LoginGraceTime 60、ClientAliveInterval 300、ClientAliveCountMax 3
- 关闭不必要功能:X11Forwarding no、AllowTcpForwarding no、AllowAgentForwarding no
- 可选登录横幅:Banner /etc/ssh/banner
- 创建 SFTP 专用用户与组,并限制其仅能 SFTP:
- 建组:sudo groupadd sftpusers
- 建用户(禁止 shell 登录):sudo useradd -m -g sftpusers -s /sbin/nologin sftpuser
- 设密码:sudo passwd sftpuser
- 目录与权限(满足 chroot 要求:chroot 目录及其上级必须由 root 拥有且不可组/他人写):
- 方案 A(以用户主目录为 chroot):
- 权限:sudo chown root:root /home/sftpuser && sudo chmod 755 /home/sftpuser
- 可写子目录:sudo mkdir -p /home/sftpuser/uploads && sudo chown sftpuser:sftpusers /home/sftpuser/uploads && sudo chmod 775 /home/sftpuser/uploads
- 方案 B(集中目录,便于统一管理):
- 目录:sudo mkdir -p /sftp/sftpuser/upload
- 权限:sudo chown root:root /sftp /sftp/sftpuser && sudo chmod 755 /sftp /sftp/sftpuser
- 可写子目录:sudo chown sftpuser:sftpusers /sftp/sftpuser/upload && sudo chmod 775 /sftp/sftpuser/upload
- 在 /etc/ssh/sshd_config 末尾添加 Match 块(仅对 sftpusers 组生效):
- 示例:Match Group sftpusers
- ChrootDirectory /sftp/%u(或 %h 使用主目录)
- ForceCommand internal-sftp
- AllowTcpForwarding no
- X11Forwarding no
- 使配置生效:sudo systemctl restart sshd
- 防火墙放行:sudo firewall-cmd --permanent --add-service=ssh && sudo firewall-cmd --reload
- 说明:使用 internal-sftp 更安全且适配 chroot;chroot 目录及上级必须 root:root 755,可写目录单独赋权给相应用户。
二 认证与访问控制强化
- 使用 SSH 密钥替代密码(推荐):
- 客户端生成密钥(优先 Ed25519,兼容用 RSA 4096):
- ssh-keygen -t ed25519 -f ~/.ssh/id_sftpuser -C “sftpuser@sftp”
- 或:ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_sftpuser -C “sftpuser@sftp”
- 部署公钥(chroot 环境下,.ssh 在 chroot 内不易维护,推荐集中管理):
- 在服务端创建集中目录:sudo mkdir -p /etc/ssh/sftp-keys/sftpuser
- 拷贝公钥:sudo cp id_sftpuser.pub /etc/ssh/sftp-keys/sftpuser/authorized_keys
- 权限:sudo chown -R root:root /etc/ssh/sftp-keys/sftpuser && sudo chmod 700 /etc/ssh/sftp-keys/sftpuser && sudo chmod 600 /etc/ssh/sftp-keys/sftpuser/authorized_keys
- 在 /etc/ssh/sshd_config 的 Match Group sftpusers 块内添加:
- AuthorizedKeysFile /etc/ssh/sftp-keys/%u/authorized_keys
- 完成部署后,将全局 PasswordAuthentication 设为 no 并重启 sshd
- 限制来源 IP(示例):
- firewalld:sudo firewall-cmd --permanent --add-rich-rule=‘rule family=“ipv4” source address=“1.2.3.4” port port=“22” protocol=“tcp” accept’ && sudo firewall-cmd --reload
- 或临时使用 iptables:sudo iptables -A INPUT -p tcp --dport 22 -s 1.2.3.4 -j ACCEPT && sudo iptables -A INPUT -p tcp --dport 22 -j DROP
- 防暴力破解:
- 安装与启用 fail2ban(CentOS 需先装 EPEL):sudo yum install -y epel-release && sudo yum install -y fail2ban && sudo systemctl enable --now fail2ban
- 客户端自动登录(可选):
- 客户端 ~/.ssh/config:
- Host sftp-prod
- HostName 203.0.113.10
- User sftpuser
- IdentityFile ~/.ssh/id_sftpuser
- PreferredAuthentications publickey
- PasswordAuthentication no
- 注意私钥权限:chmod 600 ~/.ssh/id_sftpuser。
三 日志审计与 SELinux 处理
- 增强日志可见性:
- 在 /etc/ssh/sshd_config 设置:LogLevel VERBOSE
- 重启 sshd 后,审计登录与会话:sudo grep -i sftpuser /var/log/secure
- SELinux(CentOS 默认开启,chroot 写入失败常与此相关):
- 推荐布尔值方式:sudo setsebool -P ssh_chroot_rw_homedirs on
- 或修复文件上下文(示例目录 /sftp):
- 安装工具:sudo yum install -y policycoreutils-python-utils
- 设置上下文:sudo semanage fcontext -a -t ssh_home_t “/sftp(/.*)?”
- 应用:sudo restorecon -Rv /sftp
- 验证:ls -Z /sftp/sftpuser 应含 ssh_home_t。
四 快速验证与回滚要点
- 连接与功能验证:
- 连接:sftp sftpuser@server_ip
- 上传/下载后在服务器检查:ls -l /sftp/sftpuser/upload
- 验证仅 SFTP 可用、无法获得 shell:尝试执行远程命令应被拒绝
- 常见问题排查:
- 无法登录或写入:检查 ChrootDirectory 上级是否为 root:root 755、可写目录属主是否正确、SELinux 布尔值/上下文
- 密钥无效:确认 AuthorizedKeysFile 路径、权限 600、用户属主为 root
- 修改配置前先备份:sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak-$(date +%F)
- 回滚:恢复备份后 sudo systemctl restart sshd
- 安全提示:
- 生产环境变更前在维护窗口进行,保留至少一条当前可用会话,避免被锁
- 建议定期更新系统与 OpenSSH,持续监控 /var/log/secure 与 fail2ban 状态