PHP exec() SELinux 命令

PHP exec() SELinux commands

我的目标是在数组中接收命令“semanage login -l”消息并在浏览器中显示结果。 我在 class Ausearch 中创建了一行,其中有一个函数 processSudoInput(),其内容为:

  public function processSudoInput()
    {
       exec("echo password | /usr/bin/sudo -S semanage login -l ",$output);
       return $output;
    }

问题是当我在终端中打印 $output 时,我得到了很好的结果(一个带有字符串的数组)。 Class ausearch 在单独的 .php 文件 CommandHandler.php 中被调用,其中包含:

use Commands\Ausearch;

include 'Commands/Ausearch.php';

function displayLogData()
{
    $ausearch = new Ausearch();
    $result = $ausearch->processSudoInput();
    var_dump($result);
}
displayLogData();

当我在 PHPStorm 中执行此 php 代码时,我得到结果:

 [0]=>
  string(0) ""
  [1]=>
  string(70) "Login Name           SELinux User         MLS/MCS Range        Service"
  [2]=>
  string(0) ""

并继续下去。 但是当我在浏览器中调用这个函数时(在 HTML 文件中)然后它 returns

array(0) { }

在浏览器中。 到目前为止,我已经尝试执行 visudo 并添加

%www-data ALL=NOPASSWD:ALL

甚至尝试过 chown -R apache:apache /var/wwwchown -R 777 /var/www 没有运气。 甚至将 selinux 设置为 permissive 目前正在使用CentOS8,目标是不惜一切代价在浏览器中实现一个包含上述数据的数组,无论安全性如何。

在 CentOS8 发行版和其他使用 httpd 进程的发行版上,没有这样的系统主题(用户)www-data 也没有 httpd。在“PHPStorm”中执行 sudo 命令时,有用户 A,他拥有执行这些命令所需的所有权限,尽管在执行 sudo 命令并在 web 上显示它们时,用户 B 负责对于它和那个用户 B 是 Apache,因此如果需要 运行 该命令,强烈建议创建 shell 脚本来执行特定的 sudo 命令,也就是封装该命令。在 visudo 里面必须有一行:

%apache ALL=NOPASSWD: /path/to/shell/file.sh

在许多 Internet 示例中,没有提及 %apache 组件(据我搜索)。 Shell 文件是可建议的,因此要避免使用这是一个巨大的安全漏洞(以上解决方案都不是一个好的解决方案,也不是很好但不可怕)

%apache ALL=NOPASSWD: ALL

visudo 中添加上面的行之后,可以在 PHP

中添加 运行 行
exec('sudo /path/to/shell/file.sh`, $output)

shell_exec('sudo /path/to/shell/file.sh')

取决于您的目标

重要的是,sudo 是执行这些脚本的功能所必需的。