メインコンテンツまでスキップ

ネットワークセキュリティ設計

Container Apps のネットワークセキュリティ設計と、Application Gateway を使用したプライベート化について説明します。

現在の構成

アーキテクチャ概要

┌─────────────────────────────────────────────────────────────────┐
│ Internet │
└────────────────────────────┬────────────────────────────────────┘

┌──────────────┴──────────────┐
│ │
▼ ▼
┌─────────────────────────┐ ┌─────────────────────────┐
│ Frontend Container App │ │ Backend Container App │
│ (External Ingress) │ │ (External + IP制限) │
│ │ │ │
│ Public IP: あり │ │ Public IP: あり │
│ アクセス: 全公開 │ │ アクセス: IP制限 │
└─────────────────────────┘ └─────────────────────────┘

現在の設定

項目状態説明
VNet 統合✅ ありinfrastructure_subnet_id で接続
VNet CIDR10.0.0.0/16Japan East
Container Apps Subnet10.0.0.0/1816,384 アドレス
Environmentgx-shared-container-app-envinternal-only ではない
Frontend IngressExternalPublic、インターネット公開
Backend IngressExternal + IP 制限Public IP あり、IP でフィルタ
Application Gateway❌ なし
WAF❌ なし

制約事項

⚠️ 重要: internal-only は Container Apps Environment 作成時のみ設定可能です。既存の Environment を internal-only に変更することはできません。

Container Apps を Private にする方法

設定結果
ingress.external = falsePublic IP なし、Environment 内のみアクセス可能
VNet 統合 + internal-only: trueVNet 内のみアクセス可能(完全プライベート)

Private な Container App をインターネット公開する方法

方法コスト特徴
Application Gateway(推奨)WAF、パスベースルーティング、SSL終端
Azure Front Doorグローバル負荷分散、CDN、Private Link 対応
API ManagementAPI ゲートウェイ、認証、レート制限
Nginx Reverse Proxyシンプル、別 Container App で構成

Application Gateway のパス制御機能

