2009-10-24 131 views
3

我想要做的是使用'button_to'&朋友在Linux服務器上啓動不同的腳本。並不是所有的腳本都需要成爲root用戶,但有些腳本會運行「apt-get dist-upgrade」等。Ruby on Rails-如何以root身份運行bash腳本?

的PassengerDefaultUser設置爲www數據在apache2.conf

我已經嘗試從身邊小事做起喜歡寫文本文件控制器等運行腳本,只是讓我知道,我有Rails正確執行腳本。 (換句話說,我知道如何從控制器運行腳本)但我無法弄清楚如何運行需要root權限的腳本。任何人都可以帶領我?

關於安全性的說明:感謝所有針對黑客攻擊的警告。但是,您不需要放鬆任何睡眠,因爲A)Web應用程序無法從公共互聯網訪問,它只會在私人內部網上進行訪問,B)該應用程序受密碼保護,以及C)因爲用戶不會能夠提供自定義輸入,只能從將作爲變量傳遞給腳本的表單中進行選擇。但是,因爲我說這並不意味着我無視您的安全建議 - 我會在我的設計中非常仔細地考慮它們。

+1

我不知道該怎麼做,但要小心,一個錯誤可能會授予任何人訪問Web訪問權限。 – 2009-10-24 03:16:22

+0

我無法強調這一點:**當從自動化系統調用時,不要給Bash腳本根訪問權限** – EmFi 2009-10-24 07:32:41

+0

我希望你正在檢查表單輸入。即使你正在使用選擇框。沒有理由讓用戶無法用他們不期望的數據製作他們的POST請求。允許任何以root身份運行是非常危險的事情。它只需要一個好奇的用戶來連接你的系統。 – EmFi 2009-10-25 10:07:24

回答

6

您應該使用setuid位來實現沒有sudo的相同功能。但是你不應該運行Bash腳本。 Setuid比sudo更安全。使用sudo或setuid,您正在以root身份運行程序。但是隻有setuid(在某些語言的幫助下)提供了一些額外的安全措施。

本質上,您將使用臨時允許作爲所有者運行的腳本,而不是調用它們的用戶。 Ruby和Perl可以檢測腳本何時以與呼叫者不同的用戶身份運行,並執行安全措施來防止不安全呼叫。這被稱爲污染模式。 Bash不會在污染模式下運行。

污染模式基本上是通過聲明來自外部源的所有輸入在傳遞給系統調用時不安全以供使用。

設置起來:

使用chmod上要運行的4755,並設置腳本設置權限的所有者爲root:

$ chmod 4755 script.rb 
$ chown root script.rb 

然後只需運行腳本,你通常將。 setuid位踢入並運行腳本,就好像它是由root運行一樣。這是臨時提升權限的最安全方法。

請參閱Ruby的文檔safe levels and taint瞭解Ruby的衛生要求,以防止污染輸入造成傷害。或者通過perlsec faq瞭解在Perl中完成同樣的事情。

再次。如果您在自動化系統中以root身份運行腳本時遇到問題。 不要使用Bash!使用Ruby或Perl而不是Bash。污染模式迫使您認真對待安全問題,並避免許多不必要的問題。

相關問題