Audit Logging

Cette page explique comment utiliser la journalisation d'audit dans vos clusters Google Kubernetes Engine (GKE).

Présentation

La journalisation d'audit Kubernetes est disponible dans tous les clusters alimentés par Kubernetes. Elle enregistre de manière chronologique les appels passés vers le serveur d'API Kubernetes. Les entrées du journal d'audit Kubernetes sont utiles pour enquêter sur les demandes d'API suspectes, pour collecter des statistiques ou pour créer des alertes de surveillance pour les appels d'API indésirables.

Les clusters GKE intègrent Cloud Audit Logging et Stackdriver Logging à la journalisation d'audit Kubernetes. Vous pouvez consulter les entrées du journal d'audit Kubernetes dans votre projet Google Cloud.

Outre les entrées écrites par Kubernetes, les journaux d'audit de votre projet contiennent des entrées écrites par Kubernetes Engine.

Audit Logging est proposé en disponibilité générale dans GKE 1.11.4 et versions ultérieures.

Avant de commencer

Avant de commencer, effectuez les tâches suivantes :

Configurez les paramètres gcloud par défaut à l'aide de l'une des méthodes suivantes :

  • Utilisez gcloud init pour suivre les instructions permettant de définir les paramètres par défaut.
  • Utilisez gcloud config pour définir individuellement l'ID, la zone et la région de votre projet.

Utiliser gcloud init

  1. Exécutez gcloud init et suivez les instructions :

    gcloud init

    Si vous utilisez SSH sur un serveur distant, utilisez l'option --console-only pour empêcher la commande d'ouvrir un navigateur :

    gcloud init --console-only
  2. Suivez les instructions pour autoriser gcloud à utiliser votre compte Google Cloud.
  3. Créez ou sélectionnez une configuration.
  4. Choisissez un projet Google Cloud.
  5. Choisissez une zone Compute Engine par défaut.

Utiliser gcloud config

  • Définissez votre ID de projet par défaut :
    gcloud config set project project-id
  • Si vous travaillez avec des clusters zonaux, définissez votre zone de calcul par défaut :
    gcloud config set compute/zone compute-zone
  • Si vous utilisez des clusters régionaux, définissez votre région de calcul par défaut :
    gcloud config set compute/region compute-region
  • Mettez à jour gcloud vers la dernière version :
    gcloud components update

Vous devez avoir un cluster Kubernetes Engine dans votre projet. Vous pouvez utiliser un cluster existant ou en créer un nouveau pour les exercices de cette rubrique. Si vous choisissez d'utiliser un cluster existant, assurez-vous qu'il a eu une activité récente. Par exemple, si vous n'avez pas créé de déploiement récemment, vous pouvez créer un déploiement maintenant en saisissant cette commande :

kubectl run log-exercise --image nginx

Documentez-vous sur la journalisation d'audit Kubernetes.

Journaux d'audit dans votre projet

Votre projet Cloud contient les journaux d'audit suivants :

  • Journal Activité d'administration
  • Journal Accès aux données

La journalisation de l'activité d'administration est activée par défaut et n'entraîne aucun coût supplémentaire.

La journalisation de l'accès aux données est désactivée par défaut et son activation peut entraîner une facturation supplémentaire. Pour en savoir plus sur l'activation de la journalisation de l'accès aux données et sur les coûts associés, consultez la section Configurer des journaux d'accès aux données.

Kubernetes Engine ne permet pas la journalisation Access Transparency.

Divers services Google Cloud Platform écrivent des entrées dans les journaux de votre projet. Le service Kubernetes écrit également des entrées dans les journaux d'audit de votre projet. Pour les clusters Kubernetes Engine, les entrées de journal écrites par ces services sont les plus pertinentes :

Service Nom à afficher
k8s.io Kubernetes
container.googleapis.com Kubernetes Engine

Afficher le journal d'activité d'administration de votre projet

