Shell

以root使用者身份從php執行shell腳本?

  • May 13, 2016

需要從 PHP 執行以下行:

$res = shell_exec(‘sudo sh /home/nicklas/cronjobs/make_account.sh 使用者名密碼’);

問題是執行時沒有任何反應。如果我嘗試回顯 $res 它會出現空白。我也嘗試過使用 system(),結果相同。我猜它不起作用,因為我需要以 root 訪問權限執行腳本,而 www-data 使用者預設情況下沒有。我將以下行添加到 /etc/sudoers 以希望獲得訪問權限:

www-data ALL=(ALL:ALL) NOPASSWD: /home/nicklas/cronjobs/make_account.sh

但沒有成功。我已經嘗試在兩者之間重新啟動apache,並沒有改變任何東西。

我錯過了什麼嗎?

出於安全原因,您永遠不應該嘗試使用使用者 www-data 執行比其自然擁有的更多權限的操作。前段時間將 Apache 訪問權限移至 www-data 是有原因的。如果您需要以 root 身份在您的機器上做某事——更改密碼或創建帳戶就是這“某事”——您應該建構一個界面。讓 php-script 在某處放置一些東西,並通過從 root 執行的腳本掃描它並在那里處理它。您可以創建一個包含使用者的文件以添加到 www-data 可以訪問的目錄中,然後每 5 分鐘(或更短時間)通過 root-cronjob 執行此操作,並將文件移動到帶有時間戳的完成文件夾以進行控制關於正在發生的事情。

我強烈反對從 Web 伺服器執行具有更高權限的東西總是一個壞主意。

Web 應用程序的安全問題來自對使用者提供的數據的信任,而不是來自使用該數據的確切過程。

換句話說,如果您不驗證和清理數據,那麼通過命名管道將其傳遞給根擁有的程序並不比編寫包裝腳本來處理該數據並允許 www-data 使用者更安全通過 sudo 執行它。

實際上,數據的大部分處理/驗證/清理應該在數據傳遞給 sudo 腳本之前完成,這應該 a) 對數據進行最終檢查,並且 b)執行需要更高權限的操作。

事實上,我認為後者可能更安全,因為它是一個更簡單的解決方案,更容易理解……你做的事情越複雜,你犯錯誤的可能性就越大。

無論您使用哪種方法(命名管道、sudo 包裝器或其他方法),關鍵是您檢查使用者提供的數據並確保它符合非常嚴格定義的標準,然後再對其進行任何操作。

網路上有許多關於 CGI 安全性的文章和操作指南,包括 stackexchange 網站上的幾篇,但其中一些常見的主題是:

  • 在您檢查和/或修改數據以使其安全之前,將數據視為“受污染”且不可信。
  • 檢查數據 - 例如測試它是否匹配允許或禁止字元的正則表達式。最安全的選擇是在有任何異常時中止,否則使用正則表達式或其他東西對其進行轉換以刪除潛在的不安全元素。
  • 如果將數據傳遞給外部 shell 腳本,請**始終引用數據。**例如,shell 腳本應該在變數周圍使用雙引號。
  • 同樣,在將數據插入數據庫時,您應該使用支持佔位符值的數據庫庫,而不是依賴轉義或引用。是一個幽默的解釋。

我可以繼續,但這裡的答案有太多要總結的了——CGI 安全是一個廣泛的話題。嘗試Google搜尋CGI 安全驗證 CGI 輸入


以你的“我不在乎,因為只有我在使用它”的安全態度,我覺得我給了你一把上膛的霰彈槍來炸掉你的腳,但在腳上開槍是一次寶貴的學習經驗. 這是一個創建使用者帳戶的簡單腳本。它需要root權限。

該腳本依賴於 adduser,它可用於 debian 和 debian 派生系統以及其他系統。如果它不在您的系統上,則修改為使用 useradd 。

#! /bin/bash 

# make the script abort on any error
set -e

U="$1"
P="$2"

[ -z "$U" ] && echo "Error: No username provided" >&2 && exit 1
[ -z "$P" ] && echo "Error: No password provided" >&2 && exit 1

# simple check - only allow lower-case letters and digits in usernames.
[ "$U" !~ '^[a-z0-9]*$' ] && echo "Error: Invalid Username" >&2 && exit 1

# create user if they don't already exist
if ! getent passwd "$U" > /dev/null ; then

  # create the user using adduser, must provide the gecos field 
  # and disable the password so adduser doesn't ask for them. 
  adduser --gecos "$U" --disabled-password "$U"

  # now change the password
  echo "$U:$P" | chpasswd
else
   echo "Error: Username already exists" >&2
   exit 1
fi

將腳本保存在某處,並使用 chmod 使其可執行。

要允許 www-data 在沒有密碼的情況下以 root 身份執行,請編輯 /etc/sudoersvisudo並添加以下內容:

Cmnd_Alias APACHEADDUSER = /path/to/makeaccount.sh

www-data ALL = NOPASSWD: APACHEADDUSER

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