Ruby
Rails

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

最後に

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