setfsuid() 和 Python 2.5.4
我正在尝试在 Python 2.5.4 和 RHEL 5.4 上使用 setfsuid()。因为这个函数不在 os 模块里,所以我自己写了一个 C 模块,并通过 distutils 把它安装成了 Python 的扩展模块。
但是,当我尝试使用它时,结果并不是我预期的那样。setfsuid() 返回的值显示成功(从超级用户切换),但我无法访问那些只有新设置的用户应该有权限访问的文件(使用 open() 函数),这说明 fsuid 并没有真正改变。
我试着通过连续两次运行 setfsuid() 来验证它是否有效,使用的是相同的用户输入。结果就像什么都没变一样,每次调用返回的值都是旧的用户 ID,而不是新的。我还从模块和 Python 脚本中调用了 getpid(),两个都返回了相同的 ID,所以这不是问题所在。
顺便提一下,我是在 Apache 守护进程(WSGI)中做这一切的。
有没有人能给我解释一下这个问题?谢谢!
1 个回答
2
改变FSUID的能力只限于root用户或者拥有CAP_SETFCAP权限的非root进程。现在通常不建议用root权限来运行网页服务器,所以你很可能需要在文件服务器上设置这个权限(具体可以查看man capabilities
)。请注意,这样做可能会严重影响你整个系统的安全性。我建议你考虑先启动一个小的后台进程,让它以root身份运行,并通过本地UNIX套接字与WSGI应用进行交流,这样可以在调整像Apache这样重要的目标的安全性之前,先做好准备。