環境
Ruby - 2.4.1
Rails - 5.1.0
背景
- Rails 5.1からencrypted secrets機能が追加され、Rails wayに乗った状態で、環境変数を暗号化した状態でgit管理できるようになった
-
gibberish
などのgemを使って.envファイルを暗号化して、git管理していた人は運用を乗り換えると良さそう
セットアップ
$ bin/rails secrets:setup
Adding config/secrets.yml.key to store the encryption key:
0123456789abcdef0123456789abcdef
Save this in a password manager your team can access.
If you lose the key, no one, including you, can access any encrypted secrets.
create config/secrets.yml.key
Ignoring config/secrets.yml.key so it won't end up in Git history:
1 development:
append .gitignore
Adding config/secrets.yml.enc to store secrets that needs to be encrypted.
create config/secrets.yml.enc
For now the file contains this but it's been encrypted with the generated key:
# See `secrets.yml` for tips on generating suitable keys.
# production:
# external_api_key: 1466aac22e6a869134be3d09b9e89232fc2c2289…
You can edit encrypted secrets with `bin/rails secrets:edit`.
Add this to your config/environments/production.rb:
config.read_encrypted_secrets = true
config/secrets.yml.key
と config/secrets.yml.enc
が追加され、.gitignore
に下記の記述が追加される。
# Ignore encrypted secrets key file.
config/secrets.yml.key
ちなみに、secrets.yml.key
の中身は下記の通り、keyが入っているだけである。
0123456789abcdef0123456789abcdef
この secrets.yml.key
を元に、暗号化と復号化を行うが、上述の通り、このファイルはgit管理しないので、別の管理が必要となってくる。keyの管理方法については後述。
暗号化されたsecretsを編集する
$ bin/rails secrets:edit
デフォルトだとtextmateで開こうとする
$ EDITOR="mate --wait" bin/rails secrets:edit
vimmerの人は
$ EDITOR=vim rails secrets:edit
atom派の人は
$ EDITOR="atom --wait" rails secrets:edit
のように適宜、好きなエディタで編集する。エディタ内で復号化された状態で編集することができ、ファイルを保存して閉じると暗号化されて、config/secrets.yml.enc
が更新される。編集する内容は、secrets.ymlと書き方は変わらない。
development:
api_key: api_key_for_development
test:
api_key: api_key_for_test
production:
secret_key_base: generatedsecurerandomhex64
api_key: api_key_for_production
暗号化されたsecretsを使う
Rails.application.secrets.api_key
keyの管理方法について
config/secrets.yml.key
ファイルを配置する方法の他、RAILS_MASTER_KEY
という環境変数に config/secrets.yml.key
の中身を渡すことでも暗号化、復号化を行うことができる。
そのため、config/secrets.yml.key
が配置されていない状態でも、
$ RAILS_MASTER_KEY=0123456789abcdef0123456789abcdef EDITOR=vim bin/rails secrets:edit
とすると、復号化の上、編集することができる。
そのため、環境変数を管理する方法として、下記、2種類の管理方法がある。
-
config/secrets.yml.key
を配置する - 環境変数
RAILS_MASTER_KEY
にkeyを渡す
2種類の方法の使い分けは自由だが、一例として、下記にユースケースを示す。
developmentでは、config/secrets.yml.key
を配置する
$ echo 0123456789abcdef0123456789abcdef > secrets.yml.key
などで、各個人にファイルを配置する。0123456789abcdef0123456789abcdef
の管理は各チーム内のパス管理方法で取り扱う。
productionでは、環境変数 RAILS_MASTER_KEY
にkeyを渡す
- docker-composeのenvironmentで
RAILS_MASTER_KEY
を渡す - Circle CIなども同様に
RAILS_MASTER_KEY
を環境変数に渡す
最後に
とりあえず、上記構成で運用を始めてみます