Communitygithub.com

Audit RBAC du cluster Kubernetes

Auditer les configurations RBAC d'un cluster Kubernetes pour identifier les permissions trop permissives et garantir le principe du moindre privilège.

Qu'est-ce que Audit RBAC du cluster Kubernetes ?

Cette compétence permet d'auditer en profondeur les configurations de contrôle d'accès basé sur les rôles (RBAC) d'un cluster Kubernetes, qu'il s'agisse d'EKS, GKE, AKS ou d'un cluster autogéré. Elle couvre l'énumération des rôles et liaisons dangereuses (wildcards, accès aux secrets, pods/exec, escalade de privilèges), l'analyse automatisée avec des outils comme rbac-tool, KubiScan et Kubeaudit, ainsi que la vérification du montage des tokens des comptes de service. L'objectif est de détecter les configurations trop permissives, les chemins d'escalade de privilèges et les violations du principe de moindre privilège, éléments essentiels pour les audits de sécurité, l'évaluation des risques de mouvement latéral et la conformité. La compétence fournit des commandes kubectl et Python prêtes à l'emploi, ainsi qu'un format de rapport structuré pour documenter les constatations et les actions correctives.

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/mukul975/Anthropic-Cybersecurity-Skills/tree/main/skills/auditing-kubernetes-cluster-rbac

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Que fait Audit RBAC du cluster Kubernetes ?

Quand utiliser

  • Lors d'évaluations de sécurité de clusters Kubernetes (EKS, GKE, AKS ou autogérés)
  • Lors de la validation que les politiques RBAC appliquent le moindre privilège pour les utilisateurs et les comptes de service
  • Lors de l'investigation de mouvements latéraux potentiels ou d'escalade de privilèges au sein d'un cluster Kubernetes
  • Lorsque des audits de conformité exigent une documentation des contrôles d'accès et des permissions
  • Lors de l'intégration de nouvelles équipes à un cluster partagé et de la définition de politiques RBAC appropriées

Ne pas utiliser pour l'audit des politiques réseau (utiliser les outils Cilium ou Calico), pour l'analyse d'images conteneurisées (utiliser Trivy ou Grype), ou pour la surveillance de sécurité au moment de l'exécution (utiliser Falco ou Sysdig Secure).

Prérequis

  • kubectl configuré avec les permissions cluster-admin ou des permissions de lecture équivalentes sur le cluster cible
  • rbac-tool installé (kubectl krew install rbac-tool ou binaire depuis GitHub)
  • KubiScan installé (pip install kubiscan)
  • Kubeaudit installé (brew install kubeaudit ou depuis les releases GitHub)
  • Accès aux journaux d'audit du cluster pour corréler les résultats RBAC avec les accès API réels

Workflow

Étape 1 : Énumérer les ClusterRoles et Roles avec des permissions dangereuses

Identifier les rôles avec des permissions wildcard, un accès aux secrets, pod exec ou des capacités d'escalade.

# Lister tous les ClusterRoles avec un accès verbe wildcard
kubectl get clusterroles -o json | python3 -c "
import json, sys
data = json.load(sys.stdin)
for role in data['items']:
    name = role['metadata']['name']
    for rule in role.get('rules', []):
        verbs = rule.get('verbs', [])
        resources = rule.get('resources', [])
        if '*' in verbs or '*' in resources:
            print(f'ClusterRole : {name}')
            print(f'  Verbes : {verbs}')
            print(f'  Ressources : {resources}')
            print(f'  Groupes API : {rule.get(\"apiGroups\", [])}')
            print()
"

# Trouver les rôles pouvant lire les secrets
kubectl get clusterroles -o json | python3 -c "
import json, sys
data = json.load(sys.stdin)
for role in data['items']:
    name = role['metadata']['name']
    for rule in role.get('rules', []):
        resources = rule.get('resources', [])
        verbs = rule.get('verbs', [])
        if ('secrets' in resources or '*' in resources) and ('get' in verbs or 'list' in verbs or '*' in verbs):
            if not name.startswith('system:'):
                print(f'ClusterRole : {name} -> peut accéder aux secrets (verbes : {verbs})')
