Access Control¶
Die ayedo Software Delivery Plattform implementiert umfassende Zugriffssteuerungsmechanismen, um sicherzustellen, dass nur autorisierte Benutzer auf Ressourcen zugreifen können. Dieses Dokument beschreibt die verschiedenen Access-Control-Mechanismen und deren Konfiguration.
Überblick¶
Die Plattform nutzt OIDC (OpenID Connect) für zentrale Authentifizierung und Autorisierung über Keycloak als zentralen Identity Provider. Folgende Komponenten unterstützen OIDC-basierte Zugriffssteuerung:
- Keycloak: Zentraler Identity Provider mit Realm- und Federation-Support
- Kubernetes: RBAC mit OIDC-Integration via Keycloak
- GitLab: Project-based Access Control mit OIDC
- ArgoCD: Application-Deployment-Zugriff mit OIDC und RBAC
- HashiCorp Vault: Secrets-Management-Zugriff mit OIDC
- Harbor: Container-Registry-Zugriff mit OIDC
- Grafana: Dashboard-Access mit OIDC
Keycloak Access Control¶
Keycloak Zugriffslevel¶
Keycloak selbst hat verschiedene Zugriffslevel für die Administration:
| Rolle | Berechtigungen | Verwendung |
|---|---|---|
| realm-admin | Vollständige Kontrolle über einen Realm | Realm-spezifische Administration |
| manage-users | Benutzer verwalten, Gruppen verwalten | User-Management ohne System-Zugriff |
| view-users | Benutzer und Gruppen anzeigen | Read-Only Zugriff für Auditing |
| manage-clients | OIDC-Clients verwalten | Client-Konfiguration für neue Anwendungen |
| master realm admin | Vollständige Kontrolle über alle Realms | Platform Administrator |
Empfohlene Zugriffsstrategie:
- Platform Administratoren: Master Realm Admin-Zugriff
- Realm Administratoren: realm-admin für spezifischen Realm (z.B.
production) - Application Owners: manage-clients für spezifischen Realm
- Security Officers: view-users für Compliance-Audits
Keycloak Realms¶
Die ayedo SDP unterstützt Multi-Realm-Setup:
# Beispiel-Realm-Struktur
master # Master Realm (Platform-Administration)
├── production # Production Realm (Production Workloads)
├── staging # Staging Realm (Staging Workloads)
└── development # Development Realm (Dev Workloads)
Vorteile:
- Isolation: Getrennte Benutzer, Gruppen und Clients pro Umgebung
- Compliance: Produktions-Zugriffe getrennt von Test-Umgebungen
- Flexibilität: Unterschiedliche Identity-Provider-Konfigurationen pro Realm
Keycloak Federation (Identity Brokering)¶
Keycloak unterstützt Federation mit Upstream-Identity-Providern:
Unterstützte Provider:
- Azure Entra ID (Azure AD) - OIDC/SAML
- Google Workspace - OIDC
- GitHub - OIDC
- GitLab - OIDC
- Generic OIDC/SAML - Beliebige OIDC/SAML-Provider
Beispiel-Konfiguration für Azure Entra ID:
- Identity Provider in Keycloak erstellen:
- Navigieren zu: Identity Providers → Add provider → OpenID Connect v1.0
- Alias:
azure-ad - Authorization URL:
https://login.microsoftonline.com/{tenant-id}/oauth2/v2.0/authorize - Token URL:
https://login.microsoftonline.com/{tenant-id}/oauth2/v2.0/token - Client ID: Azure App Registration Client ID
-
Client Secret: Azure App Registration Client Secret
-
Mapper für Group Claims konfigurieren:
- Mappers → Create
- Name:
azure-groups - Mapper Type:
Claim to Group Membership - Claims:
groups
Vorteile der Federation:
- Keine Benutzerverwaltung in Keycloak notwendig
- Single Source of Truth (Azure AD, Google Workspace, etc.)
- Bestehende Gruppen und Berechtigungen wiederverwendbar
- Zentrales User Lifecycle Management
Keycloak Client-Konfiguration¶
Für jede Anwendung wird ein OIDC-Client in Keycloak erstellt:
# Beispiel: Kubernetes OIDC-Client
Client ID: kubernetes
Client Protocol: openid-connect
Access Type: confidential
Valid Redirect URIs:
- http://localhost:8000
- http://localhost:18000
Standard Flow Enabled: true
Direct Access Grants Enabled: false
Service Accounts Enabled: false
# Client Scopes
Default Client Scopes:
- email
- profile
- groups
Wichtige Settings:
- Valid Redirect URIs: Muss
http://localhost:*für kubelogin enthalten - groups Scope: Muss als Default Scope aktiviert sein
- Audience Mapper:
audClaim muss Client ID enthalten
Group Claims¶
Group Claims ermöglichen die Zuweisung von Berechtigungen basierend auf Gruppenmitgliedschaften im Identity Provider (Keycloak oder Upstream-Provider wie Azure AD).
Hinweis
Dieser Guide geht davon aus, dass der Group Claim Name groups ist. Dies kann in Keycloak-Mappern angepasst werden.
Kubernetes¶
Um kubelogin mit Group Claims zu verwenden, muss die kubeconfig wie folgt konfiguriert werden:
users:
- name: user@ayedo-cluster
user:
exec:
apiVersion: client.authentication.k8s.io/v1beta1
args:
- oidc-login
- get-token
- --oidc-issuer-url=https://keycloak.example.com/realms/production
- --oidc-client-id=kubernetes
- --oidc-client-secret=<client-secret>
- --oidc-extra-scope=email,groups # groups-Scope aktivieren
command: kubectl
Token-Debugging
Der Token kann im Cache gefunden werden: ~/.kube/cache/oidc-login/
Beispiel zum Debuggen:
Harbor¶
Harbor unterstützt Group Claims für Project-Zugriff und Admin-Rechte.
Konfiguration:
Statische Benutzer deaktiviert
Bei aktiviertem OIDC können keine statischen Benutzer über die Harbor-Oberfläche erstellt werden. Benutzer werden beim ersten Login automatisch angelegt und können dann zu Admins befördert werden.
Grafana¶
OPS Grafana (Platform Monitoring)¶
grafana:
ops:
oidc:
enabled: true
userGroups:
grafanaAdmin: platform-admins
grafanaEditor: platform-engineers
grafanaViewer: developers
scopes: "openid email groups"
allowedDomains:
- example.com
User Grafana (Application Monitoring)¶
grafana:
user:
oidc:
enabled: true
userGroups:
grafanaAdmin: app-admins
grafanaEditor: developers
grafanaViewer: stakeholders
scopes: "openid email groups"
allowedDomains:
- example.com
User Onboarding¶
Dieser Abschnitt beschreibt, wie neue Benutzer für Grafana und Harbor berechtigt werden.
Grafana¶
Vorgehensweise:
- Application Developer meldet sich via OIDC in Grafana an
- Administrator meldet sich mit statischem Admin-User an
- Administrator befördert den OIDC-User zu Grafana Admin
Admin-Credentials abrufen
Admin-Promotion:
Unter https://grafana.example.com/admin/users kann der Administrator OIDC-Benutzern Admin-Rechte zuweisen.
Harbor¶
Vorgehensweise:
- Application Developer meldet sich via OIDC in Harbor an
- Administrator meldet sich mit statischem Admin-User an
- Administrator befördert den OIDC-User zu Harbor Admin
Admin-Credentials abrufen
Username: admin
Admin-Promotion:
Unter https://harbor.example.com/harbor/users kann der Administrator OIDC-Benutzern Admin-Rechte zuweisen.
GitLab¶
Vorgehensweise:
- Application Developer meldet sich via OIDC in GitLab an
- Administrator fügt Benutzer zu entsprechenden GitLab-Groups hinzu
- Benutzer erhält rollenbasierte Berechtigungen durch Group-Membership
Admin-Credentials abrufen
kubectl get secret gitlab-gitlab-initial-root-password -n gitlab -o json | \
jq '.data.password | @base64d'
Username: root
Group-Membership:
Unter https://gitlab.example.com/admin/groups kann der Administrator Benutzer zu Groups hinzufügen und Rollen zuweisen.
ArgoCD¶
Vorgehensweise:
- Platform Administrator konfiguriert RBAC-Policies (siehe oben)
- Application Developer meldet sich via OIDC in ArgoCD an
- Berechtigungen werden automatisch über Group Claims vergeben
Initial Admin Password
Username: admin
RBAC-Validation:
Unter https://argocd.example.com/settings/accounts können Administratoren Benutzer-Berechtigungen prüfen.
HashiCorp Vault¶
Vorgehensweise:
- Platform Administrator konfiguriert OIDC Auth Method und Policies (siehe oben)
- Application Developer meldet sich via OIDC in Vault an (UI oder CLI)
- Berechtigungen werden automatisch über Group Claims und Policies vergeben
OIDC-Login via CLI:
# Via CLI
vault login -method=oidc role=developer
# Browser öffnet sich für Keycloak-Login
# Nach erfolgreichem Login erhält User ein Vault-Token
OIDC-Login via UI:
Unter https://vault.example.com/ui/vault/auth → Method: OIDC → Sign in with OIDC Provider
GitLab Access Control¶
GitLab Zugriffslevel¶
GitLab unterstützt rollenbasierte Zugriffskontrolle auf Project- und Group-Ebene:
| Rolle | Berechtigungen | Verwendung |
|---|---|---|
| Owner | Vollständige Kontrolle über Project/Group | Project/Group Owner |
| Maintainer | Code-Management, CI/CD-Konfiguration | Lead Developers |
| Developer | Code-Entwicklung, Merge Requests | Application Developers |
| Reporter | Nur lesender Zugriff | Stakeholders |
| Guest | Minimaler Zugriff auf Issues | External Contributors |
OIDC-Integration¶
GitLab wird über OIDC mit Keycloak integriert:
gitlab:
oidc:
enabled: true
name: "Keycloak"
issuer: "https://keycloak.example.com/realms/production"
client_id: "gitlab"
client_secret: "<client-secret>"
scope: ["openid", "email", "profile", "groups"]
discovery: true
uid_field: "preferred_username"
OIDC-Client-Konfiguration in Keycloak:
Client ID: gitlab
Client Protocol: openid-connect
Access Type: confidential
Valid Redirect URIs:
- https://gitlab.example.com/users/auth/openid_connect/callback
Standard Flow Enabled: true
Client Scopes:
- openid
- email
- profile
- groups
Group Sync¶
GitLab kann Gruppen automatisch aus Keycloak synchronisieren:
gitlab:
oidc:
group_claim: groups
external_groups:
- developers
- platform-admins
admin_groups:
- platform-admins
Zugriffs-Mapping:
- Keycloak-Gruppe
platform-admins→ GitLab Admin - Keycloak-Gruppe
developers→ GitLab Developer (projektspezifisch)
GitLab Runner RBAC¶
GitLab Runner werden typischerweise mit Service-Accounts in Kubernetes registriert:
apiVersion: v1
kind: ServiceAccount
metadata:
name: gitlab-runner
namespace: gitlab
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: gitlab-runner
rules:
- apiGroups: [""]
resources: ["pods", "pods/exec", "pods/log"]
verbs: ["get", "list", "create", "delete"]
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "create", "delete"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: gitlab-runner
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: gitlab-runner
subjects:
- kind: ServiceAccount
name: gitlab-runner
namespace: gitlab
ArgoCD Access Control¶
ArgoCD Zugriffslevel¶
ArgoCD nutzt projektbasierte RBAC-Policies:
| Rolle | Berechtigungen | Verwendung |
|---|---|---|
| Admin | Vollständige Kontrolle über Applications | Platform Administratoren |
| Developer | Application-Management, Sync | Application Developers |
| Viewer | Nur lesender Zugriff | Stakeholders |
OIDC-Integration¶
ArgoCD wird über OIDC mit Keycloak integriert:
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-cm
namespace: argocd
data:
url: https://argocd.example.com
oidc.config: |
name: Keycloak
issuer: https://keycloak.example.com/realms/production
clientID: argocd
clientSecret: $oidc.keycloak.clientSecret
requestedScopes: ["openid", "profile", "email", "groups"]
OIDC-Client-Konfiguration in Keycloak:
Client ID: argocd
Client Protocol: openid-connect
Access Type: confidential
Valid Redirect URIs:
- https://argocd.example.com/auth/callback
Standard Flow Enabled: true
Client Scopes:
- openid
- email
- profile
- groups
RBAC-Policies¶
ArgoCD-RBAC wird über Group Claims gesteuert:
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-rbac-cm
namespace: argocd
data:
policy.default: role:readonly
policy.csv: |
# Platform Administratoren haben Admin-Rechte
g, platform-admins, role:admin
# Developers haben Developer-Rechte auf ihre Projekte
g, backend-developers, role:developer
# Custom Role: Developer kann Applications syncen
p, role:developer, applications, get, */*, allow
p, role:developer, applications, sync, */*, allow
p, role:developer, applications, override, */*, allow
p, role:developer, applications, update, */*, allow
# Namespace-basierte Policies
p, role:backend-developer, applications, *, backend-*/*, allow
p, role:frontend-developer, applications, *, frontend-*/*, allow
Policy-Syntax:
Downstream-Cluster hinzufügen¶
Platform Administratoren fügen Downstream-Cluster zu ArgoCD hinzu:
# Cluster hinzufügen
argocd cluster add <cluster-context> \
--name production-cluster \
--namespace argocd
# Cluster-RBAC prüfen
argocd cluster list
Downstream-Cluster-RBAC:
ArgoCD erstellt automatisch ein ServiceAccount im Ziel-Cluster:
apiVersion: v1
kind: ServiceAccount
metadata:
name: argocd-manager
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: argocd-manager-role
rules:
- apiGroups: ["*"]
resources: ["*"]
verbs: ["*"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: argocd-manager-role-binding
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: argocd-manager-role
subjects:
- kind: ServiceAccount
name: argocd-manager
namespace: kube-system
Least Privilege
In Produktionsumgebungen sollte der argocd-manager auf spezifische Namespaces beschränkt werden.
HashiCorp Vault Access Control¶
Vault Zugriffslevel¶
Vault nutzt Policies für granulare Zugriffskontrolle:
| Policy-Level | Berechtigungen | Verwendung |
|---|---|---|
| root | Vollständige Kontrolle | Nur für Bootstrap |
| admin | Administrative Operationen | Platform Administratoren |
| developer | Secret Read/Write | Application Developers |
| readonly | Nur lesender Zugriff | Audit/Compliance |
OIDC-Integration¶
Vault wird über OIDC mit Keycloak integriert:
# OIDC Auth Method aktivieren
vault auth enable oidc
# OIDC-Konfiguration
vault write auth/oidc/config \
oidc_discovery_url="https://keycloak.example.com/realms/production" \
oidc_client_id="vault" \
oidc_client_secret="<client-secret>" \
default_role="default"
# OIDC-Role für Platform Admins
vault write auth/oidc/role/platform-admin \
bound_audiences="vault" \
allowed_redirect_uris="https://vault.example.com/ui/vault/auth/oidc/oidc/callback" \
allowed_redirect_uris="http://localhost:8250/oidc/callback" \
user_claim="email" \
groups_claim="groups" \
policies="admin" \
ttl=8h
# OIDC-Role für Developers
vault write auth/oidc/role/developer \
bound_audiences="vault" \
allowed_redirect_uris="https://vault.example.com/ui/vault/auth/oidc/oidc/callback" \
allowed_redirect_uris="http://localhost:8250/oidc/callback" \
user_claim="email" \
groups_claim="groups" \
policies="developer" \
ttl=8h
OIDC-Client-Konfiguration in Keycloak:
Client ID: vault
Client Protocol: openid-connect
Access Type: confidential
Valid Redirect URIs:
- https://vault.example.com/ui/vault/auth/oidc/oidc/callback
- http://localhost:8250/oidc/callback
Standard Flow Enabled: true
Client Scopes:
- openid
- email
- profile
- groups
Vault Policies¶
Beispiel-Policies für verschiedene Rollen:
Admin Policy:
# admin-policy.hcl
path "*" {
capabilities = ["create", "read", "update", "delete", "list", "sudo"]
}
Developer Policy:
# developer-policy.hcl
# Developers können Secrets in ihren Namespaces verwalten
path "secret/data/production/*" {
capabilities = ["create", "read", "update", "delete", "list"]
}
path "secret/metadata/production/*" {
capabilities = ["list"]
}
# Developers können Secrets in staging lesen und schreiben
path "secret/data/staging/*" {
capabilities = ["create", "read", "update", "delete", "list"]
}
ReadOnly Policy:
# readonly-policy.hcl
path "secret/data/*" {
capabilities = ["read", "list"]
}
path "secret/metadata/*" {
capabilities = ["list"]
}
Group-basierte Policies¶
Vault-Policies werden automatisch über Group Claims zugewiesen:
# External Group für Platform Admins erstellen
vault write identity/group \
name="platform-admins" \
type="external" \
policies="admin"
# External Group für Developers erstellen
vault write identity/group \
name="developers" \
type="external" \
policies="developer"
# Group Alias für OIDC-Provider erstellen
vault write identity/group-alias \
name="platform-admins" \
mount_accessor=$(vault auth list -format=json | jq -r '."oidc/".accessor') \
canonical_id=$(vault read -field=id identity/group/name/platform-admins)
vault write identity/group-alias \
name="developers" \
mount_accessor=$(vault auth list -format=json | jq -r '."oidc/".accessor') \
canonical_id=$(vault read -field=id identity/group/name/developers)
Kubernetes Auth Method¶
Für Pod-zu-Vault-Authentifizierung nutzt die SDP Kubernetes Auth:
# Kubernetes Auth aktivieren
vault auth enable kubernetes
# Kubernetes Auth konfigurieren
vault write auth/kubernetes/config \
kubernetes_host="https://kubernetes.default.svc:443" \
kubernetes_ca_cert=@/var/run/secrets/kubernetes.io/serviceaccount/ca.crt \
token_reviewer_jwt=@/var/run/secrets/kubernetes.io/serviceaccount/token
# Role für Applications erstellen
vault write auth/kubernetes/role/app \
bound_service_account_names=app \
bound_service_account_namespaces=production \
policies=developer \
ttl=24h
Kubernetes RBAC¶
Die Plattform nutzt Kubernetes RBAC für granulare Zugriffssteuerung auf Cluster-Ressourcen.
Standard-Rollen¶
| Rolle | Beschreibung | Typische Nutzer |
|---|---|---|
cluster-admin | Voller Cluster-Zugriff | Plattform Administratoren |
admin | Namespace-Admin-Rechte | Application Owners |
edit | Ressourcen bearbeiten | Developers |
view | Nur lesen | Stakeholders |
OIDC-basierte RBAC¶
Kubernetes RBAC kann mit OIDC-Groups verknüpft werden:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: platform-admins
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: Group
name: platform-admins
apiGroup: rbac.authorization.k8s.io
Namespace-basierte RBAC¶
Entwickler erhalten typischerweise Zugriff nur auf ihre Namespaces:
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: developers-edit
namespace: production
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: edit
subjects:
- kind: Group
name: developers
apiGroup: rbac.authorization.k8s.io
Network Policies¶
Network Policies ergänzen die Zugriffssteuerung auf Netzwerkebene.
Beispiel: Namespace-Isolation¶
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-from-other-namespaces
namespace: production
spec:
podSelector: {}
policyTypes:
- Ingress
ingress:
- from:
- podSelector: {}
Compliance-Mapping¶
Die beschriebenen Access-Control-Mechanismen erfüllen folgende Compliance-Anforderungen:
| Norm | Control | Erfüllung |
|---|---|---|
| ISO 27001 | Annex A 5.15 Access Control | ✅ OIDC + RBAC |
| ISO 27001 | Annex A 5.16 Identity Management | ✅ Keycloak + IdP-Integration |
| ISO 27001 | Annex A 5.18 Access Rights | ✅ Role Mappings |
| BSI IT-Grundschutz | ORP.4 Identitäts- und Berechtigungsmanagement | ✅ OIDC-basiert |
| GDPR | Art. 32 (Access Control) | ✅ Granulare Zugriffskontrolle |
| NIS2 | Minimum Requirement (i) Access Control | ✅ MFA + RBAC |
Best Practices¶
1. Principle of Least Privilege¶
- Gewähren Sie nur die minimal notwendigen Berechtigungen
- Nutzen Sie Namespace-RBAC statt Cluster-RBAC
- Implementieren Sie zeitlich begrenzte Zugriffsrechte
2. Multi-Factor Authentication (MFA)¶
- Erzwingen Sie MFA auf Identity-Provider-Ebene
- Nutzen Sie Hardware-Token für privilegierte Accounts
- Implementieren Sie Conditional Access Policies
3. Audit Logging¶
- Aktivieren Sie Kubernetes Audit Logging
- Nutzen Sie Audit Logs für Compliance
4. Regular Access Reviews¶
- Führen Sie quartalsweise Access Reviews durch
- Entfernen Sie inaktive Benutzer automatisch
- Dokumentieren Sie Berechtigungsänderungen
5. Break-Glass Access¶
- Implementieren Sie Break-Glass-Prozeduren für Notfälle (siehe Runbooks)
- Nutzen Sie separate Admin-Accounts
- Loggen Sie alle Break-Glass-Zugriffe
Troubleshooting¶
Problem: OIDC-Login funktioniert nicht¶
Symptom: Benutzer können sich nicht via OIDC anmelden.
Lösung:
-
Keycloak-Logs prüfen:
-
OIDC-Discovery-Endpoint testen:
-
Client-Konfiguration validieren:
Problem: Group Claims fehlen im Token¶
Symptom: Benutzer haben keine Gruppenberechtigungen.
Lösung:
- Prüfen Sie den Token-Inhalt (siehe oben: Token-Debugging)
- Validieren Sie die Client Scopes in Keycloak
- Stellen Sie sicher, dass der
groups-Scope als Default Client Scope aktiviert ist - Prüfen Sie Group Mapper-Konfiguration in Keycloak
Problem: GitLab OIDC-Login schlägt fehl¶
Symptom: GitLab zeigt OIDC-Fehler beim Login.
Lösung:
-
GitLab-Logs prüfen:
-
Redirect URI validieren:
-
Client Secret prüfen:
Problem: ArgoCD RBAC-Policies funktionieren nicht¶
Symptom: Benutzer haben nicht die erwarteten Berechtigungen in ArgoCD.
Lösung:
-
RBAC-ConfigMap prüfen:
-
Benutzer-Groups im Token prüfen:
-
Policy-Test durchführen:
-
ArgoCD-Server-Logs prüfen:
Problem: Vault OIDC-Login schlägt fehl¶
Symptom: Vault zeigt Fehler beim OIDC-Login.
Lösung:
-
Vault-Logs prüfen:
-
OIDC-Auth-Method-Konfiguration prüfen:
-
OIDC-Role prüfen:
-
Redirect URI validieren:
Problem: Vault Policies werden nicht angewendet¶
Symptom: Benutzer haben nicht die erwarteten Vault-Berechtigungen.
Lösung:
-
Token-Policies prüfen:
-
Group-Membership prüfen:
-
Group Alias prüfen:
-
Policy-Inhalt validieren: