温馨提示×

CentOS怎样修复SFTP权限

小樊
72
2026-08-04 00:17:37
栏目: 智能运维

在 CentOS 上修复 SFTP 权限问题,通常要从 目录权限、SELinux、SSH 配置、用户配置 四个方面排查。下面按常见场景一步一步来。


一、最常见:SFTP 目录权限不正确(Chroot 场景)

如果你使用的是 Chroot SFTP(/etc/ssh/sshd_config 中 ForceCommand internal-sftp),这是最容易出错的地方

1️⃣ Chroot 目录权限要求(非常严格)

假设配置如下:

Match User sftpuser
    ChrootDirectory /data/sftp
    ForceCommand internal-sftp

那么必须满足:

Chroot 目录及其所有上级目录

  • 属主必须是 root
  • 权限 不能大于 755
  • 不能被普通用户写入

✅ 正确示例:

chown root:root /data/sftp
chmod 755 /data/sftp

❌ 错误示例(一定失败):

chown sftpuser:sftpuser /data/sftp
chmod 777 /data/sftp

2️⃣ 在 Chroot 目录中创建可写目录

Chroot 目录本身不能写,但你可以建一个子目录:

mkdir /data/sftp/upload
chown sftpuser:sftpuser /data/sftp/upload
chmod 755 /data/sftp/upload

登录后只能操作 upload 目录。


二、确认用户 Shell 是否正确

SFTP 用户 不需要登录 shell,但也不能是 /bin/false/sbin/nologin 直连 SSH。

查看用户 shell:

grep sftpuser /etc/passwd

通常建议:

sftpuser:x:1001:1001::/data/sftp:/sbin/nologin

✅ 这是正常的
❌ 如果是 /bin/bash 且 Chroot 配置错误,就会失败


三、检查 sshd_config 配置

编辑配置:

vi /etc/ssh/sshd_config

常见正确配置示例

Subsystem sftp internal-sftp

Match Group sftpusers
    ChrootDirectory /data/sftp
    ForceCommand internal-sftp
    X11Forwarding no
    AllowTcpForwarding no

或按用户:

Match User sftpuser
    ChrootDirectory /data/sftp
    ForceCommand internal-sftp

修改后重启 SSH:

systemctl restart sshd

四、SELinux 问题(CentOS 特有)

CentOS 默认开启 SELinux,经常导致 能登录但无法上传/下载

1️⃣ 临时关闭验证

setenforce 0

如果 SFTP 恢复正常,说明是 SELinux 问题。


2️⃣ 正确修复(推荐)

如果是 Chroot 目录:

semanage fcontext -a -t ssh_home_t "/data/sftp(/.*)?"
restorecon -Rv /data/sftp

或允许 SFTP 写权限:

setsebool -P ssh_chroot_rw_homedirs on

五、常见问题对照表

现象 原因
能登录但无法上传 Chroot 目录权限错误
直接断开连接 Chroot 目录不是 root 属主
提示 broken pipe SELinux
提示 permission denied 目录权限
登录后目录为空 Chroot 路径错误

六、快速自检脚本(推荐)

namei -l /data/sftp

确保:

  • 所有上级目录权限 ≤ 755
  • 所有目录属主是 root

七、如果你愿意,我可以帮你直接定位

你可以直接贴出下面信息(不用贴密码):

  1. /etc/ssh/sshd_config 中 SFTP 相关配置
  2. ls -ld /data/sftp
  3. namei -l /data/sftp
  4. getenforce 输出

我可以精确告诉你是哪一条配置导致的问题

0