credentials.yml.enc / master.keyとは何か
Rails 5.2 ~ からはsecret.ymlが廃止され、credentials.yml.enc / master.keyが導入されました。credentials.ymlはmaster.keyによって暗号化、復号化されます。secret.ymlは暗号化されておりませんでしたので、セキュリティ的にはより強固なものとなったようです。
特徴
- Rails 5.2 ~
- credentials.yml.encはmaster.keyとペアであり、master.keyによって暗号化されている。
- credentials.yml.enc, master.key共にデフォルトでgitignoreに追加されている。
編集及び取得方法
編集方法
$ cd [アプリケーションのディレクトリ]
$ sudo EDITOR=vim bin/rails credentials:edit
初めてこのコマンドを叩くとcredentials.yml.encとmaster.keyのペアが自動生成されます。
編集コマンドを叩いて次のような画面が出てきたらOK
# 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: *******************************************************
ここにAWSやその他のサービスを使う際に必要となるaccess_key_id, secret_access_keyの情報を入力する。
aws:
access_key_id: ***
secret_access_key: ***
# Used as the base secret for all MessageVerifiers in Rails, including the one protecting cookies.
secret_key_base: *******************************************************
##取得方法
credentials.yml.encに書き込んだ情報はmaster.keyによって復号化され取得されます。その際の取り出し方について。
Rails.application.credentials.***
例 AWSの場合
Rails.application.credentials.aws[:access_key_id] # アクセスキーID
Rails.application.credentials.aws[:secret_access_key] # シークレットアクセスキー
##実際に取得できるか試してみる
credentials.yml.encに入力した情報の取得が成功しているかを判定する際に非常に便利なコマンドがあります。
$ rails c
$ [1] pry(main) > Rails.application.credentials.aws
$ => { :access_key_id=>"123", :secret_access_key=>"456" }
このように表示されていればOK!
チーム開発におけるcredentials.yml.encとmaster.keyの扱いについて
チーム開発においては、master.keyを信頼できる開発メンバーにファイル共有ソフト等を用いて共有します。credentials.yml.encは本番環境にデプロイしてもmaster.keyによって暗号化されているため問題ありません。
本番環境ではmaster.keyを絶対にアップロードしないで下さい。
##本番環境でのmaster.keyの値を取得方法
本番環境にはmaster.keyは当然アップロードすることは出来ません。代わりに環境変数に設定してcredentials.yml.encを復号化します。
$ cd ~ #本番環境
$ sudo vim /etc/environment #環境変数の設定
環境変数は必ず、RAILS_MASTER_KEYとして設定して下さい。
また、デフォルトでcredentials.yml.encはgitignoreに追加されてしまっているので、この記述をコメントアウトします。
.gitignore
# config/credentials.yml.enc
config/master.key #マスターキーは絶対にgit addしない。