Sichern Sie Ihre Azure Kubernetes Service-Cluster (AKS-Cluster) mit Azure Policy

Sie können integrierte Sicherheitsrichtlinien auf Ihre Azure Kubernetes Service (AKS) Cluster anwenden und erzwingen, indem Sie Azure Policy verwenden. Azure Policy unterstützt Sie bei der Durchsetzung von Organisationsstandards und der Bewertung der Compliance im großen Stil. Nachdem Sie das Azure Policy-Add-On für AKS installiert haben, können Sie einzelne Richtliniendefinitionen oder als Initiativen bezeichnete Gruppen von Richtliniendefinitionen (mitunter als Richtliniensätze bezeichnet) auf Ihren Cluster anwenden. Eine vollständige Liste der AKS-Richtlinien- und Initiativdefinitionen finden Sie unter Azure Policy integrierten Definitionen für AKS.

In diesem Artikel erfahren Sie, wie Sie Richtliniendefinitionen auf Ihren Cluster anwenden und überprüfen, ob die Zuweisungen erzwungen werden.

Voraussetzungen

Sie benötigen die folgenden Ressourcen installiert und konfiguriert, bevor Sie beginnen:

Zuweisung einer integrierten Richtliniendefinition oder Initiative

Sie können eine Richtliniendefinition oder Initiative im Azure-Portal anwenden, indem Sie die folgenden Schritte ausführen:

  1. Wechseln Sie zum Azure Policy Dienst im Azure Portal namens "Richtlinie".
  2. Wählen Sie im linken Bereich der Seite „Azure Policy“ die Option Definitionen aus.
  3. Wählen Sie unter Kategorien die Option Kubernetes aus.
  4. Wählen Sie die Richtliniendefinition oder -initiative aus, die Sie anwenden möchten. Wählen Sie für dieses Beispiel die Initiative Sicherheitsbasisstandards für Kubernetes-Cluster-Pods für Linux-basierte Workloads aus.
  5. Wählen Sie Zuweisen aus.
  6. Legen Sie den Bereich auf die Ressourcengruppe des AKS-Clusters fest, für den das Azure Policy-Add-On aktiviert ist.
  7. Wählen Sie die Registerkarte Parameter aus, und ändern Sie den Effekt von audit in deny, um neue Bereitstellungen zu blockieren, die gegen die Basislinieninitiative verstoßen. Sie können auch zusätzliche Namespaces hinzufügen, die von der Auswertung ausgeschlossen werden sollen. Übernehmen Sie für dieses Beispiel die Standardwerte.
  8. Wählen Sie Überprüfen + erstellen>Erstellen aus, um die Richtlinienzuweisung zu übermitteln.

Erstellen Sie ein Verzeichnis für die Terraform-Konfiguration.

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

Erstellen Sie die Terraform-Konfiguration

Erstellen Sie eine Datei mit dem Namen main.tf.

touch main.tf

Öffnen Sie die main.tf Datei, und fügen Sie die folgende Konfiguration hinzu.

Konfigurieren des Terraform-Anbieters

Die folgende Konfiguration:

  • Definiert die Terraform-Version.
  • Konfiguriert den AzureRM-Anbieter.
  • Aktiviert Azure Anbieterfeatures, die für die Ressourcenverwaltung erforderlich sind.
terraform {
 required_version = ">= 1.6.0"
 required_providers {
   azurerm = {
     source  = "hashicorp/azurerm"
     version = "~> 4.0"
   }
 }
}
provider "azurerm" {
 features {}
}

Definieren von Eingabevariablen

Verwenden Sie die folgenden Variablen, um den Namen der vorhandenen Ressourcengruppe und des AKS-Clusters während der Bereitstellung anzugeben.

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
}

Verweisen auf den vorhandenen AKS-Cluster

Die folgenden Datenquellen rufen Informationen zur vorhandenen Ressourcengruppe und zum AKS-Cluster ab. Terraform verwendet diese Daten, um auf Infrastruktur zu verweisen, die bereits in Azure vorhanden ist, anstatt neue Ressourcen zu erstellen.

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
}

