Aller au contenu

Audit de l'API Kubernetes

AKKO fournit une politique d'audit prête pour la production qui enregistre chaque action significative sur le serveur API Kubernetes — qui a fait quoi, quand, sur quelle ressource. Les logs sont expédiés vers logs layer via log shipper et interrogeables depuis Dashboards (tableau de bord « Audit Trail »).

L'activation impose des changements de flags sur le serveur API : c'est une opération unique par cluster.


Ce qui est enregistré

Classe d'événement Niveau Pourquoi
Écritures (create/update/patch/delete) sur workloads, RBAC, ingress, CRDs RequestResponse Diff complet visible — répond à « qui a changé ça »
Pod exec / attach / port-forward RequestResponse Détecte accès shell et tunnels
Lecture sur Secrets, ConfigMaps, tokens ServiceAccount Metadata Détecte les tentatives d'exfiltration
Authentification (TokenReview, SubjectAccessReview) Metadata Audit des décisions RBAC
Lecture sur tout le reste (kubectl get/list) Metadata Trail léger d'exploration
Lectures system:nodes (kubelet polling) None Filtré — 90 % du bruit API
/healthz, /metrics, /openapi/* None Filtré — sondes santé

Fichier de politique : helm/k8s-audit/audit-policy.yaml


k3s (Netcup, edge, mono-noeud)

# 1. Copier la politique dans le dossier de config k3s
sudo cp helm/k8s-audit/audit-policy.yaml /etc/rancher/k3s/audit-policy.yaml

# 2. Ajouter les flags du serveur API à la config k3s
sudo tee -a /etc/rancher/k3s/config.yaml <<'EOF'
kube-apiserver-arg:
  - audit-policy-file=/etc/rancher/k3s/audit-policy.yaml
  - audit-log-path=/var/log/k3s-audit.log
  - audit-log-maxage=30
  - audit-log-maxbackup=10
  - audit-log-maxsize=100
EOF

# 3. Redémarrer k3s pour prendre en compte les flags
sudo systemctl restart k3s

# 4. Vérifier
sudo tail -f /var/log/k3s-audit.log | jq .

log shipper (déployé par AKKO) scrape automatiquement /var/log/k3s-audit.log sur le noeud hôte et expédie les entrées vers logs layer sous le label job="k3s-audit".


EKS (AWS)

L'audit EKS s'active via un flag CloudWatch — pas besoin de fichier de politique (EKS utilise la politique upstream par défaut, équivalente à la nôtre).

aws eks update-cluster-config \
  --region eu-west-1 \
  --name akko-prod \
  --logging '{"clusterLogging":[{"types":["audit","authenticator","controllerManager"],"enabled":true}]}'

Les logs arrivent dans le groupe CloudWatch /aws/eks/akko-prod/cluster. Pour centraliser dans Dashboards, utiliser le DaemonSet AWS for Fluent Bit (ou le shipper logs layer fourni par AKKO).


GKE (Google Cloud)

gcloud container clusters update akko-prod \
  --region europe-west1 \
  --logging=SYSTEM,WORKLOAD,API_SERVER

Les logs arrivent dans Cloud Logging. Filtre :

resource.type="k8s_cluster"
protoPayload.serviceName="k8s.io"

Pour les expédier vers logs layer : déployer le sink Cloud Logging vers logs layer (chart Helm séparé) ou utiliser Pub/Sub → log shipper.


AKS (Azure)

az monitor diagnostic-settings create \
  --name akko-audit \
  --resource $(az aks show -g <rg> -n akko-prod --query id -o tsv) \
  --logs '[{"category":"kube-audit","enabled":true},{"category":"kube-audit-admin","enabled":true}]' \
  --workspace <log-analytics-workspace-id>

Les logs arrivent dans le workspace Log Analytics. Le langage de requête est KQL — voir la table AzureDiagnostics.


OpenShift

OpenShift écrit les logs d'audit par défaut dans /var/log/kube-apiserver/audit.log sur chaque noeud master. Pour remplacer le profil par la baseline AKKO :

apiVersion: config.openshift.io/v1
kind: APIServer
metadata:
  name: cluster
spec:
  audit:
    profile: WriteRequestBodies

Pour des règles personnalisées complètes, monter audit-policy.yaml via un MachineConfig et le référencer dans customRules.


Interroger les événements d'audit

Une fois les logs dans logs layer, le tableau de bord Dashboards Audit Trail fournit des panneaux prêts à l'emploi :

  • Top utilisateurs par appels API (dernière heure)
  • Créations / suppressions de ressources (timeline)
  • Opérations privilégiées (pods/exec, changements de RoleBinding)
  • Lectures sensibles (accès Secret par utilisateur)

Exemples LogQL bruts :

# Toutes les lectures de Secret de la dernière heure
{job="k3s-audit"} | json | objectRef_resource = "secrets" | verb = "get"

# Tous les changements de RoleBinding aujourd'hui
{job="k3s-audit"} | json | objectRef_resource = "rolebindings" | verb =~ "create|update|patch|delete"

# Top 10 utilisateurs par volume d'écritures
sum by (user_username) (count_over_time(
  {job="k3s-audit"} | json | verb =~ "create|update|patch|delete" [1h]
))


Rotation & rétention

Les flags k3s ci-dessus tournent tous les 100 Mo et conservent 10 backups pendant 30 jours sur disque. logs layer applique une rétention distincte (30 jours par défaut, 90 jours sur Netcup — voir Configuration logs layer). Régler la rétention disque plus courte que logs layer pour éviter la duplication.


Mapping conformité

Standard Exigence Couvert
SOC 2 CC6.1 Journalisation des accès logiques ✅ Tous les événements d'écriture enregistrés avec identité utilisateur
ISO 27001 A.12.4.1 Journalisation des événements ✅ Décisions d'authentification + autorisation
RGPD Art. 32 Intégrité & responsabilité ✅ Log JSON tamper-evident expédié vers logs layer
HDS Hébergement de données de santé — logs d'accès ✅ Lectures de ressources sensibles au niveau Metadata

Pour les déploiements air-gapped, voir Déploiement Air-Gapped pour expédier les logs d'audit vers un logs layer interne sans egress internet.