編集

次の方法で共有


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 サーバーへの接続セキュリティを強化する方法と、パブリック ネットワーク アクセスを制限するためのさまざまなオプションについて説明します。

Note

この記事は、Amazon EKS に詳しいプロフェッショナルの方が Azure Kubernetes Service (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 サーバーにはインターネットからアクセスできます。

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

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

クラスターの Kubernetes API サーバー エンドポイントのパブリック アクセスを無効にしている場合は、次のいずれかの方法で Kubernetes API サーバー エンドポイントにアクセスできます。

  • 接続されたネットワーク: AWS トランジットゲートウェイ またはその他の 接続オプションを使用してネットワークを VPC に接続 し、接続されたネットワーク内のコンピューターを使用します。 Amazon EKS コントロール プレーン セキュリティ グループに、接続されたネットワークからのポート 443 のイングレス トラフィックを許可する規則が含まれていることを確認する必要があります。
  • amazon EC2 bastion ホスト : Amazon EC2 インスタンスをクラスターの VPC 内のパブリック サブネットに起動し、SSH 経由でそのインスタンスにログインして、kubectl コマンドを実行できます。 詳細については、AWS Linux bastion ホストを参照してください。 Amazon EKS コントロール プレーン セキュリティ グループに、要塞ホストからのポート 443 のイングレス トラフィックを許可する規則が含まれていることを確認する必要があります。 詳細については、「クラスターの Amazon EKS セキュリティ グループの要件を表示する」を参照してください。 要塞ホストの kubectl を構成するときは、クラスターの RBAC 構成に既にマップされている AWS 資格情報を使用するか、エンドポイントのパブリック アクセスを削除する前に、要塞が RBAC 構成に使用する IAM プリンシパル を追加してください。 詳細については、「IAM ユーザーとロールに Kubernetes API へのアクセスを許可し、未承認またはアクセス拒否 (kubectl) する」を参照してください。
  • AWS Cloud9 IDE: AWS Cloud9 は、ブラウザーだけでコードを記述、実行、デバッグできるクラウドベースの統合開発環境 (IDE) です。 クラスターの VPC に AWS Cloud9 IDE を作成し、IDE を使用してクラスターと通信できます。 詳細については、「AWS Cloud9での環境の作成」を参照してください。 Amazon EKS コントロール プレーン セキュリティ グループに、IDE セキュリティ グループからのポート 443 のイングレス トラフィックを許可する規則が含まれていることを確認する必要があります。 詳細については、「クラスターの Amazon EKS セキュリティ グループの要件を表示する」を参照してください。 AWS Cloud9 IDE の kubectl を構成するときは、クラスターの RBAC 構成に既にマップされている AWS 資格情報を使用するか、エンドポイントのパブリック アクセスを削除する前に、IDE で使用する IAM プリンシパルを RBAC 構成に追加してください。 詳細については、「IAM ユーザーとロールに Kubernetes API へのアクセスを許可し、未承認またはアクセス拒否 (kubectl) する」を参照してください。

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

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

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

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

プライベート AKS クラスター により、API サーバーとエージェント ノード間のネットワーク トラフィックが仮想ネットワーク内に残ります。 プライベート AKS クラスターでは、コントロール プレーンまたは API サーバーには、RFC1918 - プライベート インターネット のアドレス割り当てに関するドキュメントで定義されている内部 IP アドレスがあります。 プライベート クラスターを使用すると、API サーバーとノード プール間のネットワーク トラフィックがプライベート ネットワーク上にのみ残ることを確認できます。

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

プライベート AKS クラスターをプロビジョニングすると、AKS は既定でプライベート DNS ゾーンを持つプライベート FQDN と、Azure パブリック DNS 内の対応する A レコードを持つ追加のパブリック FQDN を作成します。 エージェント ノードは、引き続きプライベート DNS ゾーンの A レコードを使用して、API サーバーへの通信用のプライベート エンドポイントのプライベート IP アドレスを解決します。

次の図は、プライベート 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 は使用できません。

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

プライベート AKS クラスターでは、API サーバー エンドポイントにパブリック IP アドレスがありません。 プライベート クラスターへのネットワーク接続を確立するには、いくつかのオプションがあります。

  1. --vnet-name フラグを指定した az vm create コマンドを使用して、AKS クラスターと同じ仮想ネットワーク内に仮想マシンを作成します。
  2. 別の仮想ネットワークで仮想マシンを使用し、AKS クラスター仮想ネットワーク 仮想ネットワーク ピアリング を設定します。
  3. クラスター仮想ネットワークに接続するように Azure ExpressRoute または VPN を構成します。
  4. 別の仮想ネットワーク内に Azure プライベート エンドポイント 接続を作成します。
  5. クラスターの API サーバーに接続されているサブネットにデプロイされた Cloud Shell インスタンスを使用します。

Azure CLI を使用すると、az aks コマンド invoke コマンドを使用して、VPN または Express Route を構成することなくプライベート クラスターにアクセスできます。 このコマンドを使用すると、Azure API を介してプライベート クラスターで kubectlhelmなどのコマンドをリモートで呼び出すことができます。クラスターに直接接続する必要はありません。 command invokeを使用するには、Microsoft.ContainerService/managedClusters/runcommand/actionMicrosoft.ContainerService/managedclusters/commandResults/read アクションに必要なアクセス許可を設定する必要があります。

Azure portal では、Run command 機能を利用して、プライベート クラスターでコマンドを実行できます。 この機能では、実際には command invoke 機能を使用して、クラスターでコマンドを実行します。 Run command 機能によって作成されたポッドには、クラスターを管理するための kubectl および helm ツールが用意されています。 さらに、jqxargsgrepawk などのツールを使用して Bash をサポートしています。

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

API Server VNet 統合

API Server VNet 統合を使用して構成された Azure Kubernetes Service (AKS) クラスター、AKS がデプロイされている VNet 内の委任されたサブネットに API サーバー エンドポイントを直接投影します。 API Server VNet 統合により、プライベート リンクやトンネルを必要とせずに、API サーバーとクラスター ノード間のネットワーク通信が可能になります。 API サーバーは、委任されたサブネット内の内部ロード バランサー VIP の背後にあり、ノードが利用するように構成されています。 API Server VNet 統合を使用すると、API サーバーとノード プール間のネットワーク トラフィックがプライベート ネットワークのみに残ることを確認できます。

コントロール プレーンまたは API サーバーは、AKS で管理される Azure サブスクリプション内にあります。 クラスターまたはノード プールが Azure サブスクリプションに含まれています。 クラスター ノードを構成するサーバーと仮想マシンは、委任されたサブネットに投影される API サーバー VIP とポッド IP を介して相互に通信できます。

API Server VNet 統合は、パブリック クラスターまたはプライベート クラスターでサポートされています。 クラスターのプロビジョニング後にパブリック アクセスを追加または削除できます。 VNet 以外の統合クラスターとは異なり、エージェント ノードは常に、DNS を使用せずに API サーバー内部ロード バランサー (ILB) IP のプライベート IP アドレスと直接通信します。 すべてのノードから API サーバーへのトラフィックはプライベート ネットワークに保持され、API サーバーからノードへの接続にトンネルは必要ありません。 パブリック ネットワーク アクセスが有効になっている場合、API サーバーと通信する必要があるクラスター外クライアントは通常どおりに行うことができます。 パブリック ネットワーク アクセスが無効になっている場合は、標準の プライベート クラスターと同じプライベート DNS セットアップ手法に従う必要があります。 詳細については、「API Server VNet 統合を使用して Azure Kubernetes Service クラスターを作成する」を参照してください。

承認された 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 接続を検討する場合は、注意すべき重要な考慮事項がいくつかあります。 注意すべきいくつかの重要なポイントを次に示します。

  • AKS プライベート クラスターでは、承認された IP と比較してセキュリティと分離が強化されています。 ただし、既存のパブリック AKS クラスターをプライベート クラスターに変換することはできません。 代わりに、既存の AKS クラスターに対して承認された IP を有効にすることができます。
  • 許可された IP 範囲をプライベート API サーバー エンドポイントに適用することはできません。 パブリック API サーバーにのみ適用されます。
  • プライベート クラスターでは、Azure DevOps でホストされるエージェントはサポートされていません。 代わりにセルフホステッド エージェントを使用することをお勧めします。
  • Azure Container Registry をプライベート AKS クラスターで機能させるには、クラスター仮想ネットワーク内のコンテナー レジストリにプライベート リンクを設定する必要があります。 または、Container Registry 仮想ネットワークとプライベート クラスターの仮想ネットワークの間でピアリングを確立することもできます。
  • Azure Private Link サービスの制限は、プライベート クラスターに適用されます。
  • プライベート クラスターの顧客サブネット内のプライベート エンドポイントが削除または変更されると、クラスターは機能しなくなります。

共同作成者

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

プリンシパルの作成者:

その他の共同作成者:

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

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

次のステップ

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