温馨提示×

怎样限制ubuntu sftp用户

小樊
42
2026-09-17 11:42:51
栏目: 智能运维

在 Ubuntu 上限制 SFTP 用户(通常指:只能 SFTP,不能 SSH 登录;只能访问指定目录,不能越权),最常用、最安全的做法是使用 OpenSSH 自带的 internal-sftp + Chroot。

下面从最常用方案到进阶限制给你讲清楚。


一、最常用方案:Chroot + internal-sftp(推荐)

1. 创建 SFTP 用户

sudo adduser sftpuser

(不建议给 shell,后面会改)

2. 创建一个专用目录(必须 root 拥有)

sudo mkdir -p /sftp/sftpuser
sudo chown root:root /sftp/sftpuser
sudo chmod 755 /sftp/sftpuser

存放文件的子目录(用户可写):

sudo mkdir /sftp/sftpuser/upload
sudo chown sftpuser:sftpuser /sftp/sftpuser/upload

3. 修改用户 shell(禁止 SSH)

sudo usermod -s /usr/sbin/nologin sftpuser

4. 配置 SSH(关键)

编辑:

sudo nano /etc/ssh/sshd_config

在文件末尾添加:

Match User sftpuser
    ChrootDirectory /sftp/sftpuser
    ForceCommand internal-sftp
    AllowTcpForwarding no
    X11Forwarding no

如果有多个用户:

Match Group sftp
    ChrootDirectory /sftp/%u
    ForceCommand internal-sftp

(需要先 sudo groupadd sftp 并 usermod -aG sftp user)


5. 重启 SSH

sudo systemctl restart ssh

测试:

sftp sftpuser@服务器IP

✅ 只能 SFTP
❌ 不能 SSH
❌ 不能访问 /


二、限制多个用户(用用户组)

sudo groupadd sftp
sudo usermod -aG sftp user1
sudo usermod -aG sftp user2

目录结构:

/sftp/user1
/sftp/user2

sshd_config:

Match Group sftp
    ChrootDirectory /sftp/%u
    ForceCommand internal-sftp

三、限制 IP(可选)

只允许某个 IP 使用 SFTP:

Match User sftpuser
    ChrootDirectory /sftp/sftpuser
    ForceCommand internal-sftp
    AllowUsers sftpuser@192.168.1.100

或在防火墙层限制 22 端口。


四、限制权限(防误删、防执行)

目录权限规则(非常重要):

  • Chroot 目录:root 拥有,755
  • 用户写目录:用户拥有

错误示例(会登录失败):

chown sftpuser /sftp/sftpuser   # ❌

五、进阶:完全禁用命令式 SFTP 功能(更狠)

如果你只想:

  • 上传
  • 下载
  • 不能删除 / 不能重命名

那就需要 第三方 SFTP 服务(如 ProFTPD + SFTP) 或 OverlayFS / 只读挂载,OpenSSH 本身不支持细粒度命令限制。


六、常见错误排查

问题 原因
broken pipe Chroot 目录不是 root 拥有
能 SSH 没设置 nologin
能跳出目录 没用 internal-sftp
登录慢 DNS 反向解析

总结(最简方案)

internal-sftp + Chroot + nologin = 标准 SFTP 限制方案

如果你愿意,我可以:

  • 给你一份 可直接复制的脚本
  • 帮你 限制只读 / 只写
  • 或配置 Docker / 云服务器场景

你现在是 单用户还是多用户?服务器是公网还是内网?

0 踩