【问题标题】:Missing production secret_key_base in railsrails 中缺少生产 secret_key_base
【发布时间】:2014-07-06 17:26:09
【问题描述】:

我最近部署了一个应用程序,但由于缺少生产 secret_key_base 而出现内部服务器错误。经过几个小时的测试,我设法用两种方法解决了这个问题:

方法一:

我使用rake secret 生成了一个新的secret_key,并在secrets.yml 中将其替换为<%= ENV["SECRET_KEY_BASE"] %>。再次部署该应用程序,这次它工作了。 但我认为这种方法是错误的。

方法二:

我用rake secret 生成了一个新的secret_key,并将它添加到environments/production.rb,就像config.secret_key_base = 'd1f4810e662acf46a33960e3aa5bd0************************,没有改变secrets.yml(默认是production: <%= ENV["SECRET_KEY_BASE"] %>)。再次部署该应用程序,它工作正常。

我的问题:

  1. 哪种方法最好?
  2. 如果第二种方法正确,为什么rails默认没有在production.rb中生成secret_key_base?
  3. 还有其他方法可以做到这一点吗?

【问题讨论】:

  • 方法 2 仍在我的服务器中工作。但是我需要运行bundle exec rake secret 命令而不是rake secret 来获取适当的密钥。

标签: ruby-on-rails deployment ruby-on-rails-4


【解决方案1】:

我终于找到了正确的方法。 所提到的方法都不是正确的。

正确方法:

我们自己应该生成一个密钥(通过rake secret),然后通过在命令提示符下运行以下命令为 SECRET_KEY_BASE 创建一个环境变量:

rhc set-env SECRET_KEY_BASE=3dc8b0885b3043c0e38aa2e1dc64******************** -a myapp

运行此命令后,通过 SSH 连接到您的服务器并运行 env,这样您应该会在列表中看到您的 SECRET_KEY_BASE。

现在重启你的应用rhc app-stop myapprhc app-start myapp,然后你就可以开始了。

【讨论】:

  • 这个rhc方法只有在openshift.redhat.com托管时才可用?
  • 您可以在其文档中为每个服务找到合适的方法。例如对于 heroku,您可以查看此页面:devcenter.heroku.com/articles/config-vars
  • 最终我在我的 VPS 上获取了一个秘密并将其放入我的 secrets.yml 文件中。
  • AWS Elastic Beanstalk 中的类似支持 - 您部署您的 rails 应用程序,然后在应用程序部署后使用 elastic beanstalk CLI 或 Web 控制台创建密钥
【解决方案2】:

如果您使用的是普通的 Ubuntu 机器,只需将 export SECRET_KEY_BASE=" <<< output from rake secret here >>> " 放入您的 ~/.bashrc

运行source ~/.bashrc 并重新启动应用程序。

【讨论】:

    【解决方案3】:

    还有一个更安全的选项,就是将它添加到 Apache/Nginx 配置文件中。我正在使用 Apache,并且刚刚使用过:

    SetEnv SECRET_KEY_BASE my_secret
    

    然后将 secrets.yml 文件设置为:

    production: <%= ENV["SECRET_KEY_BASE"] %>
    

    对于生产网络服务器,我不确定假设 .bashrc 文件正在运行并且会设置您的 ENV 变量是否有效,但我认为这种方式肯定可以设置它。我不是专家,所以准备好承担任何风险或原因,为什么这不是一个好主意向我指出。

    【讨论】:

      【解决方案4】:

      方法一是正确的。您不想将您的秘密存储在代码中。

      【讨论】:

      • 为什么不呢?它回答了所有 3 个问题:“我的问题:哪种方法最好?如果第二种方法是正确的,为什么 rails 默认不会在 production.rb 中生成 secret_key_base?还有其他方法吗?”除此之外,它还解释了原因。
      • 如果公共存储库中没有代码或者公共存储库中没有代码,则可以使用 gitignore 忽略它
      • 即使使用私有存储库,将生产机密存储在源代码控制中也是一种安全风险。只有生产运行时环境“需要知道”这些秘密,但是有了 VCS,现在在所有拥有 repo 签出/克隆的主机上都有额外的副本,包括开发箱、CI 主机等。这使得更难保护(甚至了解)生产机密的真实暴露面。
      猜你喜欢
      • 2015-07-12
      • 2017-06-02
      • 1970-01-01
      • 2016-03-29
      • 2016-01-12
      • 2014-06-23
      • 2016-11-05
      • 2014-06-04
      相关资源
      最近更新 更多