Scénarios d'exportation de données de journalisation : analyse de la sécurité et des accès

Ce document explique comment exporter des journaux de Cloud Logging vers des destinations telles que BigQuery, Chronicle ou un système SIEM tiers pour répondre aux exigences de sécurité. et les exigences d'analyse de l'environnement d'infrastructure cloud de votre organisation. Les entreprises utilisent souvent ces outils d'analyse de sécurité pour prévenir, détecter et contrer les menaces telles que les logiciels malveillants, l'hameçonnage, les rançongiciels et les erreurs de configuration potentielles des éléments. Pour vous aider à répondre à ces exigences de sécurité et d'analyse, ce document présente d'abord les différents journaux liés à la sécurité de votre environnement Google Cloud, des journaux d'application aux journaux de la plate-forme, en plus des journaux d'audit tels que les journaux des activités d'administration et Journaux d'accès aux données.

À l'aide de l'outil de champ d'application des journaux, vous pouvez d'abord évaluer ces types de journaux pertinents à la sécurité, en termes de visibilité et de couverture de détection des menaces. Cet outil vous aide à identifier les tactiques et techniques de menace allant du modèle de menace MITRE ATT&CK® populaire aux types de journaux Google Cloud spécifiques qui vous aideront à étudier ces problèmes courants. De même, il mappe les modules Event Threat Detection de Security Command Center sur les sources de journal Google Cloud correspondantes dont ils dépendent.

Dans ce scénario, les journaux exportés sont diffusés vers un ensemble de données dans BigQuery que vous configurez dans le cadre de l'exportation en plus du filtre de journalisation défini par l'utilisateur. Vous accordez des autorisations pour, le cas échéant, limiter l'accès aux journaux. Vous pouvez simplifier la gestion et l'interrogation des données en configurant le récepteur de journaux pour exporter les données dans des tables partitionnées, dans lesquelles les données sont partitionnées par jour en fonction du champ timestamp de l'entrée de journal. Cette approche peut contribuer à réduire les coûts des requêtes en limitant la quantité de données à analyser dans le cadre des requêtes. Un autre avantage des tables partitionnées est que vous pouvez définir une date d'expiration des partitions au niveau d'une table spécifique ou d'un ensemble de données complet, et ainsi ne conserver les données de journalisation que tant que vous le jugez utile. Par exemple, vous pouvez conserver les données des journaux d'audit pendant trois ans. Les anciennes données sont automatiquement supprimées à mesure que les partitions progressent et expirent.

Ce scénario fait partie de la série Modèles de conception pour les exportations Cloud Logging.

Évaluer les journaux à exporter

Outil de champ d'application des journaux

L'outil de champ d'application interactif suivant répertorie les journaux utiles à la sécurité présents sur Google Cloud, comme les journaux d'audit Cloud, les journaux Access Transparency et plusieurs journaux de plate-forme. Pour vous aider à déterminer quels journaux exporter et analyser afin de répondre à vos propres besoins de sécurité et de conformité, cet outil met en correspondance chaque type de journal avec les éléments correspondants:

Sélectionnez les types de journaux souhaités pour générer automatiquement un filtre de journal approprié à utiliser dans la section Configurer l'exportation de journaux.

Enregistrer le filtre de journal

Dans Cloud Shell, créez une variable pour enregistrer le filtre de journal généré automatiquement précédemment. Vous pouvez également l'affiner davantage en fonction de vos besoins. Par exemple, vous pouvez filtrer (ou exclure) des ressources uniquement dans un ou plusieurs projets spécifiques.

export LOG_FILTER='log-filter'

Configurer l'exportation de journaux

Le diagramme suivant illustre les étapes à suivre pour activer l'exportation des fichiers journaux vers BigQuery.

  • Configurez l'ensemble de données de journalisation à exporter dans BigQuery.
  • Activez la journalisation d'audit pour tous les services Google Cloud.
  • Activez les journaux de plate-forme pour des services Google Cloud spécifiques.
  • Configurez l'exportation de journaux.
  • Définissez les autorisations de stratégie IAM pour l'ensemble de données BigQuery.

Activez l'exportation de la journalisation vers BigQuery.

Configurer l'ensemble de données dans BigQuery

Suivez les instructions pour configurer un jeu de données qui hébergera les journaux exportés. Si vous utilisez des journaux agrégés, l'ensemble de données BigQuery doit se trouver dans l'un des projets Google Cloud de votre organisation. Si vous exportez les journaux d'un seul projet, l'ensemble de données BigQuery doit faire partie du même projet.

