Rails

【Rails】「credentials.yml.enc」と「master.key」の使い方について詳しく解説!

Rails

 

今回は、Rails5.2以降で追加された「credentials.yml.enc」と「master.key」の使い方について解説したいと思います。テキストエディタはVScodeを用いて解説するので、その点だけ注意してください。

「credentials.yml.enc」と「master.key」について曖昧な方は、こちらの記事を参考にしましょう。

Rails
【Rails】Rails5.2以降で追加された「credentials.yml.enc」について簡単にまとめてみた!Rails5.2以降で追加された「credentials.yml.enc」について簡単に解説しています。Rails5.2以降では、新しくアプリを立ち上げた時に「config/secrets.yml」が生成されず、代わりに「config/credentials.yml.enc」が生成されます。master.keyとペアで覚えていきましょう。...

事前準備

まずは新しくアプリケーションを立ち上げましょう。

今回では、CredentialsTestという名前でアプリケーションを作成します。

$ rails new CredentialsTest

 

わかりやすいようにデスクトップに配置するのがいいかも。

ファイル場所

では、「credentials.yml.enc」と「master.key」の場所について確認しておきます。テキストエディタ(今回はVScode)で先ほど作成したCredentialsTestファイルを開き、configディレクトリ以下を見てみましょう。

credentials.yml.encとmaster.key

このように「credentials.yml.enc」と「master.key」はconfigディレクトリに格納されていることが分かりますね。

credentials.yml.encの設定

続いて「credentials.yml.enc」を編集してみましょう。

「credentials.yml.enc」の中身を見てみると、以下のようによく分からない記述が書いてあると思います。これは中身が暗号化されているためです。

↓ credentials.yml.enc

rrqhKtnyI5+lil0A4fF21cTPxaJjFIlS16lVXfF59VE1rQTC〜〜〜

 

 

「credentials.yml.enc」は特別なファイルで、中身が暗号化されているためこのまま編集することはできません。テキストエディタに「credentials.yml.enc」を編集できる設定を加えていきましょう。

テキストエディタを開き、「command+shift+p」を押してコマンドパレットを開きます。続いて「shell」と入力し、「PATH内に’code’コマンドをインストールします」という項目をクリックします。(下図)

shellコマンド

shellとは簡単に言うと、ユーザーから送られてきたコマンドをカーネル(OS)に分かるように翻訳してくれるものです。

分かりやすい図があったので、参考に載せておきます。

shell

参照:https://eng-entrance.com/linux-shellscript-what

 

それでは実際に、「credentials.yml.enc」を編集していきましょう。ターミナルで以下のコマンドを打ち込みます。

↓ ターミナル

$ EDITOR='code --wait' rails credentials:edit

 

すると、このように復号化された情報がテキストエディタに表示されると思います。

credentials.yml.encの中身

 

以下の記述のコメントアウトを外してみましょう。

# aws:
#   access_key_id: 123
#   secret_access_key: 345

↓コメントアウトを外す

aws:
  access_key_id: 123
  secret_access_key: 345

 

コメントアウトを外したら、ファイルを保存し閉じます。

ファイルを閉じないとターミナルで入力ができないので注意してください。

 

それでは今設定した「credentials.yml.enc」を呼び出してみましょう。ターミナルで「rails c」と打ち込み、コンソール画面を開きます。

↓ ターミナル

$ rails c

 

そのコンソール画面で、以下のコマンドを打ってみてください。すると、先ほど見たsecret_key_baseの中身が表示されるはずです。

↓ ターミナル

irb(main):001:0> Rails.application.credentials[:secret_key_base]

 

次に、以下のコマンドを打ち込んでみましょう。同じように、先ほど見たaccess_key_idの中身が表示されるはずです。

↓ ターミナル

irb(main):002:0> Rails.application.credentials[:aws][:access_key_id]

 

carrierwaveで設定する際は以下のような記述になるので覚えておきましょう。

CarrierWave.configure do |config|
  config.fog_credentials = {
    provider: 'AWS',
    aws_access_key_id: Rails.application.credentials[:aws][:access_key_id],
    aws_secret_access_key: Rails.application.credentials[:aws][:secret_access_key],
    region: 'ap-northeast-1'
  }
end

 

↓carrierwaveの設定についてはこちら

AWS
【AWS】ローカル環境の画像保存先をS3に変更する方法を1から解説!ローカル環境の画像保存先をS3に変更する方法を1から解説しています。環境変数の値を「secrets.yml」から読み込んで、さらにその内容を「carrierwave.rb」が読み込むという構造になっています。少し難しい構造ですが、1つ1つ進めていきましょう。...

master.keyの設定

では次に「master.key」について見ていきましょう。

「master.key」とは、暗号化された「credentials.yml.enc」の記述を復号化するための鍵のようなものです。

暗号化された文章を、読める形に戻すことを復号化と言うよ!

 

「master.key」をメモ帳などに貼り付けておいたら、試しに「master.key」の記述を消してみましょう。「master.key」の記述を消した後に、再びsecret_key_baseの中身を見てみます。

↓ ターミナル

$ rails c
irb(main):001:0> Rails.application.credentials[:secret_key_base]

 

すると、「ActiveSupport::MessageEncryptor::InvalidMessage 」というエラーが出て内容を参照できないことがわかります。(下図)

エラー画面

 

では、先ほどの「masster.key」を環境変数にセットしましょう。その後、以下のコマンドを打ち込んでください。

↓ ターミナル

$ export RAILS_MASTER_KEY=(先ほどコピーしたキー)

 

(先ほどコピーしたキー)のかっこは必要ないので、外して入力しましょう。

「master.key」として使用する環境変数名は必ず「RAILS_MASTER_KEY」にしなければなりません。

間違えると動作しないので注意しましょう。

master.keyの管理方法

「master.key」は、間違ってGithubなどパブリックな場所に送られてしまわないように、アプリケーションを新しく立ち上げた時から「.gitignore」に入っています。

この記述を間違って消さないように気をつけてください。

↓.gitignore

# 省略

# Ignore master key for decrypting credentials and more.
/config/master.key

 

また、チーム開発など複数人で1つのアプリケーションを管理するときは、「master.key」をLINEやSlackなどプライベートな方法で送り合う必要があります。

アプリケーションを立ち上げた人(rails newした人)は、「master.key」を同じチームメンバーに送ることを忘れないようにしましょう。

まとめ

  • 「credentials.yml.enc」と「master.key」はconfig以下に格納されている
  • 「credentials.yml.enc」を開くコマンドは「$ EDITOR=’code –wait’ rails credentials:edit」
  • 「master.key」は「credentials.yml.enc」を復号化するための鍵
  • 「master.key」はプライベートな方法で送る必要がある

 

 

今回は、Rails5.2以降で追加された「credentials.yml.enc」と「master.key」の使い方について解説しました。アプリケーションをデプロイする上で必須の知識なので、ぜひこの機会に覚えてくださいね。