我工作的公司一直在使用 capistrano 进行 Rails 应用程序部署。我们为每个Web应用程序创建了应用程序用户(例如foo_app),它们都属于没有密码sudo权限的webapp组:
%webapp ALL=(ALL) NOPASSWD: ALL
在我们的 cap deploy.rb 中,我们设置了一个 ssh key 对,以允许 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 使用应用程序特定用户来运行我的流程,例如 unicorn 、延迟作业等。
我已经使用了 :admin_runner, :runner 变量,但它们没有按我的预期工作。当启动 unicorn 、延迟作业等进程时,我可以将一些第 3 方食谱更改为 sudo 作为 foo_app。但是要保持它们更新需要做很多工作。
有什么想法吗?
谢谢!
最佳答案
首先,您可能需要考虑稍微限制一下 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
-托兰斯
关于ruby-on-rails - Capistrano 安全最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10775933/