ポイント💡
とりあえずcredentials.yml.enc
の編集・書き方・読み取り方法を知りたい方はここだけをご覧になっていただければOKです。
credentials.yml.enc を 編集する📝
$ EDITOR="vi" bin/rails credentials:edit
credentials.yml.enc の 書き方 と 読み取り方法 📖
aws:
access_key_id: 123
#=> Rails.application.credentials.aws[:access_key_id]
secret_key_base: 8be8e637d755f79c799048bed8be0c...
#=> Rails.application.credentials.secret_key_base
secrets.yml はどこへ消えた? 🤔
Rails5.2では新規アプリを作成した時にconfig/secrets.yml
が生成されず、代わりにconfig/credentials.yml.enc
が生成されるようになりました。
credentials.yml.encの使い方について調べた内容を備忘録として投稿させていただきます。
credentials.yml.enc の編集方法 📝
ファイルを直接編集することはできない
credentials.yml.encの内容は暗号化されてるため、エディタなどで直接ファイルを開いて編集することはできません。
Q+GBLmbxagoirjyHWkJDdaMdg0cJR...
credentials.yml.encを編集するためにはrails credentials:edit
コマンドを実行します。
EDITORが未指定の場合は編集することができない
credentials.yml.encの編集には環境変数:EDITORに指定されてるエディタが利用されます。環境変数:EDITORが未設定の状態でrails credentials:edit
を実行した場合は以下のようなメッセージが表示されます。
$ 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.
EDITORを指定して編集する
vi
を利用してcredentials.yml.encを編集する場合は、環境変数:EDITORにviを指定してrails credentials:edit
コマンドを実行します。
$ EDITOR="vi" bin/rails credentials:edit
.bash_profileなどに環境変数:EDITORを指定しておけば、EDITOR="xxx"
の指定は不要になります。
# .bash_profileに環境変数 EDITOR を設定する
$ echo 'export EDITOR="vi"' >> ~/.bash_profile
$ source ~/.bash_profile
$ echo $EDITOR
#=> vi
$ bin/rails credentials:edit
# 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: 8be8e637d755f79c799048bed8be0c...
credentials.yml.enc の読み取り方法 📖
credentials.yml.encに設定した資格情報を取り出すにはRails.application.credentials.xxxを指定します。
aws:
access_key_id: 123
#=> Rails.application.credentials.aws[:access_key_id]
secret_access_key: 345
#=> Rails.application.credentials.aws[:secret_access_key]
secret_key_base: 8be8e637d755f79c799048bed8be0c...
#=> Rails.application.credentials.secret_key_base
例:rails consoleを利用したcredentials.yml.encの読み取り
$ rails c
irb(main):001:0> Rails.application.credentials.aws[:access_key_id]
=> 123
irb(main):002:0> Rails.application.credentials.aws[:secret_access_key]
=> 345
irb(main):003:0> Rails.application.credentials.secret_key_base
=> "8be8e637d755f79c799048bed8be0c..."
irb(main):004:0> exit
credentials.yml.enc の暗号化・復号 🔑
config/master.key
credentials.yml.enc
はmaster keyを利用して暗号化・復号されます。
デフォルトのmaster keyの値はconfig/master.key
に記載されてます。
cee513823adb2cda09b6c08b2b5508..
Rails5.2が生成する**.gitignore**では/config/master.key
が標準で指定されており、master keyがGitリポジトリに含まれないように配慮されてます。
# Ignore master key for decrypting credentials and more.
/config/master.key
/config/master.key
が存在しない状態でrails credentials:editコマンドを実行した場合、/config/master.key
が生成されます。
$ bin/rails credentials:edit
Adding config/master.key to store the master encryption key: 0c31e7f7da70866fe43d4f2cb93a56c2
Save this in a password manager your team can access.
If you lose the key, no one, including you, can access anything encrypted with it.
create config/master.key
環境変数:RAILS_MASTER_KEY
/config/master.key
が共有できない環境ではmaster keyを環境変数:RAILS_MASTER_KEYで指定します。
/config/master.key
が存在せず、環境変数:RAILS_MASTER_KEYでmaster keyが設定されてない場合はcredentials.yml.enc内のデータは読み取れません。
$ rails c
irb(main):001:0> Rails.application.credentials.secret_key_base
=> nil
/config/master.key`が存在しなくても、環境変数:RAILS_MASTER_KEYでmaster keyを設定した場合はcredentials.yml.enc内のデータが読み取れるようになります。
$ export RAILS_MASTER_KEY="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
$ rails c
irb(main):001:0> Rails.application.credentials.secret_key_base
=> cee513823adb2cda09b6c08b2b5508..
config.require_master_key設定 ⚙️
本番環境ではmaster keyの指定漏れを防ぐためにconfig/environments/production.rb
でconfig.require_master_key = trueを有効化することが推奨されてるようです。
config.require_master_key = true
上記オプションが有効の場合、master keyが指定されてない状態でサーバ起動を実行しようとするとエラーが発生します。
$ rails s
=> Booting Puma
=> Rails 5.2.0 application starting in development
=> Run `rails server -h` for more startup options
Missing encryption key to decrypt file with. Ask your team for your master key and write it to /xxx/my-app/config/master.key or put it in the ENV['RAILS_MASTER_KEY'].
Exiting