1

我正在编写一个网站 GUI 来管理运行 CentOS 的数据服务器设备。很多电器都是这样做的。供应商基本上构建了仅用于更改某些配置参数的 GUI,并锁定了其他所有内容。但我很确定我遇到了权限问题,我正在寻找最安全的方法来做到这一点。即,当用户通过 GUI 提交主机名更改时,shell_exec 命令似乎作为 apache 运行。Apache 可能无权更改主机名,这就是为什么这不起作用。授予 Apache 这些权限可能是不安全的,对吗?那么解决方案是什么?所有设备供应商如何能够编写更改主机名的 GUI,他们是如何(安全地)做到这一点的?

代码摘录:

                <form action="Settings.php" method="get">
                <div class="box">
                    <h1>Device Settings</h1>    
                     Hostname: <input type="text" name="Hostname" label="Hostname" value="<?php echo $Hostname; ?>"><br />
                     <input type="submit" value="Set"><br />
                </div>           
            </form> 
            $Hostname=shell_exec("hostname"); /*gethostname**/

            if (isset($_GET['Hostname'])){
                $Hostname=$_GET['Hostname'];
                $output1=shell_exec("sudo hostname ". $Hostname. " 2>&1");*/

            }   
4

3 回答 3

1

当然,给apache这样的权限是不安全的。在这种情况下,此服务器上的任何用户都可以运行 sudo 并制作他想要的东西。最好的方法是编写一个系统守护程序,由另一台安全服务器控制。

如果您需要单服务器解决方案,您可以运行另一个特权 apache,它不为用户的虚拟主机提供服务。这将更加安全。

于 2015-05-21T14:32:15.530 回答
1

我永远不会将 Apache 直接绑定到系统命令。任何使用shell_exec()都应被视为代码异味. 我会让你的 GUI 什么都不做,只是将它的值保存到一些简单的非特权存储中,比如保存在某个专用目录或 SQLite 数据库中的 JSON 文件。这消除了向 Apache 授予任何特殊权限的需要,并具有额外的好处,即您可以保存配置的多个时间戳版本,这可以让您在出现错误时简单地恢复到任何先前的配置。然后,我将创建一个与 Web 服务无关的单独进程,该进程读取配置并进行适当的系统级别更改。只有这个过程需要更高的权限,而不是整个 Web 服务器。它可以用您喜欢的任何语言编写,并且可以根据需要手动执行,作为以某个时间间隔运行的 cron 或主动监视更改的守护程序。

于 2015-05-21T16:02:22.957 回答
-1

您可以配置sudo为允许以另一个用户的名义(例如 www-data)执行所有命令、一个特定命令或命令模式(也可以使用正则表达式),而无需输入密码。

检查手册

于 2015-05-21T14:20:47.247 回答