Rails

【Rails5.2】秘匿情報を管理することができるcredentials.yml.encとmaster.keyの使い方について

Rails

 

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

Rails6で追加された、秘匿情報を環境毎に管理することができる仕組みMulti Environment Credentialsについては以下の記事を参考にしてください。
Rails
【Rails】秘匿情報を環境毎に管理することができるMulti Environment Credentialsについて初心者向けにまとめてみた今回は秘匿情報を環境毎に管理することができるMulti Environment Credentialsについて簡単にまとめたので紹介しています。付与されている権限によって閲覧できる情報を管理することができるため、権限の異なる複数人で開発する際にはもってこいの機能になります。...

Rails5.2での秘匿情報管理

credentials.yml.enc

Rails5.2では秘匿情報を管理する仕組みとして、credentials.yml.encmaster.keyが用いられています。

credentials.yml.encは秘匿情報の設定ファイル、master.keyがそのファイルを復号化(暗号化されたデータを読める状態に戻すこと)する際に用いられるキーになります。言い換えると、復号化の鍵であるmaster.keyがなければcredentials.yml.encのファイルを閲覧・編集することができません。

秘匿情報を管理する仕組みとして、Rails4.1ではsecrets.yml、Rails5.1ではsecrets.yml.encが生成されていました。これらについては今後扱うことがないため解説を省略します。

master.keyの取り扱いについて

先程、master.keyは秘匿情報の設定ファイルであるcredentials.yml.encを開くためのキーであると解説しました。

言い換えれば、master.keyを知っていれば秘匿情報のデータを閲覧することができてしまうということになります。そのため、master.keyは第三者や外部の人間に知られてはいけません。

間違ってもGithubやSNSといったオープンな場にmaster.keyの情報をアップロードしないよう注意しましょう。(チーム開発のような複数人での開発の場合は、master.keyはLINEやSlackといったプライベートな方法で送り合うようにしましょう)

master.keyはアプリケーションを新しく立ち上げた時(% rails newをした時)から.gitignoreに入っています。

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
Rails
【Rails】rails newでバージョン指定しても、それ以上のバージョンが入ってしまう場合の対処法「rails new」を実行する際にバージョンを指定しても、それ以上のバージョンが入ってしまう場合の対処法について解説しています。原因はGemfileにあるので、Railsのバージョン指定がうまくいかないといった時は、Gemfileの記述に着目してみてください。...

ファイル確認

作成されたアプリケーションを開き、今回の該当ファイルであるcredentials.yml.encとmaster.keyの場所を確認しておきましょう。

% tree .

# 今回と無関係なファイルは省略
├── config
│   ├── credentials.yml.enc
│   ├── master.key
config配下にcredentials.yml.encとmaster.keyが格納されています。

VSCodeの設定

今回はVisual Studio Code(通称VSCode)を使用したcredentials.yml.encの復号化を行っていきます。

まずはVSCodeを開き、command+shift+pを押してコマンドパレットを開きましょう。コマンドパレットにshellと入力し、「シェルコマンド: PATH内に’code’コマンドをインストールします」という項目をクリックします。

PATH内に’code’コマンドをインストールします

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

shell

参照: 【1分でわかる】シェルスクリプトとは?

credentials.yml.encの復号化

続いてcredentials.yml.encを復号化していきます。

credentials.yml.encの中身を確認すると、以下のようなランダムな文字列が記述されています。これは中身が暗号化され、ランダムな文字列に変換されているためです。

# credentials.yml.enc

rrqhKtnyI5+lil0A4fF21cTPxaJjFIlS16lVXfF59VE1rQTCknkw14

 

復号化した内容がVSCodeに表示されるよう、以下のコマンドを打ち込みます。

% EDITOR='code --wait' rails credentials:edit
VSCodeではなくvimエディタで開きたい場合は% EDITOR=vi bin/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
secret_key_baseとはCookieの暗号化に使用される値です。削除しないように注意しましょう。

秘匿情報の取得

次に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
Rails
【Rails】配列・ハッシュから安全に値を取り出すことができるdigメソッドについて配列とハッシュから安全に値を取り出すことができるdigメソッドについて紹介しています。配列では「Arrayオブジェクト[index]」のように、ハッシュからは「ハッシュオブジェクト[キー]」のようにも値を取得することができますが、digメソッドで取得する際の違いはあるのでしょうか。...

トラブルシューティング

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を削除し、% EDITOR='code --wait' rails credentials:editを打ち込むと、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のバージョンによって秘匿情報の管理する仕組みが異なるため、注意して設定するようにしましょう。