Istio CNI inschakelen voor service mesh-invoegtoepassing op basis van Istio voor Azure Kubernetes Service

In dit artikel leest u hoe u Istio CNI inschakelt voor de op Istio gebaseerde service-mesh-invoegtoepassing in Azure Kubernetes Service (AKS). Istio CNI verbetert de beveiliging door de noodzaak van bevoegde netwerkmogelijkheden in toepassingsworkloads in de service-mesh te elimineren.

Overzicht

Istio leidt toepassingsverkeer om naar de Envoy sidecar-proxy met behulp van een van de twee mechanismen:

  • Istio CNI (CNIChaining): Een CNI-invoegtoepassing op clusterniveau configureert verkeersomleiding, zodat toepassingspods geen bevoegde netwerkmogelijkheden nodig hebben. De istio-validation initcontainer wordt toegevoegd tijdens de sidecar-injectie om te controleren of de verkeersomleiding correct is geconfigureerd.
  • Init-containers (InitContainers): Elke applicatiepod gebruikt een geprivilegieerde istio-init init-container die de capaciteiten NET_ADMIN en NET_RAW vereist om verkeersomleiding te configureren. Deze mogelijkheden veroorzaken vaak beveiligingsproblemen in bedrijfsomgevingen.

Vanaf revisie asm-1-30is Istio CNI het standaardomleidingsmechanisme voor nieuwe mesh-installaties. Voor revisies asm-1-25 tot en met asm-1-29 blijven init-containers de standaard en moet u Istio CNI expliciet inschakelen. Eerdere revisies bieden geen ondersteuning voor Istio CNI.

Istio CNI biedt de volgende voordelen ten opzichte van init-containers:

  • Verbetert de beveiliging: hiermee verwijdert u de noodzaak van bevoegde netwerkmogelijkheden (NET_ADMIN, NET_RAW) van toepassingsworkloads
  • Vereenvoudigt het beveiligingsbeleid voor pods: toepassingspods vereisen alleen minimale mogelijkheden
  • Onderhoudt functionaliteit: biedt dezelfde mogelijkheden voor verkeerbeheer als de traditionele init-containerbenadering

Opmerking

Istio CNI is geen vervanging voor Azure CNI en zal uw normale AKS-netwerk niet verstoren. Het is een afzonderlijke invoegtoepassing die is ontworpen om de verkeersomleiding op knooppuntniveau te beheren, waardoor de beveiliging wordt verbeterd door de noodzaak van bevoegde init-containers in toepassingspods weg te nemen.

Voordat u begint

  • Installeer de Azure CLI versie 2.86.0 of hoger. U kunt az --version uitvoeren om de versie te controleren. Voor het installeren of upgraden, zie Azure CLI installeren.

  • U hebt een AKS-cluster nodig waarvoor de Istio-gebaseerde service mesh plug-in is ingeschakeld. Als u deze installatie niet hebt, raadpleegt u de Implementatie van de Istio-gebaseerde service mesh add-on voor Azure Kubernetes Service.

  • Zorg ervoor dat uw Istio-service-mesh revisie asm-1-25 of hoger gebruikt. U kunt de huidige revisie controleren met:

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

Omgevingsvariabelen instellen

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

Istio CNI inschakelen

Istio CNI inschakelen op een nieuwe mesh-installatie

Voor revisies asm-1-30 en later is CNIChaining het standaardmechanisme voor proxyomleiding voor nieuwe installaties van de service-mesh-invoegtoepassing. U hoeft geen extra parameters op te geven. Schakel Istio CNI expliciet in voor revisies asm-1-25 tot en met asm-1-29 door de parameter --proxy-redirection-mechanism op te geven:

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

Istio CNI inschakelen op een bestaande mesh-installatie

Als u de invoegtoepassing Istio-service-mesh al hebt ingeschakeld, kunt u met de volgende opdracht overschakelen naar Istio CNI:

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

De asm-1-30 standaardwaarde is alleen van toepassing op nieuwe installaties, dus het bijwerken van een bestaande mesh wijzigt het omleidingsmechanisme niet.

Opmerking

Bestaande pods schakelen niet automatisch over naar de istio-validation init-container. Start uw implementaties opnieuw op nadat u Istio CNI hebt ingeschakeld, zodat pods de wijziging (bijvoorbeeld kubectl rollout restart deployment/<name>) kunnen ophalen.

Controleren of Istio CNI ingeschakeld is

Gebruik az aks get-credentials om de referenties voor uw AKS-cluster op te halen:

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

Nadat u Istio CNI hebt ingeschakeld, controleert u de installatie door te controleren of de CNI DaemonSet wordt uitgevoerd:

kubectl get daemonset -n aks-istio-system

U ziet dat de Istio CNI DaemonSet wordt uitgevoerd:

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

Workloads implementeren en gedrag controleren

Als u de beveiligingsverbetering wilt controleren, kunt u de voorbeeldtoepassing bookinfo implementeren en controleren of workloads gebruikmaken van de beveiligde istio-validation init-container in plaats van de bevoegde istio-init container.

Voorbeeldtoepassing implementeren

Schakel eerst sidecar injection in voor de standaardnamespace.

# 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}

Implementeer de voorbeeldapplicatie bookinfo:

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

Veilig gebruik van init-containers controleren

Controleer of de geïmplementeerde pods de beveiligde istio-validation init-container gebruiken in plaats van istio-init:

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

Verwachte uitvoer moet istio-validation tonen als de init-container met verwijderde capabilities:

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"]}

U kunt ook de YAML voor een specifieke pod controleren om de beveiligingscontext te controleren:

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

In de uitvoer moet worden weergegeven dat de istio-validation init-container geen bevoegde mogelijkheden heeft:

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

Istio CNI uitschakelen

Als u Istio CNI wilt uitschakelen en wilt terugkeren naar het gebruik van traditionele init-containers, gebruikt u de volgende opdracht:

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

Na het uitschakelen van Istio CNI:

  1. De CNI DaemonSet wordt verwijderd:

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

    Verwachte uitvoer (geen CNI DaemonSet):

    Error from server (NotFound): daemonsets.apps "azure-service-mesh-istio-cni-addon-node" not found
    
  2. Nieuwe workloads maken gebruik van de traditionele istio-init init-container met netwerkmogelijkheden. Start alle bestaande implementaties opnieuw om de wijziging op te halen:

    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. Controleer de naam en mogelijkheden van de init-container:

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

    Verwachte uitvoer moet istio-init tonen met netwerkmogelijkheden:

    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"]}
    

Volgende stappen