CentOS 配置 SFTP 账号:安全文件传输指南
在 Linux 服务器管理中,安全地传输文件至关重要,SFTP(SSH File Transfer Protocol)基于 SSH 协议,提供了加密的文件传输通道,相比传统的 FTP 更加安全可靠,本指南详细讲解在 CentOS 系统上配置专用 SFTP 账号的过程,并限制其仅用于文件传输,无法获得完整的 Shell 访问权限,从而提升服务器安全性。
核心目标:创建隔离的 SFTP 用户

我们将创建一个新用户,将其活动严格限制在指定的目录内,实现安全隔离。
详细配置步骤:
准备工作与用户创建
- 使用管理员账号(如
root或具有sudo权限的账号)登录服务器。 - 创建 SFTP 用户组 (推荐): 为便于管理,建议先创建一个专门的用户组,执行命令:
groupadd sftpusers
- 创建新用户并设置主目录: 创建用户
sftpuser1(可自定义用户名),将其加入sftpusers组,并指定其主目录(/var/sftp/sftpuser1):useradd -g sftpusers -d /var/sftp/sftpuser1 -s /sbin/nologin sftpuser1
-g sftpusers:指定主组为sftpusers。-d /var/sftp/sftpuser1:设置用户主目录(该目录会在下一步创建)。-s /sbin/nologin:关键!禁止用户通过 SSH 获得交互式 Shell 登录能力,仅允许 SFTP。
- 设置用户密码:
passwd sftpuser1
输入并确认一个强密码。
- 使用管理员账号(如
创建并配置隔离目录
- 创建根目录: 所有 SFTP 用户的隔离目录会集中在一个父目录下(如
/var/sftp),创建它并设置严格权限:mkdir -p /var/sftp chown root:root /var/sftp chmod 755 /var/sftp
- 此目录归
root所有,其他用户只有读取和执行权限,无法写入。
- 此目录归
- 创建用户专属目录: 在根目录下为用户创建专属目录(即之前指定的主目录):
mkdir -p /var/sftp/sftpuser1
- 设置用户目录权限: 将专属目录的所有权交给
root,但授予用户写入权限(通过组):chown root:sftpusers /var/sftp/sftpuser1 chmod 770 /var/sftp/sftpuser1
root拥有所有权,sftpusers组拥有读写执行权限(用户sftpuser1属于该组)。- 关键点: 用户登录后将被限制在此目录(
/var/sftp/sftpuser1)内,且该目录归root所有,用户sftpuser1能读写此目录是因为属于sftpusers组并拥有770权限。
- 创建用户实际使用的上传目录(可选但推荐): 用户登录后只能看到其专属目录,为了允许用户上传文件,需要在专属目录下创建一个子目录(如
upload)并将其所有权交给该用户:mkdir /var/sftp/sftpuser1/upload chown sftpuser1:sftpusers /var/sftp/sftpuser1/upload chmod 770 /var/sftp/sftpuser1/upload
- 用户
sftpuser1现在对upload目录拥有完全控制权(读写执行)。
- 用户
- 创建根目录: 所有 SFTP 用户的隔离目录会集中在一个父目录下(如
修改 SSH 配置以启用 SFTP 监狱 (Chroot)

- 编辑 SSH 服务的主配置文件:
vi /etc/ssh/sshd_config
- 找到配置文件的末尾或
Subsystem sftp相关部分。 - 注释掉或替换默认的 SFTP 行: 找到类似
Subsystem sftp /usr/libexec/openssh/sftp-server的行,在其行首添加 注释掉它。 - 添加新的 SFTP 配置块: 在文件末尾添加以下配置(请根据实际情况调整路径和组名):
# 配置内部SFTP子系统,并将 sftpusers 组成员限制在各自目录内 Subsystem sftp internal-sftp Match Group sftpusers ChrootDirectory /var/sftp/%u ForceCommand internal-sftp X11Forwarding no AllowTcpForwarding no PermitTunnel noSubsystem sftp internal-sftp:使用 OpenSSH 内置的 SFTP 实现(internal-sftp),它原生支持ChrootDirectory功能,效率更高。Match Group sftpusers:此配置块仅应用于属于sftpusers组的用户。ChrootDirectory /var/sftp/%u:核心配置!将匹配的用户限制(chroot)在其主目录/var/sftp/<用户名>下。%u会自动替换为登录的用户名(如sftpuser1)。ForceCommand internal-sftp:强制匹配的用户只能运行 SFTP 命令,禁止执行任何其他命令或获得 Shell。X11Forwarding no,AllowTcpForwarding no,PermitTunnel no:禁用不必要的功能,进一步加强安全。
- 保存并退出编辑器 (在
vi中按Esc,输入:wq,回车)。
- 编辑 SSH 服务的主配置文件:
应用配置并重启 SSH 服务
- 在修改
sshd_config后,必须重启 SSH 服务使更改生效:systemctl restart sshd
- 强烈建议在断开当前连接前,先在新窗口中测试 SFTP 登录,确认无误后再退出管理会话,避免因配置错误导致无法远程连接。
- 在修改
测试 SFTP 连接
- 使用 SFTP 客户端(如 FileZilla, WinSCP, 或命令行
sftp)进行连接测试。 - 连接信息:
- 主机:服务器 IP 地址或域名
- 端口:SSH 端口(默认 22)
- 用户名:
sftpuser1 - 密码:之前设置的密码
- 协议:选择
SFTP - SSH File Transfer Protocol。
- 预期结果:
- 成功连接后,客户端应显示用户被限制在
/var/sftp/sftpuser1目录(客户端可能显示为 根目录)。 - 用户应能看到并可以读写
upload子目录(如果创建了)。 - 尝试执行任何 Shell 命令(如
ls在 FileZilla 的命令行)都应失败,提示权限不足或命令不可用。
- 成功连接后,客户端应显示用户被限制在
- 使用 SFTP 客户端(如 FileZilla, WinSCP, 或命令行
值得注意的安全与权限要点:
ChrootDirectory所有权:/var/sftp/sftpuser1目录本身及其所有父目录(直到/var/sftp)必须由root用户拥有,且其他用户不能有写权限(通常设置为755),这是internal-sftp实现chroot的安全要求。- 用户数据目录: 用户需要写入数据的目录(如
/var/sftp/sftpuser1/upload)必须由该用户拥有(或属于其组并有写权限),并设置在ChrootDirectory指定的目录内部。 /sbin/nologin: 确保用户 shell 设置为/sbin/nologin(或/usr/sbin/nologin)是防止其获得 SSH Shell 登录的关键。- 权限最小化: 始终遵循最小权限原则,只授予用户完成工作所必需的权限。
- 日志监控: 定期检查
/var/log/secure日志文件,监控 SFTP 用户的登录和活动情况。 - 防火墙: 确保服务器的防火墙(如
firewalld)开放了 SSH 端口(默认 22/TCP),外部客户端才能连接 SFTP。 - 密钥认证(可选): 对于更高安全性,可考虑为 SFTP 用户配置 SSH 密钥认证代替密码,并在
sshd_config中为匹配块添加PasswordAuthentication no来禁用密码登录。
遵循这些步骤,即可在 CentOS 服务器上成功建立安全的 SFTP 账号访问机制,有效保障文件传输过程的安全性,同时限制用户权限范围,定期审计用户权限和目录结构是维持长期安全的重要习惯。

