Le serveur API enregistre chaque requête et réponse de l'API Kubernetes sous forme de journal d'audit. Pour les clusters enregistrés — où un cluster Kubernetes externe est connecté à ACK — les administrateurs de cluster peuvent acheminer ces journaux vers Log Service d'Alibaba Cloud et les utiliser pour répondre à des questions telles que :
Que s'est-il passé et quand ?
Qui a initié la requête ?
Quelle ressource a été affectée ?
Cela permet de retracer l'historique complet des opérations du cluster et d'enquêter sur les incidents de sécurité lors des activités d'exploitation et de maintenance.
Prérequis
Avant de commencer, assurez-vous d'avoir :
Un cluster enregistré avec un cluster Kubernetes externe connecté. Pour les instructions de configuration, consultez Créer un cluster enregistré dans la console ACK
Étape 1 : Configurer la politique d'audit sur les nœuds maîtres
Connectez-vous à un nœud maître et modifiez le fichier /etc/kubernetes/audit-policy.yaml à l'aide du modèle ci-dessous. Répétez cette étape sur tous les autres nœuds maîtres.
La valeur apiVersion dépend de votre version de Kubernetes :
Kubernetes antérieur à la version 1.24 : utilisez
audit.k8s.io/v1beta1Kubernetes 1.24 et versions ultérieures : utilisez
audit.k8s.io/v1
Pour plus de détails, consultez les notes de publication de Kubernetes 1.24.
Niveaux d'audit
Le modèle de politique utilise quatre niveaux d'audit. Comprendre ces niveaux vous aide à décider s'il convient d'ajuster les règles pour votre environnement :
| Niveau | Éléments consignés |
|---|---|
None |
Rien. Les événements correspondant à cette règle ne sont pas consignés. |
Metadata |
Métadonnées de la requête uniquement : utilisateur, horodatage, ressource et verbe. Les corps de requête et de réponse ne sont pas consignés. |
Request |
Métadonnées et corps de la requête. Le corps de la réponse n'est pas consigné. Ne s'applique pas aux requêtes hors ressource. |
RequestResponse |
Métadonnées, corps de la requête et corps de la réponse. Ne s'applique pas aux requêtes hors ressource. |
Modèle de politique d'audit
apiVersion: audit.k8s.io/v1beta1 # Use audit.k8s.io/v1 for Kubernetes >= 1.24
kind: Policy
# Suppress events in the RequestReceived stage.
omitStages:
- "RequestReceived"
rules:
# High-volume, low-risk requests — not logged.
- level: None
users: ["system:kube-proxy"]
verbs: ["watch"]
resources:
- group: "" # core
resources: ["endpoints", "services"]
- level: None
users: ["system:unsecured"]
namespaces: ["kube-system"]
verbs: ["get"]
resources:
- group: "" # core
resources: ["configmaps"]
- level: None
users: ["kubelet"] # legacy kubelet identity
verbs: ["get"]
resources:
- group: "" # core
resources: ["nodes"]
- level: None
userGroups: ["system:nodes"]
verbs: ["get"]
resources:
- group: "" # core
resources: ["nodes"]
- level: None
users:
- system:kube-controller-manager
- system:kube-scheduler
- system:serviceaccount:kube-system:endpoint-controller
verbs: ["get", "update"]
namespaces: ["kube-system"]
resources:
- group: "" # core
resources: ["endpoints"]
- level: None
users: ["system:apiserver"]
verbs: ["get"]
resources:
- group: "" # core
resources: ["namespaces"]
# Read-only URLs — not logged.
- level: None
nonResourceURLs:
- /healthz*
- /version
- /swagger*
# Events — not logged.
- level: None
resources:
- group: "" # core
resources: ["events"]
# Secrets, ConfigMaps, and TokenReviews contain sensitive or binary data —
# log metadata only.
- level: Metadata
resources:
- group: "" # core
resources: ["secrets", "configmaps"]
- group: authentication.k8s.io
resources: ["tokenreviews"]
# Read requests for known API groups — log request metadata only (responses can be large).
- level: Request
verbs: ["get", "list", "watch"]
resources:
- group: "" # core
- group: "admissionregistration.k8s.io"
- group: "apps"
- group: "authentication.k8s.io"
- group: "authorization.k8s.io"
- group: "autoscaling"
- group: "batch"
- group: "certificates.k8s.io"
- group: "extensions"
- group: "networking.k8s.io"
- group: "policy"
- group: "rbac.authorization.k8s.io"
- group: "settings.k8s.io"
- group: "storage.k8s.io"
# Write requests for known API groups — log full request and response.
- level: RequestResponse
resources:
- group: "" # core
- group: "admissionregistration.k8s.io"
- group: "apps"
- group: "authentication.k8s.io"
- group: "authorization.k8s.io"
- group: "autoscaling"
- group: "batch"
- group: "certificates.k8s.io"
- group: "extensions"
- group: "networking.k8s.io"
- group: "policy"
- group: "rbac.authorization.k8s.io"
- group: "settings.k8s.io"
- group: "storage.k8s.io"
# All other requests — log metadata only.
- level: Metadata
Étape 2 : Configurer kube-apiserver sur les nœuds maîtres
Connectez-vous à un nœud maître et modifiez le fichier /etc/kubernetes/manifests/kube-apiserver.yaml. Répétez cette étape sur tous les autres nœuds maîtres.
La configuration comprend trois parties : les indicateurs de ligne de commande, les variables d'environnement pour la collecte des journaux et les montages de volume.
Ajouter les indicateurs de journal d'audit
Ajoutez les indicateurs suivants à la section command :
spec:
containers:
- command:
- kube-apiserver
- --audit-log-maxbackup=10
- --audit-log-maxsize=100
- --audit-log-path=/var/log/kubernetes/kubernetes.audit
- --audit-log-maxage=30
- --audit-policy-file=/etc/kubernetes/audit-policy.yaml
Chaque indicateur contrôle un aspect spécifique de la rotation des journaux et de la politique :
| Indicateur | Description |
|---|---|
--audit-log-path |
Chemin où le backend de journalisation écrit les événements d'audit. L'absence de cet indicateur désactive complètement le backend de journalisation. |
--audit-log-maxsize |
Taille maximale du fichier journal en mégaoctets avant rotation. Définissez la valeur sur 100. |
--audit-log-maxbackup |
Nombre maximal de fichiers journaux tournés à conserver. Définissez la valeur sur 10. |
--audit-log-maxage |
Nombre maximal de jours de conservation des anciens fichiers journaux. Définissez la valeur sur 30. |
--audit-policy-file |
Chemin vers le fichier de politique d'audit configuré à l'étape 1. |
Ajouter les variables d'environnement de collecte des journaux
Ajoutez les variables suivantes à la section env. Remplacez {cluster_id} par l'ID réel de votre cluster dans les quatre noms de variable. Pour trouver l'ID de votre cluster, consultez Afficher les informations du cluster.
env:
- name: aliyun_logs_audit-${cluster_id}
value: /var/log/kubernetes/kubernetes.audit
- name: aliyun_logs_audit-${cluster_id}_tags
value: audit=apiserver
- name: aliyun_logs_audit-${cluster_id}_product
value: k8s-audit
- name: aliyun_logs_audit-${cluster_id}_jsonfile
value: "true"
image: registry-vpc.cn-shenzhen.aliyuncs.com/acs/kube-apiserver:v1.20.4-aliyun.1
| Variable | Description |
|---|---|
aliyun_logs_audit-${cluster_id} |
Chemin vers le fichier journal d'audit collecté par Logtail. |
aliyun_logs_audit-${cluster_id}_tags |
Tag ajouté à chaque entrée de journal pour identifier la source comme étant le serveur API. |
aliyun_logs_audit-${cluster_id}_product |
Identifiant de type de journal utilisé par le backend de journalisation. |
aliyun_logs_audit-${cluster_id}_jsonfile |
Indique à Logtail d'analyser le fichier journal au format JSON. |
Monter le fichier de politique d'audit et le répertoire des journaux
Ajoutez des entrées volumeMounts à la spécification du conteneur :
volumeMounts:
- mountPath: /var/log/kubernetes
name: k8s-audit
- mountPath: /etc/kubernetes/audit-policy.yaml
name: audit-policy
readOnly: true
Ajoutez ensuite les entrées volumes correspondantes au niveau de la spécification du pod :
volumes:
- hostPath:
path: /var/log/kubernetes
type: DirectoryOrCreate
name: k8s-audit
- hostPath:
path: /etc/kubernetes/audit-policy.yaml
type: FileOrCreate
name: audit-policy
Étape 3 : Installer le composant logtail-ds
Installez le composant logtail-ds pour activer la collecte des journaux depuis les nœuds maîtres. Pour les étapes d'installation, consultez Étape 2 : Installer logtail-ds.
Étapes suivantes
Une fois la configuration terminée, consultez et analysez vos journaux d'audit dans la console ACK. Consultez Utiliser l'audit de cluster.