本連載では、エンタープライズシステムでコンテナ/Kubernetesを活用した業務システムを開発・運用するエンジニアに向けて、知っておくべきKubernetesセキュリティの基礎知識、Microsoftが提供するパブリッククラウド「Azure」をもとにクラウドにおけるKubernetesセキュリティ対策のポイント、注意点などの実践的なノウハウを紹介します。

第5回となる今回は、Kubernetesクラスタの保護について紹介します。KubernetesクラスタはコントロールプレーンとNodeという大きく2つのコンポーネントに分類されます。コントロールプレーンはkube-apiserver、etcd、kube-scheduler、kube-controller-managerの4つで構成されており、主要なKubernetesサービスと、アプリケーション ワークロードのオーケストレーションを提供します。Nodeはアプリケーション ワークロードを実行する仮想マシンです。

AKSにおいて、コントロールプレーンはAzureからPaaSとして提供されます。そのため、コントロールプレーンを構成するリソースを自分でゼロから構築する必要はありません。セキュリティについても、Kubernetes Hardening Guidanceでも述べられているetcdに対するアクセス制限などはAzureの責任範囲となり、利用者はKubernetes APIに対するアクセス制限に集中できます。

一方で、アプリケーション ワークロードを実行するNodeは、Azure Virtual Machineとして提供されています。kubeletやkube-proxy、containerdといったKubernetes ノードのコンポーネントやコンテナ ランタイムはセットアップされた状態で利用を開始できるものの、コントロールプレーンに比べてより多くの部分を利用者側で考慮しなければなりません。

コントロールプレーン/Kubernetes APIの保護

先に述べたとおり、コントロールプレーンはAzureからPaaSとして提供されており、利用者が主に検討しなければならないのはKubernetes APIに対するアクセス制限です。Kubernetes APIのアクセス制限はアクセス元のネットワーク制限と、認証による制限の2つに分かれます。認証による制限については5章の認証認可で扱います。

Kubernetes APIのネットワークアクセスを制限する方法は2つあります。

  1. プライベートAKSクラスタを構成しKubernetes APIへのパブリックIPからのアクセスを禁止する
  2. 通常のAKSクラスタの--api-server-authorized-ip-rangeオプションを使用してアクセス元のパブリックIPを制限する

プライベートAKSクラスタ

プライベートAKSクラスタのAPIサーバエンドポイントはパブリック IPからアクセスできません。このため、以下のような手段でアクセス経路を確保する必要があります。

  • AKS ラスタが展開されているVNet内にVMを作成し、そのVM らアクセスする(マネージド踏み台サービスの Bastion を利用すれば閉域接続が可能)
  • AKSクラスタが展開されているVNetに対して、VPN、Express RouteまたはVNet ピアリングで接続し、その経路からアクセスする

この仕組みはPrivate Endpointを使って実現されているため、Private Endpointが持っている制約が適用されています。Private Endpointが持っている制約のうちエンタープライズでの利用という観点で特に問題となるのは、NSG(ネットワーク セキュリティ グループ)を使ったアクセス制限の適用対象外であるという点です。

Private EndpointのNSGサポートは今後提供される予定ですが、この制限があるため、現時点ではAKSの仮想ネットワークと接続されたプライベートのネットワークからのアクセスを制限できません。

Private EndpointのNSGサポートの詳細は以下をご確認ください。

アクセス元IPアドレスを制限するオプション

コントロールプレーンへのアクセス制限を行う別の手段として、API サーバへのアクセス元 IP アドレスを制限するオプションも利用できます。 先にあげたプライベートクラスタのようにアクセス元を VNet 内部に制限する必要がなく、明示的に許可された IP アドレスのみアクセスを許可したいケースでは有用なオプションとなります。