Requêtes SQL pour des insights sur la sécurité

Ce document explique comment analyser les journaux d'audit Cloud Logging à l'aide de requêtes SQL standard BigQuery sur la page Analyse de journaux. Les requêtes SQL vous permettent d'agréger et d'analyser vos journaux d'audit, qui fournissent des informations sur les activités d'administration et les accès dans vos ressources Google Cloud.

À propos des journaux d'audit

Les services Google Cloud peuvent écrire quatre types de journaux d'audit:

  • Journaux d'audit des activités d'administration: les journaux d'audit des activités d'administration enregistrent les appels d'API et les autres opérations qui modifient la configuration ou les métadonnées des ressources. Ces journaux sont toujours écrits. Vous ne pouvez pas les configurer, les exclure ni les désactiver.

  • Journaux d'audit des accès aux données: les journaux d'audit des accès aux données enregistrent les appels d'API qui lisent la configuration ou les métadonnées des ressources, ainsi que les appels d'API pilotés par l'utilisateur qui créent, modifient ou lisent les données de ressources fournies par l'utilisateur. Étant donné que l'accès aux données est une opération d'API fréquente, ces journaux sont désactivés par défaut (sauf dans BigQuery).

  • Journaux d'audit des événements système: les journaux d'audit des événements système contiennent des entrées associées aux actions Google Cloud qui modifient la configuration des ressources. Ces journaux sont générés par les systèmes Google. Ils ne sont pas générés par les actions des utilisateurs. Vous ne pouvez pas configurer, exclure ni désactiver les journaux d'audit des événements système.

  • Journaux d'audit des refus de règles: les journaux d'audit des refus de règles sont enregistrés lorsqu'un service Google Cloud refuse l'accès à un utilisateur ou à un compte de service en raison d'une violation des règles de sécurité. Vous ne pouvez pas désactiver ces journaux, mais vous pouvez utiliser des filtres d'exclusion pour empêcher leur stockage dans Logging.

Pour en savoir plus sur les journaux d'audit, consultez la section Présentation des journaux d'audit. Pour obtenir la liste des services intégrés aux journaux d'audit, consultez la section Services Google Cloud avec journaux d'audit.

Utiliser les journaux d'audit pour identifier les cas de non-respect des règles ou les activités suspectes

Vous pouvez utiliser les journaux d'audit pour identifier les cas de non-respect des règles ou les activités suspectes:

  • Pour identifier une éventuelle escalade des droits à l'aide d'Identity and Access Management (IAM) ou une évasion de la défense en désactivant la journalisation, utilisez les journaux d'audit des activités d'administration. Pour obtenir un exemple de requête qui identifie ce scénario, consultez la section Modifications apportées aux paramètres de journalisation.

  • Pour identifier un usage abusif potentiel des API ou des données hébergées dans des services tels que Cloud Storage ou BigQuery, utilisez les journaux d'audit de l'accès aux données. Pour obtenir un exemple de requête qui identifie ce scénario, consultez Identifier une utilisation élevée de l'API par un principal.

  • Pour identifier la fréquence d'accès aux données et les utilisateurs concernés, interrogez tous les journaux d'audit. Pour obtenir un exemple de requête qui identifie ce scénario, consultez la section Déterminer les actions les plus courantes effectuées au cours du mois dernier.

Avant de commencer

  • Assurez-vous de disposer d'un projet, d'un dossier ou d'une organisation Google Cloud qui génère des journaux d'audit.

  • Assurez-vous d'avoir accès à une vue du bucket de journaux vers lequel les journaux d'audit sont acheminés. Le bucket de journaux doit être mis à niveau pour utiliser l'Analyse de journaux. Pour savoir comment créer un bucket de journaux mis à niveau pour utiliser l'Analyse de journaux, consultez Configurer les buckets de journaux.

  • Pour obtenir les autorisations nécessaires pour créer des sinks et afficher les journaux, demandez à votre administrateur de vous accorder les rôles IAM suivants:

    Pour en savoir plus sur l'attribution de rôles, consultez la page Gérer l'accès aux projets, aux dossiers et aux organisations.

    Vous pouvez également obtenir les autorisations requises via des rôles personnalisés ou d'autres rôles prédéfinis.

    Selon les journaux d'audit que vous souhaitez consulter, vous devrez peut-être disposer de rôles ou d'autorisations distincts. Pour en savoir plus sur la définition des rôles IAM, consultez la documentation Contrôle des accès avec IAM de Logging.

  • Pour utiliser les requêtes de ce document sur la page Log Analytics, procédez comme suit:

    1. Dans la console Google Cloud, accédez à la page Analyse de journaux:

      Accéder à l'Analyse de journaux

      Si vous utilisez la barre de recherche pour trouver cette page, sélectionnez le résultat dont le sous-titre est Logging.

    2. Identifiez le nom de la table pour la vue des journaux que vous souhaitez interroger.

      Pour identifier ce nom, accédez à la liste Vues des journaux, recherchez la vue de journal, puis sélectionnez Requête. Le volet Requête est renseigné par une requête par défaut, qui inclut le nom de la table de la vue de journal interrogée. Le nom de la table est au format project_ID.region.bucket_ID.view_ID.

      Pour savoir comment accéder à la requête par défaut, consultez la section Interroger une vue de journal.

    3. Remplacez TABLE_NAME_OF_LOG_VIEW par le nom de la table de la vue de journal que vous souhaitez interroger, puis copiez la requête.

    4. Collez la requête dans le volet Requête, puis cliquez sur Exécuter la requête.

