Kubernetes へのネットワーク アクセスをセキュリティで保護する

Azure Bastion
Azure DNS
Azure Kubernetes Service (AKS)
Azure Private Link
Azure Virtual Network

この記事では、Azure Kubernetes Service (AKS) と Amazon Elastic Kubernetes Service (Amazon EKS) のネットワーク モードを比較します。 この記事では、AKS クラスターのマネージド API サーバーへの接続セキュリティを強化する方法と、パブリック ネットワーク アクセスを制限するためのさまざまなオプションについて説明します。

注意

この記事は、Amazon EKS に詳しいプロフェッショナルの方を対象に、AKS についてわかりやすく説明した連載記事の一部です。

Amazon EKS のネットワーク モード

Amazon Virtual Private Cloud (Amazon VPC) を使用すると、アマゾン ウェブ サービス (AWS) のリソースを、パブリックおよびプライベートのサブネット、または VPC 内の IP アドレスの範囲で構成される仮想ネットワーク内に起動できます。 パブリック サブネットはインターネットに接続する必要があるリソースをホストし、プライベート サブネットはパブリック インターネットに接続されていないリソースをホストします。 Amazon EKS では、パブリックとプライベート両方のサブネットにマネージド ノード グループをプロビジョニングできます。

エンドポイント アクセス制御を使用すると、API Server エンドポイントにパブリック インターネットから到達するか、VPC を介して到達できるかを構成できます。 EKS には、クラスター エンドポイントへのアクセスを制御するいくつかの方法が用意されています。 既定のパブリック エンドポイント、プライベート エンドポイント、または両方のエンドポイントを同時に有効にすることができます。 パブリック エンドポイントを有効にすると、クラスレス ドメイン間ルーティング (CIDR) の制限を追加して、パブリック エンドポイントに接続できるクライアント IP アドレスを制限できます。

Amazon EKS ノードがマネージド Kubernetes コントロール プレーンに接続する方法は、クラスターに対してどのエンドポイント設定が構成されているかによって決まります。 エンドポイント設定は、Amazon EKS コンソールまたは API を使用していつでも変更できます。 詳細については、「Amazon EKS クラスター エンドポイント アクセス コントロール」を参照してください。

パブリック エンドポイントのみ

パブリック エンドポイント経由でコントロール プレーンを公開することは、新しい Amazon EKS クラスターの既定のモードです。 クラスターのパブリック エンドポイントのみが有効になっている場合、Amazon VPC 内から送信される Kubernetes API 要求 (ワーカー ノードからコントロール プレーンへの通信など) は VPC から離れますが、Amazon のネットワークからは離れません。 ノードがコントロール プレーンに接続するには、パブリック IP アドレスとインターネット ゲートウェイへのルート、または NAT ゲートウェイのパブリック IP アドレスを使用できるネットワーク アドレス変換 (NAT) ゲートウェイへのルートを使用する必要があります。

パブリック エンドポイントとプライベート エンドポイント

パブリック エンドポイントとプライベート エンドポイントの両方が有効になっている場合、VPC 内からの Kubernetes API 要求は、VPC の Amazon EKS で管理される Elastic Network Interfaces (ENI) を介してコントロール プレーンと通信します。 クラスター API サーバーにはインターネットからアクセスできます。

プライベート エンドポイントのみ

プライベート エンドポイントのみが有効な場合、クラスター API サーバーへのすべてのトラフィック (kubectlhelm コマンドなど) は、クラスターの VPC または接続されたネットワーク内から送信される必要があります。 インターネットから API サーバーへのパブリック アクセスは無効になっています。 このアクセス モードを実装するには、VPC への AWS 仮想プライベート ネットワーク (AWS VPN) または AWS DirectConnect を使用します。 AWS VPN または DirectConnect を使用せずにエンドポイントへのアクセスを制限するには、パブリック エンドポイントに CIDR 制限を追加して、追加のネットワークを設定せずに接続を制限できます。

接続オプションの詳細については、「プライベート専用 API サーバーへのアクセス」を参照してください。

API サーバーへの AKS ネットワーク アクセス

AKS の Kubernetes API へのネットワーク アクセスをセキュリティで保護するには、プライベート AKS クラスターまたは承認された IP 範囲の 2 つのオプションがあります。

プライベート AKS クラスター

AKS プライベート クラスターを使用すると、API サーバーとノード プール間のネットワーク トラフィックは仮想ネットワーク内に留まります。 プライベート AKS クラスターでは、コントロール プレーンまたは API サーバーに、同じ仮想ネットワーク内にある Azure プライベート エンドポイント経由でのみアクセスできる内部 IP アドレスがあります。 同じ仮想ネットワーク内のすべての仮想マシン (VM) は、プライベート エンドポイントを介してコントロール プレーンとプライベートに通信できます。 コントロール プレーンまたは API サーバーは Azure マネージド サブスクリプションでホストされ、AKS クラスターとそのノード プールはお客様のサブスクリプションにあります。

