Linux

文件執行腳本中的visudo權限

  • May 10, 2021

我正在嘗試通過 php 執行 shell 腳本,但出現權限錯誤,但是我正在嘗試向我的 www-data 使用者添加權限,以便在沒有密碼的情況下使用 sudo 命令,但它不起作用,我沒有不知道我是否報告了任何錯誤。以下是我的“visudo”文件的編輯方式。

www-data ALL=(ALL) NOPASSWD:/var/www/mysite/classes/builder-sites-nginx.sh
www-data ALL=(ALL) NOPASSWD:/var/www/mysite/classes/MyClassToCallScript.php

我的程式碼 PHP 是:

$command = "sudo sh ".dirname(__FILE__)."/builder-sites-nginx.sh {$domain}";
// dump($command);
$response = shell_exec($command);

我的程式碼外殼:

#!/bin/bash

FILE_FROM=/etc/nginx/sites-available/sites-builders
FILE_TO=/etc/nginx/sites-enabled/"$1"

[ ! -d "$FILE_FROM" ] && mkdir -p "$FILE_FROM"

if test -f "$FILE_TO"; then
   echo "syntax is ok. $FILE_TO already exists"
else
       ln -s "$FILE_FROM/$1" /etc/nginx/sites-enabled/

       #check stats
       if nginx -t > /dev/null 2>&1; then
               echo "syntax is ok"
               service nginx reload
       else
               echo "syntax is not ok"
               rm "$FILE_TO"
       fi
fi

但我的回答是“空的”。我通過將以下摘錄添加到我的“visudo”中進行了測試

www-data ALL=(ALL) NOPASSWD:ALL

使用我上面提到的方法是可行的,但我相信我的網站的安全性會受到威脅,對嗎?為什麼我的 apache 使用者將具有 sudo 權限,如果有人放入一些惡意文件我會遇到麻煩,所以我回到我最初的問題,我在執行給定腳本時放置“visudo”路徑的方式是正確的?

您沒有執行sudo /var/www/mysite/classes/builder-sites-nginx.sh,您正在執行sudo sh /var/www/mysite/classes/builder-sites-nginx.sh- 並且sudo未配置為允許 www-data 執行sudo sh(也不應該 - 這將是一個巨大的安全漏洞,相當於www-data ALL=(ALL) NOPASSWD:ALL)。

使/var/www/mysite/classes/builder-sites-nginx.sh執行檔chmod +x,並確保它#!/bin/bash作為第一行(#!/bin/sh也可以工作,因為您的腳本不使用任何 bash-only 功能)。

然後將您的 PHP 程式碼修改為:

$command = "sudo ".dirname(__FILE__)."/builder-sites-nginx.sh {$domain}";

順便說一句,根據$domain定義的位置和方式(即,如果它來自使用者提供的數據),您可能需要使用 PHP 的escapeshellcmd()函式對其進行清理。

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