【问题标题】:Is setting the SUID/SGID bit on the SVN binary a security risk?在 SVN 二进制文件上设置 SUID/SGID 位是否存在安全风险?
【发布时间】:2011-04-30 13:54:06
【问题描述】:

每当提交时,我想使用 SVN 存储库 (Unfuddle) 的回调功能在我的服务器上 ping 一个 URL。我有一个 PHP 脚本接受消息并尝试调用 shell 脚本来执行“svn 更新”。

我面临的问题是 Apache 在用户“www-data”下运行并且无权访问本地存储库:“.svn/lock”权限被拒绝。我已经阅读了所有关于在 shell 脚本上设置 SUID/SGID 以及大多数 *NIX 操作系统由于涉及安全风险而根本不支持它的内容。

但是,我可以在位于 /usr/bin/svn 的 SVN 二进制文件上设置 SUID/SGID 位。这通过允许任何用户在任何存储库上发出 SVN 命令来缓解问题;不是最理想的……

我的问题是实现此类设置的最合乎逻辑/理智/安全的方法是什么,如果我确实保留了 svn 二进制文件中设置的位,这会带来我没有意识到的重大安全风险吗?

对不起,冗长的帖子;这是我的第一个问题,我想彻底。

谢谢

【问题讨论】:

    标签: security svn permissions


    【解决方案1】:

    此类问题有两种解决方案,轮询或事件驱动。

    轮询解决方案的一个示例是让您的服务器上运行的 cronjob 每 N 分钟更新一次。如果它适合您,这可能是最容易维护的。您可以通过从正确的帐户运行 cron 来回避整个权限问题。

    您介绍的解决方案是事件驱动的解决方案。它们通常占用较少的资源,但可能更难设置。事件驱动解决方案的另一个示例是让 www-data 属于 svn 组。设置 SGID 位并将存储库目录更改为 svn 组。这应该允许该组中的任何人签入/签出。

    如果您需要限制更新,您可以临时提升权限或更改用户。您使用 ssh 单一用途密钥(又名命令密钥)以具有正确权限的用户身份登录。然后可以使用单一用途密钥进行更新。

    另一种提升权限的方法是使用sudo -u [user] [command]。更新 /etc/sudoers 文件以允许 www-data 将用户升级/更改为可以执行更新的用户。

    无论哪种方式,我都不会使用 SUID/SGID 脚本。

    【讨论】:

    • 如果可能的话,我更喜欢偶数驱动的解决方案。您使用“svn”组的想法遵循本文的想法:svnbook.red-bean.com/en/1.0/ch06s05.html 但正如您所看到的,还有一些其他事情需要考虑,这使得它有点混乱.我需要进一步研究“命令键”选项。我想,就目前而言,我的问题仍然存在,如果为 svn 二进制文件本身(不是 shell 脚本)设置 SGID 是否存在我应该注意的任何明显的安全问题。感谢您的意见。
    【解决方案2】:

    正如 CodeRich 已经说过的,您可以设置一个 cron 作业来频繁更新 tue 工作副本(这也是我会使用的解决方案)。

    设置 svn SUID/SGID 是不好的,因为 svn 可以在文件系统中的任何地方写入文件(想想一个包含密码和影子文件的公共可访问存储库,检出到 /etc)。您可以使用一个小的 suid 包装程序(它是您的用户帐户的 SUID,而不是 root),它将 chdir 放入您的工作副本并在那里使用正确的参数执行 svn。您可以查看ikiwiki,它在用作 cgi 时会执行此操作。

    另一种方法是更改​​工作副本的权限,以便 www-data 用户可以在那里创建和写入文件。

    【讨论】:

    • 感谢 Rudi,作为一般规则,我想最好避免在任何二进制文件(尤其是 root 拥有的那些)上使用 SUID/SGID,除非你真的知道发生了什么。我可能最终会接受你的第一个建议,只是 CRON 它:也许让 Apache 编写一个 CRON 每分钟轮询的文件,如果该文件存在 svn update and remove file。感谢您的意见。
    【解决方案3】:

    更改工作副本的权限,以便 Apache 可以对其进行写入。您有一个要更改的目录,您需要权限才能这样做。就这么简单:)

    然后您面临的问题是允许任何 Apache 用户(或被黑客入侵的页面)在您的存储库中写入所有内容,这不是一件好事。所以 - 你只需要允许系统的一部分写入它,最好的方法是作为已经拥有 repo 的用户运行你的 php 脚本。

    这很容易通过将 php 脚本作为 cgi 或 fastcgi 进程运行来实现。您可以指定要使用的用户,它根本不必是 www-data,尽管它确实需要更多的设置,但您可以获得最好的事件驱动和安全性。

    下面是对 phpSuexec 的简要说明。

    【讨论】:

    • 我可以更改每个存储库的权限,但感觉很脏:) 我喜欢你关于让 PHP 作为 CGI 执行并在该脚本上设置 SUID 位的想法 - 但我的服务器当前未设置为此,需要进一步安装 - 嗯......我是一个极简主义者 :) 我认为一个简单的 CRON 是去这里的方式;虽然我想知道共享主机帐户如何管理这个,因为我从来没有遇到过这个问题。谢谢。
    • 共享主机之所以有效,是因为 PHP 要么设置为以您的用户身份运行,而且您的主目录(显然)也归您的用户所有。使用 phpSuexec(或 cgi),您将获得与它们相同的结果。忘记 suid 位等,只需以拥有您要更新的目录的用户身份运行脚本。设置非常简单 - 请参阅链接。
    猜你喜欢
    • 2012-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多