在 CentOS 上搭建与加固 SFTP 的完整步骤
一 环境准备与安装
- 安装 OpenSSH 服务端(如未安装):sudo yum install -y openssh-server
- 启动并设置开机自启:sudo systemctl enable --now sshd
- 防火墙放行 SSH(默认端口 22):sudo firewall-cmd --permanent --add-service=ssh && sudo firewall-cmd --reload
- 验证服务状态:sudo systemctl status sshd(应显示 active/running)
二 快速启用 SFTP(系统自带,无需额外组件)
- SFTP 基于 SSH,默认已启用。编辑 /etc/ssh/sshd_config,确认存在:Subsystem sftp /usr/libexec/openssh/sftp-server
- 重启服务生效:sudo systemctl restart sshd
- 客户端连接测试:sftp your_username@your_server_ip(输入密码后进入 SFTP 会话)
三 推荐做法 使用 internal-sftp 并限制用户仅 SFTP
- 创建专用组与用户(禁止 Shell 登录更安全)
- 建组:sudo groupadd sftpusers
- 建用户(示例家目录为 /data/sftp/upload):sudo useradd -m -d /data/sftp/upload -s /sbin/nologin -G sftpusers sftpuser
- 设置密码:sudo passwd sftpuser
- 准备目录与权限(Chroot 根目录必须由 root 拥有,且路径上各级目录不可被组/其他写入)
- 根目录:sudo mkdir -p /data/sftp && sudo chown root:sftpusers /data/sftp && sudo chmod 755 /data/sftp
- 可写子目录:sudo mkdir -p /data/sftp/upload && sudo chown sftpuser:sftpusers /data/sftp/upload && sudo chmod 755 /data/sftp/upload
- 配置 SSH(两种方式,二选一)
- 按用户限制(推荐先单用户验证)
- 在 /etc/ssh/sshd_config 末尾添加:
- Match User sftpuser
- ChrootDirectory /data/sftp
- ForceCommand internal-sftp
- AllowTcpForwarding no
- X11Forwarding no
- PermitTTY no
- 按组限制(批量管理)
- 在 /etc/ssh/sshd_config 末尾添加:
- Match Group sftpusers
- ChrootDirectory /data/sftp
- ForceCommand internal-sftp
- AllowTcpForwarding no
- X11Forwarding no
- 使配置生效:sudo systemctl restart sshd
- 连接测试:sftp sftpuser@your_server_ip(应仅能访问 /data/sftp 及其子目录)
四 常见问题与排错
- 配置语法检查:sudo sshd -t(修改 sshd_config 后务必先检查)
- 目录权限要点(Chroot 失败常见原因)
- 从 ChrootDirectory 指定目录到系统根目录的每一级,拥有者必须为 root,且不可对组/其他开放写权限(常见为 755/750,绝不能 777)
- 用户的可写目录应放在 Chroot 根下的子目录中,并单独赋权给该用户
- 日志排查:tail -f /var/log/secure(登录失败、权限拒绝等会记录于此)
- 连接异常如“Broken pipe”:优先检查 Chroot 目录及上级目录的拥有者与权限是否符合上面规则
五 安全加固与进阶建议
- 禁用 Shell 登录:创建用户时使用 -s /sbin/nologin(或 /bin/false)
- 仅用 internal-sftp:在 sshd_config 中使用 Subsystem sftp internal-sftp,配合 ForceCommand internal-sftp
- 关闭不必要通道:在 Match 段中设置 AllowTcpForwarding no、X11Forwarding no、PermitTTY no
- 改用密钥登录并禁用密码:
- 客户端生成密钥:ssh-keygen -t ed25519
- 上传公钥:ssh-copy-id user@server_ip
- 服务端禁用密码:PasswordAuthentication no(确保公钥已部署后再改)
- 防火墙与端口:仅开放 22/TCP,必要时改端口并同步更新防火墙规则
- 日志与监控:持续关注 /var/log/secure,必要时接入审计/告警