允许 Apache 以其他用户身份运行命令

允许 Apache 以其他用户身份运行命令

我有一个脚本,用于在用户的主目录中执行几个命令。这些文件归用户所有,Apache(www-data组)仅对它们具有读取权限。该脚本需要由 PHP 通过 按需执行exec(),并执行一些文件删除/解压操作,但由于 Apache 对目录没有写入权限,因此操作失败。

我尝试过sudoers像这样编辑该文件:

www-data ALL=(user) NOPASSWD: /bin/su user -c /home/user/bin/script.sh

但它提示我输入用户密码

我也尝试过

www-data ALL=(root) NOPASSWD: /usr/bin/sudo su user -c /home/user/bin/script.sh

但会提示输入www-data密码sudo

我如何才能让它在没有密码的情况下工作?

答案1

最后用这一行代码让它工作了:

www-data ALL=(ALL) NOPASSWD: /usr/bin/sudo -u user /home/user/bin/script.sh

因为我的脚本需要参数,所以我必须在行尾添加“shell 样式的通配符”:

www-data ALL=(ALL) NOPASSWD: /usr/bin/sudo -u user /home/user/bin/script.sh [[\:alpha\:]]*

这并不是我所寻找的,但它确实有效(即我的参数以字母开头,但实际上我希望表达式仅匹配字母数字字符、破折号和句点)。

我对 shell 通配符和 POSIX 字符类一点都不熟悉,我使用的基本上是从 sudoers 手册中复制粘贴的。任何知道如何将它们应用于此类问题的人,请留下您的评论!

答案2

为什么在 sudo 里面运行 su?(或者更糟的是,在 sudo 里面运行 sudo)

www-data ALL=(user) NOPASSWD: /bin/bash /home/user/bin/script.sh

这应该可行。

答案3

如果它不是脚本,您可以直接suid执行可执行文件,并设置组和权限,以便只有网络服务器可以执行它。

您还可以使用suExec(仅限 Apache)或CGIWrap(任何网络服务器)以其他用户身份运行 CGI。还有suPHP专门针对 Apache 上非 CGI 模式下的 PHP。

它们提供略有不同的选项(例如,CGIwrap 可以设置资源限制),但一般来说,它们会以备用用户的身份运行程序。

答案4

我对此采取了不同的方法,允许 apache 用户对指定用户进行 sudo,然后该用户可以运行所有命令(或者如果您只需要一个或几个命令,则可以指定一个列表。

APACHEUSER        ALL=(USERNAME)        ALL
Defaults:APACHEUSER       targetpw
Defaults:APACHEUSER             !requiretty

这允许使用以下代码(例如从数据库读取)发送密码:

echo password | sudo -u username -S bash -c command_here arguments_here

只需确保您为此使用专用用户,并且不要将该用户放在 wheel 组中。

也可以看看这里

吉尔特

相关内容