今回はRails5.2で追加された秘匿情報を管理する仕組み、credentials.yml.encとmaster.keyの使い方について詳しく解説したいと思います。AWSキーやAPIキーといった秘匿情報を管理する仕組みはRails5.2以前からもありましたが、Rails5.2からはcredentials.yml.encでの管理に変更になりました。

Rails5.2での秘匿情報管理

Rails5.2では秘匿情報を管理する仕組みとして、credentials.yml.encとmaster.keyが用いられています。
credentials.yml.encは秘匿情報の設定ファイル、master.keyがそのファイルを復号化(暗号化されたデータを読める状態に戻すこと)する際に用いられるキーになります。言い換えると、復号化の鍵であるmaster.keyがなければcredentials.yml.encのファイルを閲覧・編集することができません。
master.keyの取り扱いについて
先程、master.keyは秘匿情報の設定ファイルであるcredentials.yml.encを開くためのキーであると解説しました。
言い換えれば、master.keyを知っていれば秘匿情報のデータを閲覧することができてしまうということになります。そのため、master.keyは第三者や外部の人間に知られてはいけません。
間違ってもGithubやSNSといったオープンな場にmaster.keyの情報をアップロードしないよう注意しましょう。(チーム開発のような複数人での開発の場合は、master.keyはLINEやSlackといったプライベートな方法で送り合うようにしましょう)
credentials.yml.encの設定方法
では実際に、credentials.yml.encに秘匿情報を設定する方法について見ていきます。
アプリケーションの立ち上げ
まずは以下のコマンドで新しくアプリケーションを立ち上げましょう。
% rails _5.2.6_ new credentials_app -d mysql --skip-bundle
- アプリケーション名: credentials_app
- Ruby: 2.6.5
- Rails: 5.2.6
- データベース: MySQL

ファイル確認
作成されたアプリケーションを開き、今回の該当ファイルであるcredentials.yml.encとmaster.keyの場所を確認しておきましょう。
% tree .
# 今回と無関係なファイルは省略
├── config
│ ├── credentials.yml.enc
│ ├── master.key
% tree .で階層構造出してくれるの、記事書く上で地味に役立つことに気づいた🧐
brew install treeだけでtreeコマンドが使えるようになったからインストールも楽。 pic.twitter.com/ldtCRL8UGu
— ちばよしはる (@6k1RQzGG8nxr9OC) January 31, 2022
VSCodeの設定
今回はVisual Studio Code(通称VSCode)を使用したcredentials.yml.encの復号化を行っていきます。
まずはVSCodeを開き、command+shift+p
を押してコマンドパレットを開きましょう。コマンドパレットにshell
と入力し、「シェルコマンド: PATH内に’code’コマンドをインストールします」という項目をクリックします。

shell
とは、ユーザーから送られてきたコマンドをカーネル(OS)に分かるように翻訳・実行してくれるものになります。またカーネル(OS)での処理結果も翻訳して返してくれます。

credentials.yml.encの復号化
続いてcredentials.yml.encを復号化していきます。
credentials.yml.encの中身を確認すると、以下のようなランダムな文字列が記述されています。これは中身が暗号化され、ランダムな文字列に変換されているためです。
# credentials.yml.enc
rrqhKtnyI5+lil0A4fF21cTPxaJjFIlS16lVXfF59VE1rQTCknkw14
復号化した内容がVSCodeに表示されるよう、以下のコマンドを打ち込みます。
% EDITOR='code --wait' rails credentials:edit
すると「これらのファイルの作成者を信頼しますか?」というモーダルがVSCode上に表示されるため「開く」を選択します。

