Rails 5.2中如何分离secret_key_base?升级后的密钥存储疑问
我刚从Rails 5.1升到5.2的时候也对这套新的credentials系统摸不着头脑,咱们一个个解决你的疑问:
1. 是不是SECRET_KEY_BASE和master.key合并成同一个了?
完全不是哦!这俩是不同的东西:
SECRET_KEY_BASE:是Rails用来加密会话、签名cookie等核心功能的密钥,在5.1里是单独的环境变量或配置项;到了5.2,它默认被存放在加密的config/credentials.yml.enc文件里。master.key:是用来解密credentials.yml.enc这个加密文件的密钥——它本身不是业务用的密钥,只是解锁加密配置的钥匙。
简单说:master.key打开credentials.yml.enc,里面才包含SECRET_KEY_BASE(还有其他你想加密的配置,比如API密钥)。
2. 如何在开发环境用独立的master.key和SECRET_KEY_BASE?
Rails支持为不同环境单独配置credentials,这样开发和生产的密钥体系可以完全隔离:
生成开发环境专属的credentials:
在终端运行命令:rails credentials:edit --environment development这会自动创建:
config/credentials/development.yml.enc:加密的开发环境配置文件,你可以在里面写专属的secret_key_base和其他开发用密钥。config/credentials/development.key:解密这个开发配置文件的密钥,一定要把这个文件加入.gitignore,绝对不能提交到代码仓库。
使用开发环境credentials:
Rails在开发环境下会自动优先读取config/credentials/development.yml.enc(用对应的development.key解密),而不是全局的config/credentials.yml.enc。这样你的开发环境就有了独立的密钥体系,和生产环境完全分开。如果你不想用credentials系统,也可以直接在开发环境设置环境变量
SECRET_KEY_BASE,它会覆盖credentials里的值——这种方式对习惯旧版的开发者也友好。
3. 不让开发者知晓生产环境的master.key,该怎么做?
这是团队协作里的关键安全点,核心原则是生产环境的密钥绝对不能出现在代码仓库或开发者本地:
生产环境用环境变量替代master.key:
部署生产环境时,不要把master.key传到服务器,而是设置环境变量RAILS_MASTER_KEY,Rails会自动用这个环境变量的值来解密生产的credentials.yml.enc。另外,也可以直接设置SECRET_KEY_BASE环境变量,它会覆盖credentials里的对应值。开发者只需要开发环境的密钥:
每个开发者只需要自己生成的development.key(或者团队共享开发环境的development.yml.enc和development.key,但要通过安全渠道,比如密码管理工具),完全不需要接触生产环境的master.key或任何生产密钥。保护好生产的credentials.yml.enc:
虽然这个文件是加密的,但也要确保只有运维或部署人员能访问,不要随便共享。
内容的提问来源于stack exchange,提问作者Tallboy

