概要
- Rails で秘匿情報を扱うための機能 (secrets.yml.enc / credential.yml.enc) は、直近の数バージョンでかなり動きがあり、情報が錯綜していたので、自分なりに整理してみました
歴史
Rails 5.1
- secrets 機能が実装された
- config/secrets.yml.env と
config/master.key
がペアになっている-
config/master.key
の代わりにRAILS_MASTER_KEY
環境変数でも OK
-
- config/secrets.yml.env と
Rails 5.2
- credentials 機能が実装された
- ほぼ secrets と同じ
- config/credentials.yml.enc と
config/master.key
がペアになっている-
config/master.key
の代わりにRAILS_MASTER_KEY
環境変数でも OK
-
- config/credentials/環境名.yml.enc を用意することもできるが、encrypted メソッド を使ってファイルをいちいち明示する必要があった
Rails 6.0
- credentials を
RAILS_ENV
から類推できるようになった- 例えば production 環境のとき:
- config/credentials/production.yml.enc があればそれをロード
- 無かったら config/credentials.yml.enc をロード
- 上記のように、フォールバックはあくまで yml 単位なので注意!
- ある項目が config/credentials/production.yml.enc に無かったら config/credentials.yml.enc を探索、ではない
- つまり環境間で共通の項目はすべての yml に重複して書く必要がある
- 例えば production 環境のとき:
- 鍵を環境ごとに用意できるようになった
- config/credentials/環境名.yml.enc と
config/環境名.key
がペアになっている - が、環境変数を使う場合は
RAILS_MASTER_KEY
だけしか使えないので注意!-
RAILS_環境名_KEY
のような環境変数を用意しても何も起きない - https://github.com/rails/rails/commit/d69b04de0ff33237209afea6f6cac3ab27934908#r30575065
-
- config/credentials/環境名.yml.enc と
どうしたらいいの
- 環境ごとに変わるものは環境変数で与えて、共通のものは config/credential.yml で与える、というのがいいのではないか
password: <%= ENV['DB_PASSWORD'] || Rails.application.secrets.database_password %>