Console

  1. Dans Cloud  Console, accédez à la page Journaux du menu Journalisation.

    Accéder à la page Journaux

  2. En haut de la page, localisez le menu déroulant permettant de sélectionner un type de ressource. Dans ce menu, sélectionnez Cluster Kubernetes.

  3. Vous pouvez également spécifier l'emplacement ou choisir Tous les emplacements. Si vous sélectionnez un emplacement, vous pouvez sélectionner un cluster spécifique à cet emplacement.

  4. Le menu suivant à droite sert à sélectionner un journal. Dans le menu déroulant, sélectionnez activité, puis cliquez sur OK.

  5. L'écran affiche tous les niveaux de journalisation par défaut. Pour spécifier un niveau de journalisation (Avertissement, par exemple), sélectionnez-le dans le menu déroulant représentant les niveaux de journalisation.

  6. Il est possible que seules les entrées du journal de la dernière heure soient affichées. Si vous ne voyez aucune entrée de journal pour la dernière heure, cliquez sur Charger les plus anciens journaux.

  7. Dans la zone de recherche Filtrer par libellé ou texte recherché, juste au-dessus des menus déroulants décrits ci-dessus, cliquez sur la flèche vers le bas pour ouvrir le menu déroulant. Dans le menu, sélectionnez Convertir en filtre avancé.

  8. La zone de texte affiche un filtre semblable à celui-ci :

    resource.type="k8s_cluster"
    logName="projects/my-project/logs/cloudaudit.googleapis.com%2Factivity"
    
  9. Ouvrez l'une des entrées du journal en cliquant sur la flèche au début de la ligne. Le champ logName de l'entrée a la valeur projects/project-id/logs/cloudaudit.googleapis.com%2Factivity.

gcloud

Répertoriez les deux premières entrées du journal Activité d'administration de votre projet :

gcloud logging read \
    'logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"' \
    --limit 2 \
    --freshness 300d

project-id est l'ID de votre projet.

La sortie affiche deux entrées de journal. Notez que pour chaque entrée de journal, le champ logName a la valeur projects/project-id/logs/cloudaudit.googleapis.com%2Factivity.

insertId: 18yao5jem14og
labels:
  cluster_version: 1.8.8-gke.0
logName: projects/project-id/logs/cloudaudit.googleapis.com%2Factivity
...

Interfaces de filtrage de base et avancées

Dans la console Cloud, la page Journaux comporte deux interfaces de filtrage : une de base et l'autre avancée. Pour en savoir plus sur les deux interfaces de filtrage, consultez la page Interfaces des filtres de la visionneuse de journaux.

Afficher les services qui écrivent dans votre journal d'activité d'administration

Console

  1. Dans Cloud  Console, accédez à la page Journaux du menu Journalisation.

    Accéder à la page Journaux

  2. Si la page Journaux n'est pas déjà en mode avancé, passez en mode avancé. Dans la zone de filtre, cliquez sur la flèche vers le bas située à droite et sélectionnez Convertir en filtre avancé.

  3. Dans la zone de filtre, supprimez le texte existant et ajoutez ce filtre.

    logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
    protoPayload.serviceName="k8s.io"
    

    project-id est l'ID de votre projet.

    Cliquez sur Envoyer le filtre.

    L'écran répertorie toutes les entrées du journal d'activité d'administration écrites par le service k8s.io, c'est-à-dire les entrées écrites par le plan de contrôle de Kubernetes.

  4. Recherchez les entrées de journal écrites par des services autres que k8s.io. Dans la zone de filtre, remplacez serviceName="k8s.io" par serviceName!="k8s.io". Cliquez sur Envoyer le filtre.

    Toutes les entrées du journal d'activité d'administration qui n'ont pas été écrites par le service k8s.io sont répertoriées.

  5. Ouvrez l'une des entrées de journal et développez le champ protoPayload. Examinez la valeur de serviceName pour savoir quel service a écrit l'entrée de journal.

  6. Recherchez les entrées de journal écrites par le service container.googleapis.com, c'est-à-dire les entrées écrites par le plan de contrôle de Kubernetes Engine. Dans la zone de filtre, remplacez serviceName!="k8s.io" par serviceName="container.googleapis.com". Cliquez sur Envoyer le filtre.

