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