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:editconfig/credentials.yml.encファイルをconfig/master.key鍵で復号して- エディタvimで編集する。保存してエディタを閉じると
config/master.key鍵で暗号化してconfig/credentials.yml.encファイルに保存する
--environment(-e)オプションを使うと環境ごとにファイルを分けることができる。
EDITOR="vim" bin/rails credentials:edit --environment stagingconfig/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はリポジトリに含まれないので、開発環境構築時に共有する必要がある。