一个简单的,一步一步的方式设置“监狱”SFTP专用帐户

我觉得我已经通过互联网上的每一个SFTP / Chroot教程,并没有find我在找什么(或者,至less,他们没有产生正确的结果)。 这是我的细节:

  • 我将通过脚本创build大量的个人用户帐户。 因此,任何需要我非常精细地手动编辑每个用户的文件的解决scheme都不是一件好事。
  • 每个用户都会在/ var / www / html / USER文件夹中获得一个目录,其中USER是他们的用户名。 他们应该有对这个目录的全部写入权限,并且能够创build和编辑子目录,但是它们应该完全被locking在文件树中较高的任何目录之外(他们不应该能够列出,更不用说编辑,/ var / www / html /或/ var / www /或/ var /等)

而已。 看起来很简单吧? 然而,我所看到的大多数例子都是关于将所有的SFTP用户locking在一个单一的共享目录中,或者要求你将用户“监禁”到他们的/ home / USER目录(这对web服务不起作用)。 我不要那个。

我正在使用Ubuntu 16.04在新的AWS EC-2实例上执行此操作。

我试过的两种方法徒劳无功:

  • 将用户的HOME设置为/ var / www / html / USER,Chroot将它们监控到HOME。 无论出于何种原因,这似乎并不奏效 – 这会导致SFTP拒绝连接。

  • 为用户设置一个标准的HOME目录(例如使用adduser),创build用户的Web目录,Chroot将它们监控到Web目录。 尽pipe经历了几天的尝试,我还没有设法使这个工作–SFTP帐户仍然最终隧道到HOME目录,这往往意味着他们被拒绝Chroot监狱

结果发生的是用户有太多的自由,或者完全被locking。 我从来没有设法进入一个情况,用户只能看到正确的目录,并能够编辑它。 我已经尝试了该目录下的每个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 

这与大多数指南认为你应该做的事情相符。

我创build一个新用户:

 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给他们一个密码。

然后我尝试login:

 sftp testuser@myserver testuser@myserver's password: packet_write_wait: Connection to myserver_ip: Broken pipe Connection closed 

这似乎是由于Chroot监狱设置,并没有涉及到任何其他明显的服务器设置。 如果我注释掉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 

它不会改变我能看到的任何东西(和以前一样的“Broken pipe”错误)。 (是的,我正在重新启动ssh服务器,每当我做出改变。)

这些是用户文件夹的当前设置:

 drwxr-xr-x 4 testuser sftp 4096 Aug 29 15:00 testuser 

有些说明要Chroot工作,你需要

 chown root:root /var/www/html/testuser 

但是我仍然得到ChrootDirectory设置的“Broken pipe”错误。 将权限更改为777也不会改变这一点。 (/ var / www / html由root:root拥有,就像/ var / www /和/ var /)

其他的东西,我已经尝试使用/ etc / ssh / sshd_config:

  • 将其更改为子系统sftp / usr / lib / openssh / sftp-server并注释掉ForceCommand internal-sftp(无法察觉的更改)

  • 注释掉UsePAM是的(有人报告这有帮助,但它只是让SFTP服务器立即拒绝所有连接 – “由远程主机closures”)

好的,我终于搞定了。 有一些事情我做错了,显然我反复尝试的一些尝试搞砸了一些设置,所以我只是提出了实例,并从头开始。

主要的问题似乎是你不能使Chroot的目录成为可写的目录。 所以它不能成为你的主要网站目录。 我一直在想这一切都错了,试图使我的主要Apache目录的用户帐户。 这是不对的 – 你所做的是你在一个标准的用户目录(/ home / jimmy)中创build用户帐户,在该目录中创build一个www(或public_html或其他)文件夹,使用户目录本身(在这种情况下, home / jimmy /),并创build由jimmy和Chrooted组(例如上面的示例中的“sftp”)拥有的可写目录(/ home / jimmy / www)。 然后,将ChrootDirectory设置为%h(在本例中为/ home / jimmy)。 Jimmy将无法在目录/ home / jimmy /中执行任何操作,但他可以将文件放入/ home / jimmy / www。 为了使其可用,您可以在Apache中设置userdir并告诉它使用这些www文件夹作为用户文件夹。

现在它工作!

监狱可以满足这个要求,我想。 这很容易使用。

https://github.com/pymumu/jail-shell