Azure Kubernetes Service の Istio ベースのサービス メッシュ アドオンに対して Istio CNI を有効にする

この記事では、Azure Kubernetes Service (AKS) で Istio ベースのサービス メッシュ アドオンに対して Istio CNI を有効にする方法について説明します。 Istio CNI は、サービス メッシュ内のアプリケーション ワークロードにおける特権ネットワーク機能の必要性を排除することで、セキュリティを向上させます。

概要

既定では、Istio サービス メッシュは、各アプリケーション ポッドの特権 init コンテナー (istio-init) を使用して、Envoy サイドカー プロキシへのネットワーク トラフィック リダイレクトを構成します。 これらの init コンテナーには NET_ADMINNET_RAW の機能が必要です。多くの場合、エンタープライズ環境ではセキュリティ上の問題としてフラグが付けられます。

Istio CNI では、個々のポッド init コンテナーからクラスター レベルの CNI プラグインにネットワーク構成の責任を移行することで、このセキュリティの問題に対処します。 この方法の特徴は次のとおりです。

  • セキュリティの向上: アプリケーション ワークロードから特権ネットワーク機能 (NET_ADMINNET_RAW) の必要性を排除
  • ポッドのセキュリティ ポリシーを簡素化: アプリケーション ポッドには最小限の機能のみが必要です
  • 機能の維持: 従来の init コンテナー アプローチと同じトラフィック管理機能を提供します

Istio CNI が有効になっている場合、アプリケーション ポッドは最小限の istio-validation init コンテナーを使用し、特権 istio-init コンテナーの代わりにすべての機能を削除します。

Istio CNI は Azure CNI の代わりではなく、通常の AKS ネットワークに干渉しません。 これは、Istio のトラフィック リダイレクト設定をノード レベルで処理するように設計された別のプラグインであり、アプリケーション ポッド内の特権 init コンテナーの必要性を取り除くことでセキュリティを向上させます。

開始する前に

  • Azure CLI バージョン 2.86.0 以降をインストールします。 az --versionを実行してバージョンを確認できます。 インストールまたはアップグレードする必要には、「Azure CLI のインストール」をご覧ください。

  • Istio ベースのサービス メッシュ アドオンが有効になっている AKS クラスターが必要です。 このセットアップがない場合は、 Azure Kubernetes Service の Istio ベースのサービス メッシュ アドオンのデプロイに関するページを参照してください。

  • Istio サービス メッシュでリビジョン asm-1-25 以降が使用されていることを確認します。 現在のリビジョンは、次の方法で確認できます。

    az aks show --resource-group <resource-group-name> --name <cluster-name> --query 'serviceMeshProfile.istio.revisions'
    

環境変数の設定

export CLUSTER=<cluster-name>
export RESOURCE_GROUP=<resource-group-name>

Istio CNI を有効にする

新しいメッシュ インストールで Istio CNI を有効にする

サービス メッシュ アドオンを有効にする場合は、 --proxy-redirection-mechanism パラメーターを指定して Istio CNI を有効にすることができます。

az aks mesh enable --resource-group ${RESOURCE_GROUP} --name ${CLUSTER} --proxy-redirection-mechanism CNIChaining

既存のメッシュ インストールで Istio CNI を有効にする

Istio サービス メッシュ アドオンが既に有効になっている場合は、次のコマンドを使用して Istio CNI に切り替えることができます。

az aks mesh proxy-redirection-mechanism --resource-group ${RESOURCE_GROUP} --name ${CLUSTER} --mechanism CNIChaining

既存のポッドは、 istio-validation init コンテナーに自動的に切り替えられません。 Istio CNI を有効にした後、デプロイを再起動して、ポッドが変更を受け取るようにします (たとえば、 kubectl rollout restart deployment/<name>)。

Istio CNI が有効になっていることを確認する

az aks get-credentialsを使用して、AKS クラスターの資格情報を取得します。

az aks get-credentials --resource-group ${RESOURCE_GROUP} --name ${CLUSTER}

Istio CNI を有効にした後、CNI DaemonSet が実行されていることを確認してインストールを確認します。

kubectl get daemonset -n aks-istio-system

Istio CNI DaemonSet が実行されていることがわかります。

NAME                                      DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
azure-service-mesh-istio-cni-addon-node   3         3         3       3            3           kubernetes.io/os=linux   94s

ワークロードをデプロイし、動作を確認する

セキュリティの向上を確認するには、bookinfo サンプル アプリケーションをデプロイし、ワークロードが特権istio-validation コンテナーではなく、セキュリティで保護された istio-init init コンテナーを使用していることを確認します。

