Railsの現場でめちゃ使われるMulti Environment Credentialsについて(セキュリティにおいてめっちゃ重要)
そもそも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.key
とdevelopment.yml.enc
です。
このテストバージョンが必要でした。
注意
development.yml.encのymlは暗号化(設定やデータを記述するために使われる)
、
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.
-e
のeはenviromentのことです。
以下がテスト環境の編集です。-eは必須
です。❗️
# rails credentials:edit -e test #-eは必須
編集した時の画像はこの記事載っています。
この記事に環境毎のcredentialsを確認できるコマンドや環境毎のcredentials keyを生成・秘匿情報の編集ができるコマンドが載っています。
- 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