我需要允许特定用户从我的 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:/
访问远程服务器上未锁定的所有内容。