Credentials(Rails5.2新) 很基础的知识点,具体还要实操。

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被遗弃了,转而介绍使用证书原则。

不过你仍不得不储存某个编码🔑在你的服务器端和所有其他开发系统上。所有其他的secrets/credentials被使用key来编码,能够安全的储存在你的代码仓库code repository。

 

Credentials在开发和产品环境下都是相同的identical(exactly the same) 

 

encrypt 和 decrypt 编码和解码

 


Setup

 

在新的Railsapp中,新增文件config/master.key,里面的master key用于encrypt所有证书。 保存这个主key到你的团队密码管理系统中。

⚠️如果你丢失了这个key,没人能进入这个编码的证书了 

 

我建立的shop app的证书key(超长啊):

O5yekV5F7hNpMxR2x11U9AIhIuRF0xqtinU8SVvlcmndupZbop

NIWHqcqIYKqbGwd2ujXxCLK+Pr4VNagAuLLD3N46MymhTFYT

cuN7XpnsLbmvIEJw0pZHD+dUnLBSfIk7KCo8Yp/rB5sTBI2K4y

+gLssT6FVGF9iCl/ytAdXzmul5fmH4neYCwEvpAUxgIx6iKpsG7

WGH6ejoexIAfLsuzZDaSDTdn6lPGAbZHuJ+FnV2ttxT1OPZOSr

L7fNKP8p1vl8HANylj7dV7/XPjLfZMZXmUTLvdDfkKhJB2oCqkv

0pxVueqUyrQMdvHtQFliJHww/gQn6uKr/Epa4djaJMS/Va4mks

s/C8pbru1bkSgWE1nTBl9a0MKV9me7e32jDjKLnQiGoytQmm

X/IGrbn9XZ63idmNxymod3--pSSSd2WLnqVJjh8T--DDzTzBG

Wp/NU/kN8qTF5zA== 

 


 

Editing Credentials 

 

在还没设置过环境变量EDITOR时可以设置

EDITOR=vim rails credentials:edit

development:
aws:
   access_key_id: 123
   secret_access_key: 345
# Used as the base secret for all MessageVerifiers in Rails, including the
one protecting cookies.
secret_key_base: 9846dad34a3168...68d634f

test: foobar


 

存取一个key。

 

  1. 进入rails console
  2. 使用:AppName::Application.credentials.name_of_the_credential 
例子: 

2.5.1 :004 > Shop::Application.credentials.test => nil

#因为我的程序里没有test证书,所以返回nil, 另外,app名字的第一个字母要大写。

 

 


 

使用证书在Product web Server

 

拷贝config/master.key到那个系统就行。 

 


 

 

 

 

 

posted @ 2018-06-11 15:59  Mr-chen  阅读(1204)  评论(0编辑  收藏  举报