Activer les journaux d'audit pour tous les services

Les journaux d'audit pour l'accès aux données sont désactivés par défaut (sauf dans BigQuery). Pour configurer les journaux d'audit pour l'accès aux données directement dans Google Cloud Console, consultez la page Configurer les journaux d'audit pour l'accès aux données. Vous pouvez également configurer les journaux d'audit pour l'accès aux données à l'aide de gcloud en utilisant des objets de stratégies IAM. Pour obtenir un exemple de configuration de stratégie IAM globale qui active les journaux d'audit pour l'accès aux données pour tous les services et tous les utilisateurs, consultez la section Activer tous les journaux d'audit pour l'accès aux données.

Activer les journaux de plate-forme spécifiques au service

Les journaux de plate-forme doivent être activés service par service, généralement au niveau des ressources. Par exemple, les journaux Cloud DNS sont activés au niveau du réseau VPC, les journaux de flux VPC sont activés au niveau du sous-réseau pour toutes les VM du sous-réseau et les journaux des règles de pare-feu sont activés au niveau de la règle de pare-feu individuelle. Pour savoir comment activer un type de journal spécifique, consultez la section Outil de champ d'application des journaux et cliquez sur le lien Activer dans chaque ligne.

Configurer l'exportation de la journalisation

À partir de Google Cloud CLI, utilisez la commande gcloud logging sinks create ou l'appel d'API organizations.sinks.create pour créer un récepteur avec le filtre de journalisation approprié L'exemple de commande gcloud suivant crée un récepteur nommé gcp_logging_sink_bq pour l'organisation. Le récepteur inclut tous les projets enfants et spécifie le filtre de journal enregistré dans la variable $LOG_FILTER créée ci-dessus.

gcloud logging sinks create gcp_logging_sink_bq \
     bigquery.googleapis.com/projects/compliance-logging-export/datasets/gcp_logging_export \
     --use-partitioned-tables \
     --log-filter='$LOG_FILTER' \
     --include-children \
     --organization=324989855333

Le résultat ressemble à ce qui suit :