gcloud

  1. Répertoriez les deux premières entrées du journal d'activité d'administration de votre projet écrites par le service k8s.io, c'est-à-dire les entrées écrites par le plan de contrôle de Kubernetes.

    gcloud logging read \
       'logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
           AND protoPayload.serviceName="k8s.io"' \
       --limit 2 \
       --freshness 300d
    

    project-id est l'ID de votre projet.

    Dans le résultat, vous pouvez voir que protoPayload:serviceName a la valeur k8s.io :

    protoPayload:
     ...
     serviceName: k8s.io
    
  2. Recherchez les entrées de journal écrites par des services autres que k8s.io :

    gcloud logging read \
       'logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
           AND protoPayload.serviceName!="k8s.io"' \
       --limit 2 \
       --freshness 300d
    

    Toutes les entrées du journal d'activité d'administration qui n'ont pas été écrites par le service k8s.io sont répertoriées.

    logName: projects/project-id/logs/cloudaudit.googleapis.com%2Factivity
    ...
    protoPayload:
     ...
     serviceName: compute.googleapis.com
    ...
    
  3. Dans l'une des entrées de journal, examinez la valeur de protoPayload.serviceName pour savoir quel service a écrit l'entrée de journal.

  4. Recherchez les entrées de journal écrites par le service container.googleapis.com, c'est-à-dire les entrées écrites par le plan de contrôle de Kubernetes Engine :

    gcloud logging read \
       'logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
           AND protoPayload.serviceName="container.googleapis.com"' \
       --limit 2 \
       --freshness 300d
    

    project-id est l'ID de votre projet.

Filtrer le journal d'activité d'administration par type de ressource

Chaque entrée du journal d'activité d'administration s'applique à un certain type de ressource. Voici les types de ressources les plus pertinents pour les clusters Kubernetes :

Type de ressource Nom à afficher
k8s_cluster Cluster Kubernetes
gke_cluster Opérations du cluster GKE

Les entrées de journal écrites par le serveur de l'API Kubernetes s'appliquent au type de ressource k8s_cluster. Ces entrées de journal décrivent les opérations sur les ressources Kubernetes de votre cluster, par exemple les Pods, Deployments et Secrets.

Les entrées de journal écrites par le serveur de l'API Kubernetes Engine s'appliquent à la ressource gke_cluster. Ces entrées de journal décrivent des opérations telles que la création et la suppression d'un cluster.

Console

  1. Dans Cloud  Console, accédez à la page Journaux du menu Journalisation.

    Accéder à la page Journaux

  2. Si la page Journaux n'est pas déjà en mode de base, passez à ce mode. Dans la zone de filtre, cliquez sur la flèche vers le bas située à droite et sélectionnez Effacer les filtres et revenir au mode de base.

  3. Dans le menu déroulant permettant de sélectionner un type de ressource, sélectionnez Cluster Kubernetes. Il s'agit du nom à afficher pour le type de ressource k8s_cluster.

  4. Dans le menu déroulant permettant de sélectionner un journal, sélectionnez une activité et cliquez sur OK.

    Toutes les entrées du journal d'activité d'administration qui s'appliquent au type de ressource k8s_cluster sont répertoriées à l'écran.

  5. Ouvrez l'une des entrées de journal et développez le champ resource. Vérifiez que le champ type contient la valeur k8s_cluster.

  6. Dans le menu déroulant, sélectionnez Opérations du cluster GKE. Il s'agit du nom à afficher pour le type de ressource gke_cluster. Dans le menu déroulant permettant de sélectionner un journal, sélectionnez Activité, puis cliquez sur OK.

    L'écran répertorie toutes les entrées du journal d'activité d'administration qui s'appliquent au type de ressource gke_cluster.

gcloud

  1. Répertoriez les deux premières entrées du journal d'activité d'administration de votre projet qui s'appliquent au type de ressource k8s_cluster :

    gcloud logging read \
       'logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
           AND resource.type="k8s_cluster"' \
       --limit 2 \
       --freshness 300d
    

    project-id est l'ID de votre projet.

    Dans le résultat, vous pouvez voir que le champ resource:type a la valeur k8s_cluster :

    resource:
     ...
     type: k8s_cluster
    
  2. Répertoriez les deux premières entrées du journal d'activité d'administration de votre projet qui s'appliquent au type de ressource gke_cluster :

    gcloud logging read \
       'logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
           AND resource.type="gke_cluster"' \
       --limit 2 \
       --freshness 300d
    

    Dans le résultat, vous pouvez voir que le champ resource:type a la valeur gke_cluster :

    resource:
     ...
     type: gke_cluster
    

