実務でcredentials.ymlを扱って、秘密情報を管理するときに理解が曖昧な部分があったので、「秘密情報をうまい具合に管理できるやつでしょ」という過去の自分に向けて記事を書きます。
この記事では以下のことを中心に書いてます。
記事で書くこと
- credentials.ymlとは簡単な説明
- 編集方法
- 環境変数として使用するには
- 運用方法
credentials.ymlとは
- 機密情報(APIキー、パスワード、認証情報など)を安全に管理するための仕組み
以下のイラストにcredentials.ymlの全体像をまとめてみました
▼主に登場する2つのファイルについての説明
- 秘密情報を一括管理しているcredentials.yml.enc
- credentials.yml.encを復号化(暗号を解除)するために必要なconfig/master.key
- 注意:リモートリポジトリにプッシュしては絶対にダメ
編集方法
x\350\0239F\301\037!\334\037\330p\3119A\346M!\"\260\344c\347\275\031\266m\2455\263\027\217?\306
u\241\270L.\033=\254h\212|\275T?\342Y\2053\230\344\365.\313\264\211\233a\220\272\234\2269
上記のcredentials.yml.enc
は直接編集できません。
編集するために必要なことをこの章で解説していきます
手順① ローカル環境にconfig/master.key
がある状況で下記コマンドを実行
$ EDITOR="vi" bin/rails credentials:edit
以下のようにvimで表示されます
# APIキー(外部サービスと連携するための情報)
some_api_key:
api_id: your_api_id
api_secret: your_api_secret
手順② i
を押してインサートモードに入ることで、テキストを編集
手順③ Vimで編集した後は、Esc
キーを押して通常モードに戻り、:wq
と入力して保存・終了
環境変数として使用するには
使用場面として、アプリケーション上で環境変数の情報を取得したい時について解説していきます。
例えば、credentials.yml.enc
ファイルに下記のように情報が保存されているとします。
some_api_key:
api_id: YOUR_API_ID
api_secret: YOUR_API_SECRET
この場合、api_id
にアクセスするには次のように記述します。
api_id = Rails.application.credentials.some_api_key[:api_id]
同様に、api_secret
にアクセスする場合は以下のようになります。
api_secret = Rails.application.credentials.some_api_key[:api_secret]
なので、
下記が例として、外部APIを呼び出すときに、認証情報でcredentials
の情報を利用するときのコードです。
require 'net/http'
class ApiClient
def initialize
@api_id = Rails.application.credentials.some_api_key[:api_id]
@api_secret = Rails.application.credentials.some_api_key[:api_secret]
end
def get_data
uri = URI('https://example.com/data')
req = Net::HTTP::Get.new(uri)
req['Authorization'] = "Bearer #{@api_secret}"
end
end
運用方法
チームで運用する際に、credentials.yml.encをうまく活用するためのポイントの
「master.keyを外部に漏らさない仕組み・master.keyの共有方法」
について紹介します。
master.keyの管理
-
.gitignore
を用いて、config/master.keyはGitのリモートリポジトリで管理しないように設定すること。絶対にプッシュしない仕組みを作る!
# Ignore master key for Rails credentials
/config/master.key
とはいえconfig/master.key
がないと、credentials.yml.enc
に情報を登録したりすることができないので、チームに共有する必要があります。
なので、チームに共有する手段の1つとして、以下があると思います。
- 1Passwordのような社内のパスワードマネージャーを使う
参考