我目前主持的Drupal CentOS的机器上的第6位。 Drupal的( CMS )配置中含有不应当几十个第三方模块分叉作为一般最佳的编码习惯。 然而,这些模块利用的PHP exec
才能正常运行命令。
该网站允许管理员在任何页面通过UI配置嵌入PHP代码片段,理所当然地认为他们可以访问的PHP代码输入格式。 我需要不断提供给管理员此输入格式,因为有几个节点(页)和面板窗格,利用小型化,无害化的PHP代码片段,就像嵌入特定形式到内容区域,例如。
问题是,如果有人妥协的管理员帐户,然后他们可以在网站上运行任意PHP代码,从而通过PHP的运行shell命令exec
, passthru
等有什么办法,从操作系统层面,来限制什么shell命令PHP可以通过本机? 难道这通过限制文件的权限从PHP一些程序来完成?
注:我不能使用的php.ini disable_functions选项指令,因为我还需要exec
为许多情况下,如果模块使用某些shell命令,如视频编码,例如正常工作。
要回答你的问题:从理论上讲,如果你使用PHP可以运行为命令极其受限帐户创建了一个用户帐号,你可以调整你的安装更加安全。 然而,真正的问题是,管理员用户能够执行任意命令。 如果出现这种情况,你将有你的手显著更大的问题。
这里真正的解决办法是:
- 内的Drupal从提交和运行任意代码的能力是你可以不这样做减轻显著风险。 我强烈建议重新设计的代码,这些“无害”位,因为它们会导致妥协; 执行任意代码只是一种利用和也有许多人担心。
- 这需要运行shell命令的模块也显著的安全漏洞。 在某些情况下,我已经能够叉/补丁或更换执行与那些没有命令的模块,但在某些情况下(如视频编码),这是无法避免的。 在这种情况下,我会成立一个非常有限的后端服务的前端可以沟通。 这种分离的关注和离开的Drupal做它的目的是:管理和服务内容。
如果您admininstrator帐户遭到黑客入侵,你注定。 您正在尝试少注定的,但是这是不行的。
禁用EXEC()
这只是一切都能够对系统进行调用的功能的一小部分。 有很多更多的,像passthru()
shell_exec()
popen()
proc_open()
反引号运算符,依此类推。 也无济于事。
限制可用的可执行文件
将工作只有在攻击者无法把他自己的可执行文件。 但file_put_contents()
就能可执行文件写入到硬盘,然后它可以被调用。 也不会帮助。
PHP不能做任何伤害本身,可以吗?
错误。 通过在服务器上执行的东西exec()
似乎是个好主意,但PHP本身是足够强大的发泄你的服务器和连接到任何东西的破坏。
我认为,唯一真正的解决办法是:
不要让你的管理员帐户遭到黑客入侵。
如果他们遭到黑客入侵,就能马上知道。 能够追溯到的攻击给管理员。 能够知道究竟是什么攻击者并为您的机器,这样你也许能解开它。 一个非常重要的部分是你实现一个审计跟踪记录器,节省了在不同的机器上的数据。
而且你可能实现对谁可以登录,摆在首位的管理员更严格的限制。 例如,有可能是没有必要使整个世界的IP范围内登录,如果你肯定知道一个特定的管理总是用他的本地ISP工作的IP范围。 至少,按门铃,并告知别人,从中国的登录是怎么回事,如果这不是预期的(除非你在中国工作:-))。
并有双因素身份验证。 您可以发送短信到手机号码与附加的登录密码。 或者你可能能够通过实现谷歌或Facebook的身份验证完全外包登录。 这些球员已经拥有基础设施来支持这一点。
而此外,你对内部人员较高的电阻。 人们不重视他们的个人社交网络登录比登录他们的雇主更高。 获取某人的Facebook密码将花费平均为30 $,但公司登陆已经为8 $共享。 去搞清楚...
这不是在操作系统级别,但Drupal核心内有一个名为PHP模块。 您可以使用此为基础,创建一个扩展此模块的功能的自定义模块,然后只需启用这个模块,而不是Drupal的6核心模块。 然而,这样做的最大的问题带有禁用Drupal的6个核心模块,然后让你的新模块。 我想测试它dev的安装,以确保以前的内容不会被删除,新的模块正确分析存储PHP输入。 它应该是没事的模块安装只针对PHP内容禁用挂钩警告现在会显示在纯文本。
至于扩展的核心模块,这是一个非常简单的模块开始。 你可以在允许或不被允许的命令来执行的列表硬编码。 然后,您可以检查与这个列表解析的变量exec语句,做任何是适当的。 这不是简单地对在操作系统级别程序本身阻塞一个完美的比赛,但总比没有好。 硬编码的列表,你只是想修改php_filter钩在模块文件的底部,并做了drupal_eval之前,做您的测试。
您还可以扩展此模块是在Drupal的管理界面进行配置,以创建一个列表,而不是硬编码的。 希望这个理念帮助。
另一种方法:
我们相信,我们需要创建一个只可以访问系统,以在网络上进行远程登录到其他机器的测试用户。 因为我们只需要运行一个telnet需要限制在一个标准的bash会话中可用的其他命令。 让我们一步一步来配置应有尽有。
1)我们创建用户测试
这将是该系统的普通用户,所以我们应该作为一个普通用户。 唯一特殊的是,我们改变用户的外壳。 默认的通常是/斌/ bash和我们将设置/斌/ rbash。 rbash实际上是bash的副本,但它确实是一个“受限制的庆典”。
shell> adduser --shell /bin/test rbash
2)我们创建该文件。 在.bash_profile
我们必须创建在创建用户的主文件和我们想应用的权限。 该文件的内容将会是如下,
if [-f ~/.bashrc]; then
. ~/.bashrc
fi
PATH = $HOME/apps
export PATH
3)我们要避免的变化
一旦你创建的文件,我们停止没有人可以修改该文件。
shell> chattr +i /home/test/.bash_profile
4)我们创建的应用程序目录和安装程序“访问”
现在,一旦你拥有了一切设置,只需要创建的应用程序和里面,创建一个链接到你希望用户拥有权限的程序。 在应用程序内的所有程序,用户可以运行,但是,没有。
shell> mkdir apps
shell> ln-s /usr/bin/telnet /home/test/apps/
5)我们发现,作品
现在,您可以访问系统并验证它工作正常。
shell> ssh test@remote
test@remote password:
shell@remote> ls
-rbash: ls: command not found
shell@remote> cd
-rbash: cd: command not found
shell@remote> telnet
telnet>
球队:
这里是我的方法.....
我创建了一个小脚本接受命令的列表,并根据命令,执行将被控制,以避免问题。 我不知道这是否是在问题的范围。 示例代码有命令在Windows中,但你可以在Linux中使用它,以及...
<?php
ini_set('display_errors',1);
error_reporting(E_ALL);
function executeCommand($my_command){
$commandExclusions = array ('format', 'del');
if (in_array(strtolower($my_command),$commandExclusions)) {
echo "Sorry, <strong>".$my_command." </strong> command is not allowed";
exit();
}
else{
echo exec($my_command, $result, $errorCode);
implode("n", $result);
}
}
echo "<h3>Is it possible to restrict what commands php can pass through exec at an OS level?</h3><br>";
echo "********************************<br>";
//test of an accepted command
echo "test of an accepted command:<br>";
executeCommand("dir");
echo "<br>********************************<br>";
echo "test of an unaccepted command:<br>";
//test of an unaccepted command
executeCommand("format");
echo "<br>********************************<br>";
?>
输出:
是否有可能限制PHP可以在OS层面通过EXEC命令是什么?
接受的命令的测试:117风向(S)11937468416个字节自由
一个接受的命令的测试:对不起,格式化命令是不允许
文章来源: Is it possible to restrict what commands php can pass through exec at an OS level?