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
はリポジトリに含まれないので、開発環境構築時に共有する必要がある。