Railsのcredentialsコマンドを使用すると、アプリケーションの認証情報(APIキー、データベースのパスワードなど)を安全に管理できます。
認証情報は暗号化され、config/credentials.yml.encに保存されるため、環境変数を多用せずに機密情報を扱えます。
credentialsコマンドには以下の3つのコマンドが用意されています。
bin/rails credentials:edit:認証情報を編集bin/rails credentials:show:認証情報の内容を復号化して表示bin/rails credentials:diff:Gitを用いた差分管理の設定と確認
また、-e <environment>オプションを指定することで、環境ごと(例:production, development, test)に異なる認証情報を管理できます。
credentialsコマンドの詳細はbin/rails credentials:helpで確認できます。
本記事では、これらのコマンドの使い方について解説します。
- 実行環境
- Ruby 3.4.1
- Rails 8.0.1
- VSCode 1.97.2
- MacBook Pro (13-inch, 2020)
- macOS Sequoia 15.3
1. bin/rails credentials:edit
EDITOR="code --wait" bin/rails credentials:edit
$VISUALまたは$EDITORに指定したエディターでconfig/credentials.yml.encを編集するconfig/credentials.yml.encが存在しない場合は、config/credentials.yml.encとconfig/master.keyを作成するEDITOR="code --wait"でエディターにVS Codeを指定--wait引数を渡すと編集中のファイルを閉じるまでbin/rails credentials:editが待機する
以下のように環境変数を定義しておけば、EDITOR="code --wait"を指定せずに実行できるようになります。
echo 'export EDITOR="code --wait"' >> ~/.zshrc
1-1. 環境ごとに認証情報を管理する
-eオプションで環境ごとにcredentialsを管理できます。
# production環境の場合
bin/rails credentials:edit -e production
config/credentials/#{environment}.yml.encとconfig/credentials/#{environment}.keyが作成される.gitignoreに/config/credentials/#{environment}.keyが追加される
2. bin/rails credentials:show
bin/rails credentials:show
- 復号化された
config/credentials.yml.encの内容が表示されるbin/rails credentials:diff config/credentials.yml.encと同じ
-e <environment>で環境ごとに指定可能
3. bin/rails credentials:diff
bin/rails credentials:diff config/credentials.yml.enc
- 復号化された
config/credentials.yml.encの内容が表示されるbin/rails credentials:showと同じ
-e <environment>で環境ごとに指定可能
3-1. git diffでcredentialsの差分を確認する
bin/rails credentials:diff --enroll
git diff実行時にbin/rails credentials:diffを呼び出すようになる(復号化された内容が表示される)
--enrollオプションにより.gitattributesに以下が追記されます。
# .gitattributes
config/credentials/*.yml.enc diff=rails_credentials
config/credentials.yml.enc diff=rails_credentials
これにより全てのcredentialsファイルに対してrails_credentials diff driver(=bin/rails credentials:diff)が適用されます。
- Rails::Command::CredentialsCommand#diff
- Git - gitattributes Documentation - Setting the internal diff algorithm
bin/rails credentials:editコマンド実行時にdiff driverが設定されているかを確認し、設定がない場合は.git/configに以下が追記されます。
# .git/config [diff "rails_credentials"] textconv = bin/rails credentials:diff
- Rails::Command::CredentialsCommand#edit
- Git - gitattributes Documentation - Performing text diffs of binary files
これらの設定を無効にするには--disenrollオプションを指定します。
# git diff実行時に暗号化された内容が表示されるようになる
bin/rails credentials:diff --disenroll
【参考】
- Ruby on Rails 5.2 Release Notes - 2.4 Credentials - Ruby on Rails Guides
- Add credentials using a generic EncryptedConfiguration class by dhh · Pull Request #30067 · rails/rails
- Rails セキュリティガイド - 11 利用環境のセキュリティ - Railsガイド
- https://github.com/rails/rails/tree/main/railties/lib/rails/commands/credentials
- 【イベントレポート】Railsアプリで秘匿情報を環境変数からCredentialsに移行した話 - Timee Product Team Blog
- secret_key_baseが漏れると何が起きるのか実際に試してみた|TechRacho by BPS株式会社
- Ruby on Rails 5.2 Release Notes - 2.4 Credentials - Ruby on Rails Guides
- Rails5.2から追加された credentials.yml.enc のキホン #Rails - Qiita
- Rails Encrypted Credentials on Rails 5.2