はじめに
秘密情報の管理はセキュリティ面において重要です。
ここを疎かにしてしまうと、取り返しのつかない事態を引き起こす可能性もありますので、確実に抑えておくと良いでしょう。
また、歴史を振り返りながら知ることで、より深く知識を身に付けられると思うので頑張りましょう!
〜Rails4.0
このバージョンまでは標準的な秘密情報を安全に管理する方法がありませんでした。
Cookieの暗号化を行うときに利用するトークンが存在していたが、ファイルにベタ書きしていたので、開発者側での句風雨が必要でした。
SampleApp::Application.config.secret_key_base = '......'
12 factor appの考え方が広まるにつれて、秘密情報は環境変数経由で利用することが増えてきました。その結果、開発中はリポジトリへ含めないようにしている設定ファイルから開発環境用のトークンなどを読み込み、本番環境では、環境変数からトークンを取得する攻勢を取ることが多くなりました。
Rails4.1
Rails4.1からrails new
をした際に、環境ごとに値を定義可能な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.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.key
とconfig/credentials/staging.yml.enc
が生成されます。
上記のように、--environment
オプションで環境ごとの設定を行えるようになりました。
注意点として、credentialsの読み込みは、credentials/RAILS_ENV.yml.enc
を参照し、無ければ、credentials.yml.enc
を読み込ことに注意したほうが良いです。
credentialsを2つ以上の環境で利用したい場合
<test環境とdevelop環境で利用する>
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
終わりに
いかがでしたでしょうか?
秘密情報の管理って、自分の感覚ではまどろっこしくて苦手だったので少し避けてきました。
しかし、学習してみると奥が深く面白かったです。
自分と同じ心境の人が秘密情報の管理につまづかない助けになれば良いと思います!