このガイドでは、 Terraform と Azure DevOps を使用して、ハブアンドスポーク ネットワーク トポロジでプライベート AKS クラスターを作成する方法について説明します。 Azure Firewall は、 Azure Kubernetes Service (AKS) クラスターとの間のトラフィックを検査するために使用されます。 このクラスターは、ハブ仮想ネットワークとピアリングされた 1 つ以上のスポーク仮想ネットワークによってホストされています。
アーキテクチャ
このアーキテクチャの Visio ファイル をダウンロードします。
ワークフロー
Terraform モジュール は、次の 4 つのサブネットをホストする新しい仮想ネットワークをデプロイするために使用されます。
- AKS クラスター (AksSubnet)。
- ジャンプ ボックス仮想マシン (VM) とプライベート エンドポイント (VmSubnet)。
- Application Gateway WAF2 (AppGatewaySubnet)。
- Azure Bastion (AzureBastionSubnet)。
AKS クラスターでは、ユーザー定義のマネージド ID を使用して、Azure 内にロード バランサーやマネージド ディスクなどの追加リソースを作成します。 Terraform モジュールを使用すると、必要に応じて、次の機能を備えた AKS クラスターをデプロイできます。
- Azure ディスクと Azure Files 用の Container Storage Interface (CSI) ドライバー
- AKS マネージド Microsoft Entra の統合
- Kubernetes 認可用 Azure RBAC
- サービス プリンシパルに代わるマネージド ID
- Azure ネットワーク ポリシー
- Azure Monitor Container insights
- Application Gateway イングレス コントローラー
- 動的 IP 割り当てと拡張サブネット サポート
この AKS クラスターは、次のプールで構成されています。
- 重要なシステム ポッドとサービスのみがホストされるシステム ノード プール。
- ユーザー ワークロードと成果物がホストされるユーザー ノード プール。
VM は、AKS クラスターをホストしている仮想ネットワークにデプロイされます。 AKS をプライベート クラスターとしてデプロイする場合、システム管理者はこの VM を使用して、Kubernetes コマンドライン ツールからクラスターを管理できます。 この VM のブート診断ログは、Azure Storage アカウントに格納されます。
Azure Bastion ホストは、SSL 経由でのジャンプボックス VM へのセキュリティで保護された SSH 接続を提供します。 コンテナー イメージと成果物 (Helm チャートなど) を作成、保存、管理するために Azure Container Registry (ACR) が使用されます。
AKS には、クラスターと外部ネットワーク間のイングレス トラフィックとエグレス トラフィックを保護するための組み込みソリューションは提供されていません。
このため、この記事で紹介するアーキテクチャには、 DNAT ルール、ネットワーク ルール、アプリケーション ルールを使用して受信トラフィックと送信トラフィックを制御する Azure Firewall が含まれています。 ファイアウォールは、 脅威インテリジェンス ベースのフィルタリングによってワークロードも保護します。 Azure Firewall と Bastion は、プライベート AKS クラスターをホストしている仮想ネットワークとピアリングされているハブ仮想ネットワークにデプロイされます。 ルート テーブルとユーザー定義ルートは、AKS クラスターから Azure Firewall への送信トラフィックをルーティングします。
Note
高度な脅威保護を提供するため、Azure Firewall の Premium SKU を使用することを強くお勧めします。
Key Vault は、 Microsoft Entra ワークロード ID、 シークレット ストア CSI ドライバー、または Dapr を介してキー、証明書、シークレットを取得するために AKS で実行されるワークロードによってシークレット ストアとして使用されます。 Azure Private Link により、AKS ワークロードは仮想ネットワーク内のプライベート エンドポイント経由で Azure Key Vault などの Azure PaaS サービスにアクセスできるようになります。
トポロジには、次のサービスのプライベート エンドポイントとプライベート DNS ゾーンが含まれます。
AKS クラスターをホストする仮想ネットワークと、前述のプライベート DNS ゾーンの間には、仮想ネットワーク リンクがあります。
Log Analytics ワークスペースを使用して、Azure サービスから診断ログとメトリックを収集します。
コンポーネント
Azure Firewall は、Azure で実行されているクラウド ワークロードに脅威保護を提供する、クラウドネイティブでインテリジェントなネットワーク ファイアウォールのセキュリティ サービスです。 組み込みの高可用性とクラウドの無制限のスケーラビリティを備えた、完全にステートフルなサービスとしてのファイアウォールです。 これは、東西と北南の両方のトラフィック検査を提供します。
Container Registry は、オープンソースの Docker Registry 2.0 が基になっている、マネージド型のプライベート Docker レジストリ サービスです。 既存のコンテナー開発およびデプロイ パイプラインで Azure コンテナー レジストリを使用するか、Container Registry タスクを使用して Azure にコンテナー イメージをビルドすることができます。
Azure Kubernetes Service を使用すると、運用上のオーバーヘッドが Azure にオフロードされるため、Azure でのマネージド Kubernetes クラスターのデプロイが簡素化されます。 Azure で Kubernetes サービスをホストして、正常性の監視や維持などの重要なタスクを処理します。 Kubernetes マスターは Azure によって管理されるので、お客様はエージェント ノードの管理と保守のみを行います。
Key Vault では、API キー、パスワード、証明書、暗号化キーなどのシークレットが、強化されたセキュリティにより格納され、アクセスが制御されます。 また、Key Vault を使用することにより、Azure および内部の接続されているリソースで使用するためのパブリックおよびプライベートのトランスポート層セキュリティまたは Secure Sockets Layer (TLS または SSL) 証明書を容易にプロビジョニング、管理、デプロイできます。
Azure Bastion は、お使いの仮想ネットワーク内でプロビジョニングする、完全に管理されたサービスとしてのプラットフォーム (PaaS) です。 Azure Bastion では、TLS 経由で Azure portal から直接、仮想ネットワーク内の VM への、セキュリティが向上したリモート デスクトップ プロトコル (RDP) および Secure Shell (SSH) 接続が提供されます。
Azure Virtual Machines では、仮想化の柔軟性を提供する、オンデマンドでスケーラブルなコンピューティング リソースが提供されます。
Azure Virtual Network は、Azure のプライベート ネットワークの基本的な構成ブロックです。 Virtual Network により、Azure リソース (VM など) は、強化されたセキュリティにより、他の Azure リソース、インターネット、オンプレミス ネットワークと通信できます。 Azure 仮想ネットワークは、オンプレミスの従来のネットワークと似ていますが、スケーラビリティ、可用性、分離などの Azure インフラストラクチャのメリットが得られます。
Virtual Network インターフェイス により、Azure VM はインターネット、Azure、およびオンプレミスのリソースと通信できます。 1 つの Azure VM に複数のネットワーク インターフェイス カードを追加でき、それにより、子 VM で独自の専用ネットワーク インターフェイス デバイスと IP アドレスを使用できます。
Azure Managed Disks では、Azure VM 上で Azure によって 管理されるブロックレベルのストレージ ボリュームが提供されます。 Ultra ディスク、Premium ソリッドステート ドライブ (SSD)、Standard SSD、Standard ハード ディスク ドライブ (HDD) を使用できます。
Blob Storage は、クラウド用のオブジェクト ストレージ ソリューションです。 Blob Storage は、テキスト データやバイナリ データなどの大量の非構造化データを格納するために最適化されています。
Private Link を使用して、仮想ネットワーク内のプライベート エンドポイント経由で Azure PaaS サービス (Blob Storage、Key Vault など) にアクセスできます。 また、このサービスを使用して、所有している、または Microsoft パートナーによって提供されている Azure ホステッドサービスにアクセスすることもできます。
代替
Azure Firewall ではなく、Azure Marketplace のサードパーティのファイアウォールを使用できます。 この場合、AKS クラスターからの受信トラフィックと送信トラフィックを検査して許可または拒否するようにファイアウォールを適切に構成する必要があります。
シナリオの詳細
AKS クラスターは、管理またはカスタム可能な仮想ネットワーク上にデプロイされます。 いずれにしても、クラスターには仮想ネットワーク外部のサービスに対する送信依存関係があります。 管理と運用の目的で、AKS クラスター ノードは、これらの送信依存関係に関連付けられた特定のポートと完全修飾ドメイン名 (FQDN) にアクセスする必要があります。 これには、独自のクラスターの Kubernetes API サーバーへのアクセス、クラスター コンポーネントのダウンロードとインストール、Microsoft Container Registry からのコンテナー イメージのプルが含まれます。 これらの送信依存関係は FQDN で定義されており、静的アドレスがないため、ネットワーク セキュリティ グループを使用して送信トラフィックをロックダウンすることはできません。 したがって、AKS クラスターには、ノードとサービスが必要に応じて外部リソースにアクセスできるように、既定で無制限の送信 (出力) インターネット アクセスが用意されています。
ただし、実稼働環境では通常、Kubernetes クラスターをデータの流出やその他の望ましくないネットワーク トラフィックから保護することが望ましいです。 受信と送信の両方のネットワーク トラフィックはすべて、セキュリティ ルールに基づいて制御する必要があります。 これを実現するには、定期的なクラスターメンテナンスタスク、アウトバウンド依存関係、ワークロード要件のために必要なポートとアドレスへのアクセスを許可しながら、エグレス トラフィックを制限する必要があります。
簡単な解決策は、ドメイン名に基づいて送信トラフィックを制御できるファイアウォール デバイスを使用することです。 ファイアウォールは、信頼できるネットワークとインターネットの間に障壁を作成します。 Azure Firewall を使用して、送信先の FQDN、プロトコル、ポートに基づいて送信トラフィックを制限し、きめ細かいエグレス トラフィック制御を実現します。 また、AKS クラスターの送信依存関係に関連付けられた FQDN への許可リスト登録も有効になりますが、これはネットワーク セキュリティ グループでは不可能です。 さらに、共有境界ネットワークにデプロイされた Azure Firewall の脅威インテリジェンス ベースのフィルタリングにより、イグレス トラフィックを制御し、セキュリティを強化できます。 このフィルタリングにより、アラートを生成し、既知の悪意のある IP アドレスやドメインとの間のトラフィックを拒否できます。
Terraform および Azure DevOps を使用すれば、ハブアンドスポーク ネットワーク トポロジにプライベート AKS クラスターをデプロイできます。 Azure Firewall は、 Azure Kubernetes Service (AKS) クラスターとの間のトラフィックを検査するために使用されます。 このクラスターは、ハブ仮想ネットワークとピアリングされた 1 つ以上のスポーク仮想ネットワークによってホストされています。
Azure Firewall では、さまざまなお客様のユース ケースと好みに対応するために、3 つの異なる SKU がサポートされています。
- Azure Firewall Premium は、支払処理など、機密性の高いアプリケーションをセキュリティで保護する場合に推奨されます。 マルウェアや TLS 検査などの高度な脅威保護機能がサポートされています。
- Azure Firewall Standard は、レイヤー 3 から レイヤー 7 のファイアウォールを探していて、最大 30 Gbps のピーク トラフィック期間を処理するために自動スケーリングが必要なお客様に推奨されます。 脅威インテリジェンス、DNS プロキシ、カスタム DNS、Web カテゴリなどのエンタープライズ機能がサポートされています。
- Azure Firewall Basic は、スループットのニーズが 250 Mbps 未満のお客様に推奨されます。
次の表は、3 つの Azure Firewall SKUの機能を示しています。 詳細については、「Azure Firewall の価格」を参照してください。
既定で、AKS クラスターは、送信インターネット アクセスが無制限です。 このレベルのネットワーク アクセスでは、AKS クラスターで実行しているノードやサービスから必要に応じて外部リソースにアクセスできます。 エグレス トラフィックを制限する場合は、正常なクラスター メンテナンス タスクを維持するために、アクセスできるポートとアドレスの数を制限する必要があります。 AKS などの Kubernetes クラスターからの送信トラフィックにセキュリティを提供する最も簡単な方法は、ドメイン名に基づいて送信トラフィックを制御できるソフトウェア ファイアウォールを使用することです。 Azure Firewall では、宛先の完全修飾ドメイン名 (FQDN) に基づいて送信 HTTP および HTTPS トラフィックを制限できます。 また、ファイアウォール規則とセキュリティ規則を構成し、これらの必要なポートとアドレスを許可することができます。 詳細については、「AKS でクラスター ノードに対するエグレス トラフィックを制御する」をご覧ください。
同様に、共有境界ネットワークにデプロイされた Azure Firewall で 脅威インテリジェンスベースのフィルター処理 を有効にすることで、イングレス トラフィックを制御し、セキュリティを強化することができます。 このフィルター処理では、既知の悪意のある IP アドレスとドメインとの間のアラートを提供し、トラフィックを拒否することができます。
考えられるユース ケース
このシナリオでは、Kubernetes クラスターとの間の受信トラフィックと送信トラフィックのセキュリティを強化する必要性について説明します。
非対称ルーティングを回避する
このソリューションでは、ハブ仮想ネットワークに Azure Firewall がデプロイされ、スポーク仮想ネットワークにプライベート AKS クラスターがデプロイされます。 Azure Firewall は、ネットワークおよびアプリケーションのルール コレクションを使用してエグレス トラフィックを制御します。 このような状況では、AKS で実行されている任意のサービスによって公開されているすべてのパブリック エンドポイントへのイングレス トラフィックを構成して、Azure Firewall で使用されるパブリック IP アドレスのいずれかを介してシステムに入る必要があります。
パケットはファイアウォールのパブリック IP アドレスに到着しますが、プライベート IP アドレス経由でファイアウォールに戻ります (既定のルートが使用されます)。 これは問題です。 これを回避するには、次の図に示すように、ファイアウォールのパブリック IP アドレスに対して、別のユーザー定義ルートを作成します。 ファイアウォールのパブリック IP アドレスに到着するパケットは、インターネット経由でルーティングされます。 この構成により、ファイアウォールのプライベート IP アドレスへの既定ルートの使用が回避されます。
AKS ワークロードのトラフィックをハブ仮想ネットワーク内の Azure Firewall にルーティングするには、次のことを行う必要があります。
- クラスターのワーカー ノードをホストする各サブネットにルート テーブルを作成して関連付けます。
- 0.0.0.0/0 CIDR のトラフィックを Azure Firewall のプライベート IP アドレスに転送するユーザー定義ルートを作成します。 [ネクスト ホップの種類]として [仮想アプライアンス] を指定します。
詳細については、「チュートリアル:Deploy and configure Azure Firewall using the Azure portal (チュートリアル: Azure portal を使用して Azure Firewall のデプロイと構成を行う)」を参照してください。
詳細については次を参照してください:
- Azure Firewall を使用して AKS クラスターからのエグレス トラフィックを制限する
- Azure Firewall と Azure Standard Load Balancer を統合する
Azure DevOps を使用する場合のワークロードのプライベート AKS クラスターへのデプロイ
Azure DevOpsを使用する場合、 Azure DevOps Microsoft ホステッド エージェント を使用して、プライベート AKS クラスターにワークロードをデプロイすることはできないことにご注意ください。 それらは API サーバーにアクセスできません。 プライベート AKS クラスターにワークロードをデプロイするには、プライベート AKS クラスターと同じ仮想ネットワークまたはピアリングされた仮想ネットワーク内で Azure DevOps セルフホステッド エージェント をプロビジョニングして使用する必要があります。 後者の場合は、ノード リソース グループ内の AKS クラスターのプライベート DNS ゾーンと、Azure DevOps セルフホステッド エージェントをホストする仮想ネットワークとの間に仮想ネットワーク リンクを作成してください。
仮想マシンに単一の Windows または Linux Azure DevOps エージェントをデプロイすることも、仮想マシン スケール セットを使用することもできます。 詳細については、「Azure 仮想マシン スケール セット エージェント」を参照してください。 また、Docker を使用して Windows Server Core コンテナー (Windows ホストの場合) または Ubuntu コンテナー (Linux ホストの場合) 内で実行するセルフホステッド エージェントを Azure Pipelines に設定することもできます。 プライベート AKS クラスターに 1 つ以上のレプリカを含むポッドとしてデプロイします。 詳細については、次のトピックを参照してください。
プライベート AKS クラスターのノード プールをホストするサブネットが、ルート テーブルとユーザー定義ルートを介して Azure Firewall にエグレス トラフィックをルーティングするように構成されている場合は、必ずアプリケーションおよびネットワークの適切なルールを作成してください。 これらのルールでは、エージェントが外部サイトにアクセスして、 Docker、 Kubectl、 Azure CLI、 Helm などのツールをエージェント仮想マシンにダウンロードしてインストールできる必要があります。 詳細については、「Docker でセルフホステッド エージェントを実行する」を参照してください。
または、AKS クラスターをホストしている仮想ネットワーク内またはピアリングされた仮想ネットワーク内に マネージド DevOps プール (MDP) を構成することもできます。 マネージド DevOps プールにより、開発チームは特定のニーズに合わせてカスタマイズされた Azure DevOps エージェント プールを作成できるようになります。 セキュリティのベスト プラクティスを実装し、コストとパフォーマンスのバランスをとるオプションを提供し、一般的なシナリオのパスを提供し、カスタム プールの作成と維持にかかる時間を大幅に短縮します。 詳細については、「Microsoft Managed DevOps Pools アーキテクチャの概要」を参照してください。
仮想ネットワーク内のマネージド DevOps プールからエージェントを追加することで、CI/CD パイプラインがプライベート AKS クラスターの Kubernetes API サーバーと対話し、パブリック ネットワーク アクセスが無効になっており、同じ仮想ネットワークまたはピアリングされたネットワークで定義されたプライベート エンドポイント経由でのみアクセスできる Azure リソース (Azure Container Registry など) にアクセスできるようになります。 詳細については、「マネージド DevOps プールのネットワークを構成する」を参照してください。
パブリック Standard Load Balancer の前で Azure Firewall を使用する
Terraform モジュール のリソース定義では、 ライフサイクル メタ引数を使用して、Azure リソースが Terraform コントロールの外部で変更された場合のアクションをカスタマイズします。 ignore_changes 引数は、タグなどの指定されたリソース プロパティの更新を無視するように Terraform に指示するために使用されます。 Azure Firewall ポリシー リソース定義にはライフサイクル ブロックが含まれているので、ルール コレクションまたは単一のルールが作成、更新、または削除された場合に Terraform がリソースを更新できません。 同様に、Azure ルート テーブルにはライフサイクル ブロックが含まれているので、ユーザー定義ルートの作成、削除、または更新時に Terraform がリソースを更新することはできません。 これにより、Azure Firewall ポリシーの DNAT、アプリケーション、およびネットワークのルールと、Terraform コントロールの外部にある Azure ルート テーブルのユーザー定義ルートを管理できます。
この記事に関連付けられているサンプル には、 セルフホステッド エージェントで実行される Azure DevOps パイプライン を使用して、プライベート AKS クラスターにワークロードをデプロイする方法を示す、 Azure DevOps CD パイプライン が含まれています。 このサンプルでは、パブリック Helm チャートを使用して Bitnami redmine プロジェクト管理 Web アプリケーションをデプロイします。 次の図は、サンプルのネットワーク トポロジを示しています。
メッセージ フローを次に示します。
- AKS でホストされる Web アプリケーションに対する要求は、パブリック IP 構成を介して Azure Firewall によって公開されるパブリック IP に送信されます。 パブリック IP とパブリック IP 構成は両方ともこのワークロード専用です。
- Azure Firewall DNAT ルール では、Azure Firewall パブリック IP アドレスとポートを、ノード リソース グループ内の AKS クラスターの Kubernetes パブリック Standard Load Balancer 内のワークロードによって使用されるパブリック IP とポートに変換します。
- ロード バランサーは、AKS クラスターのいずれかのエージェント ノードで実行されている Kubernetes サービス ポッドの 1 つに要求を送信します。
- 応答メッセージは、ユーザー定義ルートを介して元の呼び出し元に送り返されます。 Azure Firewall パブリック IP はアドレス プレフィックスで、 インターネット は ネクスト ホップ タイプです。
- ワークロードによって開始された送信呼び出しは、既定のユーザー定義ルートによって Azure Firewall のプライベート IP アドレスにルーティングされます。 0.0.0.0/0 はアドレス プレフィックスで、 仮想アプライアンス は ネクスト ホップ タイプです。
詳細については、「AKS クラスターのパブリック Standard Load Balancer の前で Azure Firewall を使用する」を参照してください。
内部 Standard Load Balancer の前で Azure Firewall を使用する
この記事に関連付けられている サンプル では、ASP.NET Core アプリケーションは AKS クラスターによってサービスとしてホストされ、 NGINX イングレス コントローラーによって前面に表示されます。 NGINX イングレス コントローラー は、AKS クラスターをホストするスポーク仮想ネットワーク内にプライベート IP アドレスを持つ内部ロード バランサーを介して公開されます。 詳細については、「AKS で内部の仮想ネットワークにイングレス コントローラーを作成する」を参照してください。 NGINX イングレス コントローラー (より一般的には LoadBalancer
または ClusterIP
サービス) をデプロイするときに、メタデータ セクションの service.beta.kubernetes.io/azure-load-balancer-internal: "true"
注釈を使用して、ノード リソース グループの下に kubernetes-internal
という内部標準ロードバランサーが作成されます。 詳細については、「AKS で内部ロード バランサーを使用する」を参照してください。 次の図に示すように、テスト Web アプリケーションは、専用の Azure パブリック IP 経由で Azure Firewall によって公開されます。
メッセージ フローを次に示します。
- AKS でホストされるテスト Web アプリケーションに対する要求は、パブリック IP 構成を介して Azure Firewall によって公開されるパブリック IP に送信されます。 パブリック IP とパブリック IP 構成は両方ともこのワークロード専用です。
- Azure Firewall DNAT ルール では、Azure Firewall パブリック IP とポートを、ノード リソース グループ内の AKS クラスターの内部 Standard Load Balancer 内の NGINX イングレス コントローラーによって使用されるパブリック IP とポートに変換します。
- 要求は内部ロード バランサーによって、AKS クラスターのいずれかのエージェント ノードで実行されている Kubernetes サービス ポッドの 1 つに送信されます。
- 応答メッセージは、ユーザー定義ルートを介して元の呼び出し元に送り返されます。 0.0.0.0/0 はアドレス プレフィックスで、 仮想アプライアンス は ネクストホップタイプです。
- ワークロードによって開始された送信呼び出しは、ユーザー定義ルートのプライベート IP アドレスにルーティングされます。
詳細については、「内部 Standard Load Balancer の前で Azure Firewall を使用する」を参照してください。
考慮事項
以降の考慮事項には、ワークロードの品質向上に使用できる一連の基本原則である Azure "Well-Architected Framework" の要素が組み込まれています。 詳細については、「Microsoft Azure Well-Architected Framework」を参照してください。
次の考慮事項の一部は、AKS クラスターの保護を向上させるために Azure Firewall を使用する場合に固有ではない一般的な推奨事項です。 これらは、このソリューションの不可欠な要件だと考えています。 これは、セキュリティ、パフォーマンス、可用性と信頼性、ストレージ、サービス メッシュ、監視に関する考慮事項に適用されます。
セキュリティ
セキュリティは、重要なデータやシステムの意図的な攻撃や悪用に対する保証を提供します。 詳細については、「セキュリティの重要な要素の概要」を参照してください。
Azure プラットフォームは、ネットワーク侵入や分散型サービス拒否 (DDoS) 攻撃など、さまざまな脅威に対する保護を強化します。 パブリック HTTPS エンドポイントを公開する AKS でホストされる Web アプリケーションとサービスを保護するには、Web アプリケーション ファイアウォール (WAF) を使用する必要があります。 SQL インジェクション、クロスサイト スクリプティング、その他の Web エクスプロイトなど、一般的な脅威からの保護を提供する必要があります。 これを行うには、Open Web Application Security Project (OWASP) ルールとカスタム ルールを使用します。 Azure Web Application Firewall では、一般的な悪用や脆弱性から Web アプリケーションを一元的に保護します。 Azure WAF は、 Azure Application Gateway、 Azure Front Door、 Azure Content Delivery Networkを使用してデプロイできます。
DDoS 攻撃は、アプリケーションをクラウドに移行する組織が直面する最大の可用性とセキュリティの問題の 1 つです。 DDoS 攻撃では、アプリケーションのリソースを使い果たし、正当なユーザーがアプリケーションを使用できなくなるようにすることが試みられます。 DDoS 攻撃は、インターネット経由で一般に到達可能なすべてのエンドポイントが標的になり得ます。 Azure のすべてのプロパティには、追加コストなしで、Azure DDoS インフラストラクチャ保護を介した保護が含まれています。 グローバルにデプロイされる Azure ネットワークのスケールと容量が、常時有効なトラフィック監視とリアルタイムのリスク軽減によって、一般的なネットワーク層攻撃からの強化された保護を提供します。 DDoS インフラストラクチャ保護には、ユーザーの構成もアプリケーションの変更も不要です。 これは、Azure DNS などの PaaS サービスを含むすべての Azure サービスの保護に役立ちます。
Azure DDoS ネットワーク保護では、アプリケーションの設計に関するベスト プラクティスと組み合わせることにより、DDoS 攻撃からの保護を向上させるための強化された DDoS 軽減機能が提供されます。 すべての境界仮想ネットワークで Azure DDOS ネットワーク保護 を有効にする必要があります。
セキュリティに関するその他の考慮事項を次に示します。
- Key Vault、Azure Service Bus、Azure SQL Database など、AKS ワークロードで使用されるあらゆる PaaS サービスのために プライベート エンドポイント を作成します。 アプリケーションとこれらのサービスの間のトラフィックはパブリック インターネットに公開されません。 AKS クラスター仮想ネットワークとプライベート エンドポイントを介した PaaS サービスのインスタンス間のトラフィックは、Microsoft のバックボーン ネットワークを経由しますが、通信は Azure Firewall によって渡されません。 このメカニズムにより、セキュリティが向上し、データ漏えいに対する保護が強化されます。 詳細については、「Azure Private Link とは」を参照してください。
- AKS クラスターの前で Application Gateway を使用する場合、 Web Application Firewall ポリシー を使用して、AKS 上で実行される一般向けワークロードを攻撃から保護します。
- ネットワーク ポリシーを使用し、相互に通信できるコンポーネントを制御することにより、サービス内通信を分離し、セキュリティで保護します。 既定では、Kubernetes クラスター内のすべてのポッドでは制限なしにトラフィックを送受信できます。 セキュリティ向上のため、Azure ネットワーク ポリシーまたは Calico ネットワーク ポリシーを使用して、異なるマイクロサービス間のトラフィック フローを制御するルールを定義できます。 詳細については、「ネットワーク ポリシー」を参照してください。
- AKS ノードへのリモート接続は公開しないでください。 管理仮想ネットワーク内に踏み台ホスト (jump box) を作成します。 bastion ホストを使用して、AKS クラスターにトラフィックをルーティングします。
- 運用環境で プライベート AKS クラスター を使用することを検討するか、少なくとも AKS で 許可された IP アドレスの範囲 を使用して API サーバーへのアクセスをセキュリティで保護します。 パブリック クラスターで許可された IP アドレス範囲を使用する場合は、Azure Firewall ネットワーク ルール コレクション内のすべてのエグレス IP アドレスを許可します。 クラスター内操作では、Kubernetes API サーバーが使用されます。
- Azure Firewall で DNS プロキシ を有効にした場合、Azure Firewall は 1 つ以上の仮想ネットワークから選択した DNS サーバーに DNS クエリを処理および転送できます。 この機能は非常に重要であり、ネットワーク ルールで信頼性の高い FQDN フィルタリングを行うために必要です。 Azure Firewall とファイアウォール ポリシーの設定で DNS プロキシを有効にすることができます。 DNS プロキシ ログの詳細については、「Azure Firewall ログとメトリック」を参照してください。
- Application Gatewayの前で Azure Firewall を使用する場合は、HTTPS 経由でワークロードを公開するように Kubernetes イングレス リソースを構成し、テナントごとに個別のサブドメインとデジタル証明書を使用できます。 Application Gateway イングレス コントローラー (AGIC) により、Secure Sockets Layer (SSL) 終端用の Application Gateway リスナーが自動的に構成されます。
- NGINX イングレス コントローラーなどのサービス プロキシの前で、Azure Firewall を使用できます。 このコントローラーは、リバース プロキシ、構成可能なトラフィック ルーティング、Kubernetes サービスの TLS 終端を提供します。 個別の Kubernetes サービスのイングレス ルールとルートを構成するには、Kubernetes イングレス リソースが使われます。 イングレス コントローラーとイングレス ルールを使用することにより、1 つの IP アドレスを使用して、Kubernetes クラスター内の複数のサービスにトラフィックをルーティングできます。 TLS 証明書は、認識された証明機関を使用して生成できます。 また、Let's Encrypt を使用して、 動的パブリック IP アドレスまたは静的パブリック IP アドレスを指定し、TLS 証明書を自動的に作成することもできます。 詳細については、「HTTPS イングレス コントローラーを作成し、AKS で独自の TLS 証明書を使用する」を参照してください。
- Azure Firewall オペレーターと、クラスターおよびワークロード チームの間では、初期クラスターのデプロイと、ワークロードとクラスターのニーズの進化に伴う継続的な方法の両方で、厳密な調整が必要です。 これは、 OAuth 2.0 や OpenID Connect など、クライアントを認証するためにワークロードによって使用される認証メカニズムを構成する場合に特に当てはまります。
- この記事で説明されている環境をセキュリティで保護するには、次のガイドラインに従います。
高可用性と信頼性
信頼性により、顧客に確約したことをアプリケーションで確実に満たせるようにします。 詳細については、「信頼性の重要な要素の概要」を参照してください。
ここでの可用性と信頼性に関する考慮事項は、AKS のマルチテナントに固有の考慮事項ではありません。 これらは、このソリューションの不可欠な要件だと考えています。 AKS クラスターとワークロードの可用性を最適化するには、次の方法を検討してください。
リージョン内の回復性
- デプロイ時に、可用性を高めるために Azure Firewall が複数の可用性ゾーンにまたがるように構成できます。 アップタイムの割合については、Azure Firewall SLA を参照してください。 また、この構成は SLA に影響しますが、近接性のために Azure Firewall を特定のゾーンに関連付けることもできます。 アベイラビリティ ゾーンに展開されたファイアウォールには、可用性ゾーン間データ転送を含め、追加コストはかかりません。
- リージョン内のすべての 可用性ゾーン に AKS クラスターのノード プールをデプロイします。 ノード プールの前で Azure Standard Load Balancer または Application Gateway を使用します。 このトポロジでは、データセンターが 1 つ停止した場合の回復性が向上します。 クラスター ノードは 1 つのリージョンに含まれている 3 つの別個の可用性ゾーンにある、複数のデータセンターにまたがって分散されます。
- リージョン内の回復性と高可用性を実現するため、 Container Registry のゾーン冗長 を有効にします。
- ポッド トポロジの分散制約 を使用して、リージョン、可用性ゾーン、ノードなどの障害ドメイン間でポッドを AKS クラスター全体に分散する方法を制御します。
- ミッション クリティカルなワークロードがホストされる AKS クラスターには、アップタイム SLA の使用を検討します。 アップタイム SLA は、クラスターに対して利用料金に基づく高い SLA を実現するためのオプションの機能です。 アップタイム SLA では、可用性ゾーンを使用するクラスターに対して、Kubernetes API サーバー エンドポイントの高可用性が保証されます。 可用性ゾーンを使用しないクラスターでも使用できますが、SLA は低くなります。 SLA の詳細については、「アップタイム SLA」を参照してください。 AKS は、更新ドメインおよび障害ドメイン全体でマスター ノード レプリカを使用して、SLA 要件が満たされるようにします。
ディザスター リカバリーと事業継続
- 1 つの地域内の少なくとも 2 組の Azure リージョン ペア にソリューションをデプロイすることを検討します。 事業継続とディザスター リカバリーを保証するために、”アクティブ/アクティブ”または”アクティブ/パッシブ”のルーティング方法により、 Azure Traffic Manager または Azure Front Door などのグローバル ロード バランサーを使用します。
- Azure Firewall はリージョン サービスです。 2 つ以上のリージョンにソリューションをデプロイする場合は、各リージョンに Azure Firewall を作成する必要があります。 グローバルの Azure Firewall ポリシーを作成して、すべてのリージョン ハブに適用される組織に必須のルールを含めることができます。 このポリシーは、リージョン Azure ポリシーの親ポリシーとして使用できます。 空ではない親ポリシーを使って作成されたポリシーは、親ポリシーからすべてのルール コレクションを継承します。 親ポリシーから継承されたネットワーク ルール コレクションは、新しいポリシーの一部として定義されているネットワーク ルール コレクションより常に優先されます。 この同じロジックがアプリケーション ルール コレクションに適用されます。 ただし、ネットワーク ルール コレクションは、継承に関係なく、常にアプリケーション ルール コレクションより先に処理されます。 Standard および Premium のポリシーの詳細については、「Azure Firewall Manager ポリシーの概要」を参照してください。
- QA 環境でリージョン内のフェールオーバー プロセスのスクリプト化、文書化、定期テストを行ってください。 これにより、コア サービスがプライマリ リージョンの停止の影響を受ける場合に、予期しない問題を回避できます。 また、これらのテストは、DR アプローチが RPO または RTO ターゲットを満たしているかを、フェールオーバーに必要となる最終的な手動のプロセスおよび介入と組み合わせて検証します。
- フェールバック プロシージャをテストして、想定した動作を検証してください。
- コンテナー イメージを Container Registry に格納します。 レジストリを各 AKS リージョンに geo レプリケートします。 詳細については、「Azure Container Registry の geo レプリケーション」を参照してください。
- 可能であれば、コンテナーにサービス状態を格納しないようにします。 代わりに、マルチリージョン レプリケーションをサポートする Azure PaaS を使用します。
- Azure Storage を使用する場合は、ストレージをプライマリ リージョンからバックアップ リージョンに移行するプロセスをテストします。
オペレーショナル エクセレンス
オペレーショナル エクセレンスは、アプリケーションをデプロイし、それを運用環境で実行し続ける運用プロセスをカバーします。 詳細については、「オペレーショナル エクセレンスの重要な要素の概要」を参照してください。
DevOps
- 継続的インテグレーションと継続的デリバリー (CI/CD) パイプラインで Helm チャートを使用して、ワークロードを AKS にデプロイします。 GitHub Actions または Azure DevOps などの DevOps システムを使用します。 詳細については、「Azure Kubernetes Service へのビルドとデプロイ」を参照してください。
- ユーザーによる使用を可能にする前にアプリケーションを適切にテストするには、アプリケーション ライフサイクル管理で A/B テストとカナリア デプロイを使用します。 同じサービスの異なるバージョン間でトラフィックを分割するために使用できる手法はいくつかあります。 別の方法として、サービス メッシュの実装によって提供されるトラフィック分割機能を使用することもできます。 詳細については、「Linkerd Traffic Split 」および「Istio Traffic Management」を参照してください。
- Azure Container Registry または別のコンテナー レジストリ (Docker Hub など) を使用して、クラスターにデプロイされているプライベート Docker イメージを格納します。 AKS では、その Microsoft Entra ID を使って Azure Container Registry に対して認証できます。
- 実稼働環境のネットワーク トポロジとファイアウォール規則をミラー化する別の実稼働前環境で、ワークロードのイングレスとエグレスをテストします。 段階的なロールアウト戦略は、新しい機能またはネットワーク ルールを実稼働環境にリリースする前に、ネットワークまたはセキュリティの問題を検出するのに役立ちます。
監視
Azure Firewall は、ファイアウォールによる受信および送信トラフィックをログ記録に関して、Azure Monitor と完全に統合されています。 詳細については、「Azure Firewall の脅威インテリジェンスベースのフィルター処理」を参照してください。
次の監視に関する考慮事項は、AKS のマルチテナントに固有の考慮事項ではありません。ただし、このソリューションに不可欠な要件と考えられています。
- Container insights を使用して、AKS クラスターとワークロードの正常性状態を監視します。
- 診断ログとメトリックを収集するために、すべての PaaS サービス (Container Registry または Key Vault など) を構成します。
コストの最適化
結果として得られるアーキテクチャのコストは、次のような構成の詳細によって異なります。
- サービス階層
- スケーラビリティ (特定の需要をサポートするためにサービスによって動的に割り当てられるインスタンスの数)
- 自動化スクリプト
- ディザスター リカバリー レベル
これらの構成の詳細を評価した後、 Azure 料金計算ツール を使用してコストを見積もります。 価格最適化オプションの詳細については、Microsoft Azure Well-Architected フレームワークの「コスト最適化の原則」を参照してください。
このシナリオのデプロイ
このシナリオのソース コードは、 GitHubで入手できます。 このソリューションはオープンソースであり、 MIT ライセンスで提供されます。
前提条件
オンライン デプロイの場合は、Azure アカウントが必要です。 お持ちでない場合は、開始する前に 無料の Azure アカウント を作成してください。 Azure DevOps を使用して Terraform モジュールをデプロイする前に、次の要件を満たす必要があります。
- Terraform 状態ファイルを Azure ストレージ アカウントに格納します。 ストレージ アカウントを使用してリモートの Terraform 状態、状態ロック、保存時の暗号化を格納する方法の詳細については、「Terraform 状態を Azure Storage に格納する」を参照してください。
- Azure DevOps プロジェクトを作成します。 詳細については、「Azure DevOps でのプロジェクトの作成」を参照してください。
- Azure サブスクリプションへの Azure DevOps サービス接続 を作成します。 サービス接続を作成するときに、サービス プリンシパル認証 (SPA) または Azure マネージド サービス ID を使用できます。 いずれの場合も、Azure サブスクリプションへの接続に Azure DevOps によって使用されるサービス プリンシパルまたはマネージド ID に、サブスクリプション全体の所有者ロールが割り当てられている必要があります。
Azure へのデプロイ
Azure サブスクリプション情報を用意します。
ワークベンチ GitHub リポジトリを複製します。
git clone https://github.com/Azure-Samples/private-aks-cluster-terraform-devops.git
README.md ファイルに記載されている手順に従います。
共同作成者
この記事は、Microsoft によって保守されています。 当初の寄稿者は以下のとおりです。
プリンシパル作成者:
- Paolo Salvatori | プリンシパル サービス エンジニア
パブリックでない LinkedIn プロファイルを表示するには、LinkedIn にサインインします。
次のステップ
Microsoft Azure Well-Architected フレームワーク の AKS の推奨事項とベスト プラクティスを確認します。
Azure Firewall
- Azure Firewall とは
- Azure Firewall ポリシー ルール セット
- Azure Firewall 規則を構成する
- Azure Firewall DNS プロキシの詳細
- Azure Firewall Premium の機能
- Azure Firewall の脅威インテリジェンスベースのフィルター処理
Azure Kubernetes Service
- プライベート Azure Kubernetes Service クラスターを作成する
- マルチテナント機能とクラスターの分離に関するベスト プラクティス
- Azure Kubernetes Service (AKS) での基本的なスケジューラ機能に関するベスト プラクティス
- スケジューラの高度な機能に関するベスト プラクティス
- 認証と認可に関するベスト プラクティス
- Azure Kubernetes Service (AKS) でのクラスターのセキュリティとアップグレードに関するベスト プラクティス
- Azure Kubernetes サービス (AKS) でのコンテナー イメージの管理とセキュリティに関するベスト プラクティス
- Azure Kubernetes Service (AKS) でのネットワーク接続とセキュリティに関するベスト プラクティス
- Azure Kubernetes Services (AKS) のストレージとバックアップに関するベスト プラクティス
- Azure Kubernetes Service (AKS) での事業継続とディザスター リカバリーに関するベスト プラクティス
- Azure Kubernetes Service (AKS) Day 2 Operations ガイド
関連リソース
アーキテクチャに関するガイダンス
- Azure Kubernetes Service (AKS) ソリューションの体験
- AKS クラスターのベスト プラクティス
- Azure Kubernetes Service (AKS) Day 2 Operations ガイド
- エッジ コンピューティングのオプションで Kubernetes を選択する