Optional: Erstellen und Zuweisen einer benutzerdefinierten Richtliniendefinition

Der Abschnitt "Benutzerdefinierte Richtliniendefinition" ist informational und liegt außerhalb des Gültigkeitsbereichs dieses Artikels. Mit benutzerdefinierten Richtlinien können Sie Regeln für die Verwendung von Azure definieren. Sie können beispielsweise die folgenden Arten von Regeln erzwingen:

  • Sicherheitsmaßnahmen:
  • Kostenverwaltung:
  • Organisationsspezifische Regeln, z. B. Benennungskonventionen oder Speicherorte.

Überprüfen Sie vor dem Erstellen einer benutzerdefinierten Richtlinie die Liste der gängigen Muster und Beispiele, um zu überprüfen, ob Ihr Anwendungsfall bereits behandelt wurde.

Benutzerdefinierte Richtliniendefinitionen werden in JSON geschrieben. Weitere Informationen zum Erstellen einer benutzerdefinierten Richtlinie finden Sie unter Azure Policy-Definitionsstruktur und Erstellen einer benutzerdefinierten Richtliniendefinition.

Hinweis

Azure Policy verwendet eine Eigenschaft namens templateInfo, mit der Sie den Quelltyp für die Einschränkungsvorlage definieren können. Wenn Sie templateInfo in Richtliniendefinitionen definieren, können Sie constraintTemplate - oder Einschränkungseigenschaften nicht verwenden. Sie müssen noch apiGroups und kinds definieren. Weitere Informationen finden Sie unter Grundlegendes zu Azure Policy Effekten.

Nachdem Sie Ihre benutzerdefinierte Richtliniendefinition erstellt haben, finden Sie unter Zuweisen einer Richtliniendefinition eine Schritt-für-Schritt-Anleitung zum Zuweisen der Richtlinie zu Ihrem Cluster.

Überprüfen, ob eine Azure-Richtlinie angewendet wird

Vergewissern Sie sich, dass die Richtlinienzuweisungen mithilfe des folgenden kubectl get Befehls auf Ihren Cluster angewendet werden.

kubectl get constrainttemplates

Ihre Ausgabe sollte der folgenden Beispielausgabe ähneln:

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

Überprüfen der Ablehnung eines privilegierten Pods

Testen Sie, was passiert, wenn Sie einen Pod mit dem Sicherheitskontext privileged: true planen. Dieser Sicherheitskontext weitet die Podberechtigungen aus. Die Initiative lässt keine privilegierten Pods zu, sodass die Anforderung abgelehnt wird, was wiederum zur Ablehnung der Bereitstellung führt.

  1. Erstellen Sie eine Datei mit dem Namen „nginx-privileged.yaml“, und fügen Sie das folgende YAML-Manifest ein.

    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. Erstellen Sie den Pod mithilfe des kubectl apply Befehls, und geben Sie den Namen Ihres YAML-Manifests an.

    kubectl apply -f nginx-privileged.yaml
    

    Der Pod kann wie erwartet nicht geplant werden, wie in der folgenden Beispielausgabe zu sehen:

    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}
    

    Der Pod erreicht die Scheduling-Phase nicht, daher gibt es keine Ressourcen, die Sie löschen müssen, bevor Sie fortfahren.

Testen der Erstellung eines nicht privilegierten Pods

Im vorherigen Beispiel hat das Containerimage automatisch versucht, Stammberechtigungen zu verwenden, um NGINX an den Port 80 zu binden. Die Richtlinieninitiative lehnt diese Anforderung ab, sodass der Pod nicht gestartet werden kann. Versuchen Sie jetzt, denselben NGINX Pod ohne privilegierten Zugriff auszuführen.

  1. Erstellen Sie eine Datei mit dem Namen nginx-unprivileged.yaml , und fügen Sie das folgende YAML-Manifest darin ein.

    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. Erstellen Sie den Pod mithilfe des kubectl apply Befehls, und geben Sie den Namen Ihres YAML-Manifests an.

    kubectl apply -f nginx-unprivileged.yaml
    
  3. Überprüfen Sie den Status des Pods mithilfe des kubectl get pods Befehls.

    kubectl get pods
    

    Ihre Ausgabe sollte der folgenden Beispielausgabe ähneln, was zeigt, dass der Pod erfolgreich geplant wurde und den Status Wird ausgeführt aufweist:

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

    Dieses Beispiel zeigt die Baseline-Initiative, die sich nur auf Bereitstellungen auswirkt, die gegen Richtlinien in der Sammlung verstoßen. Zulässige Bereitstellungen funktionieren weiterhin.

  4. Löschen Sie den nicht privilegierten NGINX-Pod mit dem Befehl kubectl delete, und geben Sie den Namen Ihres YAML-Manifests an.

    kubectl delete -f nginx-unprivileged.yaml
    

