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

Sie können mithilfe von Azure Policy integrierte Sicherheitsrichtlinien in Ihren Azure Kubernetes Service-Cluster (AKS-Cluster) anwenden bzw. ihnen auferlegen. 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 -Initiativendefinitionen finden Sie unter Integrierte Azure Policy-Definitionen für AKS.

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

Voraussetzungen

Zuweisen einer integrierten Richtliniendefinition oder -initiative

Sie können eine Richtliniendefinition oder -initiative im Azure-Portal mit den folgenden Schritten anwenden:

  1. Navigieren Sie im Azure-Portal, genannt Richtlinie, zum Azure Policy-Dienst.
  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 für Kubernetes-Clusterpod-Sicherheitsbaselinestandards 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 Seite Parameter aus, und ändern Sie Auswirkung von audit in deny, um neue Bereitstellungen zu blockieren, die gegen die Baseline-Initiative 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 und erstellen>Erstellen aus, um die Richtlinienzuweisung zu übermitteln.

Erstellen und Zuweisen einer benutzerdefinierten Richtliniendefinition

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. Benennung 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 jetzt eine neue Eigenschaft, die als templateInfo bezeichnet wird und es Ihnen ermöglicht, den Quelltyp für die Einschränkungsvorlage zu definieren. Durch Definieren von templateInfo in Richtliniendefinitionen müssen Benutzer keine constraintTemplate oder Constraint-Eigenschaften mehr definieren. Sie müssen allerdings weiterhin apiGroups- und Arten definieren. Weitere Informationen hierzu finden Sie unter Grundlegendes zu Azure Policy-Auswirkungen.

Nachdem Ihre benutzerdefinierte Richtliniendefinition erstellt wurde, finden Sie unter Zuweisen einer Richtliniendefinition eine Schrittanleitung zum Zuweisen der Richtlinie zu Ihrem Kubernetes-Cluster.

Überprüfen, ob Azure Policy ausgeführt wird

  • Führen Sie den folgenden kubectl get-Befehl aus, um zu überprüfen, ob die Richtlinienzuweisungen auf Ihren Cluster angewendet werden.

    kubectl get constrainttemplates
    

    Hinweis

    Die Synchronisierung der Richtlinienzuweisungen in den einzelnen Clustern kann bis zu 20 Minuten dauern.

    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 als Erstes, 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 mit dem Befehl „kubectl apply“, 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}
    

    Da der Pod die Planungsphase nicht erreicht, müssen keine Ressourcen gelöscht werden, und Sie können direkt mit dem nächsten Schritt 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. Lassen Sie uns jetzt versuchen, 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 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 mit dem Befehl „kubectl apply“, und geben Sie den Namen Ihres YAML-Manifests an.

    kubectl apply -f nginx-unprivileged.yaml
    
  3. Überprüfen Sie mit dem Befehl „kubectl get pods“ den Status des Pods.

    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
    

Deaktivieren einer Richtlinie oder Initiative

Sie können die Baselineinitiative im Azure-Portal entfernen, indem Sie die folgenden Schritte ausführen:

  1. Navigieren Sie im Azure-Portal zum Richtlinien-Bereich.
  2. Klicken Sie auf Zuweisungen.
  3. Wählen Sie die ... Schaltfläche neben der Initiative für Kubernetes-Clusterpod-Sicherheitsbaselinestandards für Linux-basierte Workloads aus.
  4. Wählen Sie Zuweisung löschen aus.

Nächste Schritte

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