Dela via


Skydda dina Azure Kubernetes Service-kluster (AKS) med Azure Policy

Du kan tillämpa och tillämpa inbyggda säkerhetsprinciper på dina AkS-kluster (Azure Kubernetes Service) med hjälp av Azure Policy. Azure Policy hjälper till att framtvinga organisationsstandarder och utvärdera efterlevnad i stor skala. När du har installerat Azure Policy-tillägget för AKS kan du använda enskilda principdefinitioner eller grupper av principdefinitioner som kallas initiativ (kallas ibland principuppsättningar) för klustret. En fullständig lista över AKS-princip- och initiativdefinitioner finns i Inbyggda Azure Policy-definitioner för AKS .

Den här artikeln visar hur du tillämpar principdefinitioner på klustret och kontrollerar att tilldelningarna tillämpas.

Förutsättningar

Tilldela en inbyggd principdefinition eller ett initiativ

Du kan använda en principdefinition eller ett initiativ i Azure Portal med hjälp av följande steg:

  1. Gå till Azure Policy-tjänsten i Azure Portal med namnet Policy.
  2. I den vänstra rutan på sidan Azure Policy väljer du Definitioner.
  3. Under Kategorier väljer du Kubernetes.
  4. Välj den principdefinition eller det initiativ som du vill använda. I det här exemplet väljer du kubernetes-klustrets säkerhetsbaslinjestandarder för Linux-baserade arbetsbelastningar .
  5. Välj Tilldela.
  6. Ange omfånget till resursgruppen för AKS-klustret med Azure Policy-tillägget aktiverat.
  7. Välj sidan Parametrar och uppdatera effekten från audit till för att deny blockera nya distributioner som bryter mot baslinjeinitiativet. Du kan också lägga till extra namnområden som ska undantas från utvärderingen. Behåll standardvärdena i det här exemplet.
  8. Välj Granska + skapa>Skapa för att skicka principtilldelningen.

Skapa och tilldela en anpassad principdefinition

Med anpassade principer kan du definiera regler för användning av Azure. Du kan till exempel tillämpa följande typer av regler:

  • Säkerhetsmetoder
  • Kostnadshantering
  • Organisationsspecifika regler (till exempel namngivning eller platser)

Innan du skapar en anpassad princip kontrollerar du listan med vanliga mönster och exempel för att se om ditt ärende redan omfattas.

Anpassade principdefinitioner skrivs i JSON. Mer information om hur du skapar en anpassad princip finns i Definitionsstruktur för Azure Policy och Skapa en anpassad principdefinition.

Kommentar

Azure Policy använder nu en ny egenskap som kallas templateInfo som gör att du kan definiera källtypen för villkorsmallen. När du definierar templateInfo i principdefinitioner behöver du inte definiera egenskaper för constraintTemplate eller constraint . Du måste fortfarande definiera apiGroups och typer. Mer information om detta finns i Förstå Azure Policy-effekter.

När du har skapat din anpassade principdefinition läser du Tilldela en principdefinition för en stegvis genomgång av hur du tilldelar principen till ditt Kubernetes-kluster.

Verifiera att en Azure Policy körs

  • Bekräfta att principtilldelningarna tillämpas på klustret med hjälp av följande kubectl get kommando.

    kubectl get constrainttemplates
    

    Kommentar

    Det kan ta upp till 20 minuter att synkronisera principtilldelningar i varje kluster.

    Dina utdata bör likna följande exempelutdata:

    NAME                                     AGE
    k8sazureallowedcapabilities              23m
    k8sazureallowedusersgroups               23m
    k8sazureblockhostnamespace               23m
    k8sazurecontainerallowedimages           23m
    k8sazurecontainerallowedports            23m
    k8sazurecontainerlimits                  23m
    k8sazurecontainernoprivilege             23m
    k8sazurecontainernoprivilegeescalation   23m
    k8sazureenforceapparmor                  23m
    k8sazurehostfilesystem                   23m
    k8sazurehostnetworkingports              23m
    k8sazurereadonlyrootfilesystem           23m
    k8sazureserviceallowedports              23m
    

Verifiera avvisande av en privilegierad podd

Vi ska först testa vad som händer när du schemalägger en podd med säkerhetskontexten privileged: trueför . Den här säkerhetskontexten eskalerar poddens behörigheter. Initiativet tillåter inte privilegierade poddar, så begäran nekas, vilket resulterar i att distributionen avvisas.

  1. Skapa en fil med namnet nginx-privileged.yaml och klistra in följande YAML-manifest.

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx-privileged
    spec:
      containers:
        - name: nginx-privileged
          image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine
          securityContext:
            privileged: true
    
  2. Skapa podden med kubectl apply kommandot och ange namnet på YAML-manifestet.

    kubectl apply -f nginx-privileged.yaml
    

    Podden kan som förväntat inte schemaläggas, vilket visas i följande exempelutdata:

    Error from server ([denied by azurepolicy-container-no-privilege-00edd87bf80f443fa51d10910255adbc4013d590bec3d290b4f48725d4dfbdf9] Privileged container is not allowed: nginx-privileged, securityContext: {"privileged": true}): error when creating "privileged.yaml": admission webhook "validation.gatekeeper.sh" denied the request: [denied by azurepolicy-container-no-privilege-00edd87bf80f443fa51d10910255adbc4013d590bec3d290b4f48725d4dfbdf9] Privileged container is not allowed: nginx-privileged, securityContext: {"privileged": true}
    

    Podden når inte schemaläggningssteget, så det finns inga resurser att ta bort innan du går vidare.

Testa skapandet av en oprivilegierad podd

I föregående exempel försökte containeravbildningen automatiskt använda roten för att binda NGINX till port 80. Principinitiativet nekar den här begäran, så podden kan inte startas. Nu ska vi prova att köra samma NGINX-podd utan privilegierad åtkomst.

  1. Skapa en fil med namnet nginx-unprivileged.yaml och klistra in följande YAML-manifest.

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx-unprivileged
    spec:
      containers:
        - name: nginx-unprivileged
          image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine
    
  2. Skapa podden med kubectl apply kommandot och ange namnet på YAML-manifestet.

    kubectl apply -f nginx-unprivileged.yaml
    
  3. Kontrollera statusen för podden med kommandot kubectl get pods .

    kubectl get pods
    

    Dina utdata bör likna följande exempelutdata, som visar att podden har schemalagts och har statusen Körs:

    NAME                 READY   STATUS    RESTARTS   AGE
    nginx-unprivileged   1/1     Running   0          18s
    

    Det här exemplet visar baslinjeinitiativet som endast påverkar de distributioner som bryter mot principer i samlingen. Tillåtna distributioner fortsätter att fungera.

  4. Ta bort den Oprivilegierade NGINX-podden med kommandot kubectl delete och ange namnet på YAML-manifestet.

    kubectl delete -f nginx-unprivileged.yaml
    

Inaktivera en princip eller ett initiativ

Du kan ta bort baslinjeinitiativet i Azure Portal med hjälp av följande steg:

  1. Gå till fönstret Princip på Azure Portal.
  2. Välj Tilldelningar.
  3. Välj knappen ... bredvid Kubernetes-klustrets säkerhetsbaslinjestandarder för Linux-baserade arbetsbelastningsinitiativ.
  4. Välj Ta bort tilldelning.

Nästa steg

Mer information om hur Azure Policy fungerar finns i följande artiklar: