PHP 脚本需要使用 shell_exec() 运行 sudo 命令的权限

PHP 脚本需要使用 shell_exec() 运行 sudo 命令的权限

我有一个包含的 PHP 脚本shell_exec(),它执行的命令通常需要 sudo。我使用 visudo 编辑了 sudoers,使其包含以下内容:

www-data ALL = NOPASSWD: /var/root/node/npm/node_modules/less/
%users ALL = NOPASSWD: /var/root/node/npm/node_modules/less/

我认为两种方法都应该可行,但是为了确保万无一失,我选择了双重保险的方法。

我正在使用 vim 编辑 etc/sudoers,因此在添加这些行之后,我执行 :x,一切正常。我的 PHP 脚本按预期运行……大约 10-15 分钟。然后脚本停止工作。具体来说,停止shell_exec()工作。

如果我sudo visudo再次保存,我的新行仍然在那里。但只有当我再次保存时,脚本才会重新开始工作。

有人能告诉我为什么会发生这种情况吗?我有两个猜测不太好:

  1. 当我开始时会有某种宽限期,sudo visudo这允许我的脚本正常工作(但只能持续到它过期)。
  2. etc/sudoers 中的新数据保留在 sudoers.tmp(“锁定文件”)中...这些对我来说都不起作用。

编辑:

我认为我使用了错误的用户名...对于 MAMP 来说,apache 用户实际上是我的用户(而不是 www-data)。我知道这一点,因为我将其添加到我的 PHP 脚本中:echo = shell_exec("whoami");我的用户名显示为:Emerson。那么这是否意味着我应该将其添加Emerson ALL = NOPASSWD: /var/root/note/npm/node_modules/less/bin/lessc到我的 sudoers 文件中?

编辑:

我已经在我的 sudoers 文件中使用它了。Emerson ALL=(ALL) NOPASSWD: ALL它能工作,但我认为它不应该这样。除了一堆冗余之外,它也太宽容了。我把所有无用的东西都保留了下来,这样你就能看到我目前得到的结果。

#

# Host alias specification

# User alias specification

# Cmnd alias specification

# Defaults specification
Defaults        env_reset
Defaults        env_keep += "BLOCKSIZE"
Defaults        env_keep += "COLORFGBG COLORTERM"
Defaults        env_keep += "__CF_USER_TEXT_ENCODING"
Defaults        env_keep += "CHARSET LANG LANGUAGE LC_ALL LC_COLLATE LC_CTYPE"
Defaults        env_keep += "LC_MESSAGES LC_MONETARY LC_NUMERIC LC_TIME"
Defaults        env_keep += "LINES COLUMNS"
Defaults        env_keep += "LSCOLORS"
Defaults        env_keep += "SSH_AUTH_SOCK"
Defaults        env_keep += "TZ"
Defaults        env_keep += "DISPLAY XAUTHORIZATION XAUTHORITY"
Defaults        env_keep += "EDITOR VISUAL"
Defaults        !requiretty

# Runas alias specification

# User privilege specification
root    ALL=(ALL) ALL
%admin  ALL=(ALL) ALL
Emerson ALL=(ALL) NOPASSWD: ALL

# Uncomment to allow people in group wheel to run all commands
# %wheel        ALL=(ALL) ALL

# Same thing without a password
 %wheel ALL=(ALL) NOPASSWD: ALL

# Samples
# %users  ALL=/sbin/mount /cdrom,/sbin/umount /cdrom
# %users  localhost=/sbin/shutdown -h now

#Allow PHP to compile .less files
www-data ALL = NOPASSWD: /var/root/node/npm/node_modules/less/bin/lessc
%users ALL = NOPASSWD: /var/root/node/npm/node_modules/less/bin/lessc
Emerson ALL =(ALL) NOPASSWD: /var/root/node/npm/node_modules/less/bin/lessc
apache ALL =(ALL) NOPASSWD: /var/root/node/npm/node_modules/less/bin/lessc

答案1

您所建议的任何事情都不是这里的问题。

您的 sudoers 文件中是否有 requiretty 行?这可以解释为什么它对您有效,但对您的 PHP 脚本无效。删除它可以解决问题。

Sudo 可能已配置为缓存您的密码 15 分钟,请检查 sudoers 文件中是否有类似“Defaults timestamp_timeout = XXXX”的行。

一个建议是,考虑将 sudo 限制为仅需要的文件。如果攻击者设法将恶意文件放入您的 node_modules/less/ 目录中怎么办?

答案2

您应该为 Web 用户禁用 requiretty

以下是 /etc/sudoers 的语法

Defaults:username !requiretty

不要使用 vim 编辑 /etc/sudo,请使用 visudo 命令

答案3

您必须在 sudoers 文件中授权您想要允许提升权限的用户。如果您的 Web 服务器正在运行,Emerson那么

Emerson ALL = NOPASSWD: /var/root/note/npm/node_modules/less/bin/lessc

应该可以解决你的问题。

相关内容