ネットワークセキュリティ設計
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 CIDR | 10.0.0.0/16 | Japan East |
| Container Apps Subnet | 10.0.0.0/18 | 16,384 アドレス |
| Environment | gx-shared-container-app-env | internal-only ではない |
| Frontend Ingress | External | Public、インターネット公開 |
| Backend Ingress | External + IP 制限 | Public IP あり、IP でフィルタ |
| Application Gateway | ❌ なし | |
| WAF | ❌ なし |
制約事項
⚠️ 重要:
internal-onlyは Container Apps Environment 作成時のみ設定可能です。既存の Environment を internal-only に変更することはできません。
Container Apps を Private にする方法
| 設定 | 結果 |
|---|---|
ingress.external = false | Public IP なし、Environment 内のみアクセス可能 |
VNet 統合 + internal-only: true | VNet 内のみアクセス可能(完全プライベート) |
Private な Container App をインターネット公開する方法
| 方法 | コスト | 特徴 |
|---|---|---|
| Application Gateway(推奨) | 中 | WAF、パスベースルーティング、SSL終端 |
| Azure Front Door | 高 | グローバル負荷分散、CDN、Private Link 対応 |
| API Management | 高 | API ゲートウェイ、認証、レート制限 |
| 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 ベストプラクティス準拠 | 作業量大 |
推奨ケース: 金融・医療・機密データを扱うシステム
移行手順:
- 新しい VNet + Subnet を作成
- 新しい Container Apps Environment を
internal-only: trueで作成 - Application Gateway を配置
- Container Apps を新 Environment にデプロイ
- DNS/トラフィックを切り替え
- 旧 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
導入手順:
- Application Gateway モジュール作成(Terraform)
- WAF ポリシー設定(OWASP ルールセット)
- Backend Pool 設定(Container Apps の FQDN を登録)
- Container Apps の IP 制限更新(App GW の IP のみ許可)
- 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 のみに変更
理由:
- 既存環境を壊さずにセキュリティ強化できる
- WAF による OWASP Top 10 対策が得られる
- 作業量が現実的
- ダウンタイムなしで導入可能
- 将来の 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 つのテナントの問題が他に影響しない
- 段階的導入: セキュリティ要件の高いテナントから順次導入可能
- 柔軟性: テナントごとに異なる WAF ルールやパス制御を設定可能
- 選択制: セキュリティ強化が不要なテナントは現状維持も可能
導入計画
Phase 1: パイロット導入
- 対象テナント選定: セキュリティ要件の高い 1 テナントを選定
- Application Gateway モジュール作成: Terraform モジュールを開発
- テスト環境で検証: dev 環境で動作確認
- 本番適用: prd 環境に適用
Phase 2: 展開
- 他テナントへの展開: 必要に応じて他テナントに適用
- ドキュメント整備: 運用手順書の作成
- 監視設定: Application Gateway のメトリクス監視
Phase 3: 長期(必要に応じて)
- internal-only Environment への移行検討: セキュリティ要件がさらに高まった場合
- 新規 Environment 作成:
internal-only: trueで新規作成 - テナント移行: 段階的に新 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 のみ │ │ 従来通り │ │ 従来通り │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────────────────┘
次のステップ
- パイロット対象テナントの選定
- Application Gateway Terraform モジュールの作成
- WAF ポリシーの設計
- dev 環境でのテスト
- 本番適用
関連ドキュメント
- ネットワーク構成図 - 現在のネットワーク構成
- アーキテクチャリファレンス - 詳細なアーキテクチャ説明
- RBAC とセキュリティ設定 - RBAC 設定