😸

Railsの現場でめちゃ使われるMulti Environment Credentialsについて(セキュリティにおいてめっちゃ重要)

2023/11/28に公開

そもそもcredentialsとは

バックエンド開発で、一般的には認証情報やアクセス権限に関連する情報のことで、システムやアプリケーションが外部のサービスやデータベースにアクセスする際に使用される、特定の識別情報や権限情報のことです。
つまり機密情報のことです。

ex)
データベースへの接続に必要なユーザー名やパスワード、APIへのアクセスに必要なトークン、秘密鍵

これらの情報はセキュリティ上厳重に管理され、漏洩を防いでいかなければいけません。

どういう場面で必要になったか

rspecを実行した時に以下のエラーが発生しました。

# bundle exec rspec
#中略
     Failure/Error: if token.eql?(Rails.application.credentials.△△△.◯◯◯◯◯◯◯◯◯◯)
     
     NoMethodError:
       undefined method `◯◯◯◯◯◯◯◯◯◯' for nil:NilClass
     
           if token.eql?(Rails.application.credentials.△△△.◯◯◯◯◯◯◯◯◯◯)
                                                          ^^^^^^^^^^^^^^^^^
#中略

このエラーはRails.application.credentials.△△△がnilになっているエラーです。
このエラーを1つずつ見ていきました。まずはrailsのコンソールに入ります。

# rails c
Loading development environment (Rails 7.0.8)
irb(main):001> Rails.env  #今の環境の確認
=> "development"
irb(main):002> Rails.application.credentials.△△△.◯◯◯◯◯◯◯◯◯◯
=> "〇〇" #ここはデータが入ります

開発環境ではデータが取れていることがわかりました。次にテスト環境で見てみました。

# rails c -e test
Loading test environment (Rails 7.0.8)
irb(main):001> Rails.env
=> "test"
irb(main):002> Rails.application.credentials.△△△.◯◯◯◯◯◯◯◯◯◯   #◯◯◯◯◯◯◯◯◯◯がないぞーというエラー
(irb):2:in `<main>': undefined method `◯◯◯◯◯◯◯◯◯◯' for nil:NilClass (NoMethodError)

Rails.application.credentials.△△△.◯◯◯◯◯◯◯◯◯◯
                                 ^^^^^^^^^^^^^^^^^
irb(main):003> Rails.application.credentials.△△△ #◯◯◯◯◯◯◯◯◯◯なしだとnilになっている
=> nil

これからテスト環境にcredentialsのデータがないことがわかりました。

テスト用のcredentials

configの配下に開発用のcredentialsのファイルがありました。
development.keydevelopment.yml.encです。
このテストバージョンが必要でした。

注意

development.yml.encymlは暗号化(設定やデータを記述するために使われる)
Encrypt(エンクリプト)のことです。Encryptはデータを暗号化して(コード化して)隠す
時に使います。

.keyは秘密鍵と同じ考えで共有してはいけません。❗️
.yml.encはチームのメンバーで共有するためにGitHubに上げなくてはいけない

という違いがあります。.keyをGitHubに上げると警告の通知が来るみたいです。

テストの情報を作成

test.keyやtest.yml.encの情報などはリーダーからもらうことができました
こうして上の2つのファイルが作成できます。

もう1パターンはすでにあるdevelopmentの.keyと.yml.encをローカルでコピーして作成することです。

credentials情報を編集

以下のコマンドで暗号化されたクレデンシャル情報を編集できます。
以下は開発環境バージョンです。
🟡注意
-eは必ず使う必要があります❗️。
理由はデフォルトで開発環境 (development) のクレデンシャル情報が編集されてしまい
編集が終了すると、変更が保存され、再びファイルは暗号化され他のメンバーがクレデンシャル情報がわからなくなってしまいます。

# rails credentials:edit -e development  #-eは必須
File encrypted and saved.

-eeはenviromentのことです。

以下がテスト環境の編集です。-eは必須です。❗️

# rails credentials:edit -e test #-eは必須

編集した時の画像はこの記事載っています

https://qiita.com/joinus_ibuki/items/3a0d264abe510bfdd98a

この記事に環境毎のcredentialsを確認できるコマンドや環境毎のcredentials keyを生成・秘匿情報の編集ができるコマンドが載っています。

https://zenn.dev/banrih/articles/f22f0a70bbead2a02110#環境毎のcredentialsを確認

  • credentials keyの生成、秘匿情報の編集
# テスト環境
rails credentials:edit -e test

# 開発環境
rails credentials:edit -e development

# ステージング環境
rails credentials:edit -e staging

# 本番環境
rails credentials:edit -e production
  • credentialsを確認
# テスト環境
rails credentials:show -e test

# 開発環境
rails credentials:show -e development

# ステージング環境
rails credentials:show -e staging

# 本番環境
rails credentials:show -e production

test用のcredentials作成後

railsコンソールでテスト環境に入り、さっきのやり方で確認しました。

# rails c -e test  #テスト環境に入る
Loading test environment (Rails 7.0.8)
irb(main):001> Rails.env
=> "test"
irb(main):002> Rails.application.credentials.△△△.◯◯◯◯◯◯◯◯◯◯
=> "〇〇"

〇〇にデータが取れていました。

この後rspecでテストを実行したらテストが通り解決しました。

最後に注意(.gitignoreを忘れるな)

GitHubにあげる前に.gitignore にkeyを書いておきましょう❗️
秘密鍵とかパスワードも.gitignoreに書いたりします。

/config/credentials/test.key

みたいな感じです。

これがないとGitHubから警告の連絡が来ます❗️

Discussion