bin/rails credentials

secret_key_baseやAWSのアクセスキーなどを暗号化して保存するためのコマンド。

bin/rails secrets:*bin/rails encrypted:*などのコマンドは旧来のコマンドで現在は以下の3つのコマンドを使う。

  • credentials:edit
  • credentials:show
  • credentials:diff

デフォルトではconfig/credentials.yml.encが暗号化済のファイルでconfig/master.keyが暗号鍵になる。

bin/rails credentials:edit

  • EDITOR="vim" bin/rails credentials:edit
    • config/credentials.yml.encファイルを
    • config/master.key鍵で復号して
    • エディタvimで編集する。保存してエディタを閉じると
    • config/master.key鍵で暗号化して
    • config/credentials.yml.encファイルに保存する

--environment-e)オプションを使うと環境ごとにファイルを分けることができる。

  • EDITOR="vim" bin/rails credentials:edit --environment staging
    • config/credentials/staging.yml.encファイルを
    • config/credentials/staging.key鍵で復号して
    • エディタvimで編集する。保存してエディタを閉じると
    • config/credentials/staging.key鍵で暗号化して
    • config/credentials/staging.yml.encファイルに保存する

config/credentials/staging.keyは自動的に.gitignoreに追加される。

bin/rails c -e stagingを実行してRails.application.credentials.設定したキーで確認することができる(当然、config/environments/staging.rbなどがなければエラーになるので注意)。

bin/rails credentials:show

復号結果を表示する。

bin/rails credentials:diff

暗号化ファイルのdiffを見れるようにするコマンド。

暗号化済のファイルなので、git diffをみても意味のある結果は表示されない。

git diffで復号済の内容でdiffを見れるようにするにはbin/rails credentials:diff --enrollを実行する。

.gitattributesに以下の2行が追加される。

config/credentials/*.yml.enc diff=rails_credentials
config/credentials.yml.enc diff=rails_credentials

この時点では、まだgit diffの結果は変わらない。その後、EDITOR="..." bin/rails credentials:editを実行すると.git/configに以下の2行が追加される。

[diff "rails_credentials"]
	textconv = bin/rails credentials:diff

その後、git diffを実行すると復号された内容でdiffをみることができるようになる。

困った点としては、Railsの実行環境をDockerなどで仮想化していて、ホスト側でGit操作をしている場合にエラーになることが挙げられる。

ホスト側にRailsがインストールされていないので、git diffを実行したときに当然ながらbin/rails credentials:diffが実行できずにエラーになる。

なので、.git/configファイルを以下のように書き換える。

[diff "rails_credentials"]
	textconv = bin/rails_credentials_diff

そして、bin/rails_credentials_diffファイルを以下の内容で作成し、実行権限をつける。

#!/bin/sh

bin/rails version &> /dev/null

if [ $? -eq 0 ]; then
  bin/rails credentials:diff $1
else
  cat $1
fi

これで、bin/rails versionが実行できればbin/rails credentials:diffを実行し復号した内容でdiffを表示、bin/rails versionが実行できなければ暗号化済の内容でdiffを表示するようになる。

.git/configはリポジトリに含まれないので、開発環境構築時に共有する必要がある。