【问题标题】:PHP exec() SELinux commandsPHP exec() SELinux 命令
【发布时间】:2021-08-05 00:45:19
【问题描述】:

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

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

问题是当我在终端中打印 $output 时,我得到了很好的结果(一个带有字符串的数组)。 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 文件中)调用这个函数时,它会返回

array(0) { }

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

%www-data ALL=NOPASSWD:ALL

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

【问题讨论】:

  • 从互联网上随机复制和粘贴内容不太可能解决您的问题,更有可能危及或破坏您的系统。如果您在 sudoers 文件中设置了 NOPASSWD,为什么要将密码传递给 sudo 命令?为什么你的 sudoers 文件引用了 www-data 而你后来引用了用户 apachesemanage 在你的路径中吗?您是否尝试过使用exec() 的第三个参数来让您更好地了解问题所在?
  • 你说得很好,在发布这个问题后,我得出的结论是www-data 不再是用户,而是apache。此外,我制作了 shell 脚本,这些命令被封装并稍后在代码中执行 exec(sudo /path/to/shell) ,我需要 exec() 函数返回类型值(不需要 shell_exec )。后来在 sudoers 文件中,我给了 NOPASSWD 对该文件的访问权限,一切正常。总之,不要在凌晨 3 点为你的论文实验写代码 :)

标签: php exec


【解决方案1】:

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

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

在许多互联网示例中,没有提到%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 是这些函数中执行这些脚本的必要条件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-17
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 2011-03-30
    • 2013-09-07
    • 1970-01-01
    相关资源
    最近更新 更多