Created [https://logging.googleapis.com/v2/organizations/324989855333/sinks/gcp_logging_sink_bq].
Please remember to grant `serviceAccount:gcp-logging-sink-bq@logging-o324989855333.iam.gserviceaccount.com` the WRITER role on the dataset..
More information about sinks can be found at /logging/docs/export/configure_export

Dans l'entrée serviceAccount renvoyée par l'appel d'API, l'identité gcp-logging-sink-bq@logging-o324989855333.iam.gserviceaccount.com est incluse dans la réponse. Cette identité représente un compte de service Google Cloud créé spécifiquement pour l'exportation de journaux. Tant que vous n'accordez pas à cette identité un accès en écriture à l'ensemble de données BigQuery, les exportations d'entrées de journal issues de ce récepteur échoueront. Pour en savoir plus, consultez la section suivante.

Définir les autorisations de stratégie IAM pour l'ensemble de données BigQuery

En ajoutant le compte de service gcp-logging-sink-bq@logging-o324989855333.iam.gserviceaccount.com à l'ensemble de données gcp_logging_export avec les autorisations "Éditeur", vous accordez au compte de service l'autorisation d'écrire sur la destination. Tant que vous n'aurez pas ajouté ces autorisations, les opérations d'exportation depuis le récepteur échoueront.

Pour ajouter les autorisations au compte de service, procédez comme suit :

  1. Dans Cloud Console, accédez à BigQuery :

    Accéder à BigQuery

  2. Ouvrez votre nouvel ensemble de données gcp_logging_export.

  3. Dans l'onglet "Informations sur l'ensemble de données", cliquez sur le menu déroulant Partage , puis sur Autorisations.

  4. Dans le panneau latéral "Autorisations d'ensemble de données", cliquez sur Ajouter un compte principal.

  5. Dans le champ Nouveaux comptes principaux, saisissez le compte de service. Comme illustré dans l'image suivante, dans le menu déroulant Rôle, sélectionnez Éditeur de données BigQuery :

    Autorisations de stratégie IAM – Éditeur

Une fois que vous avez créé l'exportation des journaux au moyen de ce filtre, les fichiers journaux commencent à remplir l'ensemble de données BigQuery du projet configuré.

À titre d'exemple d'ensemble d'autorisations, vous pouvez :

  • supprimer tous les utilisateurs non essentiels des autorisations sur l'ensemble de données BigQuery ;
  • Ajouter un contrôle total pour l’administrateur BigQuery.
  • accorder au compte de service exportateur les autorisations nécessaires pour écrire les journaux d'exportation ;
  • autoriser les autres utilisateurs à accéder aux exportations de journaux Google Cloud.

Utiliser les journaux exportés

Lorsque vous exportez des journaux dans un ensemble de données BigQuery, Cloud Logging crée des tables datées pour contenir les entrées de journal exportées. Les entrées de journal sont placées dans des tables nommées en fonction des noms de journaux des entrées et partitionnées en fonction des horodatages des entrées. Par exemple, les journaux d'audit pour l'accès aux données sont acheminés vers la table cloudaudit_googleapis_com_data_access, comme illustré dans l'image suivante :

Liste des tables avec schéma.

Les journaux des activités d'administration et d'accès aux données sont chargés dans BigQuery au format protoPayload. Consultez la section Champs des journaux d'audit exportés pour obtenir plus d'informations sur les conversions de schéma effectuées par Cloud Logging avant de les écrire dans BigQuery.

Exemples de questions et de requêtes

Vous pouvez exécuter un large éventail de requêtes sur les journaux d'audit. Ces requêtes effectuent une analyse pour comprendre qui accède aux données ou les modifie dans Google Cloud. Remplacez gcp_logging_export par le nom de votre ensemble de données BigQuery.

Quels sont les utilisateurs ayant le plus consulté des données durant la semaine passée ?

La requête suivante utilise les journaux d'audit pour l'accès aux données pour identifier les utilisateurs qui ont le plus fréquemment accédé aux données des tables BigQuery au cours de la semaine écoulée.

SELECT
  protopayload_auditlog.authenticationInfo.principalEmail,
  COUNT(*) AS COUNTER
FROM `gcp_logging_export.cloudaudit_googleapis_com_data_access`
WHERE
  (protopayload_auditlog.methodName = "google.cloud.bigquery.v2.jobs.insert" OR
   protopayload_auditlog.methodName = "google.cloud.bigquery.v2.jobs.query")
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
GROUP BY
  1
ORDER BY
  2 desc, 1
LIMIT
  100

Quels utilisateurs ont accédé aux données de la table "accounts" le mois passé ?

La requête suivante utilise les journaux d'audit pour l'accès aux données pour identifier le compte utilisateur ayant le plus fréquemment interrogé la table "accounts" au cours du mois passé. Remplacez MY_PROJECT_ID par l'ID de votre projet et MY_DATASET par l'ensemble de données.

SELECT
  protopayload_auditlog.authenticationInfo.principalEmail,
  COUNT(*) AS COUNTER
FROM `gcp_logging_export.cloudaudit_googleapis_com_data_access`,
  UNNEST(protopayload_auditlog.authorizationInfo) authorizationInfo
WHERE
  (protopayload_auditlog.methodName = "google.cloud.bigquery.v2.jobs.insert" OR
   protopayload_auditlog.methodName = "google.cloud.bigquery.v2.jobs.query")
  AND authorizationInfo.permission = "bigquery.tables.getData"
  AND authorizationInfo.resource = "projects/MY_PROJECT_ID/datasets/MY_DATASET/tables/accounts"
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY
  1
ORDER BY
  2 desc, 1
LIMIT
  100

Quels utilisateurs ont supprimé des VM au cours de la semaine passée ?

La requête suivante utilise les journaux d'audit des activités d'administration pour identifier les utilisateurs qui ont supprimé des VM au cours de la semaine écoulée.

SELECT
  timestamp,
  resource.labels.instance_id,
  protopayload_auditlog.authenticationInfo.principalEmail,
  protopayload_auditlog.resourceName,
  protopayload_auditlog.methodName
FROM `gcp_logging_export.cloudaudit_googleapis_com_activity`
WHERE
  resource.type = "gce_instance"
  AND protopayload_auditlog.methodName = "v1.compute.instances.delete"
  AND operation.first IS TRUE
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
ORDER BY
  timestamp desc,
  resource.labels.instance_id
LIMIT
  1000

La requête suivante utilise les journaux des activités d'administration pour identifier la fréquence d'utilisation de l'autoscaling au cours du mois passé.

SELECT
  protopayload_auditlog.methodName,
  COUNT(*) AS counter
FROM `gcp_logging_export.cloudaudit_googleapis_com_activity`
WHERE
  resource.type = "gce_instance_group_manager"
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY
  1
ORDER BY
  1
LIMIT
  1000

Grâce à la requête suivante, vous pouvez visualiser les tendances des opérations du gestionnaire d'instances de Compute Engine au fil du temps, réparties par jour.

SELECT
  TIMESTAMP_TRUNC(timestamp, DAY) AS day,
  protopayload_auditlog.methodName AS methodName,
  COUNT(*) AS counter
FROM `gcp_logging_export.cloudaudit_googleapis_com_activity`
WHERE
  resource.type = "gce_instance_group_manager"
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY
  1, 2
ORDER BY
  1, 2

Vous pouvez utiliser la requête ci-dessus comme requête personnalisée de source de données dans Google Data Studio pour visualiser la tendance au fil du temps, comme illustré dans le graphique suivant.

Visualisation dans Data Studio.

Pour plus d'informations, consultez la page Requêtes personnalisées dans Data Studio.

Quelles sont les tables les plus fréquemment utilisées et par qui ?

La requête suivante utilise les journaux d'audit pour l'accès aux données pour identifier les tables BigQuery contenant les données les plus fréquemment lues et modifiées au cours du mois passé. Elle affiche l'identité de l'utilisateur associé, ainsi que la répartition du nombre total de fois où les données ont été lues et modifiées.

SELECT
  protopayload_auditlog.resourceName,
  protopayload_auditlog.authenticationInfo.principalEmail,
  COUNTIF(JSON_EXTRACT(protopayload_auditlog.metadataJson, "$.tableDataRead") IS NOT NULL) AS dataReadEvents,
  COUNTIF(JSON_EXTRACT(protopayload_auditlog.metadataJson, "$.tableDataChange") IS NOT NULL) AS dataChangeEvents,
  COUNT(*) AS totalEvents
FROM `gcp_logging_export.cloudaudit_googleapis_com_data_access`
WHERE
  STARTS_WITH(resource.type, 'bigquery') IS TRUE
  AND (JSON_EXTRACT(protopayload_auditlog.metadataJson, "$.tableDataRead") IS NOT NULL
    OR JSON_EXTRACT(protopayload_auditlog.metadataJson, "$.tableDataChange") IS NOT NULL)
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY
  1, 2
ORDER BY
  5 DESC, 1, 2
LIMIT 1000

Quelles sont les 10 requêtes les plus fréquentes dans BigQuery au cours de la semaine écoulée ?

La requête suivante utilise les journaux d'audit pour l'accès aux données pour identifier les requêtes les plus courantes au cours de la semaine écoulée. Elle répertorie également les utilisateurs correspondants et les tables référencées.

SELECT
  COALESCE(
   JSON_EXTRACT_SCALAR(protopayload_auditlog.metadataJson, "$.jobChange.job.jobConfig.queryConfig.query"),
   JSON_EXTRACT_SCALAR(protopayload_auditlog.metadataJson, "$.jobInsertion.job.jobConfig.queryConfig.query")) as query,
  STRING_AGG(DISTINCT protopayload_auditlog.authenticationInfo.principalEmail, ',') as users,
  ANY_VALUE(COALESCE(
   JSON_EXTRACT_ARRAY(protopayload_auditlog.metadataJson, "$.jobChange.job.jobStats.queryStats.referencedTables"),
   JSON_EXTRACT_ARRAY(protopayload_auditlog.metadataJson, "$.jobInsertion.job.jobStats.queryStats.referencedTables"))) as tables,
  COUNT(*) AS counter
FROM `gcp_logging_export.cloudaudit_googleapis_com_data_access`
WHERE
  (resource.type = 'bigquery_project' OR resource.type = 'bigquery_dataset')
  AND operation.last IS TRUE
  AND (JSON_EXTRACT(protopayload_auditlog.metadataJson, "$.jobChange") IS NOT NULL
    OR JSON_EXTRACT(protopayload_auditlog.metadataJson, "$.jobInsertion") IS NOT NULL)
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
GROUP BY
  query
ORDER BY
  counter DESC
LIMIT 10

Quelles sont les actions les plus courantes enregistrées dans le journal d'accès aux données au cours du mois passé ?

La requête suivante utilise tous les journaux d'audit Cloud pour identifier les 100 actions les plus fréquentes enregistrées au cours du mois passé.

SELECT
  ANY_VALUE(_TABLE_SUFFIX),
  protopayload_auditlog.methodName,
  protopayload_auditlog.serviceName,
  resource.type,
  COUNT(*) AS counter
FROM `gcp_logging_export.cloudaudit_googleapis_com_*`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY
  protopayload_auditlog.methodName,
  protopayload_auditlog.serviceName,
  resource.type
ORDER BY
  counter DESC
LIMIT 100

Étape suivante