CentOS配置SFTP服务详解
一、准备SFTP数据目录与测试账户
# 创建基础目录结构
[root@localhost ~]# mkdir -pv /data/sftp/
# 设置目录所有者必须为root(chroot前提条件)
[root@localhost ~]# chown root:root -R /data/sftp/
# 权限至少755,确保普通用户可进入
[root@localhost ~]# chmod 755 -R /data/sftp/
# 创建专用用户组
[root@localhost ~]# groupadd sftpgroup
# 创建用户并限制shell登录
[root@localhost ~]# useradd -d /data/sftp/testuser -m -g sftpgroup -s /sbin/nologin testuser
# 验证用户创建
[root@localhost ~]# id testuser
# 设置密码(测试用简单密码,生产环境建议通过Web工具生成或使用mkpasswd)
[root@localhost ~]# echo "123456" | passwd --stdin testuser
二、调整SSHD配置文件(基于用户组管理)
配置前需定位相应段落
修改后配置示例:
Subsystem sftp internal-sftp
Match Group sftpgroup
ChrootDirectory /data/sftp/%u
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
关键参数说明:
internal-sftp:使用内置SFTP子系统,无需额外软件Match Group sftpgroup:仅约束指定组的成员,多组用逗号分隔ChrootDirectory /data/sftp/%u:锁定用户根目录为 /data/sftp/用户名ForceCommand internal-sftp:强制仅允许SFTP操作AllowTcpForwarding no:禁止TCP转发(默认yes,若需shell访问可开启)X11Forwarding no:禁用X11转发,降低风险
重启服务可能遇到的错误:
[root@localhost ~]# systemctl restart sshd
Job for sshd.service failed because the control process exited with error code.
[root@localhost ~]# tail /var/log/messages
Jul 4 14:13:53 localhost sshd: /etc/ssh/sshd_config line 145: Directive 'UseDNS' is not allowed within a Match block
此问题源于UseDNS被错误放置在Match块内,务必将其置于全局配置区域。
三、客户端连接测试
1. 修正用户目录权限
[root@localhost ~]# cd /data/sftp/
[root@localhost sftp]# ls -la
drwx------ 2 testuser sftpgroup 62 Jul 4 05:12 testuser
[root@localhost sftp]# chown root:root testuser
[root@localhost sftp]# chmod 755 testuser/
[root@localhost sftp]# cd testuser/
[root@localhost testuser]# mkdir upload
[root@localhost testuser]# chown testuser:sftpgroup upload/
2. 连接测试
[root@localhost ~]# sftp testuser@172.16.150.135
testuser@172.16.150.135's password:
Connected to 172.16.150.135.
sftp> ls
upload
sftp> cd upload/
sftp> mkdir testdir
sftp> rmdir testdir
sftp> help # 显示支持的命令
常见错误处理:
packet_write_wait: Connection to 172.16.150.135 port 22: Broken pipe
Couldn't read packet: Connection reset by peer
此类错误几乎均由目录权限不正确导致,需遵循以下核心原则:
- 从ChrootDirectory指定目录向上至根目录,所有目录所有者必须是root
- 从ChrootDirectory指定目录向上至根目录,所有目录不可包含组写入权限
四、基于单个用户的配置(原理与组模式相同)
Match User zara_sftp
ChrootDirectory /data/sftp/zara_sftp
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp