簡體   English   中英

通過PHP / Perl腳本運行命令作為Linux上的特權用戶

[英]Running commands though PHP/Perl scripts as a priviledged user on Linux

背景 :我正在為一家允許用戶通過Web界面創建FTP帳戶的公司編寫腳本。 在后台,腳本必須運行一堆命令:

  • 將用戶添加到系統(useradd)
  • 打開並編輯各種文件
  • 通過sendmail郵寄用戶

還有其他一些事情......

我基本上都在尋找最安全的方法。 我聽說過setuid方法,sudo方法,當然還有httpd作為特權用戶運行。 在執行任何命令之前,將對輸入的數據進行完整性檢查(即,只有用戶名中的字母數字字符)

流行腳本使用的方法是什么(例如webmin),因為它必須相當安全?

我會建立一個Web綁定腳本可以寫入的隊列。

然后,我將從該隊列中讀取一些特權進程並采取適當的操作。 您可以通過cron作業驅動命令行腳本,或者在PHP中編寫一個小守護程序來檢查隊列,並且比cron允許的更頻繁地完成工作。

這樣,唯一可以運行特權的代碼就是您的小工作腳本,並且您不需要為Web綁定腳本提供任何路徑來獲得必要但危險的特權。

創建一個接受命令行選項,驗證它並執行useradd的腳本。 使用NOLOGIN指令將httpd的用戶添加到sudoers文件中,JUST用於該進程。

這樣,您不必擔心編寫一個始終以root權限運行的守護程序,並且您的腳本也會立即返回。 如果您剛剛使用了setuid root腳本,則同一系統上的其他用戶可以執行您的腳本(除非您檢查了他們的真實用戶ID)。

我首先要說以root身份運行httpd是一個非常糟糕的主意。

最安全的方法是在Web服務器UI和效應器之間實現完全的權限分離 - 一種顯而易見的方法是以root身份運行服務器,只接受UI發送請求的本地連接(這是一種簡單的方法)是通過inetd / xinetd - 這意味着你不必擔心建立一個守護進程的所有復雜性。

您還需要UI和效應器之間的某種信任機制 - 共享秘密就足夠了 - 這樣系統上的其他程序就無法調用效應器。 使用依賴基於挑戰的身份驗證或非對稱加密的信任系統意味着您不再需要擔心本地連接約束。

最后,您需要一個定義良好的協議,UI和效應器通過該協議進行通信。

這比使用sudo復雜得多,但更安全(例如,sudo只允許用戶將特定文件作為不同的uid執行 - 您希望該文件包含正確的程序)。

Setuid有許多與sudo相同的缺點,增加了復雜性(在大多數情況下)如果它啟動另一個程序 - 那么它將作為原始uid。

HTH

C。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM