CentOS 配置 SFTP 步骤
一 环境准备与安装
- 更新系统并安装 OpenSSH 服务器(若未安装):
- 命令:sudo yum update -y && sudo yum install -y openssh-server
- 启动并设置开机自启 SSH 服务:
- 命令:sudo systemctl start sshd && sudo systemctl enable sshd
- 防火墙放行 SSH(默认端口 22):
- 命令:sudo firewall-cmd --permanent --add-service=ssh && sudo firewall-cmd --reload
- 验证服务状态:
- 命令:sudo systemctl status sshd(应显示 active/running)
二 基础 SFTP 配置(仅使用 internal-sftp)
- 备份配置:sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
- 编辑 /etc/ssh/sshd_config,确保使用内置 SFTP 并限制会话:
- 将原有 Subsystem 行注释或替换为:Subsystem sftp internal-sftp
- 在文件末尾添加(示例将用户根目录设为 /data/sftp):
- Match Group sftp
- ChrootDirectory /data/sftp
- ForceCommand internal-sftp
- AllowTcpForwarding no
- X11Forwarding no
- 创建用户与组并设权限(示例用户 sftpuser):
- 建组:sudo groupadd sftp
- 建用户:sudo useradd -g sftp -s /sbin/nologin -M sftpuser
- 设密码:sudo passwd sftpuser
- 建立根目录与可写目录:
- sudo mkdir -p /data/sftp/sftpuser/upload
- sudo chown root:sftp /data/sftp/sftpuser
- sudo chmod 755 /data/sftp/sftpuser
- sudo chown sftpuser:sftp /data/sftp/sftpuser/upload
- sudo chmod 755 /data/sftp/sftpuser/upload
- 使配置生效:
- 命令:sudo systemctl restart sshd
- 客户端连接测试:
- 命令:sftp sftpuser@服务器IP
- 预期:仅能访问 /data/sftp/sftpuser(可写入 upload)
三 目录权限与 Chroot 关键规则
- Chroot 根目录(如 /data/sftp/sftpuser)及其上级目录的属主必须为 root,权限不超过 755,且不可对“组”或“其他”开放写权限,否则 internal-sftp 会拒绝登录。
- 如需写入,请在 Chroot 根下创建子目录(如 upload),将其属主改为相应用户(如 sftpuser:sftp),权限设为 755/775 等可用值。
- 常见错误:根目录属主非 root、根目录可写、上级目录存在组写权限等,都会导致登录失败或无法写入。
四 可选与安全加固
- 多用户隔离(每个用户独立根目录,互不可见):
- 目录结构:/data/sftp/{user1,user2}/upload
- 每个用户根目录属主为 root:root,权限 755;其下 upload 目录属主对应用户,权限 755/775
- 在 sshd_config 使用 Match User 分别为 user1、user2 指定 ChrootDirectory /data/sftp/userX
- 禁用 Shell 登录与转发:
- 创建用户时使用 -s /sbin/nologin
- 在 Match 段中设置 ForceCommand internal-sftp、AllowTcpForwarding no、X11Forwarding no
- 密钥登录与禁用密码(可选):
- 本地生成密钥:ssh-keygen -t rsa -b 4096
- 上传公钥:ssh-copy-id sftpuser@服务器IP
- 在 /etc/ssh/sshd_config 中设置:PasswordAuthentication no,然后重启 sshd
- 修改 SSH 端口(可选):
- 在 /etc/ssh/sshd_config 中设置 Port 2222,放行防火墙后重启 sshd,客户端使用 -P 2222 连接。
五 常见问题排查
- 连接被拒绝或超时:检查 sshd 是否运行(systemctl status sshd)、防火墙是否放行 22/自定义端口、端口连通性(telnet/ss)。
- 登录失败(常见报错如 “Permission denied” 或 “fatal: bad ownership or modes”):核对 Chroot 根目录及其上级目录的属主与权限(必须为 root,且不可组写/其他写)。
- 能登录但无法上传:确认在 Chroot 根下创建了可写子目录,并将属主赋予相应用户;根目录本身应保持只读。
- 修改配置后未生效:确认修改的是 /etc/ssh/sshd_config 并执行了 systemctl restart sshd;必要时查看日志 journalctl -u sshd 定位问题。