温馨提示×

如何限制debian sftp目录

小樊
49
2026-09-21 20:23:05
栏目: 智能运维

在 Debian 上限制 SFTP 用户只能访问指定目录(通常称为 chroot SFTP),最常用、最安全的方式是使用 OpenSSH 自带的 internal-sftp + ChrootDirectory。

下面是一套标准可落地方案。


一、基本思路

  • 使用 系统用户
  • 禁止该用户 SSH 登录
  • 仅允许 SFTP
  • 通过 ChrootDirectory 限制根目录
  • 用户对目录只有使用权,无越权能力

二、创建 SFTP 用户和目录

1. 创建用户(不允许登录 shell)

sudo useradd -m -s /usr/sbin/nologin sftpuser
sudo passwd sftpuser

2. 创建目录结构(关键)

❗ Chroot 目录所有者必须是 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

最终结构:

/sftp/sftpuser/   (root:root, 755)
└── upload/       (sftpuser:sftpuser)

三、配置 SSH(核心)

编辑:

sudo nano /etc/ssh/sshd_config

1. 注释或确保原 Subsystem

# Subsystem sftp /usr/lib/openssh/sftp-server
Subsystem sftp internal-sftp

2. 添加 SFTP 限制配置

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

如果是多个用户,可用:

Match Group sftp

四、重启 SSH

sudo systemctl restart ssh

五、测试 SFTP

sftp sftpuser@你的IP

登录后:

pwd

应显示:

Remote working directory: /

并且无法访问 /sftp/sftpuser 之外


六、常见问题

❌ 登录失败:broken pipe

原因:

  • Chroot 目录不是 root 拥有
  • 目录权限 > 755

解决:

chown root:root /sftp/sftpuser
chmod 755 /sftp/sftpuser

✅ 多个用户方案(推荐)

sudo groupadd sftp
sudo usermod -aG sftp sftpuser
Match Group sftp
    ChrootDirectory /sftp/%u
    ForceCommand internal-sftp

七、进阶(可选)

  • 只读用户:chmod 555
  • 日志审计:LogLevel VERBOSE
  • 禁止密码登录(用密钥)
  • 结合 mount --bind 映射真实数据目录

如果你愿意,可以告诉我:

  • 是 单用户 / 多用户
  • 是否需要 只读 / 读写
  • 是否是 Docker / 云服务器

我可以给你一份完全定制的配置。

0 踩