【问题标题】:How to change hostname, IP address via website PHP safely, CentOS如何通过网站 PHP 安全地更改主机名、IP 地址,CentOS
【发布时间】:2015-05-21 14:14:48
【问题描述】:

我正在编写一个网站 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");*/

            }   

【问题讨论】:

  • 考虑一下当我在主机名字段中输入foo; sudo rm -r / 并提交表单时会发生什么。
  • 对,那么解决方法是什么?我是否应该授予 Apache 仅通过 shell_exec 更改主机名(启动)的权利,如果是,如何?我是否应该只给 Apache root 权限(以及如何?),然后只在 PHP 中编写代码以确保输入的主机名不包含某些关键字?可能不是。我是经验丰富的计算机工程师,有网站经验……但我从未通过 html/php 设计过设备 GUI,我在 CentOS 上也不是新手……但如果你们我会弄清楚的可以为我指明正确的方向。

标签: php apache sudo sudoers


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 在我看来,这听起来像是最好的方案。该服务在后台运行并监视自定义配置文件......只要检测到该文件发生更改,它就会在实际系统上进行更改。我可以用多种语言编写,我从来没有为 CentOS 编写过这样的服务……我已经有了将用户输入写入配置文件的代码。你能让我开始编写服务吗?请记住,更改主机名只是一个开始,可以从 GUI 更改的 100 件事中就有 1 件事。谢谢!!
    • 感谢您,让我走上了正确的道路。不过我确实有一些问题。有没有办法发送正在运行的服务标志,而不是写入文件?我认为这将起作用的方式是服务应该从 GUI 接收信息(或者它可以每 x 秒检查一次数据库的更改)。该服务还将按 GUI 设置的时间间隔将 snmp 信息和命令输出存储在数据库中。 GUI 将检索该信息作为分析。对于通过 GUI 进行更改,我认为这些不需要存储在数据库中......我可以将它们直接发送到服务吗?
    • 另外,我只找到了一个很好的信息来源 (netzmafia.de/skripten/unix/linux-daemon-howto.html)。谷歌上的其他一切似乎都是关于安装服务,而不是创建服务。你知道任何来源吗?谢谢。
    【解决方案3】:

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

    检查manual

    【讨论】:

    • 我真的不认为给予 Apache sudo 访问权限是一个好主意,我不认为 exec 及其表亲可以在没有 TTY 的情况下使用 sudo。
    • 你限制了可以执行的命令,而不是任何东西(例如hostname [a-z]+)。我在 PHP 中使用了这种技术,它正在工作。如果为它配置了 sudoers,您可以通过 PHP 的 exec() 执行 sudo 命令。
    猜你喜欢
    • 2017-09-23
    • 1970-01-01
    • 1970-01-01
    • 2018-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-15
    • 1970-01-01
    相关资源
    最近更新 更多