以程式方式寫入具有 root 權限的文件的最安全方法是什麼?
大型應用程序需要在某個特定時間對需要 root 權限的文件執行少量寫入操作。它不是真正的文件,而是作為文件暴露給 Linux 的硬體介面。
為了避免給整個應用程序授予 root 權限,我編寫了一個執行關鍵任務的 bash 腳本。例如,以下腳本將啟用硬體介面的埠 17 作為輸出:
echo "17" > /sys/class/gpio/export echo "out" > /sys/class/gpio/gpio17/direction
但是,由於
suid
我係統上的 bash 腳本被禁用,我想知道實現這一目標的最佳方法是什麼。
- 使用此處介紹的一些解決方法
sudo
從主應用程序呼叫腳本,並相應地編輯 sudoers 列表,以避免在呼叫腳本時需要密碼。將 sudo 權限授予echo
.- 只需編寫一個 C 程序,使用
fprintf
, 並將其設置為 suid root。對字元串和文件名進行硬編碼,並確保只有 root 可以編輯它。或者從文本文件中讀取字元串,同樣確保沒有人可以編輯該文件。- 其他一些我沒有想到的解決方案,比上面介紹的更安全或更簡單?
您無需授予
sudo
對echo
. 事實上,這是沒有意義的,因為例如使用sudo echo foo > bar
時,重定向是作為原始使用者完成的,而不是作為 root 使用者。使用 呼叫小腳本
sudo
,只允許NOPASSWD:
需要訪問該腳本的使用者訪問該腳本(以及任何其他類似腳本)。這始終是最好/最安全的使用方式
sudo
。將需要 root 權限的少量命令隔離到它們自己的單獨腳本中,並允許不受信任或部分受信任的使用者僅以 root 身份執行該腳本。小型
sudo
腳本不應該從使用者那裡獲取參數(或輸入)(即它呼叫的任何其他程序都應該有硬編碼的選項和參數),或者它應該非常小心地驗證它必須的任何參數/輸入從使用者那裡接受。在驗證過程中保持偏執——不要尋找“已知的壞”事物來排除,只允許“已知的好”事物,並在任何不匹配或錯誤或任何甚至遠端可疑的情況下中止。
驗證應盡可能早地在腳本中進行(最好在它以 root 身份執行任何其他操作之前)。
當我第一次寫這個答案時,我真的應該提到這一點,但如果你的腳本是一個 shell 腳本,它必須正確引用所有變數。以任何方式引用包含使用者提供的輸入的變數時要特別小心,但不要假設某些變數是安全的,QUOTE THEM ALL。
這包括可能由使用者控制的環境變數(例如
"$PATH"
,"$HOME"
等。在 CGI 腳本中"$USER"
肯定包括"$QUERY_STRING"
等)。"HTTP_USER_AGENT"
事實上,只是引用它們。如果您必須使用多個參數建構命令行,請使用數組來建構 args 列表並引用 -"${myarray[@]}"
。我是否經常說“引用它們”?記住它。做。