production.log

ピクスタ株式会社で開発部の部長をやっている星直史のブログです。

Rails5.2のcredential管理を試してみた

概要

blog.naoshihoshi.com こちらの機能を開発しているときに、Rails5.2からcredential管理が変更されたことに気づいたので、 今回はRails5.2のcredential管理の方法をざっくり説明しようと思います。

Rails5.2のcredential管理の方法のざっくりとした説明

Ruby on Rails 5.2 リリースノート | Rails ガイド

config/credentials.yml.encファイルが追加され、productionアプリの秘密情報(secret)をここに保存できるようになりました。これによって、外部サービスのあらゆる認証credentialを、config/master.keyファイルまたはRAILS_MASTER_KEY環境変数にあるキーで暗号化した形で直接リポジトリに保存できます。Rails.application.secretsやRails 5.1で導入された暗号化済み秘密情報は、最終的にこれによって置き換えられます。 さらに、Rails 5.2ではcredentialを支えるAPIが用意され、その他の暗号化済み設定/キー/ファイルも簡単に扱えます。 詳しくは、Rails セキュリティガイドを参照してください。

リリースノートのcredential管理の方法を引用しました。

ざっくり言うと、

  • config/master.keyに記述したキー情報でcredential情報を暗号化
  • 暗号化した情報はconfig/credentials.yml.encに書き込む
  • credential情報は普通に人間が読める感じで書ける
  • RailsアプリはRails.application.credentials.dig(:aws, :access_key_id)って感じで簡単に呼べる

って感じです!

使い方の説明

とはいえ、実際使ってみないとよくわからないので、試してみましょう。

$ cd rails_root
$ cat config/master.key
nirejgaks945n3ge9223gsgs
$ cat config/credentials.yml.enc
omtTwkcvAjuPb8CGkx8h2R9EzqMEsEND3cD7he7z7Pd3KKrAas3jrRGGnhDfdYQr

これが初期状態です。 では、続いて、credential情報を登録してみましょう。 登録はrailsコマンドで実行します。

初期状態はsecret_key_baseだけが登録されているのですが、AWSの認証情報を追加してみます。 下記コマンドを実行すると、エディタが開きます。

$ EDITOR=vim bin/rails credentials:edit
# Used as the base secret for all MessageVerifiers in Rails, including the one protecting cookies.
secret_key_base: kgJ3dPHLkTUwNTG3pM9kgJ3dPHLkTUwNTG3pM9k6M8RR4LrRJx7UeKYiebrcqCrh6LNX9GyYXACnqfcFb8Xk6M8RR4LrRJx7UeKYiebrcqCrh6LNX9GyYXACnqfcFb8X

aws:
  access_key_id: AKIAJBVIIRA9LRVFAPOK
  secret_access_key: wNTG3pLkTUX9GyYXM8RR4L7UeKYiebrcFb8Xd

そして、再びconfig/credentials.yml.encを確認すると、情報が追加されている == 値が変更されていることがわかるはずです。

$ cd rails_root
$ cat config/credentials.yml.enc
omtTwkcvAjuPb8CGkx8h2R9EzqMEsEND3cD7he7z7Pd3KKrAas3jrRGGnhDfdYQrwkcvAjuPb8CGkx8hkcvAjuPb8CGGnhDfdYQrwkcvAjuPb82R9EzqMEsEND3MEsEND3c9EzqMEsEND

最後に、Railsから呼び出すことができるか確認します。

$ cd rails_root
$ bin/rails c
irb(main):001:0> Rails.application.credentials.dig(:aws, :access_key_id)
=> "AKIAJBVIIRA9LRVFAPOK"

ばっちりですね!

まとめ

これまでは、.envファイルなどで環境変数を設定したりしていたので、管理が煩雑になっていました。 Rails5.2からは今回紹介したcredential管理の方法を使えば管理が楽になると思います。 今回紹介した通り、使い方もシンプルであるため、おすすめです。