www 子文件夹中的 rsync 权限被拒绝

www 子文件夹中的 rsync 权限被拒绝

我需要允许特定用户从我的 Web 服务器下载文件。这些文件将位于特定目录中,我不希望下载程序读取、写入或执行该目录之外的任何操作。因此,我在 Debian 11 服务器上创建了一个普通用户(我们称其为下载者)。我使用 -d 选项将该用户的主目录指向 /var/www/example.com/Downloader

useradd -m -d /var/www/example.com/Downloader Downloader

example.com 目录及以下目录中的所有文件均分配有以下权限:

sudo chown -R WebAdmin /var/www/example.com/
sudo chgrp -R www-data /var/www/example.com/
sudo chmod -R 750 /var/www/example.com/
sudo chmod g+s /var/www/example.com/

我进一步修改了下载器目录如下:

cd /var/www/example.com/Downloader
sudo chgrp -R Downloader ./
sudo chmod -R 750 ./
sudo chmod g+s ./

现在权限如下所示:

-rwxr-x---  1 WebAdmin Downloader         740 Apr 11 11:33 index.php

当我尝试该命令时:

 rsync -arzvP [email protected]:/var/www/example.com/Downloader/ ./

我收到一个错误:

Could not chdir to home directory /var/www/example.com/Downloader/: Permission denied
receiving incremental file list
rsync: [sender] change_dir "/var/www/example.com/Downloader" failed: Permission denied (13)

sent 8 bytes  received 9 bytes  1.79 bytes/sec
total size is 0  speedup is 0.00
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1677) [Receiver=3.1.3]
rsync: [Receiver] write error: Broken pipe (32)

我知道用户下载器无法遍历父目录 /var/www 等,但我认为将主目录设为 /var/www/example.com/Downloader 可以解决这个问题。

顺便说一句,我也试过

rsync -arzvP [email protected]:/ ./

它基本上从根文件夹开始下载(包括启动设备和其他目录)!我当然不想这样!

那么,我该如何实现期望的结果呢?

答案1

让我们看看您描述的目录树的权限:

sudo ls -ld /var /var/www /var/www/example.com /var/www/example.com/Downloader

drwxr-xr-x 13 root     root       4096 Sep 11  2022 /var
drwxr-xr-x  4 root     root       4096 Sep  8 10:27 /var/www
drwxr-s---  3 WebAdmin www-data   4096 Sep  8 10:26 /var/www/example.com
drwxr-s---  3 WebAdmin Downloader 4096 Sep  8 10:26 /var/www/example.com/Downloader

检查后您会发现,权限/var/www/example.com阻止Downloader访问其主目录/var/www/example.com/Downloader

我们可以通过Downloader直接成为用户来验证这一点:

sudo -iu Downloader
sudo: unable to change directory to /var/www/example.com/Downloader: Permission denied

一种解决方案是放宽对父目录的权限,以便Downloader可以到达其目的地。允许这样做的最低要求是授予“其他”执行权限(对于目录,执行权限意味着搜索权限):

sudo chmod o+x /var/www/example.com

现在,当我们验证情况时,它可以按预期工作:

sudo -iu Downloader

pwd
/var/www/example.com/Downloader

id
uid=1009(Downloader) gid=1011(Downloader) groups=1011(Downloader)

然而,所有这些都不能解决你的主要陈述,“我不希望下载程序读取、写入或执行该目录之外的任何操作chroot“。为此,您需要为帐户设置一个环境,然后权限结构会变得(更加)复杂。现在,rsync -av Downloader@remoteHost:他们不仅可以(列出远程文件/目录,因为没有提供目标路径),还可以rsync -av Downloader@remoteHost:/访问远程服务器上未锁定的所有内容。

相关内容