Exemples de filtres pour le journal d'activité d'administration

Voici quelques exemples de filtres que vous pouvez essayer dans Cloud Console. Dans chaque cas, remplacez project-id par l'ID de votre projet.

Recherchez les modifications apportées au contrôle des accès basé sur les rôles, à l'exception des modifications système automatiques :

logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.methodName:"io.k8s.authorization.rbac.v1"
NOT protoPayload.authenticationInfo.principalEmail:"system"
logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.methodName:"io.k8s.authorization.rbac.v1.roles"
NOT protoPayload.authenticationInfo.principalEmail:"system"
logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.methodName:"io.k8s.authorization.rbac.v1.rolebindings"
NOT protoPayload.authenticationInfo.principalEmail:"system"

Vous pouvez utiliser les mêmes requêtes pour rechercher les modifications apportées à clusterroles et clusterrolebindings.

Recherchez les requêtes de signature de certificat :

logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.resourceName:"certificates.k8s.io/v1beta1/certificatesigningrequests"

Recherchez les requêtes Web non authentifiées :

logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.authenticationInfo.principalEmail:"system:anonymous"

Recherchez les appels d'identité kubelet bootstrap :

logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.authenticationInfo.principalEmail:"kubelet"

Recherchez les requêtes authentifiées par un nœud :

logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.authenticationInfo.principalEmail:"system:node"

Recherchez les appels en dehors d'une plage IP :

logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.requestMetadata.callerIp!="127.0.0.1"
protoPayload.requestMetadata.callerIp!="::1"
NOT protoPayload.requestMetadata.callerIp:"ip-prefix"

Recherchez dans votre journal d'activité d'administration les entrées qui s'appliquent au type de ressource k8s_cluster et décrivent la création d'un déploiement :

logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.methodName:"deployments.create"

Recherchez dans votre journal d'activité d'administration les entrées qui s'appliquent au type de ressource k8s_cluster et dont la valeur principalEmail correspond à system:anonymous. Ces entrées représentent probablement des tentatives infructueuses d'authentification.

logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.authenticationInfo.principalEmail="system:anonymous"

Recherchez dans le journal d'activité d'administration les entrées qui s'appliquent au type de ressource gke_cluster et décrivent la création du cluster :

logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="gke_cluster"
protoPayload.methodName="google.container.v1.ClusterManager.CreateCluster"

Recherchez dans votre journal d'activité d'administration les entrées qui s'appliquent au type de ressource gke_cluster et dont la valeur severity correspond à ERROR :

logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="gke_cluster"
severity="ERROR"

Recherchez dans votre journal d'activité d'administration les entrées qui s'appliquent au type de ressource k8s_cluster et décrivent une requête d'écriture dans un fichier secret :

logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.methodName:"io.k8s.core.v1.secrets"
NOT protoPayload.methodName:"get"
NOT protoPayload.methodName:"list"
NOT protoPayload.methodName:"watch"

Recherchez dans votre journal d'activités d'administration des entrées qui s'appliquent au type de ressource k8s_cluster et décrivent une requête Pod envoyée par un utilisateur spécifique :

logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.methodName:"io.k8s.core.v1.pods"
protoPayload.authenticationInfo.principalEmail="dev@example.com"

Pour plus d'informations sur la création de filtres, consultez Filtres de journaux avancés.

Structure d'une entrée de journal

Chaque entrée de journal est un objet de type LogEntry. Pour en savoir plus, consultez la section Comprendre les journaux d'audit.

