我正在考虑制作一个基于Web的小型Linux控制面板(只是为了好玩)。
我想到的第一个潜在问题是我需要授予Apache用户root级权限来运行这些命令,这会危及整个系统的安全性。
为系统安装专用的Web服务器实际上不是一种选择。
也许我可以运行第二个Apache实例(为普通用户保留第一个)但是如果可能的话甚至不确定。
那么,你们想的是什么? 我最好的选择是什么?
提前感谢任何输入。
编辑:好的,感谢所有的建议,我会记住它们。答案 0 :(得分:5)
编写可以作为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
答案 1 :(得分:3)
通过网络服务器执行root命令对我来说似乎是一个疯狂的想法,但无论如何。
您可以使用sudo
来确保您不会运行任何不需要的命令。
从here取得的一些例子,sudo config:
peter, %operator ALL= /sbin/, /usr/sbin, /usr/local/apps/check.pl
在php中:
exec( 'sudo /usr/local/apps/check.pl ...');
请务必正确地转义所有参数等等。
或者您可以像这样构建db表:
commands (
action,
serialized_parameters.
result,
return_code
)
使用php向此表插入命令,并使用另一个脚本,该脚本将由不同的用户在cron中运行。您将无法获得实时结果(但是您可以将它们保留30秒)但是apache用户将无法直接使用任何命令(当然,您可以在阅读记录时轻松限制操作)。
答案 2 :(得分:2)
我最近发布了一个项目,允许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的任何地方总是很棘手。
我构建的项目以两种方式之一实现了root bash shell:
1)你允许apache权限sudo python。
OR
2)每次需要具有root设置的shell时,都会将根凭据传递给对象。
选择你的毒药。 :)阅读文档。