Posted at

credentials.yml.encでシークレットキーを管理


はじめに

Rails5.2からsecrets.ymlが廃止され、credentials.yml.encに統合されたことをメンターの方に教えて頂いたため、API Keyなどのシークレットキーをcredentials.yml.encにまとめた。

恥ずかしい話、今まではENV["hogehoge.key"]と書いてシークレットキーを~/.bash_profileにまとめていた。

もちろん、アプリごとにシークレットキーを管理したほうが良い(当たり前だが)ので、今回行ったcredentials.yml.encの設定に関する一連の流れを備忘録として残しておく。


編集方法

credentials.yml.encを開いてみると、


config/credentials.yml.enc

msb4Uzo8vfnzbP65VQ58Hmu4o5WzNDTVqv9EFRnR5.....


このように暗号化されて直接編集することはできない。

credential.yml.encを編集するにはbin/rails credentials:editを実行する。

エディタを指定する必要があるので、今回はコマンドでEDITOR="vi" bin/rails credentials:editと入力。

初期値は以下の通り。


Terminal

# aws:

# access_key_id: 123
# secret_access_key: 345

# Used as the base secret for all MessageVerifiers in Rails, including the one protecting cookies.
secret_key_base: o8vfnzbP65VQ58Hmu4o5WzNDTVqv9EFRnR5.....

AWS等各種サービスで発行されたシークレットキーをここに入力する。

変更が完了すると、再びcredential.yml.encが暗号化されキーの値が変わる。


読み取り方法

各種シークレットキーをアプリ内で読み取る場合、Rails.application.credentials.aws[:access_key_id]のように入力する。(以下コード参照)

尚、初期値はコメントアウトされているため、読み取る際には外しておくこと。


Terminal

aws:

access_key_id: 65VQ58Hmu4o5WzNDT...
#=> Rails.application.credentials.aws[:access_key_id]
secret_access_key: DTVqv9EFRnR...
#=> Rails.application.credentials.aws[:secret_access_key]

secret_key_base: 8be8e637d755f79c799048bed8be0c...
#=> Rails.application.credentials.secret_key_base


本番環境(Heroku)でのシークレットキーの読み取り

暗号化されているcredential.yml.encを読み取る際にはmaster.keyが必要となる。

しかし、master.keyはRails5.2において.gitignoreに標準指定されているため、そのままでは本番環境でcredential.yml.encを読み取ることはできない。

よってHerokuで読み取る際にはheroku config:set RAILS_MASTER_KEY=マスターキーの値をコマンドで入力しマスターキーの値を指定する。


config/environments/production.rb

config.require_master_key = true


上記のように設定することで、本番環境におけるマスターキーが指定されていない場合にエラー表示を出すことができる。

基本的にcredential.yml.encの用途は「本番環境での秘匿情報の管理」だが、各環境で別々に秘匿情報を管理するためのrails-env-credentialsというgemもあるらしい。


参考

Railsガイド セキュリティ10.1-独自のcredential

Rails5.2から追加された credentials.yml.enc のキホン