🗝️

Key Vault を活用した API キーの保護

2023/04/16に公開

はじめに

様々なサービスの API にアクセスするための資格情報である API キーですが、以下のような以下のような理由から API キーをそのままアプリに埋め込むのは危ないと言われています。

  • リバースエンジニアリングによって漏洩する恐れ
  • GitHub などのレポジトリからのソースコード漏洩により、API キーを不正取得される恐れ
  • API キーが漏洩すると、APIやクラウドサービスが侵害される可能性
  • API キーが侵害されると、データを消されたり、抜かれたり、改ざんされたりする危険性あり

そのため、API キーの漏洩対策と、漏洩した場合の不正アクセス対策の両方が必要になります。その方法としてキー管理サービス (KMS) である Azure Key Vault (キー コンテナー) を活用します。

なぜ Key Vault を使うのか?

私も前はよく疑問に思っていました。

  • Key Vault に API キーを格納したとしても、Key Vault にアクセスするための資格情報が必要だよな・・・
  • ということは次は Key Vault にアクセスするための資格情報を守るための仕組みが必要?
  • あれ、これって意味なくない?

実は ↑ のイメージはそこまで間違ってはいなくて、Key Vault にアクセスする箇所でガチガチにセキュリティ対策をします。なのでセキュリティ対策が難しい API に直接アクセスするよりは、Key Vault を間に挟んだほうがよい、というイメージかと思います。
さらに Azure 上であれば、マネージド ID という資格情報の管理が不要な認証が使えるので、より安全にアクセスすることが可能です。

Azure リソースからの外部 API へのアクセス

原則としては、アクセス元のリソースに対してマネージド ID を付与し、その認証をもとにして Key Vault から API キーを取得、外部 API にアクセスします。

この時に使えるセキュリティ機能は以下の通りです。解説は後ほどまとめて。

Azure AD

  • マネージド ID
  • ワークロード ID の条件付きアクセス

Key Vault

  • ネットワーク アクセス制御
  • プライベート エンドポイント
  • アクセスポリシー もしくは RBAC
  • Defender for Key Vault

オンプレ等から外部 API へのアクセス

この場合、マネージド ID が使えないため、サービス プリンシパルで Key Vault にアクセスします。サービス プリンシパルはアプリで利用するためのアカウントのようなものです。
https://learn.microsoft.com/ja-jp/azure/key-vault/general/authentication

サービス プリンシパルを使用して認証し、 Key Vault から API キーを取得、外部 API にアクセスします。

この時に使えるセキュリティ機能は以下の通りです。解説は後ほどまとめて。

Azure AD

  • サービス プリンシパルの証明書認証
  • ワークロード ID の条件付きアクセス

Key Vault

  • ネットワーク アクセス制御
  • プライベート エンドポイント
  • アクセスポリシー もしくは RBAC
  • Defender for Key Vault

Azure AD で使えるセキュリティ機能

ほぼリンク集になりますが、↑ で記載した機能を簡単に触れていきます。

マネージド ID
サービス プリンシパルの代わりに Azure リソースに付与して他の Azure リソースなどに安全にアクセスさせる仕組みです。Azure 内部で証明書認証を勝手にやってくれるため、ユーザーが資格情報を管理する必要がなく、安全に構成できます。
https://learn.microsoft.com/ja-jp/azure/active-directory/managed-identities-azure-resources/overview

サービス プリンシパルの証明書認証
サービス プリンシパルにはシークレットというパスワード相当の文字列での認証と証明書認証が準備されています。証明書の場合、流出の危険がないわけではないですが、アプリケーションに誤って受けこまれるリスクがないため、シークレットよりも安全と言われています。
https://learn.microsoft.com/ja-jp/azure/active-directory/fundamentals/service-accounts-principal#service-principal-authentication

ワークロード ID の条件付きアクセス
サービス プリンシパルやマネージド ID を総称してワークロード ID と呼んでいます。まだ新しい機能なので、使える条件が限られているのですが、場所 (グローバル IP) をもとにアクセス可否を制御することが可能です。なお、本機能には Workload Identities Premium ライセンスが必要です。
https://learn.microsoft.com/ja-jp/azure/active-directory/conditional-access/workload-identity

Key Vault で使えるセキュリティ機能

こちらもほぼリンク集です。

ネットワーク アクセス制御
いわゆる ACL で、Key Vault にアクセスできる グローバル IP や仮想ネットワークを制限します。
https://learn.microsoft.com/ja-jp/azure/key-vault/general/network-security

プライベート エンドポイント
より強力なネットワークアクセス制御として、プライベートネットワークからしかアクセスできないように構成する仕組みです。
https://learn.microsoft.com/ja-jp/azure/key-vault/general/private-link-service?tabs=portal

アクセスポリシー もしくは RBAC
↑ はネットワークレイヤでしたが、こちらはよりアプリ寄りの制限になります。特定のユーザーやマネージド ID 等に対して、操作と範囲を指定してアクセス許可するポリシーを指定できます。
https://learn.microsoft.com/ja-jp/azure/key-vault/general/assign-access-policy?tabs=azure-portal
https://learn.microsoft.com/ja-jp/azure/key-vault/general/rbac-guide?tabs=azure-cli

Defender for Key Vault
万が一不正なアクセスを受けた場合に検知する仕組みです。例えば、普段と異なる操作や不審な IP アドレスからのアクセスを検知することが可能です。
https://learn.microsoft.com/ja-jp/azure/defender-for-cloud/defender-for-key-vault-introduction
https://learn.microsoft.com/ja-jp/azure/defender-for-cloud/alerts-reference#alerts-azurekv

Microsoft (有志)

Discussion