2

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

%webapp ALL=(ALL) NOPASSWD: ALL

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

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变量,但它们没有按我预期的那样工作。在启动独角兽、延迟作业等进程时,我可以将一些第 3 方配方更改为 sudo as foo_app,但要让它们保持更新需要做很多工作。

有任何想法吗?

谢谢!

4

1 回答 1

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

-托伦斯

于 2012-05-28T03:32:25.413 回答