我感觉我已经浏览了互联网上所有的 SFTP/Chroot 教程,但还是没有找到我想要的内容(或者至少没有一个能给出正确的结果)。以下是我的具体内容:
- 我将通过脚本创建大量个人用户帐户。因此,任何需要我逐个用户地手动编辑文件的解决方案都不是好的解决方案。
- 这些用户中的每一个都将在文件夹 /var/www/html/USER 中被分配一个目录,其中 USER 是他们的用户名。他们应该对该目录具有完全的写权限,并能够创建和编辑子目录,但他们应该完全无法访问文件树上任何较高的目录(他们不应该能够列出,更不用说编辑 /var/www/html/ 或 /var/www/ 或 /var/ 等)。
就是这样。看起来很简单,对吧?然而,我看到的大多数示例都是将所有 SFTP 用户锁定到单个共享目录中,或者要求您将用户“监禁”到他们的 /home/USER 目录中(这对 Web 服务不起作用)。我不想要那样。
我在 Ubuntu 16.04 上一个新的 AWS EC-2 实例上执行此操作。
我尝试过的两种方法都失败了:
将用户的 HOME 设置为 /var/www/html/USER,通过 Chroot 将他们限制在 HOME 中。无论出于什么原因,这似乎都不起作用 — 导致 SFTP 拒绝连接。
为用户设置标准 HOME 目录(例如使用 adduser),创建用户的 Web 目录,将他们 Chroot 监禁到 Web 目录。尽管尝试了好几天,我还是没能成功 — SFTP 帐户最终还是会进入 HOME 目录,这通常意味着它们被 Chroot jail 拒绝。
最终的结果是,要么用户拥有太多自由,要么他们被完全锁定。我从来没有设法让用户只能看到正确的目录,并且能够编辑它。我尝试了该目录上的每个 chown 设置(例如,user:user、user:sftp、root:root)和权限设置,但似乎没有任何效果。我在这里忽略了一些显而易见或深刻的东西。
添加了一些细节 — 这是我的一次尝试。
以下是 /etc/ssh/sshd_config 的相关部分:
Subsystem sftp internal-sftp
Match Group sftp
ChrootDirectory %h
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp
这与大多数指南建议你应该做的事情相符。
我创建一个新用户:
adduser --disabled-password -gecos "" --ingroup sftp --shell /usr/sbin/nologin --home /var/www/html/testuser testuser
其中写道:
Adding user `testuser' ...
Adding new user `testuser' (1001) with group `sftp' ...
Creating home directory `/var/www/html/testuser' ...
Copying files from `/etc/skel' ...
然后我用 passwd 给他们一个密码。
然后我尝试登录:
sftp testuser@myserver
testuser@myserver's password:
packet_write_wait: Connection to myserver_ip: Broken pipe
Connection closed
这似乎是由于 Chroot jail 设置造成的,与任何其他明显的服务器设置无关。如果我注释掉 ChrootDirectory,它就可以正常连接:
sftp testuser@myserver
testuser@myserver's password:
Connected to myserver.
sftp> pwd
Remote working directory: /var/www/html/testuser
但是如果我这样做了,sftp 用户就可以退出他们的目录并在服务器上随意漫游,做任何他们想做的事情。不好!
我也尝试过设置
ChrootDirectory /var/www/html/%u
但它并没有改变我所能看到的任何内容(与之前相同的“管道损坏”错误)。(是的,每次进行更改时我都会重新启动 ssh 服务器。)
这些是用户文件夹的当前设置:
drwxr-xr-x 4 testuser sftp 4096 Aug 29 15:00 testuser
有些说明说要使 Chroot 正常工作,您需要
chown root:root /var/www/html/testuser
但是设置了 ChrootDirectory 后,我仍然会收到“管道损坏”错误。将权限更改为 777 也无法改变这种情况。(/var/www/html 由 root:root 所有,/var/www/ 和 /var/ 也是如此)
我还尝试使用 /etc/ssh/sshd_config 进行其他操作:
将其更改为 Subsystem sftp /usr/lib/openssh/sftp-server 并注释掉 ForceCommand internal-sftp (没有可察觉的变化)
注释掉 UsePAM 是(有人报告这有帮助,但它只是让 sftp 服务器立即拒绝所有连接——“被远程主机关闭”)
答案1
好的,我终于让它工作了。有几件事我做错了,显然我一遍又一遍地尝试搞砸了一些设置,所以我只是关闭了实例并从头开始。
主要问题似乎是您无法将 Chroot 目录设为可写目录。因此它不能成为您的主 Web 目录。我一直错误地思考这个问题,试图从我的主要 Apache 目录中创建用户帐户。这是不对的 — 您要做的是,在标准用户目录 (/home/jimmy) 中创建用户帐户,在该目录中创建一个 www(或 public_html 或其他)文件夹,使用户目录本身(在本例中为 /home/jimmy/)归 root 所有,并使可写目录 (/home/jimmy/www) 归 jimmy 和 Chrooted 组所有(例如,我上面示例中的“sftp”)。然后,您将 ChrootDirectory 设置为 %h(在本例中为 /home/jimmy)。Jimmy 将无法在目录 /home/jimmy/ 中执行任何操作,但他可以将文件放入 /home/jimmy/www。为了使其可用,您随后设置Apache 中的用户目录 并告诉它使用这些 www 文件夹作为用户文件夹。
现在它起作用了!
答案2
我认为jail-shell可以满足这个要求。它使用起来很方便。