「開く」を選択すると以下のような内容が表示されます。
これが復号化されたcredentials.yml.encの内容であり、ここに管理したい秘匿情報を記述していく形になります。
# credentials.yml.enc
# 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: 504adc997017c4243690f62d5afd34a91bfe4f0964ec7336236e2875a09360a489ed03ace13975bc2a49e0294e736e9e9925acb9025772e0a8bfd63ac763060e
秘匿情報の取得
次にcredentials.yml.encで管理されている秘匿情報を取得してみます。
以下のようにawsキーのコメントアウトを外し、ファイルを保存し閉じましょう。
# credentials.yml.enc
# 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: 504adc997017c4243690f62d5afd34a91bfe4f0964ec7336236e2875a09360a489ed03ace13975bc2a49e0294e736e9e9925acb9025772e0a8bfd63ac763060e
↓ コメントアウトを外す
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: 504adc997017c4243690f62d5afd34a91bfe4f0964ec7336236e2875a09360a489ed03ace13975bc2a49e0294e736e9e9925acb9025772e0a8bfd63ac763060e
ターミナルでコンソールを開き、access_key_idの中身を取得してみます。取得方法は以下のような方法があります。
% rails c
# 取得方法1
> Rails.application.credentials[:aws][:access_key_id]
=> 123
# 取得方法2
> Rails.application.credentials.aws[:access_key_id]
=> 123
# 取得方法3
Rails.application.credentials.dig(:aws, :access_key_id)
=> 123

トラブルシューティング
credentials.yml.encを閲覧・編集しようとすると、ActiveSupport::MessageEncryptor::InvalidMessage
というようなエラーが表示される場合があります。
% EDITOR='code --wait' rails credentials:edit
/Users/user_name/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/activesupport-5.2.6/lib/active_support/message_encryptor.rb:206:in `rescue in _decrypt': ActiveSupport::MessageEncryptor::InvalidMessage (ActiveSupport::MessageEncryptor::InvalidMessage)
これはmaster.keyがない、もしくはcredentials.yml.encとmaster.keyが一致しない事によるエラーになります。
複数人で開発している場合はmaster.keyを再度共有してもらう、1人で開発している場合はmaster.keyの再発行を行いましょう。
上記エラーを再現してみる
master.keyをメモ帳などに貼り付けておき、master.keyの中身を削除しましょう。
# config/master.key
# 中身を削除する。
続けてcredentials.yml.encを開くコマンドを入力します。すると、ActiveSupport::MessageEncryptor::InvalidMessage
というようなエラーが表示されるはずです。
% EDITOR='code --wait' rails credentials:edit
/Users/user_name/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/activesupport-5.2.6/lib/active_support/message_encryptor.rb:206:in `rescue in _decrypt': ActiveSupport::MessageEncryptor::InvalidMessage (ActiveSupport::MessageEncryptor::InvalidMessage)
先程メモ帳に残しておいたmaster.keyの記述を元に戻しましょう。
# config/master.key
ifheqofcq7134JIHU5131
すると、credentials.yml.encの閲覧・編集が可能になったはずです。
% EDITOR='code --wait' rails credentials:edit
# credentials.yml.encが復号化される
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: 504adc997017c4243690f62d5afd34a91bfe4f0964ec7336236e2875a09360a489ed03ace13975bc2a49e0294e736e9e9925acb9025772e0a8bfd63ac763060e
要点まとめ
- Rails5.2では秘匿情報を管理する仕組みとして、credentials.yml.encとmaster.keyが用いられている
- credentials.yml.encは秘匿情報の設定ファイル、master.keyがそのファイルを復号化(暗号されたデータを読める状態に戻すこと)する際に用いられるキーとなる
- Rails4.1ではsecrets.yml、Rails5.1ではsecrets.yml.encが秘匿情報を管理する仕組みとして用いられていた
- master.keyは第三者や外部の人間に知られてはいけない
- credentials.yml.encを編集するコマンドは
% EDITOR='code --wait' rails credentials:edit
となる - secret_key_baseとはCookieの暗号化に使用される値である
ActiveSupport::MessageEncryptor::InvalidMessage
はmaster.keyがない、もしくはcredentials.yml.encとmaster.keyが一致しない事によるエラーである
参考
今回はRails5.2で追加された秘匿情報を管理する仕組み、credentials.yml.encとmaster.keyの使い方について解説しました。Railsのバージョンによって秘匿情報の管理する仕組みが異なるため、注意して設定するようにしましょう。