LoginSignup
1
2

More than 1 year has passed since last update.

[Rails]秘密情報の管理方法〜これまでから現在まで〜

Posted at

はじめに

秘密情報の管理はセキュリティ面において重要です。
ここを疎かにしてしまうと、取り返しのつかない事態を引き起こす可能性もありますので、確実に抑えておくと良いでしょう。
また、歴史を振り返りながら知ることで、より深く知識を身に付けられると思うので頑張りましょう!

〜Rails4.0

このバージョンまでは標準的な秘密情報を安全に管理する方法がありませんでした。
Cookieの暗号化を行うときに利用するトークンが存在していたが、ファイルにベタ書きしていたので、開発者側での句風雨が必要でした。

config/initializers/secret_token.rb
SampleApp::Application.config.secret_key_base = '......'

12 factor appの考え方が広まるにつれて、秘密情報は環境変数経由で利用することが増えてきました。その結果、開発中はリポジトリへ含めないようにしている設定ファイルから開発環境用のトークンなどを読み込み、本番環境では、環境変数からトークンを取得する攻勢を取ることが多くなりました。

Rails4.1

Rails4.1からrails newをした際に、環境ごとに値を定義可能なconfig/secrets.ymlが生成されるようになりました。
これにより、秘密情報を集める場所の共通認識を開発者間で持てるようになりました。

config/secrets.yml
development
  secret_ley_base: ...
test
  secret_ley_base: ...
production
  secret_ley_base: <%= ENV["SECRET_KEY_BASE"] %>

Rails5.1

これまで抱えていた問題を解消するべく、encrypted secretsを使った暗号化が提示されました。
config/secrets.yml.encに暗号化した内容を記載することで、このファイル自体をリポジトリに含めることが可能になりました。この暗号化を復号するためのキーは、環境変数経由でRAILS_MASTER_KEYという値を別で管理するだけになったので、管理コストはかなり下がりました。

config/secrets.yml.encが作成されるまでの手順

1.以下のコマンドを実行してセットアップを行う。

rails secrets:setup

2.編集したい場合は、以下のコマンドで編集を行う。

rails secrets:edit

Rails5.2

前バージョンで、秘密情報の安全な管理方法がもたらされたものの、利用方法が複雑化してきました。これによって生まれたのがcredentialsという仕組みです。
credentialsは、大きな特徴として、環境変数ごとに値を切り替えず、フラットな構成をとります。

rails newした時点で、「config/credentials.yml.enc」「config/master.key」が生成されます。この暗号化したファイルを編集するにはrails credentials:editとします。

aws:
  access_key: 123
  secret_key_base: 456

.
.
.

secret_key_base: ...

このファイルに定義された値を参照する場合は、Rails.application.credentials.〇〇とすると取得できます。これらは、master.keyやRAILS_MASTER_KEYに値がセットされていない場合はnilを返します。環境変数などの指定漏れで想定外のエラーに対応するべく、config/environments/production.rbでは、以下の設定が有効になっています。

config/environments/production.rb
...
config.require_master_key = true
...

credentialsで使用するファイルや環境変数

ファイル/環境変数 内容
config/credentials.yml.enc 暗号化した設定ファイル
config/master.key コミットしないファイル
RAILS_MASTER_KEY master.keyの値を環境変数経由で受け渡す場合の名前

Rails6.0

現在の最新バージョンRails6系では、より扱いやすくcredentialsが拡張されました。
例えば、ステージング環境用の設定をしたい場合は以下のようにします。

rails credentials:edit --environment staging

コマンド実行後、値を設定して保存すると、config/credentials/staging.keyconfig/credentials/staging.yml.encが生成されます。

上記のように、--environmentオプションで環境ごとの設定を行えるようになりました。
注意点として、credentialsの読み込みは、credentials/RAILS_ENV.yml.encを参照し、無ければ、credentials.yml.encを読み込ことに注意したほうが良いです。

credentialsを2つ以上の環境で利用したい場合

<test環境とdevelop環境で利用する>

config/environments/test.rbなどに、以下を指定する。

config/environments/test.rb
Rails.application.configure do
  # development環境と同じcredentialsを利用
  config.credentials.content_path = Rails.root.join('config', 'credentials', 'development.yml.enc')

  # development環境と同じ複号化するkeyを利用
  config.credentials.key_path = Rails.root.join('config', 'credentials', 'development.key')
end

終わりに

いかがでしたでしょうか?
秘密情報の管理って、自分の感覚ではまどろっこしくて苦手だったので少し避けてきました。
しかし、学習してみると奥が深く面白かったです。
自分と同じ心境の人が秘密情報の管理につまづかない助けになれば良いと思います!

1
2
0

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
1
2