我有一个服务器与多个用户,并希望允许他们中的一些存储网页。 因此,我为他们创build了/ var / www的子目录,并相应地configuration了我的networking服务器。
但是,我不希望他们能够查看/ var / www中除自己以外的任何子目录的内容。 我怎样才能做到这一点? 如果我把顶级目录的权限设置为用户:www-data和760的访问权限,我想这是可能的。 但是,我怎样才能确保在他们的目录中创build的每个文件或目录使用相同的用户:组属性?
另外,我想能够使用git来部署网页内容。 我不想知道如何做到这一点的技术细节,而是我应该如何组织权利。 我使用gitolite,每个存储库都存储在/ var / lib / gitolite / repositories下(文件的所有者是git用户)。 允许git用户在使用正确的用户:组信息时写入其中一个网页目录的最佳方式是什么? 这可能吗? 你如何pipe理你的/ var / www访问权限? 供应商如何做到这一点?
首先,请注意,您的760将拒绝www-data组的“进入”该目录的权限,所以它将无法从中提供文件。
目录上的+位强制文件和子目录使用与目录本身相同的uid / gid创build(子目录也将是+ s),因此如果你
chown user:www-data /var/www/userdir chmod 6770 /var/www/userdir
在那个文件夹之后,在那个文件夹中创build的任何文件和文件夹将是user:www-data。 请注意,您只需要在目录上设置它,它不会“修复”已经存在的文件和目录。
如果您不需要Web服务器的目录列表或内容协商function,则可以在文件夹 (6730) 上留下组r位。 这会使得编写一个由web服务器运行的脚本变得难一些,并且偷窥到另一个用户的目录(他们必须知道他们想要读取的文件的名字)。 您也可以通过使用某种forms的suexec来减轻这一点,以确保用户目录中的脚本不在www-data组中运行。
看一下Apache2 mod, mod_userdir用于用户Web目录的标准方法。
关于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