Credentials(Rails5.2新)

  • 增加config/credentials.yml.enc
  • 憎加config/master.key
  • 移除了5.1使用的config/secrets.ymlconfig/secrets.yml.enc and SECRET_BASE_KEY

用于储存production app secrets。

它为第三方服务可以存储任何验证的证书,用一个在config/master.key文件中的key或者使用环境变量RAILS_MASTER_KEY在repository中编码。

最终会取代Rails.application.secrets,这个编码密码在5.1中介绍过。

Rails5.2opens API underlying Credentials,优先使用Credentials API,所以你可以容易的处理其他的编码配置和keys和文件。

具体指导见:http://guides.rubyonrails.org/security.html#custom-credentials

10.1 Custom credentials

Rails 生成了config/credentials.yml.enc来储存第三方证书(你的private credentials)在repository中。

这个文件被encrypted,所以只有拥有master key的人才能decrypt破解,然后读取它的信息。

另一个文件config/master.key替代了过去5.1版的RAILS_MASTER_KEY。它用于decrypt 你的credentials.yml.enc。

因此不要把master.key放入源码版本控制工具中(git),这个文件需要保密。确保.gitignore有它的名字。


Editing Credentials

5.2提供了编辑credentials.yml.enc文件的方法:

EDITOR=vim rails credentials:edit

#当然还可以使用其他编辑器,如图形编辑器atom,sublime等
EDITOR="atom --wait" rails credentials:edit #参数--wait,关闭窗口后自动保存文件。

它会打开vim编辑器,可看到被破解decrypted的文件版本。保存它,会通过master key再次封装它.

 ⭠ master± ⮀
rails credentials:edit
^CTraceback (most recent call last): 1 # aws:
2 # access_key_id: 123
3 # secret_access_key: 345
4
5 # Used as the base secret for all MessageVerifiers in Rails, including the one protecting cookies.
6 secret_key_base: 7f66e057c043776af52f734322f5c95173205fcab766b428d3ba5f851e018af0ab898294fcb4c252424e1da4517bc7ebdf736849f629cc31e93a9d1bf6cf83e3
~

当你运行credentials:edit命令,如果config/master.key和config/credentials.yml.enc不存在,Rails会创建它们。

默认,这个文件包含了secret_key_base。但是它也可以用于储存其他证书,如额外的APIs access keys.

进入控制台, rails console:

Rails.application.credentials.secret_key_base
=> "474cbd9eae46283de0dc93cf8b5c98072ef875ec14af17d487ecbf07f0d4630051e2a6d08fc5ed597be1edd06a2f47f10f538e4a318987d8b0324af21badde2d"

通过Rails.application.credentials来把证书增加到credenticals.yml.enc。如:

config/credentials.yml.enc:

secret_key_base:3b7cd727ee24e8444053437c36cc66c3

some_api_key: SOMEKEY

Rails.application.credentials.some_api_key在任意环境可以返回 SOMEKEY

如果希望当some key是blank时,升起一个例外exception。添加叹号❕:

Rails.application.credentials.some_api_key!

# =》raises KeyError: :some_api_key is blank


Credentials & Environments

The Rails team is proposing to remove the environment scopes inside config/credentials.yml.enc.

意思是默认,不区分是development, test还是production环境。

但你可以自己为你的secrest在不同的环境,添加namespaces .如:

development:
aws:
access_key_id: 123
secret_access_key: 345
secret_key_base: 2fdea1259c6660852864f9726616df64c8cd
production:
aws:
access_key_id: 321
secret_access_key: 543
secret_key_base: hu23ih41iu23h4123u4h23iu4h2323j412i3

Deploy master key

当你把代码移动到server,确保credentials.yml.enc文件可以被破解decrypted。

所以你需要提供master key。

有2种方法:

  • 方法1: 把master key放入server。 把这个文件的符号链接放入一个共享的文件夹shared folder.
  • 方法2: 创建 a RAILS_MASTER_KEY ENV variable。Rails会侦测它并使用它作为master key:
    • in heroku: heroku config:set RAILS_MASTER_KEY=<your-master-key-here>.
    • 这是老方法,推荐用方法1.

关于Upgrading from old Rails:

见文档或者这篇文章


本书的案例: Credentials

5.1介绍的密码原则,在5.2被遗弃了,转而介绍使用证书原则。

不过你仍不得不储存某个编码

05-11 22:52