我被要求在我们部门的网络服务器上设置一个共享的网络空间,该网络空间可能由多人访问,并且可能运行 CGI 或 PHP 脚本。维护该网络空间的人员可能会决定使用它来提交文件,这意味着他们需要访问脚本创建的任何文件。我们在 Scientific Linux 6 上运行 Apache。
因为多个人需要对网络空间的写权限,所以我们的标准方法是创建一个所有相关人员所属的组,然后将网络空间中目录的权限设置为g+ws
。suexec 对这些文件具有组可写权限感到不满,并拒绝运行它们。
我们如何设置它并确保任何脚本都在与主 Apache 帐户不同的帐户下运行(并且与任何用户都不同)不是我是该网络空间的小组成员吗?出于责任(和其他)原因,我不想创建一个共享帐户,让不同的人来维护这个网络空间。
为了提供更多背景信息,我们目前的设置如下:我们有一些用户的主目录位于 NFS 上,并根据需要自动挂载。大多数人只使用通过 mod_userdir 访问的个人网络空间。过去,我们通过在 NFS 服务器上创建额外的自动挂载目录来处理共享网络空间的多个请求,这些目录不与特定帐户绑定,但设置了组所有权以方便多个帐户访问。到目前为止,这些共享空间仅包含静态内容(并且我们相信相关人员不会从中运行脚本),因此我们以前从未解决过此类空间的任何 suexec 相关问题。
编辑:请注意,用户可能需要访问脚本创建的文件。
答案1
为了确保在此背景下的责任,并为已发布的内容提供正确的所有权和权限,我使用了在这文章。
这就是我实现的方式,请注意大多数部分都是可替换的:
- 所有发布的内容都由版本控制系统(在本例中为 git)管理
- 用户在 Kerberized LDAP 中注册了名义账户以及他们的 RSA 公钥
- 过去,我使用这样的公钥来通过 gitosis/gitolite 授予对不同存储库的访问权限,但您也可以使用带有 git-shell 的普通 git。
- 前段时间,我转到了提供 LDAP 授权的 gitblit。访问 gitblit 的 Web UI 需要有效的 kerberos 票证。
- 该存储库的更新后挂钩已符号链接到包含以下内容的脚本:
#!/bin/sh
sudo /usr/local/sbin/publisher-hub2live
exit 0
未经授权的用户无法直接访问该脚本:
# ls -lrt /usr/local/sbin/publisher-hub2live
-rwx------. 1 root root 400 Oct 12 2012 /usr/local/sbin/publisher-hub2live
因此汗症规则如下:
Defaults:git !requiretty
git Host_Alias = (root) NOPASSWD: /usr/local/sbin/publisher-hub2live
替换git
为存储库的实际所有者。
发布者脚本的内容在这里发挥了“魔力”(简化版本):
#!/bin/sh
echo
echo "**** Pulling changes into Live [Hub's post-update hook]"
echo
cd /path/to/live/repo || exit
umask 0022
unset GIT_DIR
git pull hub master
chown -R root:root /path/to/live/repo
find /path/to/live/repo/ -type d | xargs chmod u=rwx,go+rx
find /path/to/live/repo/ -type f | xargs chmod u=rw,go+r
restorecon -v -R /path/to/live/repo
exec git update-server-info
exit 0
您的需求可能在所有者、组、DAC 和 MAC 权限方面有所不同,但工作流程是相同的。