无法在 Debian 中使用 www-data 用户以 sudo 身份运行脚本

无法在 Debian 中使用 www-data 用户以 sudo 身份运行脚本

我正在 Raspberry Pi(最新发行版 CLI)上设置一个强制门户,我的 Web 应用程序将根据登录者更改 NFTables 规则。我设置了 LEMP 堆栈;以 Laravel 8 作为 PHP 框架。

Nginx/php 用户是www-data,该用户有一个 sudoers 文件设置www-data ALL=(ALL) NOPASSWD:/var/www/vportal.getvs.net/app/Python/vportal.py

ls -alpython 脚本如下:-rwxr-xr-x 1 pi www-data 765 Dec 21 11:19 vportal.py

在 Laravel 控制器代码中:

        $process = new Process(['python3','/var/www/vportal.getvs.net/app/Python/vportal.py']);
        $process->run(); // executes after the command finishes

        if (!$process->isSuccessful()) {
            throw new ProcessFailedException($process);
         }
         echo $process->getOutput();

Python 脚本

import subprocess
#import os
#import pwd
#print(pwd.getpwuid(os.getuid()).pw_name)
subprocess.run("sudo nft add table nat", shell=True)
subprocess.run("sudo nft 'add chain nat postrouting { type nat hook postrouting priority 100; }'", shell=True)
subprocess.run("sudo nft add rule ip nat postrouting oifname \"wlan0\" masquerade", shell=True)
subprocess.run("sudo nft add table ip filter", shell=True)
subprocess.run("sudo nft 'add chain ip filter forward { type filter hook forward priority 0; policy accept; }'", shell=True)
subprocess.run("sudo nft add rule ip filter forward iifname \"wlan0\" oifname \"wlx000e3b337325\" ct state related,established  accept", shell=True)
subprocess.run("sudo nft add rule ip filter forward iifname \"wlx000e3b337325\" oifname \"wlan0\" accept", shell=True)

这个想法是让 Laravel 8 中的路由通过控制器在特定路由上的 Symfony 的处理命令来触发 python 脚本。我可以运行不需要 sudo 的命令而不会出现问题,但我的脚本不希望与 sudo 有任何关系。有没有办法允许www-data使用 sudo 权限“安全”运行特定脚本?

注意:这仅在本地网络上使用,不会接触互联网。并不是说这样的风险就小了,但我想我至少会注意到这一点。

答案1

您可以使用您放置在 .sudo 下的 sudoers 文件授予特定用户使用 sudo 运行特定命令的能力/etc/sudoers.d/

您可以使用的格式是:

user host=(who to run as) [Options] Command

注意:您应该在 visudo 中进行所有编辑。

因此,如果您想授予 www-data 以 root 身份运行所有内容的权限,您可以创建包含以下内容的nft文件:/etc/sudoers.d/www-data

www-data ALL = (root) nft

由于这是在脚本中,因此您可能不希望系统提示您输入密码。

在这种情况下,您需要添加 NOPASSWD: 选项:

www-data ALL = (root) NOPASSWD: nft

如果您只想允许nft add您可以执行以下操作:

www-data ALL = (root) NOPASSWD: nft add*

如果您希望允许 www-data 用户以 root 身份运行多个命令,您可以用逗号分隔这些命令:

www-data ALL = (root) NOPASSWD: nft, ls, cat

这将允许 www-data 无需密码即可 sudo nft 或 ls 或 cat。

注意:编辑 sudoers 文件时要小心。如果您的语法不正确,任何用户执行的任何 sudo 命令都会出错。

您可以用来visudo -c sudofile验证该文件。因此,对于我一直使用的示例文件visudo -c /etc/sudoers.d/www-data。如果该命令输出,www-data: parsed OK则语法正确。

答案2

你有一个重大安全缺陷在您的sudoers文件中,它允许您的 Web 用户使用 root 权限在系统上的任何位置运行任何 python 文件。考虑该文件是否包含连接bash到网络套接字的调用:

www-data ALL=(ALL) NOPASSWD:/var/www/vportal.getvs.net/app/Python/vportal.py, /usr/bin/python3

/usr/bin/python3尽快删除。

现在您已经完成了,让我们看看为什么需求失败了。您已允许特定脚本vportal.pysudo.但你永远不会用sudo;来调用它。相反,脚本本身中有几行执行sudo nft […],并且nft(正确地)不允许 www-data 以 root 身份运行。

通过从脚本内部删除sudo命令并使用sudo.哦,并确保该帐户不能写入脚本本身或任何父目录www-user

相关内容