Activer les journaux d'accès aux données

  1. Obtenez la stratégie Cloud IAM (Cloud Identity and Access Management) pour votre projet :

    gcloud projects get-iam-policy project-id > my-policy.yaml
    

    project-id est l'ID de votre projet.

  2. Ouvrez my-policy.yaml pour afficher votre stratégie Cloud IAM. Votre stratégie contient probablement un objet bindings semblable à celui-ci :

    bindings:
    - members:
      - serviceAccount:xxx.gserviceaccount.com
      - serviceAccount:yyy.gserviceaccount.com
      role: roles/container.clusterAdmin
    - members:
      ...
    
  3. Dans my-policy.yaml, créez un objet auditConfigs ou ajoutez-en un à votre objet auditConfigs existant afin que ADMIN_READ, DATA_WRITE ET DATA_READ soient répertoriés sous auditLogConfigs.

    auditConfigs:
    - auditLogConfigs:
      - logType: ADMIN_READ
      - logType: DATA_WRITE
      - logType: DATA_READ
      service: allServices
    

    Ne modifiez pas la valeur de etag.

  4. Enregistrez votre fichier mis à jour sous le nom my-policy-2.yaml.

    .
  5. Définissez la stratégie Cloud IAM pour votre projet :

    gcloud projects set-iam-policy project-id my-policy-2.yaml
    

    project-id est l'ID de votre projet.

Afficher le journal d'accès aux données de votre projet

Console

  1. Dans Cloud  Console, accédez à la page Journaux du menu Journalisation.

    Accéder à la page Journaux

  2. Si la page Journaux n'est pas déjà en mode de base, passez à ce mode. Dans la zone de filtre, cliquez sur la flèche vers le bas située à droite et sélectionnez Effacer les filtres et revenir au mode de base.

  3. En haut de la page, localisez le menu déroulant permettant de sélectionner un type de ressource. Dans ce menu, sélectionnez Cluster Kubernetes.

  4. Dans le menu permettant de sélectionner un journal, sélectionnez data_access, puis cliquez sur OK.

  5. Dans la zone Filtrer par libellé ou texte recherché, à droite, cliquez sur la flèche vers le bas pour ouvrir le menu déroulant. Dans le menu, sélectionnez Convertir en filtre avancé.

  6. La zone de texte affiche un filtre semblable à celui-ci :

    resource.type="k8s_cluster"
    logName="projects/my-project/logs/cloudaudit.googleapis.com%2Fdata_access"
  7. Ouvrez l'une des entrées de journal, et notez que le champ logName de l'entrée a la valeur projects/project-id/logs/cloudaudit.googleapis.com%2Fdata_access.

gcloud

Répertoriez les deux premières entrées du journal d'accès aux données de votre projet :

gcloud logging read \
    'logName="projects/project-id/logs/cloudaudit.googleapis.com%2Fdata_access"' \
    --limit 2 \
    --freshness 30d

project-id est l'ID de votre projet.

La sortie affiche deux entrées de journal. Notez que pour chaque entrée de journal, le champ logName a la valeur projects/project-id/logs/cloudaudit.googleapis.com%2Fdata_access.

insertId:  "x0vy9eej0j54"
labels: {…}
logName:  "projects/project-id/logs/cloudaudit.googleapis.com%2Fdata_access"
...

Exporter et stocker des entrées de journal

Les entrées de journal sont conservées dans Stackdriver Logging pendant un temps limité appelé "durée de conservation". Après cela, elles sont supprimées.

Si vous souhaitez conserver vos entrées de journal plus longtemps, vous pouvez les exporter vers un service Google tel que Cloud Storage, BigQuery ou Cloud Pub/Sub.

Configurer des métriques et des alertes

Vous pouvez utiliser Stackdriver Monitoring pour configurer des métriques en fonction de vos entrées de journal. Vous pouvez également utiliser des métriques basées sur les journaux pour configurer des graphiques et des alertes.

Stratégie d'audit

La stratégie d'audit de Kubernetes détermine les entrées de journal que le serveur d'API Kubernetes doit exporter. La stratégie d'audit de Kubernetes Engine détermine les entrées envoyées vers le journal d'activité d'administration et celles envoyées vers votre journal d'accès aux données.

Pour plus d'informations sur les stratégies d'audit dans Kubernetes Engine, reportez-vous à la section Stratégie d'audit Kubernetes Engine.

Étapes suivantes