如何通过网站PHP安全地更改主机名、IP地址,CentOS

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

我正在编写一个网站GUI,用于管理运行CentOS的数据服务器设备。很多电器都能做到这一点;供应商基本上只为更改某些配置参数构建GUI,并锁定其他所有内容。但我很确定我在权限方面遇到了问题,我正在寻找最安全的方法。i、 e.当用户通过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");*/

            }   

设备设置

主机名:您可以配置
sudo
以允许以另一个用户(例如www-data)的名义执行所有命令,一个特定命令或一个命令模式(也可以使用regex),而无需请求密码


检查。

当然,授予apache这样的特权是不安全的。在这种情况下,此服务器上的任何用户都可以运行sudo并生成所需的内容。最好的方法是编写一个由另一个安全服务器控制的系统守护进程


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

我永远不会将Apache直接绑定到系统命令。任何使用
shell\u exec()
的行为都应被视为一种行为。我会让您的GUI什么都不做,只是将其值保存到一些简单的非特权存储中,比如保存在某个专用目录中的JSON文件或SQLite数据库。这消除了向Apache授予任何特殊权限的需要,并具有额外的好处,即您可以保存配置的多个时间戳版本,这允许您在发生错误时简单地恢复到以前的任何配置。然后,我将创建一个与web服务无关的单独进程,该进程读取配置并进行适当的系统级更改。只有此进程需要增强权限,而不是整个web服务器。它可以用您喜欢的任何语言编写,也可以根据需要手动执行,例如以一定间隔运行的cron,或主动监视更改的守护进程;sudo rm-r/
在主机名字段中,然后提交表单。好的,那么解决方案是什么?我是否应该授予Apache仅通过shell_exec(开始)更改主机名的权利,如果是,如何更改?我是否应该授予Apache root权限(以及如何授予权限),然后在PHP中编写代码以确保输入的主机名不包含某些关键字?可能不会。我是经验丰富的计算机工程师,有网站经验。。。但我从来没有通过html/php设计过设备GUI,我在CentOS也不是一个新手。。。但如果你们能给我指出正确的方向,我会想办法的。我真的不认为授予Apache sudo访问权限是个好主意,我也不认为
exec
及其近亲可以在没有TTY的情况下使用sudo。你限制可以执行的命令,而不是任何东西(例如
hostname[a-z]+
)。我在PHP中使用了这种技术,它正在工作。如果配置了sudoers,您可以通过PHP的exec()执行sudo命令。在我看来,这是最好的方案。该服务在后台运行并监视自定义配置文件。。。每当它检测到对该文件的更改时,就会在实际系统上进行更改。我可以用多种语言写,我从来没有写过这样的服务。。。我已经有了将用户输入写入配置文件的代码。你能让我开始写服务吗?请记住,更改主机名只是一个开始,从GUI可以更改的100件事情中有1件是可以更改的。非常感谢。谢谢你,让我走上了正确的道路。不过我确实有一些问题。有没有办法发送正在运行的服务标志而不是写入文件?我认为这样做的方式是服务应该从GUI接收信息(或者它可以每x秒检查一次数据库的更改)。该服务还将以GUI设置的间隔在数据库中存储snmp信息和命令输出。GUI将作为分析检索该信息。对于通过GUI进行更改,我认为这些不需要存储在数据库中。。。我可以直接发送到服务吗?而且,我只找到了一个好的信息来源()。谷歌的其他一切似乎都是关于安装服务,而不是创建服务。你知道什么消息来源吗?谢谢