我有一台服务器,上面有几个用户,我想允许其中一些用户在上面存储网页。因此,我为他们创建了 /var/www 子目录,并相应地配置了我的网络服务器。
但是,我不希望他们能够查看 /var/www 中除他们自己的子目录之外的任何内容。我该怎么做?如果我将顶级目录的权限设置为 user:www-data 并将访问权限设置为 760,我认为这是可能的。但我如何确保在其目录中创建的每个文件或目录都使用相同的 user:group 属性?
另外,我希望能够使用 git 来部署网页内容。我不想知道任何有关如何执行此操作的技术细节,而是想知道如何重新组织权限。我使用 gitolite,每个存储库都存储在 /var/lib/gitolite/repositories 下(文件的所有者是 git 用户)。允许 git 用户在使用正确的用户:组信息的同时写入其中一个网页目录的最佳方法是什么?这可能吗?您如何管理您的 /var/www 访问权限?提供商如何做到这一点?
答案1
首先,请注意,您的 760 将拒绝 www-data 组“进入”该目录的权限,因此它无法从中提供文件。
目录上的 +s 位强制文件和子目录使用与目录本身相同的 uid/gid 创建(子目录也将是 +s),因此如果你
chown user:www-data /var/www/userdir
chmod 6770 /var/www/userdir
在此之后,在该文件夹中创建的任何文件和文件夹都将是 user:www-data。请注意,您只需要在目录上设置它,它不会“修复”已经存在的文件和目录。
如果你不需要网络服务器的目录列表或内容协商功能,你可以省略组 r 位在文件夹上(6730)。这将使编写由 Web 服务器运行并查看其他用户目录的脚本变得有些困难(他们必须知道他们想要读取的文件的名称)。您还可以通过使用某种形式的 suexec 来确保用户目录中的脚本不会在 www-data 组中运行,从而缓解这种情况。
答案2
看一下 Apache2 模型,mod_userdir用于用户 Web 目录的标准方法。
答案3
关于 git 访问......
您允许 apache 用户对相应的 git 存储库具有只读访问权限。然后您定期运行git pull ...
(例如,通过 cron)来更新 Web 服务器。这意味着您完全不必担心文件系统上的权限——所有文件都归 Apache 用户所有;没有其他人具有写访问权限。
这一点很重要:git 用户没有对 Apache 目录的写权限。apache 用户正在运行操作git pull
并通过 ssh 连接到您的 git 服务器(即使它恰好在同一台主机上运行)。
如果您希望自动进行更新,而不是通过 cron 轮询,您可以使用一个触发的 CGI 脚本git pull
,然后在您的存储库post-update
挂钩中放入类似以下内容:
curl http://www.example.com/trigger-post-update-script