【问题标题】:Capistrano security best practiceCapistrano 安全最佳实践
【发布时间】: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


    【解决方案1】:

    首先,您可能需要考虑稍微限制一下 nopasswd 规则。我不确定您的部署的具体细节,但我通常会创建一个专门用于部署的用户,并为他提供 nopasswd 规则 only 用于我在部署期间需要升级的命令 - 这通常会结束仅服务重启命令,也可能是特定的 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
    

    -torrancew

    【讨论】:

      猜你喜欢
      • 2010-09-28
      • 2013-06-19
      • 2014-01-17
      • 2011-01-26
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多