次の図は、プライベート クラスターの構成を示しています。

プライベート AKS クラスターを示す図。

このアーキテクチャの Visio ファイルをダウンロードします。

プライベート AKS クラスターをプロビジョニングするために、AKS リソース プロバイダーは、ノード リソース グループのプライベート完全修飾ドメイン名 (FQDN) をプライベート DNS ゾーン内に作成します。 必要に応じて、AKS は、Azure パブリック DNS ゾーンに対応するアドレス (A) レコードを持つパブリック FQDN を作成することもできます。 エージェント ノードによりプライベート DNS ゾーンの A レコードが使用され、API サーバーとの通信のためにプライベート エンドポイントのプライベート IP アドレスが解決されます。

AKS リソース プロバイダーでノード リソース グループにプライベート DNS ゾーンを作成することも、ユーザーがプライベート DNS ゾーンを作成してそのリソース ID をプロビジョニング システムに渡すこともできます。 Terraform と AzureBicepARM テンプレートAzure CLIAzure PowerShell モジュール、または Azure REST API を使用してクラスターを作成するときに、プライベート クラスターを作成できます。

プロビジョニング中に、または az aks update コマンドと --enable-public-fqdn パラメーターをと既存のクラスターに使用して、API サーバーのパブリック FQDN を有効にすることができます。 パブリック FQDN を有効にする場合、Azure DevOps セルフホステッド エージェントや GitHub Actions セルフホステッド ランナーなど、サーバーにアクセスするすべての VM は、クラスターをホストするのと同じ仮想ネットワーク内、あるいは仮想ネットワーク ピアリングまたはサイト間 VPN 経由で接続されたネットワーク内に存在する必要があります。

プライベート AKS クラスターの場合、API サーバーのパブリック FQDN を無効にします。 プライベート コントロール プレーンと通信するには、VM が同じ仮想ネットワーク内にあるか、プライベート DNS ゾーンへの仮想ネットワーク リンクを持つピアリングされた仮想ネットワーク内にある必要があります。 プライベート DNS ゾーンの A レコードは、API サーバーの FQDN を、基になるコントロール プレーンと通信するプライベート エンドポイント IP アドレスに解決します。 詳細については、「プライベート Azure Kubernetes Service クラスターを作成する」を参照してください。

プライベート クラスターのデプロイ オプション

AKS リソース プロバイダーは、プライベート AKS クラスターのデプロイをカスタマイズするために、次のパラメーターを公開します。

  • authorizedIpRanges (文字列) は、許可される IP 範囲を CIDR 形式で指定します。
  • disableRunCommand (ブール値) は、クラスターの run コマンドを無効にするかどうかを指定します。
  • enablePrivateCluster (ブール値) は、クラスターをプライベートとして作成するかどうかを指定します。
  • enablePrivateClusterPublicFQDN (ブール値) は、プライベート クラスター用に別のパブリック FQDN を作成するかどうかを指定します。
  • privateDnsZone (文字列) は、ノード リソース グループ内のプライベート DNS ゾーンを指定します。 値を指定しない場合、リソース プロバイダーによってゾーンが作成されます。 次の値を指定できます。
    • 既定値は System です。
    • None は既定でパブリック DNS になるため、AKS ではプライベート DNS ゾーンは作成されません。
    • <Your own private DNS zone resource ID> は、privatelink.<region>.azmk8s.io または <subzone>.privatelink.<region>.azmk8s.io. の形式で作成するプライベート DNS ゾーンを使用します。

次の表は、プライベート AKS クラスターをデプロイするための DNS 構成オプションを示しています。

プライベート DNS ゾーンのオプション enablePrivateClusterPublicFQDN: true enablePrivateClusterPublicFQDN: false
システム エージェント ノード、および AKS クラスター仮想ネットワークまたはプライベート DNS ゾーンに接続されている仮想ネットワーク内の他のすべての VM は、プライベート DNS ゾーン A レコードを使用してプライベート エンドポイントのプライベート IP アドレスを解決します。

その他の VM では、API サーバーのパブリック FQDN が使用されます。
エージェント ノード、および AKS クラスター仮想ネットワークまたはプライベート DNS ゾーンに接続されている仮想ネットワーク内の他のすべての VM は、プライベート DNS ゾーン A レコードを使用してプライベート エンドポイントのプライベート IP アドレスを解決します。

