【发布时间】:2012-05-27 17:32:38
【问题描述】:
我工作的公司一直在使用 capistrano 进行 Rails 应用程序部署。我们为每个 web 应用创建了应用用户(例如 foo_app),它们都属于一个没有密码 sudo 权限的 webapp 组:
%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,但要让它们保持更新需要做很多工作。
有什么想法吗?
谢谢!
【问题讨论】:
标签: ruby-on-rails security deployment capistrano