Führen Sie die folgenden Schritte aus, um Ihrem AKS-Cluster mithilfe von Terraform eine integrierte Azure Policy Initiative zuzuweisen.

Abrufen der integrierten Azure Policy Initiative

Die folgende Datenquelle ruft die integrierte politische Initiative von Azure für grundlegende Sicherheitsstandards für Kubernetes-Pods ab.

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

Weisen Sie die Azure Policy-Initiative zu

Die folgende Ressource weist der Ressourcengruppe, die den AKS-Cluster enthält, die integrierte Azure Policy Initiative zu.

Legen Sie die Richtlinienwirkung auf Deny fest, um Workloads zu blockieren, die gegen die definierten Richtlinienregeln verstoßen.

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

Initialisieren Sie die Terraform-Konfiguration

Führen Sie die Schritte terraform init aus, um das Terraform-Arbeitsverzeichnis zu initialisieren und die erforderlichen Anbieter-Plug-Ins herunterzuladen.

terraform init

Formatieren und Überprüfen der Konfiguration

Führen Sie die Ausführung terraform fmt aus, um die Terraform-Konfiguration zu formatieren.

terraform fmt

Führen Sie terraform validate aus, um die Syntax der Terraform-Konfiguration zu validieren.

terraform validate

Terraform-Konfiguration anwenden

Stellen Sie vor der Bereitstellung der Konfiguration Werte für die folgenden Variablen bereit:

  • resource_group_name
  • aks_cluster_name

Führen Sie terraform apply aus, um die Azure Policy-Zuweisung bereitzustellen.

terraform apply

Wenn Sie dazu aufgefordert werden, geben Sie die Eingabetaste yes ein, um die Bereitstellung zu bestätigen.

Überprüfen der Azure Policy-Installation

Überprüfen Sie nach Abschluss der Bereitstellung, ob die Azure Policy Komponenten im AKS-Cluster ausgeführt werden.

kubectl get pods -n kube-system

Stellen Sie sicher, dass die Gatekeeper-Einschränkungsvorlagen erfolgreich installiert wurden.

kubectl get constrainttemplates

Testen Sie die Azure Policy-Zuweisung

Erstellen Sie eine Datei mit dem Namen privileged-pod.yaml.

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

Wenden Sie das Manifest auf den Cluster an.

kubectl apply -f privileged-pod.yaml

Die Bereitstellung schlägt fehl, weil die Azure-Policy-Zuweisung privilegierte Container nicht zulässt, die gegen die konfigurierten Pod-Sicherheitsbasisstandards verstoßen.

Deaktivieren einer Richtlinie oder Initiative

Entfernen Sie die Basisinitiative im Azure-Portal, indem Sie die folgenden Schritte ausführen:

  1. Wechseln Sie zum Richtlinienbereich im Azure-Portal.
  2. Klicken Sie auf Zuweisungen.
  3. Wählen Sie die Ellipse (...) am Ende der Zeile für die Initiative Grundlegende Sicherheitsstandards für Kubernetes-Clusterpods für Linux-basierte Workloads aus.
  4. Wählen Sie Zuweisung löschen aus.

Informationen zum Entfernen des Azure Policy-Add-Ons aus Ihrem AKS-Cluster finden Sie unter Entfernen des Add-Ons.

Nächste Schritte

Weitere Informationen zur Funktionsweise Azure Policy finden Sie in den folgenden Artikeln: