Zum Inhalt

AKS-Plattform: Identität und Zugriff

Diese Seite beschreibt, wer und was auf die Plattform zugreifen kann und über welchen Mechanismus: Zugriff von Menschen, Kubernetes- und Azure- Autorisierung, workload identity, CI/CD-Identitäten, der Key Vault und Break-glass-Zugriff. Das Prinzip lautet: keine statischen Zugangsdaten. Alles nutzt Entra ID, managed identities oder federated identities.

Referenzdesign, dein Deployment kann abweichen

Gruppen- und Identitätsnamen sind die Muster der Referenzkonfiguration. Das MCP-weite Modell steht unter Identitäts- und Zugriffsmodell und Zugriff, Gruppen und PIM.

Prinzipien

  • Menschen bekommen Berechtigungen nur über Entra-ID-Gruppen, nie als Einzelzuweisung.
  • Production und Non-production haben getrennte Gruppen. Der Zugriff von Entwicklern auf Production ist standardmäßig nur lesend.
  • Funktionstrennung: Infrastruktur-Deployment, Image-Build und GitOps-Updates sind getrennte Identitäten.
  • Der Zugriff auf Azure-Ressourcen wird mit Terraform verwaltet. Die Autorisierung im Cluster wird als YAML im GitOps-Repository verwaltet und per pull request geändert.
  • Lokale Kubernetes-Konten sind deaktiviert. Die Anmeldung läuft über Entra ID mit MFA.

Identitätstypen

Identität Authentifiziert über Autorisiert bei Mechanismus
Menschen Entra ID (MFA) Kubernetes API Kubernetes RBAC, gebunden an Entra-ID-Gruppen
AKS-Cluster-Identität User-assigned managed identity Azure Resource Manager Azure RBAC (Cluster baseline)
Workload-Pods Service Account zu federated credential Azure-Services Workload identity und Azure RBAC
CI/CD-pipelines GitHub OIDC federated credential Azure und Kubernetes Azure RBAC und Cluster Roles
Break-glass Entra ID mit PIM, MFA Ganzer Cluster Binding an cluster-admin

Gruppen

Gruppennamen folgen grp-aks-<scope>-<role>[-<team>][-<env>]. Der Terraform Identity layer erstellt die Gruppen, die in der Map entra_groups der Konfiguration stehen, plus die Break-glass-Gruppe.

Gruppe Rolle Cluster
grp-aks-platform-admins Plattform-Administratoren, cluster-admin Beide
grp-aks-platform-operators Ingress, Monitoring und Zertifikate verwalten Beide
grp-aks-auditors Nur lesend, clusterweit Beide
grp-aks-breakglass Notfallzugriff Beide
grp-aks-<team>-leads-<env> Team Leads Pro Umgebung
grp-aks-<team>-devs-<env> Entwickler des Teams Pro Umgebung

Die Gruppe der Plattform-Admins und die Break-glass-Gruppe werden dem Cluster als seine Entra-ID-Admin-Gruppen übergeben. Die hub-integrated Konfiguration nutzt einen eigenen Gruppensatz mit dem Suffix -integrated, damit sich die beiden Cluster keine Gruppen teilen.

Gruppenmitgliedschaft und PIM-Aktivierung werden nicht in Terraform konfiguriert (begrenzte Provider-Unterstützung). Das Plattform-Team oder das Identity-Team des Kunden verwaltet sie.

Kubernetes-Autorisierung

Kubernetes RBAC ist nativ (Roles und Bindings als Manifeste) und wird per GitOps deployt. Azure RBAC für die Kubernetes-Autorisierung ist am Cluster eingeschaltet, und die pipeline-Identitäten nutzen die Azure-Rolle Azure Kubernetes Service RBAC Admin.

Rolle Art Zweck
cluster-admin Eingebaut Plattform-Admins und Break-glass
platform-operator ClusterRole Plattform-namespaces verwalten: Workloads, Services, Secrets, Gateway- und Zertifikatsressourcen, Monitoring-Ressourcen, network policies. Nodes und Events ansehen
auditor ClusterRole Nur lesend im ganzen Cluster
namespace-admin Role Volle Verwaltung eines Team-namespace
namespace-developer Role Anwendungen deployen und debuggen, einschließlich exec und Routes
namespace-viewer Role Lesen und Pod-Logs

Zugriffsmatrix

Rolle dev test accp prod
Entwickler namespace-developer namespace-developer namespace-viewer namespace-viewer
Team Lead namespace-admin namespace-admin namespace-admin namespace-developer
Plattform-Operator Ansehen, clusterweit Ansehen, clusterweit Ansehen, clusterweit Ansehen, clusterweit
Auditor Ansehen, clusterweit Ansehen, clusterweit Ansehen, clusterweit Ansehen, clusterweit
Plattform-Admin cluster-admin cluster-admin cluster-admin cluster-admin

Namespaces heißen <team>-<env> (zum Beispiel team-a-dev). Das Networking-Designdokument zeigt <env>-<team>; die RBAC- Manifeste, die Identitätskonfiguration und der Load Test nutzen alle <team>-<env>.

Geschützte Plattform-namespaces

kube-system, gateway-system, cert-manager, monitoring, logging, argocd, policy-system und ähnliche Plattform- namespaces sind geschützt: keine Role Bindings für Anwendungsteams, Plattform-Labels, Admission Policies, die Bindings durch Nicht-Plattform-Subjects ablehnen, und in Production nur Änderungen per GitOps. Labels nutzen eine konfigurierbare Domain (<labelDomain>/type, <labelDomain>/protected, <labelDomain>/team, <labelDomain>/environment), die pro Kunde im GitOps-Repository gesetzt wird.

