動かざることバグの如し

殿、温めておいたバグがこちらでございます

Rails 5.2の新機能Credentialsでパスワード等を管理する

環境

要点

  • 今までのsecrets.yml および rails secrets:xxxx方法は非推奨
  • 今後は rails credentials:edit で秘匿情報の編集ができる
  • 暗号化されたファイルはconfig/credentials.yml.enc 複合キーはconfig/master.key
    • もちろん.gitignoreされているのでproduction環境では ENV["RAILS_MASTER_KEY"]Railsに渡す。
  • 秘匿情報の取得は Rails.application.secrets.xxxx ではなく、今後は Rails.application.credentials.xxxx

以下は詳細

非推奨になったencrypted secrets

rails 5.1ではパスワードやAPIキーなどの秘匿情報を今までのsecrets.ymlでの管理から暗号化されたファイルconfig/secrets.yml.encと複合キーconfig/secrets.yml.keyのセットでの管理方法になった。

が、なんとRails5.2では廃止 railsのCHANGELOG曰く、

This will eventually replace Rails.application.secrets and the encrypted secrets introduced in Rails 5.1.

わずか1バージョンの人生とか短すぎるでしょ。。。

実際に叩くと怒られる。

 $rails secrets:setup
Encrypted secrets is deprecated in favor of credentials. Run:
bin/rails credentials:help

悲しい

やり方

秘匿情報の追加/編集するには以下

rails credentials:edit

これで今までのsecrets.ymlのように編集できる。保存すると自動でconfig/credentials.yml.encが暗号化された形で更新される。

ここでは仮に以下のようにしたとする

my_api_key: hogehoge
secret_key_base: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

以下のように怒られたらMacの場合は~/.bash_profileとかに export EDITOR="vim"を追記してターミナルを開き直せばおk

$rails credentials:edit
No $EDITOR to open file in. Assign one like this:

EDITOR="mate --wait" bin/rails credentials:edit

For editors that fork and exit immediately, it's important to pass a wait flag,
otherwise the credentials will be saved immediately with no chance to edit.

ここでrails cすると実際にRailsから見れているか確認できる。先程セットしたhogehogeが取得できている。 Rails.application.secretsからRails.application.credentialsに変わっているので注意

$rails c
Running via Spring preloader in process 83264
Loading development environment (Rails 5.2.0.rc2)
[1] pry(main)> Rails.application.credentials.my_api_key
=> "hogehoge"

config/master.keyがあればRailsが自動でを見に行くようなので自分で環境変数をセットする必要はない

その他

5.1のencrypted secretsとの違い

x encrypted secrets(5.1) Credentials(5.2〜)
セットアップ方法 rails secrets:setup 特になし
編集 rails secrets:edit rails credentials:edit
表示 rails secrets:show rails credentials:show
使う Rails.application.secrets.xxxx Rails.application.credentials.xxxx
暗号化されたファイル config/secrets.yml.enc config/credentials.yml.enc
複合キー config/secrets.yml.key config/master.key

production環境にデプロイするときは

Capistranoでデプロイするときには先にshared/config/master.keyにmaster.keyをアップして

set :linked_files, fetch(:linked_files, []).push("config/master.key")

すればおk

環境ごとに秘匿情報を出し分けたい

現状できないっぽいので先人様のGemに頼るしかない

sinsoku.hatenablog.com

これでそろそろ落ち着いてほしい。。。