3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Railsで秘密情報を管理するためのcredentials.ymlの登録と運用についてまとめる

Posted at

実務でcredentials.ymlを扱って、秘密情報を管理するときに理解が曖昧な部分があったので、「秘密情報をうまい具合に管理できるやつでしょ」という過去の自分に向けて記事を書きます。

この記事では以下のことを中心に書いてます。

記事で書くこと

  • credentials.ymlとは簡単な説明
  • 編集方法
  • 環境変数として使用するには
  • 運用方法

credentials.ymlとは

  • 機密情報(APIキー、パスワード、認証情報など)を安全に管理するための仕組み

以下のイラストにcredentials.ymlの全体像をまとめてみました

段落テキスト.png

▼主に登場する2つのファイルについての説明

  • 秘密情報を一括管理しているcredentials.yml.enc
  • credentials.yml.encを復号化(暗号を解除)するために必要なconfig/master.key
    • 注意:リモートリポジトリにプッシュしては絶対にダメ

編集方法

復号化される前のcredentials.yml.enc
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で表示されます

復号化されたcredentials.yml
# APIキー(外部サービスと連携するための情報)
some_api_key:
  api_id: your_api_id
  api_secret: your_api_secret

手順② iを押してインサートモードに入ることで、テキストを編集
手順③ Vimで編集した後は、Escキーを押して通常モードに戻り、:wqと入力して保存・終了

環境変数として使用するには

使用場面として、アプリケーション上で環境変数の情報を取得したい時について解説していきます。

例えば、credentials.yml.encファイルに下記のように情報が保存されているとします。

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の情報を利用するときのコードです。

credentialの認証情報を使用して、外部APIを叩くとき
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のリモートリポジトリで管理しないように設定すること。絶対にプッシュしない仕組みを作る!
.gitinnore
# Ignore master key for Rails credentials
/config/master.key

とはいえconfig/master.keyがないと、credentials.yml.encに情報を登録したりすることができないので、チームに共有する必要があります。

なので、チームに共有する手段の1つとして、以下があると思います。

  • 1Passwordのような社内のパスワードマネージャーを使う

参考

3
0
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
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?