2012-05-27 171 views
2

我工作的公司一直在使用Capistrano進行Rails應用程序部署。我們爲每個Web應用程序創建的應用程序用戶(例如foo_app),並且它們都屬於web應用程序組,沒有密碼sudo的特權:Capistrano安全最佳實踐

%webapp ALL=(ALL) NOPASSWD: ALL 

在我們蓋deploy.rb我們設置一個SSH密鑰對允許Capistrano的以應用程序用戶的身份登錄服務器並執行所有上限任務。

set :ssh_options, {:username=>'foo_app', :keys => File.join(ENV['HOME'],'.ssh', 'id_rsa_deploy')} 

它運作良好,但我覺得有點不舒服有NOPASSWD sudoer運行我的應用程序的過程中,如果應用程序被攻破,攻擊者可以很容易地接管整個服務器。

我的問題是,有沒有辦法讓不同的用戶運行我的應用程序,最好沒有sudo權限?理想我想有一個單獨的「部署」用戶做所有Capistrano的遠程任務:

set :ssh_options, {:username=>'deploy', :keys => File.join(ENV['HOME'],'.ssh', 'id_rsa_deploy')} 

,但我希望有Capistrano的使用應用程序特定的用戶運行我的程序像麒麟,耽誤工作等

我玩過:admin_runner,:runner變量,但它們不像我預期的那樣工作。我可以在啓動像獨角獸,延遲工作等流程時將某些第三方食譜更改爲sudo作爲foo_app,但這樣做可以讓他們更新。

任何想法?

謝謝!

回答

2

首先,您可能需要考慮限制該nopasswd規則。我不確定部署的具體細節,但我通常會創建一個專門用於部署的用戶,併爲他在部署期間需要升級的命令授予他nopasswd規則 - 這通常只會成爲服務重新啓動命令,可能還有特定的chown命令。如果您需要更多互動幫助,請在美國太平洋白天跳#capistrano,我很樂意嘗試幫助您 - 本週末我只是想念您。

受限NOPASSWD規則的實施例,以便在需要的引用:

webapp ALL=(root) NOPASSWD:/usr/sbin/sv restart myservice 

所得規則集:

[email protected]:~$ sudo -ll 
User torrancew may run the following commands on this host: 

Sudoers entry: 
    RunAsUsers: root 
    Commands: 
     NOPASSWD: /usr/bin/sv restart myservice 

-torrancew