Capistrano安全最佳实践

时间:2012-05-27 17:32:38

标签: ruby-on-rails security deployment capistrano

我工作的公司一直在使用capistrano进行Rails应用程序部署。我们为每个网络应用创建了app用户(例如foo_app),它们都属于没有密码sudo权限的webapp组:

%webapp ALL=(ALL) NOPASSWD: ALL

在我们的cap deploy.rb中,我们设置了一个ssh密钥对,允许capistrano以app用户身份ssh到服务器,并执行所有上限任务。

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,但这需要做很多工作才能让它们更新。

有什么想法吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

首先,您可能需要考虑限制nopasswd规则。我不确定您的部署的具体细节,但我通常创建一个专门用于部署的用户,并为他提供nopasswd规则用于在部署期间升级所需的命令 - 这通常会成为现实仅服务重启命令,也可能是特定的chown命令。如果您需要更多互动帮助,请在美国太平洋白天跳转#capistrano,我很乐意帮助您 - 本周末我很想念您。

受限制的nopasswd规则的示例,以防您需要引用:

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

结果规则集:

webapp@host:~$ sudo -ll
User torrancew may run the following commands on this host:

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

-torrancew