🐥

【Rails7】【秘匿情報の管理】「credentials.yml.encとmaster.key」「.env」の使い方とメリットを比較する

2024/08/04に公開

こんにちは。kameと申します。
現在、プログラミングスクールでRuby on railsを中心に学習中です。

この度は、プログラミング初学者目線で、
①credentials.yml.encとmaster.keyを用いた秘匿情報の管理方法
②.envを用いた秘匿情報の管理方法

上記2点を比較したときに感じた、それぞれを使用するメリットについて記述します。

※本記事の趣旨は、「筆者が2つの管理方法を比較して感じたこと」となりますので、具体的な管理方法については省略し、参考記事を引用させていただくことをご了承ください。

この記事を書いた理由

スクール内でアプリ制作にAPIを使用する人が増えており、それに伴って、APIキーを含む秘匿情報の管理方法に悩んでいる人が多く感じました。実際に管理方法を検索して調べてみると、

  • .envを用いた管理方法に関する記事が多い
  • Rails5.2以降では、Railsの標準装備としてcredentials.yml.encとmaster.keyが導入されたため、そちらを使いましょうという記事が散見される

上記のような状況だったため、実際に両方使用してみて感じた、それぞれのメリットと気をつけるべき点をまとめてみました。

credentials.yml.encとmaster.keyを使用する方法

こちらは、Railsに標準装備された秘匿情報管理機能です。Rails5.2以降で使用可能です。
具体的な導入方法は下記の参考記事をご覧ください。
※Rails6以降では、環境毎にcredentials.yml.encとmaster.keyを用意できる仕組み(Multi Environment Credentials)が導入されていますが、この部分に関しては説明を割愛させていただきます。
https://qiita.com/gyu_outputs/items/92c4a2a2f96edb10e298

  • rails newをすると、
    • credentials.yml.encとmaster.keyが自動的に作成される
    • master.keyは、自動的に.gitignoreに記載される
  • master.keyという鍵を用いて、credentials.yml.encという鍵付きボックスを解除し、中にある秘匿情報を取り出すイメージ

管理方法を図解にすると下記の通りです。
Image from Gyazo

使用するメリット・気をつけるべき点

筆者がcredentials.yml.encとmaster.keyを使用して感じたメリット・気をつけるべき点は下記の通りです。

メリット

  • rails newをした時から、master.keyが.gitignoreに記載されているため、誤ってGitHubに秘匿情報を上げる危険性が少ない(必ず確認はする)
  • チーム開発等で下記のような状況になったときに、master.keyのみをチームメンバーに共有すれば良いため、「秘匿情報が直書きされたファイル」を共有する場合と比べて安全性が高い
    • 他者が作成したGitHubリポジトリをクローン
    • クローンしたリポジトリを環境構築する際に、秘匿情報(APIキーなど)が必要

気をつけるべき点

  • credentials.yml.encの中身の編集には、エディタを指定して別途編集画面を開く必要があるため慣れが必要
  • master.keyは流出しないよう気をつける必要がある
  • チーム開発等で、後からmaster.keyを追加した場合は、必ずmaster.keyが.gitignoreに含まれているかどうか確認する

credentials.yml.encの中身の編集に関して、参考としてよく使うコマンドを下記に記載します。

【credentials.yml.encの中身を開くコマンド(下記を実行するとエディタが開かれる)】
vimを使用する場合

EDITOR="vim" bin/rails credentials:edit

※筆者はvimを使用しましたが、vim以外のエディタも指定することができるようです。詳しくはこちらの記事を参照してください。

【vimを使用する場合:credentials.yml.encの編集・保存でよく使うコマンド】

動作 コマンド
インサートモードにする ※文字入力、貼り付けが可能になる i
ノーマルモードに切り替える ※文字入力、貼り付けが終わったら実行 escキー
ファイルを保存して終了 :wq
ファイルを保存せずに終了 :q!

.envを使用する方法

こちらは、環境変数管理用のgemである「dotenv-rails」を別途インストールすることで使えるようになる、秘匿情報管理機能です。具体的な導入方法は下記の参考記事をご覧ください。
https://pikawaka.com/rails/dotenv-rails

  • 環境変数(秘匿情報)が定義された.envファイルを、アプリ内で読み込むことによって管理する方法
  • railsのgem「dotenv-rails」をインストールすることで、アプリのプロジェクトルート配下に設置された.envファイルが自動で読み込まれるようになる

使用するメリット・気をつけるべき点

筆者が.envを使用して感じたメリット・気をつけるべき点は下記の通りです。

メリット

  • 新たにエディタを開く必要がないため、秘匿情報の追記・修正がしやすい
  • 現時点でどんな秘匿情報を管理しているのかを、すぐに確認しやすい

気をつけるべき点

  • .envファイル自体は自分で作成する必要がある
  • .envファイルが.gitignoreに記載されているかどうかを必ず確認する
  • チーム開発等でメンバーに秘匿情報を共有するときは、.envファイルの中身を丸ごと共有することが必要になる。APIキー等がそのまま記載されているファイルになるため、共有する際には細心の注意を払う必要がある。

まとめ

秘匿情報はそもそも慎重に取り扱う必要があります。ヒューマンエラーを考慮すると、秘匿情報の管理環境を構築するまでの人的作業は少ない方が良いです。
上記の点を考えると、credentials.yml.encとmaster.keyを使用した方が、管理上の安全性は高いと感じました。
ただ、新たにエディタを開いて編集するという特殊な状況ではあるため、あらかじめ操作方法には慣れておいた方が良さそうです。

個人開発をする分には様々な管理方法を試すことができますが、チームでは、同じリポジトリを使用する時に秘匿情報の管理方法を統一する必要があります。
実際に、企業で秘匿情報の管理をCredentials移行した例がありましたので、こちらもご参照ください。
https://tech.timee.co.jp/entry/2024/02/14/102432

参考にした記事

Discussion