Uw AKS-clusters (Azure Kubernetes Service) beveiligen met Azure Policy

U kunt ingebouwd beveiligingsbeleid toepassen en afdwingen op uw Azure Kubernetes Service (AKS)-clusters met behulp van Azure Policy. Met Azure Policy kunt u organisatiestandaarden afdwingen en naleving op schaal beoordelen. Nadat u de Azure Policy-invoegtoepassing voor AKS hebt geïnstalleerd, kunt u afzonderlijke beleidsdefinities of groepen beleidsdefinities met de naam initiatieven (ook wel beleidssets genoemd) toepassen op uw cluster. Zie Azure Policy ingebouwde definities voor AKS-beleid en -initiatief voor een volledige lijst met AKS-beleids- en initiatiefdefinities.

In dit artikel leest u hoe u beleidsdefinities toepast op uw cluster en controleert of de toewijzingen worden afgedwongen.

Vereisten

U hebt de volgende hulpmiddelen geïnstalleerd en geconfigureerd nodig voordat u begint:

Een ingebouwde beleidsdefinitie of initiatief toewijzen

U kunt een beleidsdefinitie of initiatief toepassen in de Azure-portal met behulp van de volgende stappen:

  1. Ga naar de Azure Policy-service in de Azure-portal met de naam Beleid.
  2. Selecteer Definities in het linkerdeelvenster van de pagina Azure Policy.
  3. Selecteer onder Categorieën de optie Kubernetes.
  4. Kies de beleidsdefinitie of het initiatief dat u wilt toepassen. Selecteer voor dit voorbeeld de Pod Security Baseline-standaarden voor Kubernetes-clusters voor Linux-workloads.
  5. Selecteer Toewijzen.
  6. Stel het bereik in op de resourcegroep van het AKS-cluster waarbij de Azure Policy-add-on is ingeschakeld.
  7. Selecteer de pagina Parameters en wijzig het Effect van audit naar deny om nieuwe implementaties te blokkeren die het basisinitiatief schenden. U kunt ook extra naamruimten toevoegen om uit te sluiten van evaluatie. Behoud voor dit voorbeeld de standaardwaarden.
  8. Selecteer Beoordelen en maken>Maken om de beleidstoewijzing in te dienen.

Maak een map voor de Terraform-configuratie.

mkdir aks-use-azure-policy
cd aks-use-azure-policy

De Terraform-configuratie maken

Maak een bestand met de naam main.tf.

touch main.tf

Open het main.tf bestand en voeg de volgende configuratie toe.

De Terraform-provider configureren

De volgende configuratie:

  • Hiermee definieert u de Terraform-versie.
  • Hiermee configureert u de AzureRM-provider.
  • Hiermee schakelt u Azure providerfuncties in die vereist zijn voor resourcebeheer.
terraform {
 required_version = ">= 1.6.0"
 required_providers {
   azurerm = {
     source  = "hashicorp/azurerm"
     version = "~> 4.0"
   }
 }
}
provider "azurerm" {
 features {}
}

Invoervariabelen definiëren

Gebruik de volgende variabelen om de naam van de bestaande resourcegroep en het AKS-cluster op te geven tijdens de implementatie.

variable "resource_group_name" {
 description = "Name of the resource group that contains the existing AKS cluster."
 type        = string
}
variable "aks_cluster_name" {
 description = "Name of the existing AKS cluster."
 type        = string
}

Verwijzen naar het bestaande AKS-cluster

De volgende gegevensbronnen halen informatie op over de bestaande resourcegroep en het AKS-cluster. Terraform gebruikt deze gegevens om te verwijzen naar infrastructuur die al bestaat in Azure in plaats van nieuwe resources te maken.

data "azurerm_resource_group" "aks" {
 name = var.resource_group_name
}
data "azurerm_kubernetes_cluster" "aks" {
 name                = var.aks_cluster_name
 resource_group_name = data.azurerm_resource_group.aks.name
}

