对 /var/www 具有写入权限的 chrooted sftp 用户

bas*_*osh 12 debian apache-http-server sftp chroot file-permissions

我对我尝试部署的这个设置感到困惑。我希望你们当中有人能帮我一把:非常感谢。

背景资料

服务器是Debian 6.0,ext3,前面是Apache2/SSL和Nginx作为反向代理。我需要提供对 Apache 根目录 (/var/www) 的 sftp 访问权限,确保 sftp 用户以 RWX 权限被 chroot 到该路径。

所有这一切都没有修改 /var/www 中的任何默认权限。

drwxr-xr-x  9 root root  4096 Nov  4 22:46 www
Run Code Online (Sandbox Code Playgroud)

里面 /var/www

-rw-r----- 1 www-data www-data     177 Mar 11  2012 file1
drwxr-x--- 6 www-data www-data    4096 Sep 10  2012 dir1
drwxr-xr-x 7 www-data www-data    4096 Sep 28  2012 dir2
-rw------- 1 root     root          19 Apr  6  2012 file2
-rw------- 1 root     root     3548528 Sep 28  2012 file3
drwxr-x--- 6 www-data www-data    4096 Aug 22 00:11 dir3
drwxr-x--- 5 www-data www-data    4096 Jul 15  2012 dir4
drwxr-x--- 2 www-data www-data  536576 Nov 24  2012 dir5
drwxr-x--- 2 www-data www-data    4096 Nov  5 00:00 dir6
drwxr-x--- 2 www-data www-data    4096 Nov  4 13:24 dir7
Run Code Online (Sandbox Code Playgroud)

我试过的

  1. 创建了一个新组secureftp
  2. 创建了一个新的 sftp 用户,加入了secureftpwww-data组,也使用nologin shell。Homedir 是 /
  3. 编辑 sshd_config
Subsystem sftp internal-sftp 
AllowTcpForwarding no 
Match Group <secureftp> 
      ChrootDirectory /var/www 
      ForceCommand internal-sftp
Run Code Online (Sandbox Code Playgroud)

我可以使用 sftp 用户登录,列出文件但不允许写入操作。Sftp 用户在 www-data 组中,但 /var/www 中的权限是该组位的 read/read+x 所以......它不起作用。

我也尝试过使用 ACL,但是当我将 sftp 用户的 ACL RWX 权限应用到 /var/www(递归目录和文件)时,它也会更改 unix 权限,这是我不想要的。

我能在这里做什么?

我在想我可以让用户 www-data 以 sftp 身份登录,这样它就可以修改 www-data 在 /var/www 中拥有的文件/目录。但出于某种原因,我认为这在安全方面是一个愚蠢的举动。

Ste*_*ütt 16

我所做的是将我的用户 chroot 到他们的主目录,然后用于mount --bind在他们的主目录中创建指向它的链接。

然后我用来setfacl确保www-data维护者对目录中的新文件的写权限。这个效果会递归到/var/www,这就是你想要做的。

通过g+s在目录上设置,在其中创建的所有新文件和目录都将从其父级继承组所有权。

useradd someuser
mkdir -p /home/someuser/www
mount --bind /var/www /home/someuser/www
chmod g+s /home/someuser/www
chown -R someuser:www-data /home/someuser/www
setfacl -d -m g::rwx /home/someuser/www
Run Code Online (Sandbox Code Playgroud)

这应该够了吧。

使您的坐骑持久化

显然,当您重新启动服务器时,您希望您的坐骑仍然存在。就像将挂载添加到您的/etc/fstab. 并非所有提供程序都允许您访问此文件,但大多数都允许。

只需添加这样的行:

/var/www        /home/someuser/www        none        bind        0        0
Run Code Online (Sandbox Code Playgroud)

您可能需要重新启动以确保其正常工作。

  • 我在哪里可以付给你啤酒?看起来一切都很好,Apache 似乎也没有抱怨 sftp-user 作为 /var/www 的所有者。当我采用 ACL 方式时,我非常接近您的解决方案,但我忽略了 suid 部分:您很神奇,谢谢! (2认同)