2010-05-12 81 views
7

背景:我正在爲允許用戶通過Web界面創建FTP帳戶的公司編寫腳本。在此背景下,腳本必須運行一串命令:通過PHP/Perl腳本在Linux上作爲特權用戶運行命令

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

和其他一些東西...

我基本上是尋找最安全的這樣做的方式。我聽說過setuid方法,sudo方法,當然還有,運行httpd作爲priviledged用戶。在執行任何命令之前,將對輸入的數據進行健全性檢查(即,僅用戶名中的字母數字字符)

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

回答

5

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

然後我會從該隊列中讀取一些特權進程並採取適當的措施。你可以通過cron作業來驅動一個命令行腳本,或者在PHP中編寫一個守護進程來檢查隊列,並且比cron允許的更頻繁地執行工作。

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

+0

與此唯一的問題是:1)我需要立即創建帳戶,我不能等待cron的......這將導致2)我不想每分鐘運行一次cron,不會給服務器帶來很大的壓力嗎? – jtd 2010-05-12 20:45:05

+0

這就是爲什麼另一種選擇是編寫監視隊列並立即執行操作的守護進程(後臺進程)的原因。只要你沒有使用共享主機(這聽起來像你不是,如果你添加用戶),這可能是可行的。 – 2010-05-12 21:01:39

+0

對,有很多方法可以去做。如果可以等待一分鐘,每分鐘cron都可以。它不會對服務器造成任何可觀的負載 - 大部分時間,它只會看到隊列是空的並退出。我可能會寫一個守護進程,每隔一秒鐘檢查隊列。出於您的目的,單進程,非線程守護進程就足夠了。唯一的缺點是你現在需要確保守護進程總是運行 - 但這很容易解決。 – timdev 2010-05-12 21:06:01

2

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

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

0

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

最安全的方式來做到這一點是有Web服務器UI與效應之間的完全權限分離 - 這樣做的一個顯而易見的方法是運行一個服務器作爲根接受本地連接僅在UI發送其請求(一個簡單的方法是通過inetd/xinetd - 這意味着您不必擔心建立守護進程的所有複雜問題)。

您還需要UI和效果器之間的某種信任機制 - 共享祕密就足夠了 - 這樣系統上的其他程序就不能調用效果器。使用依賴基於挑戰的授權或非對稱加密的信任系統意味着您不再需要擔心本地連接限制。

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

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

設置uid有很多相同的缺點與增加的併發症,(在大多數情況下),如果它開始另一個程序使用sudo的 - 那麼它也會這樣做原來的UID。

HTH

C.