用于创建根符号链接的 PHP exec 权限


PHP exec permissions for creating root symlinks

我目前正在为一家工程公司开发基于 Linux 的单板计算机,我负责更新主板内托管的本地配置网站。此配置服务器的要点是,用户可以通过其 Web 浏览器连接到开发板并修改开发板内的设置。

我正在尝试创建的当前设置涉及设置主板硬件时钟的时区。不幸的是,董事会处理时区的方式是在/usr/share/zoneinfo/中的文件到/etc/localtime 之间设置系统链接。

我的问题是我需要从网站运行以下命令:

ln -s /usr/share/zoneinfo/Etc/GMT$1 /etc/localtime

其中 $1 是 + 或 - 后跟一个数字。这些是由网站上的下拉菜单生成的。

当我尝试从网站的PHP运行此命令时,我的主要问题发生了。通过捕获exec命令的响应,我发现我没有足够的权限来创建/修改符号链接。我已经尝试了创建 bash 脚本并从 PHP 运行它的方法。我也尝试从PHP运行基于C的可执行文件。

注意事项:用户密码是随机生成的,sudo 不包含在嵌入式 Linux 软件包中。

我的目标是避免出于安全考虑以 root 身份运行 Apache 服务器。有没有办法授予单个脚本(可能是临时的)运行命令的权限,或任何其他解决方法?

分离特权是有充分理由的,尤其是在处理无状态协议时。darryn.ten 的答案是浪费时间 - 您授予 Web 服务器 uid 执行所有操作的权限 - 通过以 root 身份运行 Web 服务器,您的代码以更少的努力(并且同样不安全)获得相同的结果。

我建议将逻辑封装在以 root 身份运行的程序中,该程序仅:

  • 验证参数
  • 链接时区

在示例中 bekow 我使用的是 bash,它需要 sudo 以 root 身份执行 - 但如果你用 C 编写它,那么你可以启用 setuid 位,它将以文件所有者的权限运行程序(这不适用于 shell 脚本)。不确定 setuid 在 lua 中的行为如何 - 这将是嵌入式系统的明显候选者。

#!/bin/bash
# NB must be validated under executing user privilege
REQUEST=`echo $1 | grep -P '/^(['+'-0-9]+)$/'`"; 
ln -s /usr/share/zoneinfo/Etc/GMT$(REQUEST} /etc/localtime
您需要

将sudo添加到安装中,然后

visudo

并添加以下内容

apache ALL=(ALL) NOPASSWD: ALL

前提是您的 Apache 用户是 Apache 用户。

然后将 sudo 添加到命令中

sudo ln -s /usr/share/zoneinfo/Etc/GMT$1 /etc/localtime

并且该命令应该被执行。

编辑:实际上不要这样做