Optioneel: Een aangepaste beleidsdefinitie maken en toewijzen

De sectie aangepaste beleidsdefinitie is informatief en valt buiten het bereik van dit artikel. Met aangepast beleid kunt u regels definiëren voor het gebruik van Azure. U kunt bijvoorbeeld de volgende typen regels afdwingen:

  • Beveiligingsprocedures.
  • Kostenbeheer.
  • Organisatiespecifieke regels, zoals naamconventies of locaties.

Voordat u een aangepast beleid maakt, controleert u de lijst met veelvoorkomende patronen en voorbeelden om te zien of uw case al wordt behandeld.

Aangepaste beleidsdefinities worden geschreven in JSON. Zie de definitiestructuur van Azure Policy en een aangepaste beleidsdefinitie maken voor meer informatie over het maken van een aangepast beleid.

Notitie

Azure Policy gebruikt een eigenschap met de naam templateInfo die u kunt gebruiken om het brontype voor de beperkingssjabloon te definiëren. Wanneer u templateInfo definieert in beleidsdefinities, kunt u geen constraintTemplate - of constraint-eigenschappen gebruiken. U moet nog steeds apiGroups en kinds definiëren. Zie Inzicht in Azure Policy effecten voor meer informatie.

Nadat u de aangepaste beleidsdefinitie hebt gemaakt, raadpleegt u Een beleidsdefinitie toewijzen voor een stapsgewijze procedure om het beleid toe te wijzen aan uw cluster.

Controleren of Azure Policy actief is

Controleer of de beleidstoewijzingen zijn toegepast op uw cluster met behulp van de volgende kubectl get opdracht.

kubectl get constrainttemplates

De uitvoer moet er ongeveer uitzien als in de volgende voorbeelduitvoer:

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

Afwijzing van een geprivilegieerde pod valideren

Test wat er gebeurt wanneer u een pod plant met de beveiligingscontext van privileged: true. Deze beveiligingscontext escaleert de bevoegdheden van de pod. Het initiatief staat geen geprivilegieerde pods toe, dus de aanvraag wordt geweigerd, wat resulteert in het afwijzen van de uitrol.

  1. Maak een bestand met de naam nginx-privileged.yaml en plak het volgende 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. Maak de pod met behulp van de kubectl apply opdracht en geef de naam van uw YAML-manifest op.

    kubectl apply -f nginx-privileged.yaml
    

    Zoals verwacht kan de pod niet worden gepland, zoals wordt weergegeven in de volgende voorbeelduitvoer:

    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}
    

    De pod bereikt de planningsfase niet, dus er zijn geen bronnen om te verwijderen voordat u verdergaat.

Test het maken van een niet-geprivilegieerde pod

In het vorige voorbeeld probeerde de containerimage automatisch root te gebruiken om NGINX aan poort 80 te binden. Het beleidsinitiatief weigert deze aanvraag, zodat de pod niet kan worden gestart. Probeer nu dezelfde NGINX pod uit te voeren zonder bevoegde toegang.

  1. Maak een bestand met de naam nginx-unprivileged.yaml en plak het volgende YAML-manifest erin.

    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. Maak de pod met behulp van de kubectl apply opdracht en geef de naam van uw YAML-manifest op.

    kubectl apply -f nginx-unprivileged.yaml
    
  3. Controleer de status van de pod met behulp van de kubectl get pods opdracht.

    kubectl get pods
    

    Uw uitvoer moet vergelijkbaar zijn met de volgende voorbeelduitvoer, waarin wordt weergegeven dat de pod is gepland en de status In uitvoering heeft.

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

    In dit voorbeeld ziet u het basislijninitiatief dat alleen van invloed is op de implementaties die het beleid in de verzameling schenden. Toegestane implementaties blijven functioneren.

  4. Verwijder de NGINX niet-gemachtigde pod met behulp van de kubectl delete opdracht en geef de naam van uw YAML-manifest op.

    kubectl delete -f nginx-unprivileged.yaml
    