Break-glass-Zugriff

Aspekt Design
Gruppe grp-aks-breakglass, gebunden an cluster-admin
Mitglieder Höchstens zwei oder drei Senior-Plattform-Engineers
Aktivierung PIM, zeitlich begrenzt, höchstens 4 Stunden, MFA und Begründung erforderlich
Monitoring Alert bei PIM-Aktivierung und bei Kubernetes-Audit-Aktivität der Gruppe
Review Vierteljährliches Review der Mitgliedschaft

Workload identity

Jede Anwendung bekommt eine eigene user-assigned managed identity pro Umgebung, federated mit einem Kubernetes Service Account. Identitäten werden nicht zwischen Anwendungen, Teams oder Umgebungen geteilt.

sequenceDiagram
    participant Pod
    participant SA as Service account
    participant OIDC as AKS OIDC issuer
    participant Entra as Entra ID
    participant KV as Key Vault
    Pod->>SA: Runs as the annotated service account
    SA->>OIDC: Projected token
    OIDC->>Entra: Token exchange (federated credential)
    Entra-->>Pod: Azure token of the managed identity
    Pod->>KV: Read secret (Azure RBAC)

Was Terraform für jeden Eintrag der Map workload_identities erstellt:

Ressource Namensmuster Hinweise
Managed identity mi-<map key>-<env> In rg-<env>-identity
Federated credential fc-<env>-<namespace>-<service account> Issuer ist der OIDC issuer des Clusters, Subject ist system:serviceaccount:<namespace>:<service account>
Rollenzuweisungen Wie pro Eintrag aufgelistet, zum Beispiel Key Vault Secrets User auf dem Key Vault Least Privilege pro Anwendung
workload_identities = {
  "orders-api-prod" = {
    namespace            = "team-a-prod"
    service_account_name = "orders-api"
    roles = [
      {
        role_definition_name = "Key Vault Secrets User"
        scope                = "<key-vault-resource-id>"
      }
    ]
  }
}

Zwei Schritte bei einem neuen Cluster

Das module für workload identity läuft nur, wenn oidc_issuer_url gesetzt ist, und die Issuer-URL existiert erst, nachdem der Cluster erstellt wurde. Deploye in einer neuen Umgebung zuerst den Cluster, kopiere die Issuer-URL in die Konfiguration und wende dann erneut an. Auf Azure Local gibt das Bootstrap-Skript die URL aus.

CI/CD-Identitäten

Jeder Eintrag in cicd_identities wird zu einer user-assigned managed identity mi-cicd-<name> mit einer federated credential fc-github-<name> für den GitHub-OIDC-Issuer. Das Subject benennt ein Repository und ein GitHub Environment, sodass nur Läufe dieses Environments die Identität nutzen können. Es gibt keine Client Secrets.

Identität Verantwortung Darf nicht
infra-deploy Infrastruktur deployen Images pushen, GitOps ändern, Apps deployen
image-build Images bauen und pushen Infrastruktur deployen, Key Vault lesen, den Cluster ändern
gitops-update (Design) GitOps-Manifeste aktualisieren Infrastruktur deployen, Images pushen, auf Azure zugreifen

Der pipeline-Zugriff auf den Cluster (zum Beispiel für den Load Test) wird als Azure-Rollenzuweisung auf dem Cluster vergeben (cicd_aks_role_assignments), bewusst außerhalb des Identity modules gehalten. Siehe Deployment.

Azure-Rollenzuweisungen für Personen

Das Design gibt den Plattform-Admins die Rolle Azure Kubernetes Service Cluster Admin Role auf dem Cluster, Operatoren und Auditoren die Cluster User Role und den Auditoren Reader. Im Code werden sie über die Map identity_role_assignments geliefert, die in den Referenzdateien leer oder auskommentiert ist. Fülle sie pro Umgebung aus.

Key Vault

Einstellung Wert
Autorisierung Azure RBAC, keine Access Policies
Netzwerk Public network access deaktiviert, ACL-Default-Aktion deny, nur private endpoint (Azure-Variante)
Schutz Purge protection an, Soft Delete 90 Tage (konfigurierbar)
SKU standard (kann premium sein für HSM-gestützte Schlüssel)
Name Global eindeutig, Muster kv-<purpose>-<env>, in der Konfiguration gesetzt
Logging AuditEvent und Policy-Auswertungs-Logs nach Log Analytics, wenn ein workspace gesetzt ist

Workloads bekommen nur Key Vault Secrets User. Das Design entscheidet sich für SDK-basierten Zugriff mit workload identity statt für den CSI driver: Jede Anwendung nutzt ihre eigene Identität, keine Secrets werden in Kubernetes-Secret-Objekte kopiert, und die Anwendung steuert das Caching. Das CSI-driver-Add-on ist trotzdem in den Referenzkonfigurationsdateien eingeschaltet (siehe Cluster baseline). Regeln für Kubernetes Secrets (keine Klartext-Secrets in Git, Key Vault bevorzugen, Owner-Labels) stehen unter Security policy.

Audit

Das Design listet Ereignisse, die zu überwachen und an Log Analytics zu senden sind: Änderungen an Azure-Rollenzuweisungen, Änderungen an managed identities und federated credentials, Break-glass-Aktivierung, Änderungen an cluster-admin-Bindings, fehlgeschlagene Kubernetes-Anmeldungen und das Erstellen von Service-Principal- Secrets. Diagnoseeinstellungen sind in der Referenzkonfiguration standardmäßig aus, deshalb brauchen diese Ereignisse vor go-live einen Log Analytics workspace und die passenden Schalter.