Credentials(Rails5.2新) 很基础的知识点,具体还要实操。
Credentials(Rails5.2新)
- 增加config/credentials.yml.enc
- 憎加config/master.key
- 移除了5.1使用的
config/secrets.yml
,config/secrets.yml.enc
andSECRET_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.
- in heroku:
关于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。
- 进入rails console
- 使用: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到那个系统就行。