Edited at

Rails 5.1のencrypted secretsの運用について考える

More than 1 year has passed since last update.


環境

Ruby - 2.4.1

Rails - 5.1.0


背景


  • Rails 5.1からencrypted secrets機能が追加され、Rails wayに乗った状態で、環境変数を暗号化した状態でgit管理できるようになった


  • gibberish などのgemを使って.envファイルを暗号化して、git管理していた人は運用を乗り換えると良さそう


セットアップ


console

$ 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.keyconfig/secrets.yml.enc が追加され、.gitignore に下記の記述が追加される。


.gitignore

# Ignore encrypted secrets key file.

config/secrets.yml.key

ちなみに、secrets.yml.key の中身は下記の通り、keyが入っているだけである。


config/secrets.yml.key

0123456789abcdef0123456789abcdef


この secrets.yml.key を元に、暗号化と復号化を行うが、上述の通り、このファイルはgit管理しないので、別の管理が必要となってくる。keyの管理方法については後述。


暗号化されたsecretsを編集する


console

$ bin/rails secrets:edit


デフォルトだとtextmateで開こうとする


console

$ EDITOR="mate --wait" bin/rails secrets:edit


vimmerの人は


console

$ EDITOR=vim rails secrets:edit


atom派の人は


console

$ EDITOR="atom --wait" rails secrets:edit


のように適宜、好きなエディタで編集する。エディタ内で復号化された状態で編集することができ、ファイルを保存して閉じると暗号化されて、config/secrets.yml.enc が更新される。編集する内容は、secrets.ymlと書き方は変わらない。


config/secrets.yml.enc(editing)

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を使う


ruby

Rails.application.secrets.api_key



keyの管理方法について

config/secrets.yml.key ファイルを配置する方法の他、RAILS_MASTER_KEY という環境変数に config/secrets.yml.key の中身を渡すことでも暗号化、復号化を行うことができる。

そのため、config/secrets.yml.key が配置されていない状態でも、


console

$ 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 を環境変数に渡す


最後に

とりあえず、上記構成で運用を始めてみます