Exemples de requêtes

Cette section fournit des exemples de requêtes SQL pour interroger les journaux d'audit.

Modifications apportées aux paramètres de journalisation

Pour identifier les cas où les journaux d'audit sont désactivés ou où des modifications sont apportées aux paramètres de journalisation par défaut, interrogez les journaux d'audit des activités d'administration:

SELECT
  receive_timestamp, timestamp AS eventTimestamp,
  proto_payload.audit_log.request_metadata.caller_ip,
  proto_payload.audit_log.authentication_info.principal_email,
  proto_payload.audit_log.resource_name,
  proto_payload.audit_log.method_name
FROM
  `TABLE_NAME_OF_LOG_VIEW`
WHERE
  proto_payload.audit_log.service_name = "logging.googleapis.com"
  AND log_id = "cloudaudit.googleapis.com/activity"

Déterminer les actions les plus courantes effectuées au cours du mois dernier

Pour identifier les actions les plus courantes au cours des 30 derniers jours, interrogez tous les journaux d'audit:

SELECT
  proto_payload.audit_log.method_name,
  proto_payload.audit_log.service_name,
  resource.type,
  COUNT(*) AS counter
FROM
  `TABLE_NAME_OF_LOG_VIEW`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
  AND log_id="cloudaudit.googleapis.com/data_access"
GROUP BY
  proto_payload.audit_log.method_name,
  proto_payload.audit_log.service_name,
  resource.type
ORDER BY
  counter DESC
LIMIT 100

La requête précédente recherche tous les journaux d'audit des 30 derniers jours et renvoie les 100 actions les plus fréquentes, avec des informations sur les method_name, les service_name, le type de ressource et un compteur des actions effectuées.

Détecter les rôles attribués à un compte de service

Pour identifier l'usurpation d'identité d'un compte de service ou les rôles attribués à des comptes de service, interrogez les journaux d'audit des activités d'administration:

SELECT
  timestamp,
  proto_payload.audit_log.authentication_info.principal_email as grantor,
  JSON_VALUE(bindingDelta.member) as grantee,
  JSON_VALUE(bindingDelta.role) as role,
  proto_payload.audit_log.resource_name,
  proto_payload.audit_log.method_name
FROM
  `TABLE_NAME_OF_LOG_VIEW`,
  UNNEST(JSON_QUERY_ARRAY(proto_payload.audit_log.service_data.policyDelta.bindingDeltas)) AS bindingDelta
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
  AND log_id = "cloudaudit.googleapis.com/activity"
  AND (
    (resource.type = "service_account"
    AND proto_payload.audit_log.method_name LIKE "google.iam.admin.%.SetIAMPolicy")
    OR
    (resource.type IN ("project", "folder", "organization")
    AND proto_payload.audit_log.method_name = "SetIamPolicy"
    AND JSON_VALUE(bindingDelta.role) LIKE "roles/iam.serviceAccount%")
  )
  AND JSON_VALUE(bindingDelta.action) = "ADD"
  -- Principal (grantee) exclusions
  AND JSON_VALUE(bindingDelta.member) NOT LIKE "%@example.com"
ORDER BY
  timestamp DESC

La requête précédente recherche les journaux d'audit qui capturent les rôles attribués à un principal sur un compte de service. Le rôle Créateur de jetons du compte de service permet au principal d'usurper l'identité du compte de service. La requête spécifie également une période de sept jours et exclut les bénéficiaires approuvés (%@example.com).

Identifier une utilisation élevée de l'API par un principal

Pour identifier une utilisation inhabituellement élevée de l'API par un principal, interrogez tous les journaux d'audit:

SELECT
  *
FROM (
  SELECT
    *,
    AVG(counter) OVER (
      PARTITION BY principal_email
      ORDER BY day
      ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS avg,
    STDDEV(counter) OVER (
      PARTITION BY principal_email
      ORDER BY day
      ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS stddev,
    COUNT(*) OVER (
      PARTITION BY principal_email
      RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS numSamples
  FROM (
    SELECT
      proto_payload.audit_log.authentication_info.principal_email,
      EXTRACT(DATE FROM timestamp) AS day,
      ARRAY_AGG(DISTINCT proto_payload.audit_log.method_name IGNORE NULLS) AS actions,
      COUNT(*) AS counter
    FROM `TABLE_NAME_OF_LOG_VIEW`
    WHERE
      timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 60 DAY)
      AND proto_payload.audit_log.authentication_info.principal_email IS NOT NULL
      AND proto_payload.audit_log.method_name NOT LIKE "storage.%.get"
      AND proto_payload.audit_log.method_name NOT LIKE "v1.compute.%.list"
      AND proto_payload.audit_log.method_name NOT LIKE "beta.compute.%.list"
    GROUP BY
      proto_payload.audit_log.authentication_info.principal_email,
      day
  )
)
WHERE
  counter > avg + 3 * stddev
  AND day >= DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY)
ORDER BY
  counter DESC

Pour le principal spécifié, principal_email, la requête calcule le nombre moyen d'appels d'API par jour et l'écart type de ces appels d'API. Lorsque le nombre moyen d'appels d'API est supérieur à la moyenne en cours plus trois fois l'écart type, la requête affiche les informations suivantes:

  • Compteur des actions effectuées.
  • Nombre moyen d'actions effectuées par jour.
  • Actions spécifiques effectuées.

Étape suivante