Cette page décrit la stratégie des journaux d'audit pour Google Kubernetes Engine (GKE). Pour obtenir des instructions sur l'activation et l'affichage des différents types de journaux d'audit, ainsi que sur les autorisations IAM requises, consultez la section Informations concernant les journaux d'audit de GKE.
Avant de commencer
Avant de lire ce document, assurez-vous de connaître les sujets suivants :
Présentation
Dans un cluster GKE, le serveur d'API Kubernetes écrit les entrées du journal d'audit dans un backend géré par GKE. Lorsque GKE reçoit des entrées de journal du serveur d'API Kubernetes, il les écrit dans le journal d'activité d'administration et le journal d'accès aux données de votre projet.
Deux stratégies influencent ce que vous voyez dans les journaux d'audit de votre projet :
La stratégie d'audit Kubernetes, qui définit les règles pour lesquelles des événements sont enregistrés en tant qu'entrées de journal. Elle spécifie également les données que les entrées de journal doivent inclure.
La stratégie d'audit GKE détermine les entrées à écrire dans votre journal d'activité d'administration et celles à enregistrer dans votre journal d'accès aux données.
Les journaux d'audit écrits dans votre journal d'accès aux données dépendent de la configuration de votre journal d'audit. Les journaux d'accès aux données utilisent les tarifs d'observabilité de Google Cloud. Les journaux d'activité d'administration sont gratuits. GKE est compatible avec les types de journaux d'accès aux données suivants.
ADMIN_READ
: opérations de lecture des métadonnées sur les ressources Kubernetes (par exemple, lister les pods).DATA_READ
: opérations de lecture de données dans les ressources Kubernetes (par exemple, lire les journaux pour un pod).DATA_WRITE
: opérations d'écriture de données sur les ressources Kubernetes (par exemple, mettre à jour l'état des pods).
Pour en savoir plus, consultez la section Configurer les journaux d'audit des accès aux données.
Stratégie d'audit Kubernetes
Le serveur d'API Kubernetes suit une stratégie spécifiée dans l'option --audit-policy-file
de la commande kube-apiserver.
Lorsque GKE démarre le serveur d'API Kubernetes, il fournit un fichier de stratégie d'audit en définissant la valeur de l'option --audit-policy-file
. Dans le dépôt Kubernetes Open Source, vous pouvez voir le script configure-helper.sh, qui génère le fichier de stratégie d'audit. Vous pouvez voir l'essentiel du fichier de stratégie d'audit en consultant directement le script.
Événements et étapes
Lorsqu'une personne ou un composant adresse une requête au serveur d'API Kubernetes, la demande passe par une ou plusieurs étapes :
Étape | Description |
---|---|
RequestReceived | Le gestionnaire d'audit a reçu la requête. |
ResponseStarted | Les en-têtes de réponse ont été envoyés, mais pas le corps de la réponse. |
ResponseComplete | Le corps de la réponse est terminé et aucun octet supplémentaire ne sera envoyé. |
Panic | Une erreur de serveur interne s'est produite et la requête n'a pas abouti. |
Chaque étape d'une requête génère un événement qui est traité conformément à une stratégie. La stratégie spécifie si l'événement doit être enregistré en tant qu'entrée de journal et, le cas échéant, quelles données doivent être incluses dans l'entrée de journal.
Niveaux d'audit
Le fichier de stratégie d'audit Kubernetes contient une liste de règles. Dans le fichier de stratégie, la première règle correspondant à un événement définit le niveau d'audit pour l'événement.
Une règle peut spécifier l'un des niveaux d'audit suivants :
Niveau | Description |
---|---|
None | Ne créez pas d'entrée de journal pour l'événement. |
Metadata | Créez une entrée de journal. Incluez des métadonnées, mais n'incluez pas le corps de la demande ni celui de la réponse. |
Request | Créez une entrée de journal. Incluez les métadonnées et le corps de la requête, mais n'incluez pas le corps de la réponse. |
RequestResponse | Créez une entrée de journal. Incluez les métadonnées, le corps de la requête et celui de la réponse. |
Voici un exemple de règle. Si un événement correspond à la règle, le serveur d'API Kubernetes crée une entrée de journal au niveau Request
.
- level: Request userGroups: ["system:nodes"] verbs: ["update","patch"] resources: - group: "" # core resources: ["nodes/status", "pods/status"] omitStages: - "RequestReceived"
Un événement correspond à la règle si toutes les conditions suivantes sont remplies :
- L'événement ne correspond à aucune règle précédente du fichier de stratégie.
- L'identité effectuant l'appel se trouve dans le groupe d'utilisateurs
system:nodes
. - L'appel est une requête
update
ou une requêtepatch
. - La requête porte sur une ressource
nodes/status
oupods/status
. - L'événement n'est pas destiné à l'étape
RequestReceived
de l'appel.
Résumé de la stratégie d'audit Kubernetes pour les clusters GKE
En général, les requêtes d'écriture telles que
create
,update
etdelete
sont consignées au niveauRequestResponse
.En général, les événements
get
,list
etwatch
sont consignés au niveauMetadata
.Certains événements sont traités comme des cas particuliers. Pour une liste définitive des requêtes traitées en tant que cas particuliers, consultez le script de la stratégie. Au moment de la rédaction de ce document, vous trouverez les cas particuliers suivants :
Les requêtes de mise à jour et de correctif effectuées par
kubelet
,system:node-problem-detector
ousystem:serviceaccount:kube-system:node-problem-detector
sur une ressourcenodes/status
oupods/status
sont consignées au niveau "Request".Les requêtes de mise à jour et de correctif effectuées par n'importe quelle identité du groupe
system:nodes
sur une ressourcenodes/status
oupods/status
sont consignées au niveau "Request".Les requêtes
deletecollection
effectuées parsystem:serviceaccount:kube-system:namespace-controller
sont consignées au niveau "Request".Les requêtes sur une ressource
secrets
,configmaps
outokenreviews
sont consignées au niveau "Metadata".
Certaines requêtes ne sont pas du tout enregistrées. Pour obtenir la liste définitive des requêtes non consignées, consultez les règles
level: None
dans le script de la stratégie. Au moment de la rédaction de ce document, voici les requêtes qui ne sont pas consignées :Les requêtes de
system:kube-proxy
pour surveiller une ressourceendpoints
,services
ouservices/status
Les requêtes Get de
system:unsecured
sur une ressourceconfigmaps
dans l'espace de nomskube-system
Les requêtes Get de
kubelet
sur une ressourcenodes
ounodes/status
Les requêtes Get de n'importe quelle identité dans le groupe
system:nodes
sur une ressourcenodes
ounodes/status
Les requêtes Get et Update de
system:kube-controller-manager
,system:kube-scheduler
ousystem:serviceaccount:endpoint-controller
sur une ressourceendpoints
dans l'espace de nomskube-system
Les requêtes Get de
system:apiserver
sur une ressourcenamespaces
,namespaces/status
ounamespaces/finalize
Les requêtes Get et List de
system:kube-controller-manager
sur n'importe quelle ressource du groupemetrics.k8s.io
Les requêtes vers des URL qui correspondent à
/healthz*
,/version
ou/swagger*
Stratégie d'audit GKE
Lorsque GKE reçoit des entrées de journal du serveur d'API Kubernetes, il applique sa propre stratégie pour déterminer les entrées à écrire dans le journal d'activité d'administration de votre projet et celles à écrire dans le journal d'accès aux données de votre projet.
Dans la plupart des cas, GKE applique les règles suivantes pour consigner les entrées provenant du serveur d'API Kubernetes :
Les entrées représentant des requêtes
create
,delete
etupdate
sont consignées dans votre journal des activités d'administration.Les entrées représentant des requêtes
get
,list
etupdateStatus
sont consignées dans votre journal d'accès aux données.
Pour vous renseigner en détail sur les tarifs et les types de journaux activés par défaut, consultez la page Informations sur Logging.
Comprendre le fichier de stratégie d'audit Kubernetes
Pour les clusters GKE, le fichier de stratégie d'audit Kubernetes commence par des règles spécifiant que certains événements ne doivent pas être consignés du tout. Par exemple, cette règle indique que toute requête get
de kubelet
sur une ressource nodes
ou nodes/status
ne doit pas être consignée. Rappelez-vous qu'un niveau None
signifie qu'aucun événement correspondant ne doit être consigné :
- level: None users: ["kubelet"] # legacy kubelet identity verbs: ["get"] resources: - group: "" # core resources: ["nodes", "nodes/status"]
Après la liste des règles level: None
, le fichier de stratégie contient une liste de règles constituant des cas particuliers. Par exemple, voici une règle de cas particulier qui indique de consigner certaines requêtes au niveau Metadata
:
- level: Metadata resources: - group: "" # core resources: ["secrets", "configmaps"] - group: authentication.k8s.io resources: ["tokenreviews"] omitStages: - "RequestReceived"
Un événement correspond à la règle si toutes les conditions suivantes sont remplies :
- L'événement ne correspond à aucune règle précédente du fichier de stratégie.
- La requête porte sur une ressource de type
secrets
,configmaps
outokenreviews
. - L'événement n'est pas destiné à l'étape
RequestReceived
de l'appel.
En plus de la liste des règles de cas particuliers, le fichier de règles contient des règles générales.
Pour consulter les règles générales du script, vous devez remplacer la valeur de known_apis
par ${known_apis}
. Après le remplacement vous obtenez une règle identique à ce qui suit :
- level: Request verbs: ["get", "list", "watch"] resources: - group: "" # core - group: "admissionregistration.k8s.io" - group: "apiextensions.k8s.io" - group: "apiregistration.k8s.io" - group: "apps" - group: "authentication.k8s.io" - group: "authorization.k8s.io" - group: "autoscaling" - group: "batch" - group: "certificates.k8s.io" - group: "extensions" - group: "metrics.k8s.io" - group: "networking.k8s.io" - group: "policy" - group: "rbac.authorization.k8s.io" - group: "settings.k8s.io" - group: "storage.k8s.io" omitStages: - "RequestReceived"
La règle s'applique aux événements qui ne correspondent à aucune règle précédente du fichier de stratégie et qui ne se trouvent pas à l'étape RequestReceived
. La règle indique que les requêtes get
, list
et watch
sur toute ressource appartenant à l'un des groupes répertoriés doivent être consignées au niveau Request
.
La règle suivante du fichier de stratégie ressemble à ce qui suit :
- level: RequestResponse resources: - group: "" # core - group: "admissionregistration.k8s.io" - group: "apiextensions.k8s.io" - group: "apiregistration.k8s.io" - group: "apps" - group: "authentication.k8s.io" - group: "authorization.k8s.io" - group: "autoscaling" - group: "batch" - group: "certificates.k8s.io" - group: "extensions" - group: "metrics.k8s.io" - group: "networking.k8s.io" - group: "policy" - group: "rbac.authorization.k8s.io" - group: "settings.k8s.io" - group: "storage.k8s.io" omitStages: - "RequestReceived"
La règle s'applique aux événements qui ne correspondent à aucune règle précédente du fichier de stratégie et qui ne se trouvent pas à l'étape RequestReceived
. En particulier, la règle ne s'applique pas aux requêtes de lecture : get
, list
et watch
. Au lieu de cela, elles s'applique aux requêtes d'écriture telles que create
, update
et delete
. La règle indique que les requêtes d'écriture doivent être consignées au niveau RequestResponse
.
Étape suivante
- Audits Kubernetes
- Accéder aux journaux d'audit
- Présentation de la sécurité dans GKE
- Cloud Audit Logging