無法使用 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 -al
python腳本的以下內容:-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 以
nft
root 身份執行的權限,您可以創建/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
,則語法是正確的。