以超级用户身份启动 FPM 池/反映 root 访问权限

以超级用户身份启动 FPM 池/反映 root 访问权限

我正在用 PHP 构建一个 NAS 控制应用程序,该应用程序只能从本地网络访问。

首先,PHP-FPM 不允许使用用户启动它的池root,而且我还没有找到强制执行此操作的方法。

是的,是的,以 root 身份运行 PHP 并不安全(并且还构建了操作系统配置应用程序),但我不知道如何使用并在执行后/etc/rc.conf直接从 PHP编辑 Arch Linux 。file_put_contents()rc.d restart network

我 已open_basedir = /php.ini.

我有读这个因此,我设置了一个 sudoer,并使用相应的用户和组启动 PHP-FPM 池。

我的sudoer是系统用户,添加了:

useradd -r -s /bin/bash -g wheel -d /srv/http/ systemphp

在 sudoer 配置中我添加了以下条目:

systemphp stone=NOPASSWD: ALL

stone是系统的实际主机名。

问题在于我必须这样做sudo <everything>,但我不想将一切都基于shell_exec()/ exec()

因为这里的任何选择都是一种选择,所以我仍然尝试过:

var_dump(shell_exec('sudo fdisk -l'));

返回了null。在PuTTY中su systemphpsudo fdisk -l返回了实际列表。

如果没有shell_exec(),则以下代码会导致fopen(/etc/rc.conf): failed to open stream: Permission denied

$handle = fopen('/etc/rc.conf', 'r+');

if ( $handle )
{
    while( ($buffer = fgets($handle)) !== false)
    {
        echo $buffer;
    }

    if ( !feof($handle) )
    {
    echo 'Error: fgets() unexpectedly failed' . PHP_EOF;
}

    fclose($handle);
}

我该如何建立这样的环境或者至少反映它?

答案1

请不要构建编辑关键配置文件的 Web 界面。

相反,您可以构建一个 Web 应用,让用户修改此配置文件的副本或模板。然后代理或计划脚本可以实际修改此配置文件。

这是大多数供应链管理工作。看看木偶或者BCGF2看看其他语言是如何做到这一点的。

答案2

虽然我非常同意这是一个坏主意,而且你实际上应该编辑一个临时副本并让其他东西复制它,但如果你决心rc.conf直接编辑,请创建一个组,让其成为systemphp成员,将组所有权更改rc.conf为该组并授予rc.conf组写权限。

NOPASSWD: all与通过 sudoers授予用户权限相比,这至少可以减少出现潜在错误的可能性。

此外,这仍然是一个糟糕的想法。您可能看不到对系统造成损害的方法,但要确保这一点将非常困难。我甚至可以说您做不到。rc.conf是一个 bash 脚本,它有来源,祝您好运处理潜在的边缘情况。

顺便说一句,我甚至想不出其中有什么rc.conf有用的改变,特别是因为它在最新的系统上是一个非常小的文件——基本上任何东西都可能更适合在其他地方改变,或者在另一个文件中改变,并告诉rc.conf源该文件,如果它确实实际上需要出现在那儿。

相关内容