用于生产环境的 Rails 5.2 加密凭证

Ara*_*ind 2 ruby ruby-on-rails gitlab-ci ruby-on-rails-5.1 ruby-on-rails-5.2

我已经创建了 5.2 版本的新 Rails 应用程序。Rails 5.2 引入了秘密的加密功能。

我已经在 devise.rb 文件中配置了密钥

config.secret_key = Rails.application.credentials[Rails.env.to_sym][:secret_key_base]

并为所有环境添加了 secret_key 的使用

EDITOR=vim rails 凭证:编辑

development:
 secret_key_base: absdss

test:
 secret_key_base: 123232

production:
 secret_key_base: 123456
Run Code Online (Sandbox Code Playgroud)

保存凭据后,我可以在本地的 rails 控制台中获取 secret_key

rails 控制台中的输出:

Running via Spring preloader in process 44308
Loading development environment (Rails 5.2.0)
2.5.1 :001 > Rails.application.credentials.development[:secret_key_base]
=>     "absdss" 
Run Code Online (Sandbox Code Playgroud)

凭据在生产服务器上不起作用,我们在 gitlab 中使用 CI/CD 进行部署阶段,当我运行

rails 数据库:创建数据库:迁移

我收到以下错误

> rails db:create db:migrate

 ---> Running in 1563453ddf2a

rails aborted!

NoMethodError: undefined method `[]' for nil:NilClass

/usr/src/app/config/initializers/devise.rb:12:in `block in <main>'

/usr/local/bundle/gems/devise-4.4.3/lib/devise.rb:307:in `setup'

/usr/src/app/config/initializers/devise.rb:5:in `<main>'

/usr/local/bundle/gems/bootsnap-1.3.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:50:in `load'
Run Code Online (Sandbox Code Playgroud)

现在的问题是如何将 RAILS_MASTER_KEY 设置为生产服务器?

pra*_*een 6

我分享几点可能对你有帮助

加密凭证与纯文本凭证或环境变量相比具有一些优势

Rails 5.1 引入了加密的秘密

配置/secrets.yml.key
配置/secrets.yml.enc

Rails 5.2 用加密凭证替换了这两个秘密

config/credentials.yml.enc
config/master.key

config/master.key 文件是在创建 rails 项目时创建的

加密密钥(master.key)被 git 忽略

生产中

配置/环境/production.rb

config.require_master_key = true
Run Code Online (Sandbox Code Playgroud)

没有密钥就无法解密您的凭据

管理密钥

一种。scp 或 sftp 文件

湾 如果您需要向开发人员提供密钥的副本,那么您可以使用密码管理器,因为它们使用加密。

C。我使用 last pass 来管理主密钥文件

用于加密凭证的密钥不同于密钥库。

master.key 上的密钥用于加密和解密所有凭据。它不会替换密钥库。

Rails 需要密钥库。如果要生成新的密钥基本运行,

bin/rails secret
Run Code Online (Sandbox Code Playgroud)

并通过运行 bin/rails credentials:edit 将其添加到您的凭证中。