设置SVN二进制文件上的SUID / SGID位是否存在安全风险?

时间:2010-10-26 05:50:48

标签: security svn permissions

我想使用SVN存储库(Unfuddle)的回调功能在提交时对我的服务器上的URL进行ping操作。我有一个PHP脚本接受该消息并尝试调用shell脚本来执行'svn update'。

我面临的问题是Apache在用户'www-data'下运行,并且无法访问本地存储库:'。svv / lock'权限被拒绝。我已经阅读了有关在shell脚本上设置SUID / SGID以及大多数* NIX OS因为涉及安全风险而不支持它的所有内容。

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

我的问题是实现这种类型设置的最合乎逻辑/最安全/最安全的方法是什么?如果我确实将svn二进制文件上设置的位置确实存在,那么这会带来一个我未能意识到的主要安全风险?< / p>

对不起啰嗦的帖子感到抱歉;这是我的第一个问题,我想彻底。

由于

3 个答案:

答案 0 :(得分:2)

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

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

您所涵盖的解决方案是一个事件驱动的解决方案。它们通常资源密集程度较低,但可能难以设置。事件驱动解决方案的另一个例子是让www数据属于svn组。设置SGID位并将存储库目录chown到svn组。这应该允许该组中的任何人签入/退出。

如果您需要限制更新,您可以升级权限或临时更改用户。您使用ssh单一用途密钥(也称为命令密钥)作为具有正确权限的用户进行ssh。然后可以使用单一用途密钥进行更新。

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

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

更改工作副本的权限,以便Apache可以写入它。您有一个要更改的目录,您需要具有此权限。就这么简单:)

您遇到的问题是允许任何Apache用户(或被黑客入侵的页面)在您的仓库中写入,而不是一件好事。所以 - 你只需要允许系统的一部分写入它,最好的方法是以已经拥有repo的用户身份运行你的php脚本。

通过将php脚本作为cgi或fastcgi进程运行,可以轻松实现。你可以指定要使用的用户,它根本不必是www-data,虽然它需要更多的设置,你可以获得最好的事件驱动和安全性。

以下是phpSuexec的快速解释。