【Rails】世界で一番わかりやすい!!「credentials.yml.enc」+「master.key」使い方徹底攻略!

目次

はじめに

credentials.yml」と「master.key」はRails5.2から追加された秘密情報を管理する仕組みです。

環境変数を使わずRails単体で秘密情報を管理できるため、ローカルの環境に依存しない大変便利な機能です!

秘密情報の管理

Webアプリケーションの作成に関してコード共有ツールを使うことが当たり前。

誰もがアクセスでき、プルリクなどを貰ったり、自分のコードをみてもらうことが当たり前なオープンソース時代。

しかし、自分の個人情報をさらけ出していると良からぬ人から攻撃され、個人情報が盗まれる悪用されたりいたずらされたりしてしまう世の中でもあります。

さめさん
さめさん

僕の知り合いのエンジニアは油断して生年月日をパスワードにしていたらブログがクラックされちゃったみたいだよ。

クマくん
クマくん

ええええ!

怖いなぁ・・・

大丈夫だったの?

さめさん
さめさん

ホームページが真っ黒になって、

トップページにクラックしてやったぜ!!!

って英語の画像が貼ってあったらしいよ。

クマくん
クマくん

うわぁ・・・

怖いなぁ・・・

さめさん
さめさん

やる方もやる方だけど、

自分の身は自分で守らないといけないね!

秘密情報とは、例えばAWSのアカウントだったり、データベースのパスワードなどです。

他にも決済機能を入れている場合だったらstripeやpaypalの秘密鍵や公開鍵がそれに値するでしょう。

これらをGithubなどのバージョン管理システムでPublic(公共的)にみられないようにしないと大変なことになります

Rails5.1まで

Railsではcredentials.ymlができるまで、上記のような秘密情報はサーバーの環境変数にセットして、 Railsで読み込んだりdotenvのようなGemで管理していました。

しかし、環境変数にセットする必要場合は、それぞれのローカル環境や本番環境毎にセットしなければいけません。

更新の手間・チーム開発での共有方法にコストがめちゃくちゃかかるのです

Rails5.2でcredentials.ymlが誕生

Rails5.2になりcredentials.ymlが使えるようになったことで、共有の手順が1つ減りました。

また、秘密情報が追加・変更・削除があった場合に、いちいちローカルの環境を更新せずGithubなどのバージョン管理システムからコードを同期するだけで追加・変更・削除が可能になったため、コストが激減しました。

クマくん
クマくん

どれが正しいのかわからなくなっちゃったりするから助かるなぁ。

さめさん
さめさん

文字を入力することも誤字脱字のエラーのリスクがあるからね。

それに初心者の人はコマンドラインでサーバーを操作すること自体にリスクがあるからなぁ。

クマくん
クマくん

環境変数を書き換えた後アプリを止めて、環境変数を読み込み直さなきゃいけなかったりして、エラーが出た時に解決するのが大変だもん・・・!

credentials.ymlの仕組み

入力された秘密情報の文字列をmaster.keyの文字列で暗号化し、credentials.yml.encという鍵を作成します。

credentials.yml.encとは?

公開鍵と呼ばれるものです。

イメージとして、credentials.yml.encは家の錠前です。

master.keyがないと情報を開示できないため、Githubなどへの公開が可能です!

master.keyとは?

秘密鍵を呼ばれるものです。

rails newコマンドでRailsアプリを作成した人がmaster.keyを持っています。

イメージとして、master.keyはシンプルに家の鍵そのものと考えてください。

家の鍵を道端に置いておかないように、Githubなどへ公開してはいけません。

チームメンバーと共有したい場合はLineやSlack、メールなどでチームメンバーだけに共有しましょう。

credentials.ymlの編集

credentials.ymlを編集にあたり、ポイントが2つあります。

  • credentials.yml.encの文字列を直接変更せず、コマンドを使ってテキストエディタで開きます。
  • ymlファイルのため、インデントに注意。

コマンドを使ってテキストエディタを開いてから編集するのは、credentials.yml.encは暗号化された文字列であるため、変更されてしまうと鍵そのものが変わってしまうためです。あくまで変更したいのは鍵を解錠した中身であるため、注意しましょう。

また、ymlファイルはインデントにとても厳しいです。ハッシュのなかでネストするためには改行してインデントを2つあけ記述する必要があります。

VScodeやターミナルに標準装備されているVimを使うことを想定し、

アプリのディレクトリにいる状態で、ターミナルに以下のコマンドを打ち込みます。

# VScodeで開く場合
$ EDITOR='code --wait' rails credentials:edit

# Vimで開く場合
$ EDITOR='vim' rails credentials:edit
クマくん
クマくん

Vimで開いたらよくわからなくなっちゃった〜。

どうしたらターミナルから出られるの?

さめさん
さめさん

あ、 Vimは操作が特殊だから説明が必要だったね汗

一旦esc(エスケープ)ボタンを押して、

:q!

って打ってみて。

