【问题标题】:PHP exec permissions for creating root symlinks用于创建根符号链接的 PHP 执行权限
【发布时间】:2012-06-14 09:15:51
【问题描述】:

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

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

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

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

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

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

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

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

【问题讨论】:

  • sudo 是授予脚本临时权限的方式。考虑将其添加到您的嵌入式安装中。
  • 大多数嵌入式系统使用用 c 编写的 suexec 助手

标签: php linux permissions exec ln


【解决方案1】:

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

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

  • 验证参数
  • 链接时区

在示例中,我使用 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

【讨论】:

  • 我最终采用了与此类似的方法。我创建了一个名为 setuid 的 C 程序,然后赋予它足够的权限以使用 suid 运行。我在 C 程序中使用 setuid(0); 完成了此操作,然后运行:chown root /usr/bin/timezone_set chmod +s /usr/bin/timezone_set 以设置我的 C 应用程序具有适当的权限。然后我设置 PHP 程序来运行应用程序。
【解决方案2】:

安装时需要添加sudo,然后

visudo

并添加以下内容

apache ALL=(ALL) NOPASSWD: ALL

假设您的 apache 用户是 apache。

然后在命令中添加sudo

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

并且该命令应该被执行。

编辑:实际上不要这样做

【讨论】:

  • 当出于安全考虑避免将 Apache 服务器作为 root 运行时,在我看来,通过 sudo 让 apache 无限制地访问该框不是一个非常安全的解决方案?
  • 好吧,这是一件愚蠢的事情,尽管它在技术上是可行的。 @symcbean 有一个更安全的答案。
猜你喜欢
  • 2021-08-19
  • 2014-01-20
  • 2014-12-17
  • 2015-10-19
  • 1970-01-01
  • 2015-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多