LoginSignup
79

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-05-22

環境

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

最後に

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
79