我正在考虑制作一个基于 Web 的小型 Linux 控制面板(只是为了好玩)。
我想到的第一个潜在问题是我需要授予 Apache 的用户 root 级别的权限来运行这些命令,这会危及整个系统的安全性。
为系统安装专用的 Web 服务器并不是一个真正的选择。
也许我可以运行第二个 Apache 实例(为普通用户保留第一个)但甚至不确定是否可能。
那么,你们怎么看?我在这里最好的选择是什么?
提前感谢您的任何意见。
编辑:好的,谢谢大家的建议,我会记住的。
编写可以以 root 身份运行的特定脚本并使用 setuid 位来执行此操作,以便 Apache 可以仅以 root 身份运行这些脚本。IE
#! /usr/bin/php (or wherever your php binary is)
<?php
// Some PHP code that takes in very limited user input,
// validates it carefully, and does a sequence of actions
// that you need to run as root.
// This could easily be a shell script (or whatever else you want)
// instead of PHP. That might be preferable in many situations.
?>
然后确保该脚本由 root 拥有并由 Apache 运行的用户分组:
chown root:www-data myscript.php
然后让它以所有者身份运行:
chmod u+s myscript.php
并确保 Apache 可以执行它:
chmod g+x myscript.php
通过网络服务器执行 root 命令对我来说似乎是一个疯狂的想法,但无论如何。
您可以使用sudo
which 来确保您不会运行任何不需要的命令。
取自这里的小例子,sudo config:
peter, %operator ALL= /sbin/, /usr/sbin, /usr/local/apps/check.pl
在 php 中:
exec( 'sudo /usr/local/apps/check.pl ...');
请务必正确转义所有参数,依此类推。
或者您可以像这样构建数据库表:
commands (
action,
serialized_parameters.
result,
return_code
)
使用 php 将命令插入此表和另一个脚本,该脚本将由不同的用户在 cron 中运行。你不会有实时结果(但你可以让他们有 30 秒的时间)但是 apache 用户将不能直接使用任何命令(当然你可以在读取记录时轻松地限制操作)。
我最近发布了一个项目,它允许 PHP 获取并与真正的 Bash shell 交互(如果需要,作为 root 用户),它解决了 exec() 和 shell_exec() 的限制。在这里获取:https ://github.com/merlinthemagic/MTS
下载后,您只需使用以下代码:
$shell = \MTS\Factories::getDevices()->getLocalHost()->getShell('bash', true);
$return1 = $shell->exeCmd('yourFirstCommand');
//the return will be a string containing the return of the command
echo $return1;
就安全性而言,它比以 root 身份运行 apache 要好得多。但是让 PHP 靠近根目录总是很棘手。
我构建的项目通过以下两种方式之一实现了 root bash shell:
1)您允许apache有权sudo python。
或者
2) 每次需要具有 root 设置的 shell 时,都将 root 凭据传递给对象。
选择你的毒药。:) 阅读文档。