機能説明
パスベースルーティング/api/* → API Backend, /web/* → Web Backend
WAF カスタムルールパスごとに許可/ブロック
IP + パス制限/admin/* を特定 IP のみに制限
URL リライトパス書き換え(例: /v1/api/*/api/*

移行オプション

選択肢 A: Environment 再作成(完全プライベート化)

概要: 新しい Container Apps Environment を internal-only: true で作成し、全テナントを移行

┌─────────────────────────────────────────────────────────────────┐
│ Internet │
└────────────────────────────┬────────────────────────────────────┘


┌─────────────────────────────┐
│ Application Gateway + WAF │
│ (Public IP) │
│ │
│ パスルール: │
│ ├─ /api/* → Backend │
│ └─ /* → Frontend │
└─────────────┬───────────────┘


┌─────────────────────────────┐
│ Container Apps Environment │
│ (VNet統合 + internal-only) │
│ │
│ ├─ Frontend (internal) │
│ └─ Backend (internal) │
│ │
│ Public IP: なし │
└─────────────────────────────┘
メリットデメリット
Public IP 完全排除全テナント移行が必要
最高レベルのセキュリティダウンタイム発生
Azure ベストプラクティス準拠作業量大

推奨ケース: 金融・医療・機密データを扱うシステム

移行手順:

  1. 新しい VNet + Subnet を作成
  2. 新しい Container Apps Environment を internal-only: true で作成
  3. Application Gateway を配置
  4. Container Apps を新 Environment にデプロイ
  5. DNS/トラフィックを切り替え
  6. 旧 Environment を削除

選択肢 B: Application Gateway 追加 + IP 制限(推奨)

概要: 既存 Environment はそのままで、Application Gateway を前段に追加し、IP 制限を App GW のみに変更

┌─────────────────────────────────────────────────────────────────┐
│ Internet │
└────────────────────────────┬────────────────────────────────────┘


┌─────────────────────────────┐
│ Application Gateway + WAF │
│ (Public IP: 20.x.x.x) │
│ │
│ WAF 保護: │
│ - OWASP Top 10 対策 │
│ - DDoS 保護 (Basic) │
│ - SSL 終端 │
└─────────────┬───────────────┘


┌─────────────────────────────┐
│ Container Apps Environment │
│ (既存、VNet統合) │
│ │
│ ├─ Frontend │
│ │ IP制限: App GW のみ │
│ └─ Backend │
│ IP制限: App GW のみ │
│ │
│ Public IP: あり(直接アク │
│ セスは IP 制限でブロック) │
└─────────────────────────────┘
メリットデメリット
既存環境を維持Container App に Public IP が残る
ダウンタイムなしIP 制限の設定ミスリスク
WAF で攻撃防御internal-only より安全性は劣る
段階的に導入可能
将来 internal-only 移行の準備にもなる

推奨ケース: 一般的な Web アプリ、SaaS

導入手順:

  1. Application Gateway モジュール作成(Terraform)
  2. WAF ポリシー設定(OWASP ルールセット)
  3. Backend Pool 設定(Container Apps の FQDN を登録)
  4. Container Apps の IP 制限更新(App GW の IP のみ許可)
  5. DNS 切り替え(カスタムドメインがあれば)

選択肢 C: 現状維持

メリットデメリット
作業不要WAF 保護なし
Backend の IP 制限管理が煩雑
セキュリティ改善なし

比較表

観点選択肢 A(internal-only)選択肢 B(App GW + IP制限)選択肢 C(現状維持)
安全性◎ 最高○ 十分
Public IPなしあり(IP制限で保護)あり
WAF 保護
手間なし
ダウンタイムありなしなし
推奨金融・医療・機密データ一般的な Web アプリ非推奨

推奨構成

短期(今すぐ)

選択肢 B: Application Gateway + WAF を追加し、IP 制限を App GW のみに変更

理由:

  1. 既存環境を壊さずにセキュリティ強化できる
  2. WAF による OWASP Top 10 対策が得られる
  3. 作業量が現実的
  4. ダウンタイムなしで導入可能
  5. 将来の internal-only 移行時も App Gateway はそのまま使える

長期(将来)

必要に応じて選択肢 A(internal-only Environment)へ移行

セキュリティリスク分析

選択肢 B のリスク

リスク深刻度説明
Container App の直接 URL が漏洩IP 制限があるので直接アクセスはブロック
IP 制限の設定ミス人的ミスで意図しない IP を許可する可能性
App GW の IP 変更極低Standard SKU は静的 IP(変更されない)

選択肢 B で得られる保護

  • WAF: OWASP Top 10 対策(SQL インジェクション、XSS 等)
  • DDoS 保護: Basic レベル(Standard は追加料金)
  • SSL 終端: 証明書管理の一元化
  • 単一エントリポイント: 監視・ログの集約

テナント単位の設定可否

現在のアーキテクチャ

┌─────────────────────────────────────────────────────────────────┐
│ Shared Infrastructure (全テナント共通) │
│ terraform/environments/shared/ │
│ │
│ ├─ Container Apps Environment (gx-shared-container-app-env) │ ← 共通
│ ├─ VNet (10.0.0.0/16) │ ← 共通
│ ├─ Subnets │ ← 共通
│ ├─ NSG │ ← 共通
│ └─ ACR, Key Vault, Log Analytics │ ← 共通
└─────────────────────────────────────────────────────────────────┘

┌─────────────────────┼─────────────────────┐
│ │ │
▼ ▼ ▼
┌───────────────┐ ┌───────────────┐ ┌───────────────┐
│ Tenant A │ │ Tenant B │ │ Tenant C │
│ (dev/prd) │ │ (dev/prd) │ │ (dev/prd) │
│ │ │ │ │ │
│ - Frontend CA │ │ - Frontend CA │ │ - Frontend CA │
│ - Backend CA │ │ - Backend CA │ │ - Backend CA │
│ - MySQL │ │ - MySQL │ │ - MySQL │
└───────────────┘ └───────────────┘ └───────────────┘

設定可否一覧

項目テナント単位説明
Container Apps Environment❌ 不可全テナント共通(internal-only もここで設定)
VNet / Subnet❌ 不可共有インフラ
NSG ルール❌ 不可共有インフラ
Backend IP 制限✅ 可能backend_allowed_ip_ranges で設定
Frontend IP 制限✅ 可能追加可能
Custom Domain✅ 可能テナントごとに設定
Application Gateway✅ 可能テナントごとに追加可能

重要な制約

  • internal-only はテナント単位では変更不可: Container Apps Environment は全テナントで共有されているため、Environment レベルの設定(internal-only)はテナント単位で変更できません。
  • Application Gateway + IP 制限はテナント単位で可能: 各テナントに対して独立した Application Gateway を配置し、IP 制限を設定することが可能です。

Application Gateway の配置方針

2つのアプローチ

アプローチ 1: 共通の Application Gateway

全テナントで 1 つの Application Gateway を共有:

Internet → 共通 Application Gateway → 各テナントの Container Apps

├─ /tenant-a/* → Tenant A
├─ /tenant-b/* → Tenant B
└─ /tenant-c/* → Tenant C
メリットデメリット
コスト低(1 つの App GW)パスベースルーティング必須
管理シンプルテナント間の依存性
1 テナントの問題が全体に影響

アプローチ 2: テナント別 Application Gateway(採用)

各テナントが独自の Application Gateway を持つ:

Internet → App Gateway A → Tenant A (Frontend + Backend)
Internet → App Gateway B → Tenant B (Frontend + Backend)
Internet → なし → Tenant C (現状維持、IP制限のみ)
メリットデメリット
テナントごとに独立コスト高(App Gateway × テナント数)
段階的導入が可能管理対象が増える
1 テナントの問題が他に影響しない
セキュリティ要件に応じて選択可能

採用方針

テナント別 Application Gateway(アプローチ 2)を採用

理由:

  1. 独立性: 各テナントが独立しており、1 つのテナントの問題が他に影響しない
  2. 段階的導入: セキュリティ要件の高いテナントから順次導入可能
  3. 柔軟性: テナントごとに異なる WAF ルールやパス制御を設定可能
  4. 選択制: セキュリティ強化が不要なテナントは現状維持も可能

導入計画

Phase 1: パイロット導入

  1. 対象テナント選定: セキュリティ要件の高い 1 テナントを選定
  2. Application Gateway モジュール作成: Terraform モジュールを開発
  3. テスト環境で検証: dev 環境で動作確認
  4. 本番適用: prd 環境に適用

Phase 2: 展開

  1. 他テナントへの展開: 必要に応じて他テナントに適用
  2. ドキュメント整備: 運用手順書の作成
  3. 監視設定: Application Gateway のメトリクス監視

Phase 3: 長期(必要に応じて)

  1. internal-only Environment への移行検討: セキュリティ要件がさらに高まった場合
  2. 新規 Environment 作成: internal-only: true で新規作成
  3. テナント移行: 段階的に新 Environment へ移行

目標アーキテクチャ

パイロット導入後

┌─────────────────────────────────────────────────────────────────┐
│ Internet │
└─────────────────────────────┬───────────────────────────────────┘

┌───────────────────┼───────────────────┐
│ │ │
▼ ▼ ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ App Gateway A │ │ (なし) │ │ (なし) │
│ + WAF │ │ │ │ │
│ Public IP │ │ │ │ │
└────────┬────────┘ │ │ │ │
│ │ │ │ │
▼ ▼ ▼ │ │
┌─────────────────────────────────────────────────────────────────┐
│ Container Apps Environment (gx-shared-container-app-env) │
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Tenant A │ │ Tenant B │ │ Tenant C │ │
│ │ │ │ │ │ │ │
│ │ IP制限: │ │ IP制限: │ │ IP制限: │ │
│ │ App GW のみ │ │ 従来通り │ │ 従来通り │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────────────────┘

次のステップ

  1. パイロット対象テナントの選定
  2. Application Gateway Terraform モジュールの作成
  3. WAF ポリシーの設計
  4. dev 環境でのテスト
  5. 本番適用

関連ドキュメント