setfsuid()和python 2.5.4

setfsuid()和python 2.5.4,python,operating-system,Python,Operating System,我正在尝试将setfsuid()用于python 2.5.4和RHEL 5.4。 由于它不包含在操作系统模块中,所以我将其包装在自己的C模块中,并使用distutils将其作为python扩展模块安装 然而,当我尝试使用它时,我没有得到预期的结果。 setfsuid()返回一个值,指示成功(从超级用户更改),但我无法访问只有新设置的用户才应具有用户访问权限的文件(使用open()),这表明fsuid没有真正更改 我试图通过使用相同的用户输入连续运行两次setfsuid()来验证setfsuid(

我正在尝试将setfsuid()用于python 2.5.4和RHEL 5.4。 由于它不包含在操作系统模块中,所以我将其包装在自己的C模块中,并使用distutils将其作为python扩展模块安装

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

我试图通过使用相同的用户输入连续运行两次setfsuid()来验证setfsuid()是否有效 结果就像什么都没有改变一样,每次调用返回的值都是旧用户id与新用户id不同的值。我还从模块中调用了getpid(),从python脚本中调用了getpid(),两者都返回了相同的id

为了以防万一,我应该注意到我是在Apache守护进程(WSGI)中完成所有这些工作的

有人能解释一下吗?
谢谢

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

据我所知,使用具有root权限的mod_WSGI是不可能的。所以我似乎无论如何都无法设置fsuid,我的选项是:1。照你的建议去做。运行一个根进程,在守护进程处理请求之前更改其功能。这听起来不错,是的。根据应用程序的环境,也可以使用不同的web服务器。Cherrypy非常简单,包括WSGI支持。我没有特别检查这个问题,但是它作为root用户或使用CAP_SETFCAP功能运行可能没有问题。谢谢你的建议,但是我需要使用Apache,所以Cherrypy是不可能的。我试着按照我自己的建议去做,很快就知道我需要作为内核线程运行,以便能够为其他进程设置功能。对我来说,摆弄内核是最后的选择。我试图通过从根进程中的一个程序执行apache启动来绕过这个问题,它为SETUID设置了自己的可继承能力。这不起作用-httpd守护进程都在可继承集中设置了SETUID,在允许和有效集的所有标志中都设置了0。知道我做错了什么吗?谢谢,内核模式对于您想要的结果应该不是必需的。与其尝试多进程方法,我建议尝试使用
setcap
命令将这些功能附加到Apache进程。我相信这个命令设置了可执行文件的一些xattr属性,内核会在每次启动程序时检查这些属性。它应该允许您永久地为Apache设置SETFCAP功能(有点像增强的粘性位)。