Gebruik de volgende stappen om een ingebouwd Azure Policy initiatief toe te wijzen aan uw AKS-cluster met behulp van Terraform.

Het ingebouwde Azure Policy-initiatief ophalen

Met de volgende gegevensbron haalt u het ingebouwde Azure Policy-initiatief op voor standaarden voor de basislijn voor podbeveiliging in Kubernetes.

data "azurerm_policy_set_definition" "aks_pod_security_baseline" {
 display_name = "Kubernetes cluster pod security baseline standards for Linux-based workloads"
}

Het Azure Policy-initiatief toewijzen

Met de volgende resource wordt het ingebouwde Azure Policy initiatief toegewezen aan de resourcegroep die het AKS-cluster bevat.

Stel het effect van het beleid in op Deny om workloads te blokkeren die de gedefinieerde beleidsregels schenden.

resource "azurerm_resource_group_policy_assignment" "aks_pod_security_baseline" {
 name                 = "aks-pod-security-baseline"
 display_name         = "Kubernetes cluster pod security baseline standards for Linux-based workloads"
 resource_group_id    = data.azurerm_resource_group.aks.id
 policy_definition_id = data.azurerm_policy_set_definition.aks_pod_security_baseline.id
 parameters = jsonencode({
   effect = {
     value = "Deny"
   }
 })
}

De Terraform-configuratie initialiseren

Voer terraform init uit om de Terraform-werkmap te initialiseren en de vereiste provider-plug-ins te downloaden.

terraform init

De configuratie opmaken en valideren

Voer terraform fmt uit om de Terraform-configuratie te formatteren.

terraform fmt

Voer deze opdracht uit terraform validate om de syntaxis van de Terraform-configuratie te valideren.

terraform validate

De Terraform-configuratie toepassen

Geef voordat u de configuratie implementeert waarden op voor de volgende variabelen:

  • resource_group_name
  • aks_cluster_name

Voer deze opdracht uit terraform apply om de Azure Policy-toewijzing te implementeren.

terraform apply

Voer desgevraagd in yes om de implementatie te bevestigen.

De installatie van de Azure Policy controleren

Nadat de implementatie is voltooid, controleert u of de Azure Policy onderdelen worden uitgevoerd in het AKS-cluster.

kubectl get pods -n kube-system

Controleer of de Gatekeeper-beperkingssjablonen zijn geïnstalleerd.

kubectl get constrainttemplates

De Azure Policy-toewijzing testen

Maak een bestand met de naam privileged-pod.yaml.

apiVersion: v1
kind: Pod
metadata:
 name: privileged-pod
spec:
 containers:
 - name: nginx
   image: nginx
   securityContext:
     privileged: true

Pas het manifest toe op het cluster.

kubectl apply -f privileged-pod.yaml

De implementatie mislukt omdat de Azure Policy-toewijzing containers met verhoogde bevoegdheden blokkeert die in strijd zijn met de geconfigureerde standaarden voor de podbeveiligingsbasislijn.

Een beleid of initiatief uitschakelen

Verwijder het basislijninitiatief in de Azure-portal met behulp van de volgende stappen:

  1. Ga naar het deelvenster Beleid in de Azure-portal.
  2. Selecteer Opdrachten.
  3. Selecteer het weglatingsteken (...) aan het einde van de regel voor het initiatief de basislijnstandaarden voor podbeveiliging van Kubernetes-clusters voor Linux-workloads.
  4. Selecteer Toewijzing verwijderen.

Als u de Azure Policy-invoegtoepassing uit uw AKS-cluster wilt verwijderen, raadpleegt u De invoegtoepassing verwijderen.

Volgende stappen

Zie de volgende artikelen voor meer informatie over hoe Azure Policy werkt: