Function App のクライアント証明書要件の確認

相互 TLS 認証が必要な関数ではクライアント証明書を必須にし、アプリケーションで検証してください。

説明

証明書で呼び出し元を認証する必要がある Function App で証明書を必須にしていないと、その認証手順なしでリクエストを受け付ける場合があります。すべての関数に相互 TLS が必要なわけではないため、まずサービスの認証要件を確認してください。証明書を受け取ることと、信頼できる呼び出し元として検証することは別の処理です。

想定される影響

  • 証明書に基づくアクセス要件を満たせない場合があります。
  • 証明書を持たないクライアントのリクエストがアプリケーションに届く場合があります。
  • 転送された証明書を検証しないと、許可していない呼び出し元を受け入れるおそれがあります。

対処方法

相互 TLS が必要な場合は HTTPS を適用し、クライアント証明書を Required に設定してください。現在のリソースでは client_certificate_enabled と client_certificate_mode を併せて確認してください。アプリケーションで証明書の信頼性・有効性と呼び出し権限を検証し、証明書がないリクエストや無効な証明書を拒否することをテストしてください。

例

AzureRM 3.x の旧 Function App で client_cert_mode を比較する抜粋です。ストレージなどの必須設定と HTTPS は別途構成してください。現在のリソースでは証明書設定の名前が異なる場合があります。

変更前

hcl
resource "azurerm_function_app" "example" {
  name                = "test-azure-functions"
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name
  app_service_plan_id = azurerm_app_service_plan.example.id

  client_cert_mode = "Optional"
}

変更後

hcl
resource "azurerm_function_app" "example" {
  name                = "test-azure-functions"
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name
  app_service_plan_id = azurerm_app_service_plan.example.id

  client_cert_mode = "Required"
}

変更前の Optional は証明書を必須にしません。変更後の Required は証明書の提示を要求しますが、転送された証明書の検証と呼び出し元の認可もアプリケーションで行う必要があります。

参考資料