我工作的公司一直在使用 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,但要让它们保持更新需要做很多工作。
有任何想法吗?
谢谢!