2018-10-02 追記

Rails 5.2 以降では encrypted secrets は廃止された模様.代わりに credentials を使うようにとのこと.

https://github.com/rails/rails/blob/v5.2.0/activesupport/CHANGELOG.md

Add config/credentials.yml.enc to store production app secrets. Allows saving any authentication credentials for third party services directly in repo encrypted with config/master.key or ENV["RAILS_MASTER_KEY"]. This will eventually replace Rails.application.secrets and the encrypted secrets introduced in Rails 5.1.

概要

Ruby on Rails 5.1 Release Notes — Ruby on Rails Guides

2.5 Encrypted secrets Rails now allows management of application secrets in a secure way, inspired by the sekrets gem.

config/secrets.yml の暗号化バージョン (config/secrets.yml.enc) を利用できるようになった.中身が暗号化されているため,認証情報のような秘匿したい情報でも遠慮なく git で管理できるようになった.運用では復号のための秘密鍵の管理にだけ気を配ればよい.

初期設定

bundle exec rails secrets:setup

ls -1 config/secrets.*
config/secrets.yml
config/secrets.yml.enc  # <- 暗号化された情報
config/secrets.yml.key  # <- 秘密鍵

暗号化

config/secrets.yml.enc を編集する場合は下記コマンドを実行する (vim で編集したい場合).

EDITOR=vim bundle exec rails secrets:edit

環境変数 EDITOR で指定したエディタで一時ファイルを編集できる.書き方は config/secrets.yml と変わらない.

# secrets.yml.enc.XXXXX

production:
  foo: bar

保存すると config/secrets.yml.enc が更新される.暗号化されているため,秘密鍵がなければ内容はわからない.

cat config/secrets.yml.enc
89VOBxN+FIc0zC/lX0eSPaxo3Simu3cHxBgl4YMl...

復号

以下の条件を満足していれば復号できる.

  • config/environments/{environment}.rb で config.read_encrypted_secrets = true を指定している
  • config/secrets.yml.key が存在する,もしくは環境変数 RAILS_MASTER_KEY に秘密鍵が設定されている

復号された値は Rails.application.secrets として参照できる.

RAILS_ENV=production bundle exec rails c
Running via Spring preloader in process 88666
Loading production environment (Rails 5.1.5)
>> Rails.application.secrets.foo
=> "bar"

秘密鍵の共有方法

要検討.例えば以下のような方法が考えられるか?

  • パスワードマネージャで共有 (LastPass など)
  • デプロイツールで秘密鍵配布 or 環境変数設定