PHP 安全:需要帮助理解 SUID

PHP 安全:需要帮助理解 SUID

我正在读一本关于 PHP 安全的书,下面有我不太理解的部分,具体部分用粗体显示。假设 PHP 想要移动属于用户 A 的文件,PHP 必须以用户 A 的身份运行?这允许吗?我并不是真正的系统管理员,但我真的不明白这如何使服务器更安全或更不安全

SUID 或设置用户 ID 位是 UNIX 和 Linux 文件系统权限功能,可让您指定相关应用程序 应始终以拥有二进制文件的用户身份运行—无论哪个用户启动该过程

答案1

我假设我们谈论的是 Web 服务器。通常,当 Web 服务器运行 PHP 库(或根据情况而定的可执行文件)时,PHP 将以 Web 服务器的用户身份运行。因此,如果 Web 服务器以用户“www”的身份运行,PHP 也将以该用户的身份运行,并继承该用户的权限。

如果设置了 SUID 位,那么 PHP 将不会以“www”用户身份运行,而是以 PHP 程序的所有者身份运行。因此,如果“root”拥有 PHP,那么 PHP 将始终以“root”身份运行,并拥有所有相关权限。这可能非常危险,因为在 Unix 系统上,“root”拥有无限的权力(管理员帐户仅次于 Windows 系统帐户,可以造成几乎同样大的破坏,已经够糟糕了)。

现在,如果您希望 PHP 能够以用户“joe”的身份打开文件,那么 PHP 必须以用户“joe”的身份运行。如果这是来自 Web 服务器的,则通常只能以两种方式之一发生。1. Web 服务器以“joe”的身份运行,PHP 将继承这些权限。2. PHP 以可以承担其他用户权限的用户身份运行(通常此功能保留给“root”)。

由于以“joe”身份运行 Web 服务器并不实际,因此通常将 PHP 程序设置为 SUID 并以 root 身份运行,然后假定用户“joe”的权限。这可能非常危险,因为程序中的错误可能让任何人轻易侵入服务器并造成无数损失。此外,Web 服务器其他部分的错误也可能利用这一点并再次造成损害。出于这个原因(以及其他原因),强烈建议您不要使用 SUID(除非绝对必要)并编写不需要它的程序。

根据您的具体环境,可能适用更多详细信息,其中一些可能不准确。我尽了最大努力,但不知道您到底在做什么。另请注意,Windows 中没有 SUID,但在运行 Web 服务器时有方法可以获得该功能。

相关内容