ruby-on-rails - Capistrano 安全最佳实践

标签 ruby-on-rails security deployment capistrano

我工作的公司一直在使用 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/

相关文章:

ruby-on-rails - 如何在 ruby​​ rxml 中转义分号

ruby-on-rails - 我不确定参数哈希

c# - 支持 JWT key 轮换的 Bearer Token Authentication 的 Owin 中间件

django - 使用 Nginx 作为服务部署 Django

java - 警告无法激活请求的配置文件 "projectname",因为它不存在

Java:HTTP Post 在 Ruby on Rails 应用程序中创建新的 “Ride”

ruby-on-rails - 在Rails Migrations中,为:limit整数指定的数字代表什么?

linux - 未修补的 Linux 内核漏洞

php - 保护 PHP 文件

Git:有两个不同的公共(public)和部署代码存储库