"

# Trouver les rôles avec permissions pod/exec (risque d'évasion de conteneur)
kubectl get clusterroles -o json | python3 -c "
import json, sys
data = json.load(sys.stdin)
for role in data['items']:
    name = role['metadata']['name']
    for rule in role.get('rules', []):
        resources = rule.get('resources', [])
        if 'pods/exec' in resources or 'pods/*' in resources:
            print(f'ClusterRole : {name} -> a accès pods/exec')
"

Étape 2 : Auditer les ClusterRoleBindings et RoleBindings

Examiner les liaisons pour identifier qui a un accès élevé et détecter les attributions de groupes trop larges.

# Lister tous les ClusterRoleBindings avec leurs sujets
kubectl get clusterrolebindings -o json | python3 -c "
import json, sys
data = json.load(sys.stdin)
for binding in data['items']:
    name = binding['metadata']['name']
    role = binding['roleRef']['name']
    subjects = binding.get('subjects', [])
    for subject in subjects:
        kind = subject.get('kind', '')
        subj_name = subject.get('name', '')
        ns = subject.get('namespace', 'cluster-wide')
        print(f'{name} -> Rôle : {role} | {kind} : {subj_name} ({ns})')
" | sort

# Trouver les liaisons à cluster-admin
kubectl get clusterrolebindings -o json | python3 -c "
import json, sys
data = json.load(sys.stdin)
for binding in data['items']:
    if binding['roleRef']['name'] == 'cluster-admin':
        print(f\"Liaison : {binding['metadata']['name']}\")
        for subject in binding.get('subjects', []):
            print(f\"  {subject.get('kind')} : {subject.get('name')} (ns : {subject.get('namespace', 'N/A')})\")
"

# Trouver les liaisons accordant l'accès à tous les utilisateurs authentifiés
kubectl get clusterrolebindings -o json | python3 -c "
import json, sys
data = json.load(sys.stdin)
for binding in data['items']:
    for subject in binding.get('subjects', []):
        if subject.get('name') in ['system:authenticated', 'system:unauthenticated']:
            print(f\"ATTENTION : {binding['metadata']['name']} accorde {binding['roleRef']['name']} à {subject['name']}\")
"

Étape 3 : Analyser avec rbac-tool pour une analyse complète

Utiliser rbac-tool pour une analyse RBAC automatisée, incluant les requêtes who-can et la génération de politiques.

# Qui peut get des secrets dans tous les namespaces
kubectl rbac-tool who-can get secrets

# Qui peut créer des pods (risque d'évasion de conteneur)
kubectl rbac-tool who-can create pods

# Qui peut exec dans les pods
kubectl rbac-tool who-can create pods/exec

# Qui peut escalader les privilèges (verbes bind/escalate)
kubectl rbac-tool who-can bind clusterroles
kubectl rbac-tool who-can escalate clusterroles

# Générer un rapport de politique RBAC
kubectl rbac-tool analysis

# Visualiser les relations RBAC
kubectl rbac-tool viz --outformat dot > rbac-graphe.dot
dot -Tpng rbac-graphe.dot -o rbac-graphe.png

Étape 4 : Exécuter KubiScan pour la détection des permissions risquées

Utiliser KubiScan pour identifier automatiquement les comptes de service, pods et configurations RBAC risqués.

# Exécuter KubiScan pour trouver les rôles risqués
python3 -m kubiscan -rroles   # Lister les Roles risqués
python3 -m kubiscan -rcr      # Lister les ClusterRoles risqués
python3 -m kubiscan -rrb      # Lister les RoleBindings risqués
python3 -m kubiscan -rcrb     # Lister les ClusterRoleBindings risqués

# Trouver les comptes de service risqués
python3 -m kubiscan -rs       # Comptes de service risqués

# Trouver les pods exécutés avec des comptes de service risqués
python3 -m kubiscan -rp       # Pods risqués

# Vérifier les chemins d'escalade de privilèges
python3 -m kubiscan -pe       # Vecteurs d'escalade de privilèges

# Générer un rapport complet
python3 -m kubiscan -a        # Toutes les vérifications

Étape 5 : Auditer le montage et l'utilisation des tokens des comptes de service

Vérifier les montages inutiles de tokens de comptes de service qui pourraient permettre un mouvement latéral à partir de pods compromis.

# Trouver les pods avec montage automatique de token de compte de service
kubectl get pods --all-namespaces -o json | python3 -c "
import json, sys
data = json.load(sys.stdin)
for pod in data['items']:
    name = pod['metadata']['name']
    ns = pod['metadata']['namespace']
    sa = pod['spec'].get('serviceAccountName', 'default')
    automount = pod['spec'].get('automountServiceAccountToken', True)
    if automount and sa != 'default':
        print(f'{ns}/{name} -> SA : {sa} (token monté automatiquement)')
"

# Trouver les comptes de service avec des secrets de token non par défaut
kubectl get serviceaccounts --all-namespaces -o json | python3 -c "
import json, sys
data = json.load(sys.stdin)
for sa in data['items']:
    name = sa['metadata']['name']
    ns = sa['metadata']['namespace']
    secrets = sa.get('secrets', [])
    if name != 'default' and len(secrets) > 0:
        print(f'{ns}/{name} : {len(secrets)} secret(s) lié(s)')
"

# Vérifier les pods exécutés en mode privilégié ou avec accès hôte
kubectl get pods --all-namespaces -o json | python3 -c "
import json, sys
data = json.load(sys.stdin)
for pod in data['items']:
    name = pod['metadata']['name']
    ns = pod['metadata']['namespace']
    for container in pod['spec'].get('containers', []):
        sc = container.get('securityContext', {})
        if sc.get('privileged', False) or sc.get('runAsUser', 1) == 0:
            print(f'RISQUE : {ns}/{name}/{container[\"name\"]} - privilégié={sc.get(\"privileged\",False)} runAsRoot={sc.get(\"runAsUser\",\"non défini\")==0}')
"

Étape 6 : Exécuter Kubeaudit pour la validation RBAC et des politiques de sécurité

Exécuter Kubeaudit pour des vérifications de sécurité complètes, y compris les résultats liés au RBAC.

# Exécuter toutes les vérifications kubeaudit
kubeaudit all --kubeconfig ~/.kube/config

# Exécuter des vérifications spécifiques liées au RBAC
kubeaudit privesc    # Vérifier allowPrivilegeEscalation
kubeaudit rootfs     # Vérifier readOnlyRootFilesystem
kubeaudit nonroot    # Vérifier runAsNonRoot
kubeaudit capabilities  # Vérifier les capabilities dangereuses

# Sortie au format JSON pour traitement
kubeaudit all --kubeconfig ~/.kube/config -f json > kubeaudit-resultats.json

Concepts clés

TermeDéfinition
RBACContrôle d'accès basé sur les rôles dans Kubernetes, méthode de régulation de l'accès aux ressources du cluster en fonction des rôles des utilisateurs ou des comptes de service
ClusterRoleDéfinition de rôle à l'échelle du cluster qui spécifie les permissions (verbes sur les ressources) applicables à tous les namespaces
ClusterRoleBindingAssocie un ClusterRole à des sujets (utilisateurs, groupes, comptes de service) au niveau du cluster
Service AccountIdentité associée aux pods pour s'authentifier auprès du serveur API Kubernetes, montée automatiquement sauf si désactivée
automountServiceAccountTokenChamp de spécification du pod contrôlant si le token du compte de service est automatiquement monté dans le système de fichiers du pod
Escalade de privilègesVerbes RBAC (bind, escalate, impersonate) qui permettent à un utilisateur de s'accorder ou d'accorder à d'autres des permissions élevées

Outils & systèmes

  • kubectl: CLI principal pour interroger les ressources RBAC Kubernetes (rôles, liaisons, comptes de service)
  • rbac-tool: Plugin kubectl pour l'analyse RBAC, incluant les requêtes who-can, la visualisation et la génération de politiques
  • KubiScan: Outil Python pour analyser le RBAC Kubernetes à la recherche de permissions risquées et de chemins d'escalade de privilèges
  • Kubeaudit: Outil d'audit de sécurité qui vérifie les pods et les charges de travail pour détecter les anti-patrons de sécurité, y compris les problèmes RBAC
  • rakkess: Plugin kubectl affichant la matrice d'accès pour l'utilisateur actuel sur tous les types de ressources

Scénarios courants

Scénario : Auditer un cluster EKS partagé par plusieurs équipes de développement

Contexte : Un cluster EKS partagé dessert quatre équipes de développement. Le RBAC a été configuré lors de la configuration initiale mais n'a pas été revu depuis 12 mois. Les équipes signalent pouvoir accéder aux namespaces des autres équipes.

Approche :

  1. Lister tous les ClusterRoleBindings pour identifier les liaisons accordant un accès large aux utilisateurs authentifiés
  2. Exécuter kubectl rbac-tool who-can get secrets pour trouver les sujets pouvant lire les secrets dans tous les namespaces
  3. Découvrir qu'un ClusterRoleBinding accorde edit à system:authenticated, donnant à tous les utilisateurs un accès en écriture à l'échelle du cluster
  4. Exécuter KubiScan pour identifier les comptes de service avec des permissions risquées et les pods exécutés avec des comptes de service élevés
  5. Remplacer le ClusterRoleBinding par des RoleBindings limités au namespace pour chaque équipe
  6. Désactiver automountServiceAccountToken pour les charges de travail qui n'ont pas besoin d'accès API
  7. Créer une NetworkPolicy pour isoler le trafic des namespaces entre les équipes

Pièges : La suppression de ClusterRoleBindings peut casser les pipelines CI/CD et les opérateurs qui dépendent d'un accès à l'échelle du cluster. Toujours auditer quelles charges de travail utilisent les liaisons avant de les supprimer. EKS mappe les rôles IAM aux groupes Kubernetes via la ConfigMap aws-auth, donc les modifications RBAC doivent être coordonnées avec les mappings de rôles IAM.

Format de sortie

Rapport d'audit RBAC Kubernetes
=================================
Cluster : production-eks (EKS 1.28)
Date d'audit : 2026-02-23
Namespaces : 12

INVENTAIRE RBAC :
  ClusterRoles : 48 (18 personnalisés, 30 système)
  ClusterRoleBindings : 32 (12 personnalisées, 20 système)
  Roles (par namespace) : 24
  RoleBindings (par namespace) : 36
  Comptes de service : 67

CONSTATATIONS CRITIQUES :
[RBAC-001] ClusterRoleBinding accorde edit à system:authenticated
  Liaison : authenticated-edit
  Effet : TOUS les utilisateurs authentifiés ont un accès en édition à TOUS les namespaces
  Risque : Tout utilisateur peut modifier des ressources dans n'importe quel namespace
  Correction : Remplacer par des RoleBindings limités au namespace par équipe

[RBAC-002] ClusterRole personnalisé avec permissions wildcard
  ClusterRole : developer-admin
  Règles : verbes=["*"], ressources=["*"], apiGroups=["*"]
  Liaisons : 4 utilisateurs via developer-admin-binding
  Risque : Équivalent à cluster-admin sans le nom
  Correction : Limiter aux ressources et verbes spécifiques nécessaires

RÉSUMÉ :
  Entités avec cluster-admin : 6 (recommandé : <= 3)
  Rôles avec permissions wildcard : 4
  Comptes de service avec accès aux secrets : 12
  Pods avec tokens montés automatiquement : 45 / 67
  Conteneurs privilégiés : 8

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

abusing-dpapi-for-credential-access

Extract and decrypt Windows DPAPI-protected secrets (Credential Manager, browser logins/cookies, Wi-Fi credentials, KeePass keys) online or offline using SharpDPAPI, SharpChrome, Mimikatz, or Impacket

abusing-shadow-credentials-for-privesc

Take over Active Directory accounts by writing attacker-controlled public keys to msDS-KeyCredentialLink (Shadow Credentials) with pyWhisker, Whisker, or Certipy, then authenticate via PKINIT to recover the target

achieving-cmmc-level-2-compliance

>-

acquiring-disk-image-with-dd-and-dcfldd

Create forensically sound bit-for-bit disk images with dd or dcfldd on a Linux forensic workstation, preserving evidence integrity through hash verification (MD5/SHA) during acquisition. Use when imaging a suspect drive, USB device, or memory card for investigation, preserving volatile disk evidence during incident response, or producing a verified copy for legal or law-enforcement proceedings before any destructive analysis.

analyzing-active-directory-acl-abuse

Detect dangerous ACL misconfigurations in Active Directory using ldap3

analyzing-android-malware-with-apktool

Perform static analysis of Android APK malware using apktool for resource decompilation, jadx for Java source recovery, and androguard for manifest inspection, dangerous permission-combination detection, and identification of obfuscated code, dynamic code loading, and reflection-based API calls. Use to statically triage a suspicious APK without executing it or to build mobile malware detection rules.

analyzing-api-gateway-access-logs

Parses API Gateway access logs (AWS API Gateway, Kong, Nginx) to detect

analyzing-apt-group-with-mitre-navigator

Query ATT&CK data with attackcti, mitreattack-python, and stix2, then build MITRE ATT&CK Navigator layers and multi-layer heatmap overlays mapping one or more APT groups

analyzing-azure-activity-logs-for-threats

Queries Azure Monitor activity logs and sign-in logs via azure-monitor-query

analyzing-bootkit-and-rootkit-samples

Analyzes bootkit and advanced rootkit malware infecting the Master

analyzing-browser-forensics-with-hindsight

Parse Chromium-based browser databases with Hindsight to extract and correlate browsing history, downloads, cookies, cached content, autofill data, saved passwords, and extensions from Chrome, Edge, Brave, Opera, and Vivaldi into a unified timeline (XLSX, JSON, or SQLite output). Use during incident response, insider-threat investigations, or criminal cases when you need to reconstruct a user

analyzing-campaign-attribution-evidence

Systematically evaluate cyber-campaign evidence to attribute an operation to a threat actor, using the Diamond Model and Analysis of Competing Hypotheses (ACH) to weigh infrastructure overlaps, TTP consistency, malware code similarity, and timing/language artifacts into confidence-weighted attribution assessments. Use when an incident investigation needs a defensible attribution confidence level.

analyzing-certificate-transparency-for-phishing

Monitor Certificate Transparency logs using crt.sh and Certstream to

analyzing-cloud-storage-access-patterns

Detect abnormal access in AWS S3, GCS, and Azure Blob Storage by analyzing CloudTrail Data Events, GCS audit logs, and Azure Storage Analytics for after-hours bulk downloads, new-IP access, and API-call spikes (e.g. GetObject) via statistical baselines and time-series anomaly detection. Use when investigating suspected cloud data exfiltration or building related detection rules.

analyzing-cobalt-strike-beacon-configuration

Extract and analyze Cobalt Strike beacon configuration from PE files

analyzing-cobaltstrike-malleable-c2-profiles

Parse and analyze Cobalt Strike Malleable C2 profiles with dissect.cobaltstrike (profiles and beacon-payload configs) and pyMalleableC2 (AST parsing) to extract HTTP/DNS transforms, URIs, headers, sleep/jitter, and injection behavior, then generate network detection signatures. Use when reverse-engineering a captured malleable profile or building detections against Cobalt Strike Beacon traffic.

analyzing-command-and-control-communication

Analyzes malware C2 communication over HTTP, HTTPS, DNS, and custom

analyzing-cyber-kill-chain

Analyzes intrusion activity against the Lockheed Martin Cyber Kill Chain

analyzing-disk-image-with-autopsy

Perform comprehensive forensic analysis of raw (dd), E01, or AFF disk images with Autopsy and The Sleuth Kit, recovering deleted files, examining metadata and embedded artifacts, keyword searching, and building investigation timelines with visual reports. Use for structured analysis of a forensic disk image or when stakeholders need visual reports from evidence.

analyzing-dns-logs-for-exfiltration

Analyzes DNS query logs to detect data exfiltration via DNS tunneling,

Skills associés