Query SQL per approfondimenti sulla sicurezza

Questo documento descrive come analizzare gli audit log di Cloud Logging utilizzando le query SQL standard di BigQuery nella pagina Log Analytics. Le query SQL ti consentono di aggregare e analizzare gli audit log, che forniscono informazioni su attività e accessi amministrativi nelle tue Google Cloud risorse.

Informazioni sugli audit log

Esistono quattro tipi di log di controllo che possono essere scritti dai Google Cloud servizi:

  • Audit log per le attività di amministrazione: registrano le chiamate API o altre azioni che modificano la configurazione o i metadati delle risorse. Questi log vengono sempre scritti; non puoi configurarli, escluderli o disabilitarli.

  • Audit log di accesso ai dati: gli audit log di accesso ai dati registrano le chiamate API che leggono la configurazione o i metadati delle risorse, nonché le chiamate API guidate dall'utente che creano, modificano o leggono i dati delle risorse forniti dall'utente. Poiché l'accesso ai dati è un'operazione frequente dell'API, questi log sono disattivati per impostazione predefinita (tranne per BigQuery).

  • Audit log degli eventi di sistema: gli audit log degli eventi di sistema contengono voci di log per leGoogle Cloud azioni che modificano la configurazione delle risorse. Questi log vengono generati dai sistemi di Google e non dalle azioni degli utenti. Non puoi configurare, escludere o disattivare gli audit log degli eventi di sistema.

  • Log di controllo dei criteri negati: i log di controllo dei criteri negati vengono registrati quando un Google Cloud servizio nega l'accesso a un utente o a un account di servizio per violazione di un criterio di sicurezza. Questi log non possono essere disattivati, ma puoi utilizzare i filtri di esclusione per impedire che vengano archiviati in Logging.

Per ulteriori informazioni sui log di controllo, vedi Panoramica dei log di controllo. Per un elenco dei servizi integrati con i log di controllo, consulta Google Cloud servizi con log di controllo.

Utilizza i log di controllo per identificare violazioni delle norme o attività sospette

Puoi utilizzare i log di controllo per identificare violazioni delle norme o attività sospette:

Prima di iniziare

  • Assicurati di avere un Google Cloud progetto, una cartella o un'organizzazione che generi log di controllo.

  • Assicurati di avere accesso a una visualizzazione del bucket dei log a cui vengono inoltrati i log di controllo. Per utilizzare Analisi dei log, è necessario eseguire l'upgrade del bucket di log. Per informazioni su come creare un bucket di log di cui viene eseguito l'upgrade per l'utilizzo di Analisi dei log, consulta Configurare i bucket di log.

  • Per ottenere le autorizzazioni necessarie per creare sink e visualizzare i log, chiedi all'amministratore di concederti i seguenti ruoli IAM:

    Per saperne di più sulla concessione dei ruoli, consulta Gestisci l'accesso a progetti, cartelle e organizzazioni.

    Potresti anche riuscire a ottenere le autorizzazioni richieste tramite i ruoli personalizzati o altri ruoli predefiniti.

    A seconda dei log di controllo che vuoi visualizzare, potresti aver bisogno di ruoli o autorizzazioni distinti. Per informazioni sull'impostazione dei ruoli IAM, consulta la documentazione relativa al Controllo dell'accesso con IAM.

  • Per utilizzare le query in questo documento nella pagina Log Analytics, procedi nel seguente modo:

    1. Nella Google Cloud console, vai alla pagina Log Analytics:

      Vai ad Analisi dei log

      Se utilizzi la barra di ricerca per trovare questa pagina, seleziona il risultato con il sottotitolo Logging.

    2. Identifica il nome della tabella per la visualizzazione dei log su cui vuoi eseguire una query.

      Per identificare questo nome, vai all'elenco Visualizzazioni log, individua la visualizzazione log e seleziona Query. Il riquadro Query viene compilato con una query predefinita, che include il nome della tabella della vista del log su cui viene eseguita la query. Il nome della tabella ha il formato project_ID.region.bucket_ID.view_ID.

      Per ulteriori informazioni su come accedere alla query predefinita, consulta Eseguire query su una visualizzazione dei log.

    3. Sostituisci TABLE_NAME_OF_LOG_VIEW con il nome della tabella della vista di log su cui vuoi eseguire una query, quindi copia la query.

    4. Incolla la query nel riquadro Query, quindi fai clic su Esegui query.

Query di esempio

Questa sezione fornisce query SQL di esempio per eseguire query sugli audit log.

Modifiche apportate alle impostazioni di logging

Per identificare quando gli audit log vengono disattivati o quando vengono apportate modifiche alle impostazioni di logging predefinite, esegui una query sugli audit log per le attività di amministrazione:

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"

Determinare le azioni più comuni eseguite nell'ultimo mese

Per identificare le azioni eseguite più di frequente negli ultimi 30 giorni, esegui una query su tutti i log di controllo:

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 query precedente esegue una ricerca in tutti gli audit log degli ultimi 30 giorni e restituisce le 100 azioni eseguite più di frequente con informazioni su method_name, service_name, sul tipo di risorsa e su un contatore delle azioni eseguite.

Rilevare i ruoli concessi a un account di servizio

Per identificare la simulazione dell'identità dell'account di servizio o i ruoli concessi agli account di servizio, esegui una query sui log di controllo dell'attività di amministrazione:

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 query precedente cerca gli audit log che acquisiscono i ruoli concessi a un principale in un account di servizio. Il ruolo Creatore token account di servizio consente al principale di rubare l'identità dell'account di servizio. La query specifica anche un intervallo di tempo degli ultimi sette giorni ed esclude i beneficiari approvati (%@example.com).

Identificare un utilizzo elevato dell'API da parte di un principale

Per identificare un utilizzo insolito dell'API da parte di un principale, esegui una query su tutti i log di controllo:

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

Per il principale specificato, principal_email, la query calcola il numero medio di chiamate API al giorno e la deviazione standard di queste chiamate API. Quando il numero medio di chiamate API è superiore alla media in tempo reale più tre volte la deviazione standard, la query mostra le seguenti informazioni:

  • Un contatore delle azioni eseguite.
  • Le azioni medie calcolate eseguite al giorno.
  • Le azioni specifiche che sono state eseguite.

Passaggi successivi