パブリック API サーバーの FQDN は使用できません。
なし エージェント ノードを含むすべての VM は、Azure マネージド パブリック DNS ゾーンの A レコードを介して使用できる API サーバーのパブリック FQDN を使用します。 正しくない構成。 プライベート AKS クラスターには、API サーバーの名前解決のために、少なくともパブリックまたはプライベートの DNS ゾーンが必要です。
<独自のプライベート DNS ゾーンのリソース ID> エージェント ノード、および AKS クラスター仮想ネットワークまたはプライベート DNS ゾーンに接続されている仮想ネットワーク内の他のすべての VM は、プライベート DNS ゾーン A レコードを使用してプライベート エンドポイントのプライベート IP アドレスを解決します。

その他の VM では、API サーバーのパブリック FQDN が使用されます。
エージェント ノード、および AKS クラスター仮想ネットワークまたはプライベート DNS ゾーンに接続されている仮想ネットワーク内の他のすべての VM は、プライベート DNS ゾーン A レコードを使用してプライベート エンドポイントのプライベート IP アドレスを解決します。

パブリック API サーバーの FQDN は使用できません。

プライベート クラスターの接続と管理

プライベート クラスターへのネットワーク接続を確立するには、いくつかの選択肢があります。

同じ仮想ネットワークまたはピアリングされた仮想ネットワーク内の管理 VM から kubectl コマンドライン ツールを使用して、プライベート AKS クラスターを管理できます。

同じ仮想ネットワークまたはピアリングされた仮想ネットワークで Azure Bastion を使用して、ジャンプボックス管理 VM に接続できます。 Azure Bastion は、ブラウザーと Azure portal を使用して VM に接続できるようにするフル マネージドのサービスとしてのプラットフォーム (PaaS) です。 Azure Bastion は、セキュリティで保護されたシームレスなリモート デスクトップ プロトコル (RDP) またはトランスポート層セキュリティ (TLS) 上のセキュア シェル (SSH) VM 接続を、Azure portal から直接提供します。 VM が Azure Bastion 経由で接続される場合、パブリック IP アドレス、エージェント、特別なクライアント ソフトウェアは不要です。

また、az aks command invoke を使用して、ジャンプボックス VM に接続せずに、プライベート AKS クラスターで kubectl または helm コマンドを実行することもできます。

承認された IP 範囲

クラスターのセキュリティを向上させ、API サーバーへの攻撃を最小限に抑えるための 2 つ目のオプションは、承認された IP 範囲を使用することです。 承認された IP は、パブリック AKS クラスターのコントロール プレーンへのアクセスを、既知の IP アドレスと CIDR の一覧に制限します。 このオプションを使用すると、API サーバーは引き続きパブリックに公開されますが、アクセスは制限されます。 詳細については「Azure Kubernetes Service (AKS) で許可された IP アドレス範囲を使用して API サーバーへのアクセスをセキュリティで保護する」を参照してください。

次の az aks update Azure CLI コマンドにより、IP 範囲が承認されます。

 az aks update \
     --resource-group myResourceGroup \
     --name myAKSCluster \
     --api-server-authorized-ip-ranges  73.140.245.0/24

AKS 接続に関する考慮事項

  • AKS プライベート クラスターは、承認された IP よりも高いセキュリティと分離を提供します。 ただし、既存のパブリック AKS クラスターをプライベート クラスターに変換することはできません。 既存の AKS クラスターに対しては承認済み IP を有効にできます。

  • 許可された IP 範囲をプライベート API サーバー エンドポイントに適用することはできません。 承認された IP は、パブリック API サーバーにのみ適用されます。

  • プライベート クラスターでは、Azure DevOps ホステッド エージェントがサポートされません。 セルフホステッド エージェントを使用することを検討してください。

  • Azure Container Registry がプライベート AKS クラスターと連携できるようにするには、クラスター仮想ネットワークにコンテナー レジストリのプライベート リンクを設定します。 または、Container Registry の仮想ネットワークとプライベート クラスターの仮想ネットワークの間にピアリングを設定します。

  • Azure Private Link サービスの制限事項は、プライベート クラスターに適用されます。

  • プライベート クラスターの顧客サブネット内のプライベート エンドポイントを削除または変更すると、クラスターは機能しなくなります。

共同作成者

この記事は、Microsoft によって保守されています。 当初の寄稿者は以下のとおりです。

プリンシパルの作成者:

その他の共同作成者:

  • Chad Kittel | プリンシパル ソフトウェア エンジニア
  • Ed Price | シニア コンテンツ プログラム マネージャー
  • Theano Petersen | テクニカル ライター

パブリックでない LinkedIn プロファイルを表示するには、LinkedIn にサインインします。

次のステップ

次のリファレンスは、セキュリティで保護された API を使用して AKS クラスターをデプロイするためのドキュメントと自動化のサンプルへのリンクです。