Sudo

無法使用 Debian 中的 www-data 使用者以 sudo 執行腳本

  • December 21, 2021

我在 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 的 process 命令在控制器的特定路由上觸發 python 腳本。我可以毫無問題地執行不需要 sudo 的命令,但我的腳本不想與 sudo 有任何關係。有沒有辦法允許www-data使用 sudo 權限“安全”執行特定腳本?

注意:這僅在本地網路上使用,不會接觸網際網路。並不是說這樣的風險會降低,但我想我至少會注意到這一點。

您可以授予特定使用者使用 sudo 執行特定命令的能力,該 sudoers 文件位於/etc/sudoers.d/.

您可以使用的格式是:

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

注意:您應該在 visudo 中進行所有編輯。

因此,如果您想授予 www-data 以nftroot 身份執行的權限,您可以創建/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,則語法是正確的。

引用自:https://unix.stackexchange.com/questions/683372