Vimの操作が難しそうならVScodeをインストールしてVScodeで開こう!

そうすると以下のように表示されるかと思います。

※secret_key_baseはアプリごとに変わるので皆さん違う文字列が開かれると思います。

# 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: 8be4sevDaga6...............

必要に応じて変更しましょう。

※今回は適当にawsの公開鍵を秘密鍵を変更します。

aws:
  access_key_id: xxxxxxxxxxxxxxx
  secret_access_key: yyyyyyyyyyyyyyyyyy

# Used as the base secret for all MessageVerifiers in Rails, including the one protecting cookies.
secret_key_base: 8be8e637d755f79c799048bed8be0c...

変更後保存したらファイルを閉じてください。以下のように表示されたら暗号化できています。

New credentials encrypted and saved.

credentials.ymlを開いて呼び出す

実際にコードで呼び出すときには

$ Rails.application.credentials...

と記述して呼び出していきます。

コンソールで開いて具体的に確認してみましょう。

# Railsのコンソールを開く
$ rails c

# credentialsの解錠
# secret_key_base
$ Rails.application.credentials[:secret_key_base]

# credentialsの解錠
# awsの公開鍵
$ Rails.application.credentials[:aws][:access_key_id]

サンプルを作って確認してみよう

アプリを作成

まずは新しくアプリケーションを作成します。

SampleCredentialsという名前でアプリを作りたいので、以下のコードをターミナルで打ってみましょう。

$ rails new SampleCredentials

master.keyとcredentials.yml.encを確認

まずはmaster.keyとcredential.yml.encの生成場所を確認してみましょう。

どちらもconfigディレクトリの配下にそれぞれ

  • config/master.key
  • config/credentials.yml.enc

が存在します。

credentials.yml.encの編集

それではcredentials.yml.encを編集してみましょう!

前述したように、直接文字列を変更することはできないので、テキストエディタで開きます。

今回はVScodeで開いてみましょう。

# VScodeで開く場合
$ EDITOR='code --wait' rails credentials:edit

そうすると以下のように表示されるかと思います。

さめさん
さめさん

※secret_key_baseはアプリごとに変わるから、下の文字列と違うことだけ再度注意だよ!

# 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: 8be4sevDaga6...............

必要に応じて変更しましょう。

今回は適当にawsの公開鍵を秘密鍵を変更します。

aws:
  access_key_id: xxxxxxxxxxxxxxx
  secret_access_key: yyyyyyyyyyyyyyyyyy

# Used as the base secret for all MessageVerifiers in Rails, including the one protecting cookies.
secret_key_base: 8be8e637d755f79c799048bed8be0c...

変更後保存したらファイルを閉じてください。以下のように表示されたら暗号化できています。

New credentials encrypted and saved.

credentials.yml開いてみよう

それでは実際にcredentials.yml.encを開いてみましょう。

ターミナルでRailsのコンソールを開いて呼び出しましょう。

# Railsのコンソールを開く
$ rails c

# credentialsの解錠
# secret_key_base
$ Rails.application.credentials[:secret_key_base]

# credentialsの解錠
# awsの公開鍵
$ Rails.application.credentials[:aws][:access_key_id]

よくあるエラー(チームで共有する時の注意点 )

ActiveSupport::MessageEncryptor::InvalidMessageのエラーが表示される

ターミナルでcredentials.ymlを解錠しようとした。またはrails sやrails cなどのコマンドでRailsアプリを起動しようとしたときに出るときがあります。

原因

端的にcredentials.yml.encの文字列とmaster.keyの文字列の組み合わせが不正解であるということです。

考えられる原因は2つです。

  • master.keyの共有がチーム間でできていない。
  • credentials.yml.encをチームで同期できていない。

よくあるのが、master.keyがないままcredentials.ymlを開こうとして上記のエラーが発火。焦ってcredentials.yml.encを消し、rails credentials:editコマンドでcredentials.ymlを新しく生成してしまうケースです。

この場合、新しくmaster.keyも生成されてしまうので、チームメンバーと自身のmaster.keyがバラバラで全く違う鍵ができて、どれが正しい鍵で錠前なのか分からなくなってしまいます。

解決方法

原因はcredentials.yml.encの文字列とmaster.keyの文字列の組み合わせが不正解であるということ

なのでcredentials.yml.encの文字列とmaster.keyの文字列の組み合わせを合致させましょう

誰か1人が一旦正しいものを作成し、それを全員で落ち着いて共有しましょう。

まとめ

credentials.ymlのまとめ
  • 秘密鍵と公開鍵で秘密情報を管理すること。
  • 編集にはインデントに注意すること。
  • チーム間で共有する場合には組み合わせに注意!
難しいことはない、じっくり弄ってみて!

おすすめ技術書

Ruby on the Railsを学習中の方であれば、以下の技術書がおすすめです!

よかったらシェアしてね!
  • URL Copied!
  • URL Copied!
目次
閉じる