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 :
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.