Node に対する送受信アクセス制限/閉域構成

デフォルトの設定では、クラスタ環境へのアクセス経路に制限はなく、パブリックなアクセスも可能です。

一方で、例えば企業システムを仮想ネットワーク内に閉じる、いわゆる閉域ネットワークの構成で AKS クラスタを展開したいケースなど、アクセス制限に関するさまざまな要件も考えられます。これを受けて、以下では閉域構成の方法や注意点について紹介します。

ここで、AKS クラスタの閉域化においては「コントロールプレーンへのアクセス」と「Node へのアクセス」の2つの観点がありますが、「コントロールプレーンへのアクセス」については前回紹介しましたので、今回は「Node へのアクセス」の保護を中心に考えていきます。

Node の受信アクセス制限・閉域化

Node 上で動作する Pod に対するアクセスでは、Node の前段に配置された Azure Load Balancer を経由します。デフォルトではこのロードバランサにはパブリック IP が関連付けられており、それによりインターネットからの受信アクセスが可能です。

このようなパブリックなアクセス経路を制限したい場合には、代わりとして パブリック IP を持たず VNet の内部 IP アドレスのみを持つ内部ロードバランサー (Internal Load Balancer: ILB)を展開できます。

内部ロードバランサーは、VNet 内からもしくは VNet とピアリングした隣接 VNet や、ExpressRoute/VPN 接続したオンプレ環境からのみアクセスができ、外部からのアクセスは遮断できます。

ILB の具体的な展開方法の例を以下の YAML マニフェストにて示します。kubernetesの Service リソースを "type: LoadBalancer" で定義する際に、合わせて annotations として ILB の利用を宣言しています。

これにより、新たに内部ロードバランサリソースが VNet 上に展開されることとなり、VNet 内部からのみアクセス可能な Service オブジェクトを構成できます。annotations の名称に "azure" が含まれていることからもわかる通り、これは AKS 固有の方法として提供されています。


```
apiVersion: v1
kind: Service
metadata:
  name: internal-app
   annotations:
    service.beta.kubernetes.io/azure-load-balancer-internal: "true"
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: internal-app
```

上図にも記載したように、ILB を介したアクセス経路は VNet 内部に限らず、このほかにも Application Gateway と呼ばれる WAF の機能を搭載した L7 ロードバランサをはさんでアクセスさせる構成や、VNet 内部で閉域接続できる Private Endpoint を経由してアクセスさせる構成なども可能となります。

環境の接続要件やセキュリティ要件に合わせてさまざまな構成パターンが選択できることをぜひ知っておいてください。

Node の送信アクセス制限・閉域化

次に、Pod や Node からクラスタ外部への出力経路を制御、制限する方法について観点を整理します。

脅威アクタからのクラスタ内部への侵入を防ぐのと同様に、Pod や Node から外部への不正なアクセスについても対処を講じることは、情報流出・情報漏洩防止の観点からも重要です。一例として、AKS クラスタを運用する際に Node から以下のような外部通信のシナリオが考えられます。

  • Node の kubelet から API サーバへの通信
  • Node の基盤用コンテナイメージの取得
  • Pod のコンテナイメージの取得
  • OS の各種セキュリティ更新プログラムの取得
  • AKS クラスタと連携するクラスタ外部のデータベース、ストレージ、認証基盤等への接続

特に外部通信に関して厳格なセキュリティ要件を求めるようなケースでは、明示的に許可された出力先以外は通信を拒否するためのしくみが必要となります。Azure では AKS クラスタと連携してこうした出力経路の制御、制限ができる仕組みとして、主に次の3種類の方式があります。

  • Private Endpoint
  • Service Endpoint
  • Azure Firewall + ユーザー定義ルート(UDR)

Private Endpoint と Service Endpoint は、Azure 内のサービスを対象にアクセス経路を確保する目的で利用されます。Private Endpoint は VNet に閉じた接続経路を、また Service Endpoint は Microsoft バックボーンネットワークを経由するルーティング経路を確立するもので、これにより各サービスへアクセスする際にパブリックインターネットを経由する必要がなくなります。

Azure Firewall + UDR では、クラスタ運用上で必要となる外部への通信に関して、Node からの外部アクセス時のデフォルトルーティング経路をカスタムで制御する仕組みです。

UDR を用いることで Node からの外部通信におけるデフォルトゲートウェイを Azure Firewall に向ける構成とします。これと合わせて、Firewall ルールには必要となる外部アクセスのみを明示的に許可するよう定義することで、不要な外部通信を制限できます。

なお、この構成をとる場合には AKS クラスタ作成時にルーティング方式を変更するオプション ("--outbound-type userDefinedRouting") の指定が必要となります。詳細は AKS クラスタのエグレス制御に関するドキュメントを参照してください。