Rails

【Rails】秘匿情報を環境毎に管理することができるMulti Environment Credentialsについて初心者向けにまとめてみた

Rails

 

今回は秘匿情報を環境毎に管理することができるMulti Environment Credentialsについて簡単にまとめたので紹介したいと思います。development環境とstaging環境は見せてもいいけどproduction環境の秘匿情報は隠したいというように、権限によって秘匿情報を管理することができる機能になります。

Multi Environment CredentialsはRails6よりサポートされた機能です。

秘匿情報を管理するcredentials.yml.encとは

credentialsとはRails5.2で追加された機能で、credentials.yml.encは秘匿情報の設定ファイル、master.keyがそのファイルを復号化(暗号化されたデータを読める状態に戻すこと)する際に用いられるキーになります。

credentials.yml.encについては以下の記事を参考にしてください。

Rails
【Rails5.2】秘匿情報を管理することができるcredentials.yml.encとmaster.keyの使い方について今回はRails5.2で追加された秘匿情報を管理する仕組み、credentials.yml.encとmaster.keyの使い方について詳しく解説しています。AWSキーやAPIキーといった秘匿情報を管理する仕組みはRails5.2以前からもありましたが、Rails5.2からはcredentials.yml.encでの管理に変更になりました。...

【Rails6以前】秘匿情報を環境毎に管理する仕組み

Rails6以前では秘匿情報を環境毎に管理する機能はなく、特定の環境下で秘匿情報を管理したい場合は、以下のように環境を明示して記載する必要がありました。

# credentials.yml.enc

development:
  aws:
    access_key_id: "dev123"
    secret_access_key: "dev345"

staging:
  aws:
    access_key_id: "stg123"
    secret_access_key: "stg345"

production:
  aws:
    access_key_id: "prod123"
    secret_access_key: "prod345"
# development環境の秘匿情報を取得

% Rails.application.credentials[Rails.env.to_sym][:aws][:access_key_id]
=> "dev123"

 

しかしこのような管理方法には、master.keyを知っている開発メンバーであれば全員がproduction環境にもアクセスできてしまうという問題を抱えていました。

Rails6以前で秘匿情報を環境毎に管理する仕組みとしては、rails-env-credentialsと呼ばれるgemを使用することでも可能です。

sinsoku/rails-env-credentials

【Rails6】秘匿情報を環境毎に管理する仕組み

Rails6では秘匿情報を環境毎に管理することができる仕組みがサポートされています。

それがMulti Environment Credentialsになります。

Multi Environment Credentialsは以下の構成のように、環境毎のcredentials.yml.encとmaster.keyがconfig/credentials配下に作成・配置されることになります。

Multi Environment Credentials
config/credentials.yml.encは全環境共通で使われる秘匿情報を管理するファイルになります。

Multi Environment Credentialsを使ってみる

では実際にMulti Environment Credentialsの機能を使ってみます。

アプリケーションの新規作成

まずは以下のコマンドで新規アプリケーションを作成しましょう。

% rails new multiple-environment-credentials-app -d mysql
  • アプリケーション名: multiple-environment-credentials-app
  • Ruby: 2.6.5
  • Rails: 6.0.4.4
  • データベース: MySQL

環境毎のcredentials.yml.encとmaster.keyを生成

以下のコマンドを打ち込み、環境毎のcredentials.yml.encとmaster.keyを生成します。今回はdevelopment環境・test環境・staging環境・production環境の4つのファイルを生成しています。

# development環境
% EDITOR='code --wait' rails credentials:edit --environment development

# test環境
% EDITOR='code --wait' rails credentials:edit --environment test

# staging環境
% EDITOR='code --wait' rails credentials:edit --environment staging

# production環境
% EDITOR='code --wait' rails credentials:edit --environment production

EDITOR='code --wait'はcredentials.yml.encをVSCodeで開くためのオプションになります。VSCodeでの設定が済んでいない場合は、以下の記事の「VSCodeの設定」という項目を参考にしてください。

Rails
【Rails5.2】秘匿情報を管理することができるcredentials.yml.encとmaster.keyの使い方について今回はRails5.2で追加された秘匿情報を管理する仕組み、credentials.yml.encとmaster.keyの使い方について詳しく解説しています。AWSキーやAPIキーといった秘匿情報を管理する仕組みはRails5.2以前からもありましたが、Rails5.2からはcredentials.yml.encでの管理に変更になりました。...

 

Vimエディタで開きたい場合は以下のコマンドになります。

# development環境
% EDITOR=vi bin/rails credentials:edit --environment development

# test環境
% EDITOR=vi bin/rails credentials:edit --environment test

# staging環境
% EDITOR=vi bin/rails rails credentials:edit --environment staging

# production環境
% EDITOR=vi bin/rails rails credentials:edit --environment production

階層構造の確認

ここまでの作業で以下のような階層構造ができるはずです。

config/credentials.yml.encは全環境共通で使われる秘匿情報、config/credentials配下には環境毎に設定したい秘匿情報を記載します。

multiple credentials

秘匿情報の編集

今回はdevelopment環境の秘匿情報を編集してみます。

% EDITOR='code --wait' rails credentials:edit --environment development
# aws:
#   access_key_id: 123
#   secret_access_key: 345

↓ 以下のように編集

aws:
  access_key_id: "dev123"
  secret_access_key: "dev345"

秘匿情報の取得

先ほど編集したdevelopment環境の秘匿情報は以下のコマンドで取得できます。

環境毎に設定した秘匿情報を読み込んでくれるため、特殊なオプション等をつける必要はありません。

% rails c

# 取得方法1
> Rails.application.credentials[:aws][:access_key_id]
=> "dev123"

# 取得方法2
> Rails.application.credentials.aws[:access_key_id]
=> "dev123"

# 取得方法3
Rails.application.credentials.dig(:aws, :access_key_id)
=> "dev123"
production環境のコンソールを立ち上げたい場合は% RAILS_ENV=production rails cのようにRAILS_ENV=productionを指定します。

まとめ

  • Rails6以前の仕組みでは、master.keyを知っている開発メンバーであれば全員がproduction環境にアクセスできてしまうという問題がある
  • Rails6ではMulti Environment Credentialsと呼ばれる、秘匿情報を環境毎に管理することができる仕組みがサポートされている
  • 環境毎のcredentials.yml.encとmaster.keyがconfig/credentials配下に配置される
  • config/credentials.yml.encは全環境共通で使われる秘匿情報が管理されるファイル

参考

 

 

今回は秘匿情報を環境毎に管理することができるMulti Environment Credentialsについて紹介しました。production環境以外でも秘匿情報を簡単に管理することができ、一層Railsが便利になった気がします。