【问题标题】:setfsuid() and python 2.5.4setfsuid() 和 python 2.5.4
【发布时间】:2010-05-03 12:33:57
【问题描述】:

我正在尝试将 setfsuid() 与 python 2.5.4 和 RHEL 5.4 一起使用。 由于它不包含在 os 模块中,因此我将其包装在自己的 C 模块中,并使用 distutils 将其安装为 python 扩展模块。

但是,当我尝试使用它时,我没有得到预期的结果。 setfsuid() 返回值表示成功(从超级用户更改),但我无法访问只有新设置的用户才能访问的文件(使用 open()),这表明 fsuid 并未真正更改。

我尝试通过使用相同的用户输入连续运行两次 setfsuid() 来验证它是否有效 结果好像什么都没有改变,每次调用时返回的值都是旧用户 id 与新用户 id 不同的值。我还从模块和 python 脚本中调用了 getpid(),它们都返回了相同的 id。所以这不是问题。

以防万一它很重要,我应该注意我是在 Apache 守护进程 (WSGI) 中执行所有这些操作的。

谁能解释一下? 谢谢

【问题讨论】:

    标签: python operating-system


    【解决方案1】:

    更改 FSUID 的能力仅限于具有 CAP_SETFCAP 功能的根进程或非根进程。如今,使用 root 权限运行网络服务器通常被认为是一种不好的做法,因此,您很可能需要在文件服务器上设置该功能(有关详细信息,请参阅 man capabilities)。请注意,这样做可能会严重影响您整个系统的安全性。我建议考虑生成一个以 root 身份运行并通过本地 UNIX 套接字与您的 WSGI 应用程序对话的小型后端进程,然后再处理像 Apache 这样的高调目标的安全性。

    【讨论】:

    • 据我所知,使用具有 root 权限的 mod_wsgi 是不可能的。所以看来我无论如何也不能 setfsuid,我的选择是: 1. 做你的建议 2. 运行一个根进程,在它们处理请求之前更改守护进程的能力。
    • 听起来不错,是的。根据您应用的环境,也可以使用不同的 Web 服务器。 Cherrypy 非常简单,并且包含 WSGI 支持。我没有特别检查过这个问题,但它可能以 root 身份或使用 CAP_SETFCAP 功能运行都没有问题。
    • 感谢您的建议,但我需要使用 Apache,所以 Cherrypy 是不可能的。尝试遵循我自己的建议,并很快了解到我需要作为内核线程运行才能为其他进程设置功能。内核摆弄对我来说真的是最后的手段。我尝试通过从根进程中的程序执行 apache 启动来绕过此问题,该程序为 SETUID 设置了自己的 INHERITABLE 功能。这不起作用 - httpd 守护程序都在 INHERITABLE 集中设置了 SETUID,在 PERMITTED AND EFFECTIVE 集中的所有标志中都设置了 0。知道我做错了什么吗?谢谢
    • 内核模式对于您正在寻找的结果应该不是必需的。我建议尝试使用setcap 命令将这些功能附加到Apache 进程,而不是尝试多进程方法。我相信这个命令设置了内核每次启动程序时检查的可执行文件的一些 xattr 属性。它应该允许您永久设置 Apache 的 SETFCAP 功能(有点像增强的粘性位)。
    猜你喜欢
    • 1970-01-01
    • 2018-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-31
    • 2011-06-13
    • 1970-01-01
    • 2016-12-12
    相关资源
    最近更新 更多