サンプル アプリケーションをデプロイする

最初に、既定の名前空間のサイドカー インジェクションを有効にします。

# Get the current Istio revision
REVISION=$(az aks show --resource-group ${RESOURCE_GROUP} --name ${CLUSTER} --query 'serviceMeshProfile.istio.revisions[0]' -o tsv)

# Label the namespace for sidecar injection
kubectl label namespace default istio.io/rev=${REVISION}

bookinfo サンプル アプリケーションをデプロイします。

kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.25/samples/bookinfo/platform/kube/bookinfo.yaml

セキュリティで保護された init コンテナーの使用状況を確認する

デプロイされたポッドで、istio-validationではなく、セキュリティで保護された istio-init init コンテナーが使用されていることを確認します。

kubectl get pods -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.initContainers[0].name}{"\t"}{.spec.initContainers[0].securityContext.capabilities}{"\n"}{end}'

必要な出力には、削除された機能を備えた init コンテナーとして istio-validation が表示されます。

details-v1-799dc5d847-7x9gl     istio-validation        {"drop":["ALL"]}
productpage-v1-99d6d698f-89gpj  istio-validation        {"drop":["ALL"]}
ratings-v1-7545c4bb6c-m7t42     istio-validation        {"drop":["ALL"]}
reviews-v1-8679d76d6c-jz4vg     istio-validation        {"drop":["ALL"]}
reviews-v2-5b9c77895c-b2b7m     istio-validation        {"drop":["ALL"]}
reviews-v3-5b57874f5f-kk9rt     istio-validation        {"drop":["ALL"]}

特定のポッドの YAML を確認して、セキュリティ コンテキストを確認することもできます。

kubectl get pod <pod-name> -n <namespace> -o yaml | grep -A 20 -B 25 "name: istio-validation"

出力には、 istio-validation init コンテナーに特権機能がないことを示す必要があります。

initContainers:
  - args:
    …
    name: istio-validation
    …
    securityContext:
      allowPrivilegeEscalation: false
      capabilities:
        drop:
        - ALL
      privileged: false
      readOnlyRootFilesystem: true
      runAsGroup: 1337
      runAsNonRoot: true
      runAsUser: 1337

Istio CNI を無効にする

Istio CNI を無効にし、従来の init コンテナーの使用に戻すには、次のコマンドを使用します。

az aks mesh proxy-redirection-mechanism --resource-group ${RESOURCE_GROUP} --name ${CLUSTER} --mechanism InitContainers

Istio CNI を無効にした後:

  1. CNI DaemonSet は削除されます。

    kubectl get daemonset azure-service-mesh-istio-cni-addon-node -n aks-istio-system
    

    予期される出力 (CNI DaemonSet なし):

    Error from server (NotFound): daemonsets.apps "azure-service-mesh-istio-cni-addon-node" not found
    
  2. 新しいワークロードでは、ネットワーク機能を備えた従来の istio-init init コンテナーが使用されます。 既存のすべてのデプロイを再起動して、変更を取得します。

    kubectl rollout restart deployment/details-v1
    kubectl rollout restart deployment/productpage-v1
    kubectl rollout restart deployment/ratings-v1
    kubectl rollout restart deployment/reviews-v1
    kubectl rollout restart deployment/reviews-v2
    kubectl rollout restart deployment/reviews-v3
    
  3. init コンテナーの名前と機能を確認します。

    kubectl get pods -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.initContainers[0].name}{"\t"}{.spec.initContainers[0].securityContext.capabilities}{"\n"}{end}'
    

    予想される出力には、ネットワーク機能を備えた istio-init が表示されます。

    details-v1-57bc58c559-722v8     istio-init        {"add":["NET_ADMIN","NET_RAW"],"drop":["ALL"]}
    productpage-v1-7bb64f657c-jw6gs istio-init        {"add":["NET_ADMIN","NET_RAW"],"drop":["ALL"]}
    ratings-v1-57d5594c75-4zd49     istio-init        {"add":["NET_ADMIN","NET_RAW"],"drop":["ALL"]}
    reviews-v1-7fd8f9cd59-mdcf9     istio-init        {"add":["NET_ADMIN","NET_RAW"],"drop":["ALL"]}
    reviews-v2-7b8bdc9cdf-k9qgb     istio-init        {"add":["NET_ADMIN","NET_RAW"],"drop":["ALL"]}
    reviews-v3-588854d9d7-s2f7j     istio-init        {"add":["NET_ADMIN","NET_RAW"],"drop":["ALL"]}
    

次のステップ