【问题标题】:Separate secret_key_base in Rails 5.2?在 Rails 5.2 中分离 secret_key_base?
【发布时间】:2018-04-11 18:35:16
【问题描述】:

我刚刚从 5.1 升级到 5.2,我对这种存储机密的“更好”方法感到很困惑...

也许我不明白,但现在开发和生产似乎已经“合并”成一个 SECRET_KEY_BASE 以及 master.key... 这是正确的吗?

如果没有,我如何在开发中使用单独的主密钥和SECRET_KEY_BASE

如果我有开发人员帮助我,但我不想让他们知道我在生产中使用的主密钥(或秘密)怎么办?

【问题讨论】:

  • 您可以(并且应该)通过 ENV var 提供 SECRET_KEY_BASE,这样它就不会检入源代码。在开发中,你可以使用任何你想要的 SECRET_KEY_BASE - 它只是用于签署 cookie 和 Devise 中的盐之类的东西。
  • 如果它删除了 productiondevelopment 细分以便我可以分别指定它们,我该怎么做?
  • 我实际上并没有尝试过 5.2,但以前您可以在秘密文件 <%= ENV.fetch("SECRET_BASE_KEY") %> 中使用 ERB 语法。您可以使用direnvdotenv 来减少设置环境变量的麻烦。如果你使用 docker,你可以通过容器设置 ENV 变量。
  • 如果您使用的是 ENV 变量,则不需要“单独的字段” - 只需在 heroku 仪表板中设置生产密钥,并在您正在开发的本地计算机上设置其他内容。这就是重点。 devcenter.heroku.com/articles/config-vars
  • 我实际上完全错了。 Rails 5.2+ 的秘密处理与加密的秘密文件一起使用,其中 RAILS_MASTER_KEY 包含加密密钥。这使得它与基于 ENV 的配置直接不一致。由于12factor.net/config 中列出的原因,我仍然不相信这是一种更好的方法

标签: ruby-on-rails ruby ruby-on-rails-5 ruby-on-rails-5.2


【解决方案1】:

Rails 5.2 改变了这一点。对于开发和测试环境,secret_key_base 是自动生成的,因此您可以将其从 secrets.yml 或您设置的任何位置删除。

至于生产,您可以通过运行rails credentials:edit 生成和编辑凭据文件。这还将在config/master.key 中创建主密钥,该密钥仅用于加密和解密此文件。将此添加到gitignore,这样它就不会与其他任何人共享,应该注意与其他开发人员共享。

如果所有这些听起来有点乏味,你可以忽略它并在 ENV 中提供 secret_key_base。在抱怨之前,Rails 会检查它是否存在于ENV["SECRET_KEY_BASE"] 中。

【讨论】:

  • 谢谢。开发密钥现在去哪儿了?看来这里有很多人不喜欢这种变化,也没有好地方放它们了……github.com/rails/rails/pull/30067
  • 是的,我一点也不喜欢这种变化。您仍然可以使用秘密,它们仍然像以前一样工作。
  • 秘密,我的意思是secrets.yml。仍然可以通过Rails.application.secrets访问它
  • FWIW,主要是为了未来的我,secret_key_base 在对象 Rails.application.secret_key_base 上可用,它将从多个来源中提取它,包括在开发和测试中自动生成的来源。 github.com/rails/rails/pull/30067/…
【解决方案2】:

secret_key_base有两种访问方式:

  1. Rails.application.credentials.secret_key_base
  2. Rails.application.secrets.secret_key_base

Rails 5 默认采用第一种方式。

您可以将Rails.application.credentials.secret_key_base 更改为rails credentials:edit。对于所有其他环境,请记住将环境变量RAILS_MASTER_KEY 设置为与config/master.key 相同的内容。 master.key 默认被 git 忽略。这种方式对所有环境使用相同的密钥。如果你想使用不同的键,你需要自己控制命名空间。

如果您更喜欢第二种方式Rails.application.secrets.secret_key_base。你需要创建config/secrets.yml:

development:
  secret_key_base: ...
test:
  secret_key_base: ...
production:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>

记得在生产环境中设置环境变量SECRET_KEY_BASE。 如果config/secrets.yml 文件足够机密,则将&lt;%= ENV["SECRET_KEY_BASE"] %&gt; 更改为纯文本即可。

rake secret 可以为您生成一个随机密钥。

我更喜欢第二种方式(旧方式),因为简单。

【讨论】:

  • 通过 Rails.application.secret_key_base 调用它,它会抓取正确的github.com/rails/rails/pull/30067/…
  • 我如何将rake secret 的结果放入 ENV["SECRET_KEY_BASE"] ?
  • 以用户身份登录并输入终端 this 'ECRET_KEY_BASE=xxxx' 'export SECRET_KEY_BASE'
【解决方案3】:

当我不想与我的朋友开发人员共享生产 master.key 时,我使用了这个 gem,我认为这与 OP 的目的完全相同。

https://github.com/sinsoku/rails-env-credentials

您可以为每个环境拥有一个主密钥,如下所示,因此您可以自行决定要与哪些开发人员/部署人员共享哪个密钥。

config/credentials-development.yml.enc
config/credentials-test.yml.enc
config/credentials.yml.enc
master-development.key
master-test.key
master.key

当您第一次运行类似以下内容时,将生成每个密钥:

rails env_credentials:edit -e development

如果您从一个 master.key 设置切换到此设置,您可能遇到的一个错误将与 config/database.yml 有关,Rails 会在其中尝试评估所有环境信息,无论您在哪个环境中。 (即使您将它们注释掉,Rails 仍会尝试评估 erb 部分。)

【讨论】:

  • @Filnor 更新了答案。
  • @Pcriulan 已更新。 (这有点糟糕,我不能用一条评论同时通知 2 个用户......)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-02
  • 2021-12-06
  • 2014-07-06
  • 2015-07-12
  • 2019-09-21
  • 2014-05-23
  • 2015-09-20
相关资源
最近更新 更多