我刚刚听说了ruid2,想知道是否更安全,然后fcgid? 我听说,这是不太安全,更有问题。 两者有什么分别吗?
fastcgi和mod_fcgid是一样的
我正在使用CPanel。
这些比较苹果,橘子和香蕉。
首先, FastCGI是用于在持久性应用程序(或应用程序服务器)和web服务器之间进行通信的协议。 支持FastCGI的应用程序自行运行,并接收来自Web服务器的请求,然后将响应返回给Web服务器以提供给客户端。 FastCGI的发明是因为在开始一个新的程序,加载库,读取configuration等方面有一定的开销。 如果您启动程序一次,并保持运行许多请求,可以避免大部分的开销。 mod_fcgid是该协议的一个实现。 目前,mod_fcgid有一个弱点( 它假设一个正在运行的FastCGI进程一次只能处理一个请求,因此对连接池或进程pipe理器如php-fpm甚至php-cgi使用PHP_FCGI_CHILDREN > 0都PHP_FCGI_CHILDREN ),所以人们将旧的mod_fastcgi从apache 1.x移植到2.x.
其次, mod_ruid2看起来是一个suexec / mod_suid2replace,它与FastCGI完全正交。 suexec是一个特殊的suid root程序,apache运行并告诉改变到一个特定的用户。 然后该脚本可以以该用户的身份运行程序。 通常情况下,一旦完成,它将退出,因为它不能再切换到另一个用户。 mod_suid2来了,并允许Apache本身从根改变到另一个用户在提供页面之前。 这意味着Apache可以切换到用户,然后打开文件并运行CGI程序,甚至使用mod_ *处理程序(例如mod_php)作为特定用户来运行脚本,但是由于apache本身现在被作为该用户卡住,所以apache进程已经退出并被新的根进程取代。 mod_ruid2 声称使用POSIX“能力”模型来允许apache从根切换到另一个用户,同时保持切换的能力。 通过这样做,它可以做所有mod_suid2可以,但不必在每个请求后退出。 mod_suid2和mod_ruid2都要求apache使用mpm-prefork进程模型,因为每个进程只能是一个用户。 所有这三个选项都可以用来运行一个fastcgi服务器,但是那个服务器将会像启动它的用户一样被阻塞(除非mod_ruid2改变用户的能力是可inheritance的,在这种情况下,任何代码都可以改变为root) 。
安全方面,通常apache会在启动后切换到非root用户(例如www-data )。 mod_suid2和mod_ruid2都要求apache一直以root身份运行,直到它提供请求,这意味着如果在请求服务之前(例如在URL处理过程中)可以触发的apache中存在一个利用漏洞,攻击者可以获得对系统的根访问权限。 在mod_ruid2中,如果攻击者可以坚持到apache进程,在请求结束之后切换回根目录,以便利用root访问权限,则可以在整个请求中扩展。 此外,请注意,在Apache内部执行的任何代码(例如使用mod_php的PHP代码)都具有apache本身具有的任何function。 因此,如果apache可以切换回root,那么可以在apache中运行任何PHP(或其他代码)。 suexec仅在启动脚本时运行,并且只有root长度才能决定切换到哪个用户并切换到该用户。 但是,它可能允许使用非root apache的用户通过运行suexec二进制来访问另一个用户。
我希望你问这个是因为你想以不同的用户来运行PHP脚本。 根据我的经验,以脚本的用户身份运行托pipePHP的典型方法是在不使用FastCGI的情况下使用suexec,以便将每个脚本作为单独的进程运行。 有些人通过使用mod_fastcgi 将FastCGI和suexec结合起来 ,为允许运行脚本的系统的每个用户启动至less一个FastCGI服务器,然后将请求发送到适当的用户服务器。 对于有很多用户的系统,这可能会导致很多PHP进程占用大量的内存,但是对于每个请求,启动和停止一个PHP进程仍然可能会更好。 在我看来,mod_ruid2打算通过使用mod_php而不是使用CGI来实现这一点,但是我担心这可能会破坏mod_php中的很多假设。 在我头顶持久的数据库连接可能被错误的用户访问,或像APC这样的caching可能最终会在用户之间共享代码。