Recopila registros de auditoría de Slack

Compatible con:

En esta guía, se explica cómo transferir registros de auditoría de Slack a Google Security Operations con Google Cloud Run Functions o Amazon S3 con AWS Lambda.

Antes de comenzar

Asegúrate de cumplir con los siguientes requisitos previos:

  • Instancia de Google SecOps
  • Plan Slack Enterprise Grid con acceso de propietario de la organización o administrador
  • Acceso con privilegios a cualquiera de los siguientes:
    • Google Cloud (para la opción 1: Cloud Run Functions y Cloud Scheduler)
    • AWS (para la opción 2: S3, IAM, Lambda, EventBridge).

Requisitos previos para recopilar registros de auditoría de Slack (ID de la app, token de OAuth, ID de la organización)

La API de registros de auditoría de Slack requiere un token de OAuth de usuario con el permiso auditlogs:read. Para obtener este token, debes instalar una app en el nivel de la organización de Enterprise Grid, no en el nivel del espacio de trabajo.

Crea una app de Slack para los registros de auditoría

  1. Accede a la Consola del administrador de Slack con una cuenta de propietario de la organización de Enterprise Grid o administrador.
  2. Ve a https://api.slack.com/apps y haz clic en Create New App > From scratch.
  3. Proporciona los siguientes detalles de configuración:
    • Nombre de la aplicación: Ingresa un nombre descriptivo (por ejemplo, Google SecOps Audit Integration).
    • Pick a workspace to develop your app in: Selecciona tu Development Slack Workspace (cualquier espacio de trabajo de la organización).
  4. Haz clic en Create App.

Configura los permisos de OAuth

  1. Navega a OAuth & Permissions en la barra lateral izquierda.
  2. Desplázate hacia abajo hasta la sección Scopes.
  3. En User Token Scopes (NO en Bot Token Scopes), haz clic en Add an OAuth Scope.
  4. Agrega el permiso: auditlogs:read.

Habilita la distribución pública

  1. Navega a Manage Distribution en la barra lateral izquierda.
  2. En Share Your App with Other Workspaces, asegúrate de que las cuatro secciones tengan marcas de verificación verdes:
    • Remove Hard Coded Information
    • Activate Public Distribution
    • Set a Redirect URL
    • Add an OAuth Scope
  3. Haz clic en Activate Public Distribution.

Instala la app en la organización de Enterprise Grid

  1. Navega a OAuth & Permissions en la barra lateral izquierda.
  2. Haz clic en Install to Organization (NO en "Install to Workspace").

IMPORTANTE: Revisa el menú desplegable en la parte superior derecha de la pantalla de instalación para verificar que la instalación se realice en la organización de Enterprise, no en un espacio de trabajo individual.

  1. Revisa los permisos solicitados y haz clic en Allow.
  2. Una vez que se complete la autorización, se te redireccionará a la página OAuth & Permissions.

Recupera las credenciales

  1. En OAuth Tokens for Your Workspace, busca el token de OAuth de usuario.
  2. Copia y guarda de forma segura el token que comienza con xoxp- (por ejemplo, xoxp-1234567890-0987654321-1234567890-abc123def456).

Importante: Este es tu SLACK_ADMIN_TOKEN para la función de Lambda o la función de Cloud Run. Almacénalo de forma segura.

  1. Anota tu ID de la organización:
    • Ve a la Consola del administrador de Slack.
    • Navega a Settings & Permissions > Organization settings.
    • Copia el ID de la organización.

Opción 1: Configura la exportación de registros de auditoría de Slack con Google Cloud Run Functions

En esta opción, se usan Google Cloud Run Functions y Cloud Scheduler para recopilar registros de auditoría de Slack y transferirlos directamente a Google SecOps.

Configura el directorio

  1. Crea un directorio nuevo en tu máquina local para la implementación de la función de Cloud Run.
  2. Descarga los siguientes archivos del repositorio de GitHub de Chronicle ingestion-scripts:
    • En la carpeta slack, descarga lo siguiente:
      • .env.yml
      • main.py
      • requirements.txt
    • Desde la raíz del repositorio, descarga todo el directorio common con todos sus archivos:
      • common/__init__.py
      • common/auth.py
      • common/env_constants.py
      • common/ingest.py
      • common/status.py
      • common/utils.py
  3. Coloca todos los archivos descargados en tu directorio de implementación.

La estructura de tu directorio debería verse de la siguiente manera:

deployment_directory/
├─common/
 ├─__init__.py
 ├─auth.py
 ├─env_constants.py
 ├─ingest.py
 ├─status.py
 └─utils.py
├─.env.yml
├─main.py
└─requirements.txt

Crea secretos en Google Secret Manager

  1. En la consola de Google Cloud, ve a Seguridad > Secret Manager.
  2. Haz clic en Crear secreto.
  3. Proporciona los siguientes detalles de configuración para la cuenta de servicio de Chronicle:
    • Nombre: Ingresa chronicle-service-account.
    • Valor del secreto: Pega el contenido de tu archivo JSON de autenticación de transferencia de Google SecOps.
  4. Haz clic en Crear secreto.
  5. Copia el nombre del recurso secreto en el formato: projects/<PROJECT_ID>/secrets/chronicle-service-account/versions/latest.
  6. Haz clic en Crear secreto nuevamente para crear un segundo secreto.
  7. Proporciona los siguientes detalles de configuración para el token de Slack:
    • Nombre: Ingresa slack-admin-token.
    • Valor del secreto: Pega tu token de OAuth de usuario de Slack (que comienza con xoxp-).
  8. Haz clic en Crear secreto.
  9. Copia el nombre del recurso secreto en el formato: projects/<PROJECT_ID>/secrets/slack-admin-token/versions/latest.

Configura las variables de entorno de ejecución obligatorias

  1. Abre el archivo .env.yml en tu directorio de implementación.
  2. Configura las variables de entorno con tus valores:
CHRONICLE_CUSTOMER_ID: "<your-chronicle-customer-id>"
CHRONICLE_REGION: us
CHRONICLE_SERVICE_ACCOUNT: "projects/<PROJECT_ID>/secrets/chronicle-service-account/versions/latest"
CHRONICLE_NAMESPACE: ""
POLL_INTERVAL: "5"
SLACK_ADMIN_TOKEN: "projects/<PROJECT_ID>/secrets/slack-admin-token/versions/latest"

Reemplaza lo siguiente:

  • <your-chronicle-customer-id>: Es tu ID de cliente de Google SecOps.
  • <PROJECT_ID>: Es el ID del proyecto de Google Cloud.
  • CHRONICLE_REGION: Configura tu región de Google SecOps. Valores válidos: us, asia-northeast1, asia-south1, asia-southeast1, australia-southeast1, europe, europe-west2, europe-west3, europe-west6, europe-west9, europe-west12, me-central1, me-central2, me-west1, northamerica-northeast2, southamerica-east1.
  • POLL_INTERVAL: Es el intervalo de frecuencia (en minutos) en el que se ejecuta la función. Esta duración debe ser la misma que el intervalo del trabajo de Cloud Scheduler.
  1. Guarda el archivo .env.yml.

Implementa la función de Cloud Run

  1. Abre una terminal o Cloud Shell en la Google Cloud Console.
  2. Navega hasta el directorio de implementación:
cd /path/to/deployment_directory
  1. Ejecuta el siguiente comando para implementar la función de Cloud Run:
gcloud functions deploy slack-audit-to-chronicle \
  --entry-point main \
  --trigger-http \
  --runtime python39 \
  --env-vars-file .env.yml \
  --timeout 300s \
  --memory 512MB \
  --service-account <SERVICE_ACCOUNT_EMAIL>

Reemplaza <SERVICE_ACCOUNT_EMAIL> por la dirección de correo electrónico de la cuenta de servicio que deseas que use tu función de Cloud Run.

  1. Espera a que se complete la implementación.
  2. Una vez implementada, anota la URL de la función en el resultado.

Configura Cloud Scheduler

  1. En la consola de Google Cloud, ve a Cloud Scheduler > Crear trabajo.
  2. Proporciona los siguientes detalles de configuración:
    • Nombre: Ingresa slack-audit-scheduler.
    • Región: Selecciona la misma región en la que implementaste la función de Cloud Run.
    • Frecuencia: Ingresa */5 * * * * (se ejecuta cada 5 minutos, lo que coincide con el valor de POLL_INTERVAL).
    • Zona horaria: Selecciona UTC.
    • Tipo de destino: Selecciona HTTP.
    • URL: Ingresa la URL de la función de Cloud Run del resultado de la implementación.
    • Método HTTP: Selecciona POST.
    • Encabezado de la autenticación: Selecciona Agregar token de OIDC.
    • Cuenta de servicio: Selecciona la misma cuenta de servicio que se usó para la función de Cloud Run.
  3. Haz clic en Crear.

Opción 2: Configura la exportación de registros de auditoría de Slack con AWS S3

En esta opción, se usa AWS Lambda para recopilar registros de auditoría de Slack y almacenarlos en S3. Luego, se configura un feed de Google SecOps para transferir los registros.

Configura el bucket de AWS S3 y IAM para Google SecOps

  1. Crea un bucket de Amazon S3 siguiendo esta guía del usuario: Crea un bucket
  2. Guarda el nombre y la región del bucket para consultarlos en el futuro (por ejemplo, slack-audit-logs).
  3. Crea un usuario siguiendo esta guía del usuario: Crea un usuario de IAM.
  4. Selecciona el usuario creado.
  5. Selecciona la pestaña Security credentials.
  6. Haz clic en Create Access Key en la sección Access Keys.
  7. Selecciona Third-party service como Use case.
  8. Haz clic en Siguiente.
  9. Opcional: Agrega una etiqueta de descripción.
  10. Haz clic en Create access key.
  11. Haz clic en Descargar archivo .csv para guardar la clave de acceso y la clave de acceso secreta para consultarlas en el futuro.
  12. Haz clic en Listo.
  13. Selecciona la pestaña Permissions.
  14. Haz clic en Add permissions en la sección Permissions policies.
  15. Selecciona Add permissions.
  16. Selecciona Attach policies directly.
  17. Busca la política AmazonS3FullAccess.
  18. Selecciona la política.
  19. Haz clic en Siguiente.
  20. Haz clic en Agregar permisos.

Configura la política y el rol de IAM para las cargas de S3

  1. En la consola de AWS, ve a IAM > Policies > Create policy > JSON tab.
  2. Copia y pega la siguiente política.
  3. JSON de la política (reemplaza slack-audit-logs si ingresaste un nombre de bucket diferente):
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowPutObjects",
      "Effect": "Allow",
      "Action": "s3:PutObject",
      "Resource": "arn:aws:s3:::slack-audit-logs/*"
    },
    {
      "Sid": "AllowGetStateObject",
      "Effect": "Allow",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::slack-audit-logs/slack/audit/state.json"
    }
  ]
}
  1. Haz clic en Siguiente.
  2. Ingresa el nombre de la política SlackAuditS3Policy.
  3. Haz clic en Crear política.
  4. Ve a IAM > Roles > Create role > AWS service > Lambda.
  5. Adjunta la política recién creada SlackAuditS3Policy.
  6. Nombra el rol SlackAuditToS3Role y haz clic en Create role.

Crea la función de Lambda

  1. En la consola de AWS, ve a Lambda > Functions > Create function.
  2. Haz clic en Author from scratch.
  3. Proporciona los siguientes detalles de configuración:
Configuración Valor
Nombre slack_audit_to_s3
Tiempo de ejecución Python 3.13
Arquitectura x86_64
Rol de ejecución SlackAuditToS3Role
  1. Haz clic en Crear función.
  2. Después de crear la función, abre la pestaña Code, borra el código auxiliar y pega el siguiente código (slack_audit_to_s3.py).
#!/usr/bin/env python3
# Lambda: Pull Slack Audit Logs (Enterprise Grid) to S3 (JSONL format)

import os, json, time, urllib.parse
from urllib.request import Request, urlopen
from urllib.error import HTTPError, URLError
import boto3

BASE_URL = "https://api.slack.com/audit/v1/logs"

TOKEN        = os.environ["SLACK_AUDIT_TOKEN"]  # org-level user token with auditlogs:read
BUCKET       = os.environ["S3_BUCKET"]
PREFIX       = os.environ.get("S3_PREFIX", "slack/audit/")
STATE_KEY    = os.environ.get("STATE_KEY", "slack/audit/state.json")
LIMIT        = int(os.environ.get("LIMIT", "200"))             # Slack recommends <= 200
MAX_PAGES    = int(os.environ.get("MAX_PAGES", "20"))
LOOKBACK_SEC = int(os.environ.get("LOOKBACK_SECONDS", "3600")) # First-run window
HTTP_TIMEOUT = int(os.environ.get("HTTP_TIMEOUT", "60"))
HTTP_RETRIES = int(os.environ.get("HTTP_RETRIES", "3"))
RETRY_AFTER_DEFAULT = int(os.environ.get("RETRY_AFTER_DEFAULT", "2"))
# Optional server-side filters (comma-separated 'action' values), empty means no filter
ACTIONS      = os.environ.get("ACTIONS", "").strip()

s3 = boto3.client("s3")


def _get_state() -> dict:
    try:
        obj = s3.get_object(Bucket=BUCKET, Key=STATE_KEY)
        st = json.loads(obj["Body"].read() or b"{}")
        return {"cursor": st.get("cursor")}
    except Exception:
        return {"cursor": None}


def _put_state(state: dict) -> None:
    body = json.dumps(state, separators=(",", ":")).encode("utf-8")
    s3.put_object(Bucket=BUCKET, Key=STATE_KEY, Body=body, ContentType="application/json")


def _http_get(params: dict) -> dict:
    qs  = urllib.parse.urlencode(params, doseq=True)
    url = f"{BASE_URL}?{qs}" if qs else BASE_URL
    req = Request(url, method="GET")
    req.add_header("Authorization", f"Bearer {TOKEN}")
    req.add_header("Accept", "application/json")

    attempt = 0
    while True:
        try:
            with urlopen(req, timeout=HTTP_TIMEOUT) as r:
                return json.loads(r.read().decode("utf-8"))
        except HTTPError as e:
            # Respect Retry-After on 429/5xx
            if e.code in (429, 500, 502, 503, 504) and attempt < HTTP_RETRIES:
                retry_after = 0
                try:
                    retry_after = int(e.headers.get("Retry-After", RETRY_AFTER_DEFAULT))
                except Exception:
                    retry_after = RETRY_AFTER_DEFAULT
                time.sleep(max(1, retry_after))
                attempt += 1
                continue
            # Re-raise other HTTP errors
            raise
        except URLError:
            if attempt < HTTP_RETRIES:
                time.sleep(RETRY_AFTER_DEFAULT)
                attempt += 1
                continue
            raise


def _write_page(data: dict, page_idx: int) -> str:
    """
    Extract entries from Slack API response and write as JSONL (one event per line).
    Chronicle requires newline-delimited JSON, not a JSON array.
    """
    entries = data.get("entries") or []
    
    if not entries:
        # No entries to write, skip file creation
        return None
    
    # Convert each entry to a single-line JSON string
    lines = [json.dumps(entry, separators=(",", ":")) for entry in entries]
    
    # Join with newlines to create JSONL format
    body = "\n".join(lines).encode("utf-8")
    
    # Write to S3
    ts  = time.strftime("%Y/%m/%d/%H%M%S", time.gmtime())
    key = f"{PREFIX}{ts}-slack-audit-p{page_idx:05d}.json"
    s3.put_object(Bucket=BUCKET, Key=key, Body=body, ContentType="application/json")
    
    return key


def lambda_handler(event=None, context=None):
    state  = _get_state()
    cursor = state.get("cursor")

    params = {"limit": LIMIT}
    if ACTIONS:
        params["action"] = [a.strip() for a in ACTIONS.split(",") if a.strip()]
    if cursor:
        params["cursor"] = cursor
    else:
        # First run (or reset): fetch a recent window by time
        params["oldest"] = int(time.time()) - LOOKBACK_SEC

    pages = 0
    total = 0
    last_cursor = None

    while pages < MAX_PAGES:
        data = _http_get(params)
        
        # Write entries in JSONL format
        written_key = _write_page(data, pages)

        entries = data.get("entries") or []
        total += len(entries)

        # Cursor for next page
        meta = data.get("response_metadata") or {}
        next_cursor = meta.get("next_cursor") or data.get("next_cursor")
        if next_cursor:
            params = {"limit": LIMIT, "cursor": next_cursor}
            if ACTIONS:
                params["action"] = [a.strip() for a in ACTIONS.split(",") if a.strip()]
            last_cursor = next_cursor
            pages += 1
            continue
        break

    if last_cursor:
        _put_state({"cursor": last_cursor})

    return {"ok": True, "pages": pages + (1 if total or last_cursor else 0), "entries": total, "cursor": last_cursor}


if __name__ == "__main__":
    print(lambda_handler())

  1. Ve a Configuration > Environment variables > Edit > Add environment variable.
  2. Ingresa las variables de entorno que se proporcionan a continuación y reemplaza por tus valores.

Variables de entorno

Clave Valor de ejemplo
S3_BUCKET slack-audit-logs
S3_PREFIX slack/audit/
STATE_KEY slack/audit/state.json
SLACK_AUDIT_TOKEN xoxp-*** (token de usuario a nivel de la organización con auditlogs:read)
LIMIT 200
MAX_PAGES 20
LOOKBACK_SECONDS 3600
HTTP_TIMEOUT 60
HTTP_RETRIES 3
RETRY_AFTER_DEFAULT 2
ACTIONS (opcional, CSV) user_login,app_installed
  1. Haz clic en Guardar.
  2. Selecciona la pestaña Configuration.
  3. En el panel General configuration , haz clic en Edit.
  4. Cambia Timeout a 5 minutes (300 seconds) y haz clic en Save.

Crea una programación de EventBridge

  1. Ve a Amazon EventBridge > Scheduler > Create schedule.
  2. Proporciona los siguientes detalles de configuración:
    • Nombre: Ingresa slack-audit-1h.
    • Recurring schedule: Selecciona Rate-based schedule.
    • Rate expression: Ingresa 1 horas.
    • Flexible time window: Selecciona Off.
  3. Haz clic en Siguiente.
  4. Selecciona Target:
    • Target API: Selecciona AWS Lambda Invoke.
    • Función Lambda: Selecciona slack_audit_to_s3.
  5. Haz clic en Siguiente.
  6. Haz clic en Siguiente (omite la configuración opcional).
  7. Revisa y haz clic en Create schedule.

(Opcional) Crea un usuario y claves de IAM de solo lectura para Google SecOps

  1. Ve a AWS Console > IAM > Users > Create user.
  2. Proporciona los siguientes detalles de configuración:
    • Nombre de usuario: Ingresa secops-reader.
    • Tipo de acceso: Selecciona Acceso programático.
  3. Haz clic en Siguiente.
  4. Selecciona Attach policies directly.
  5. Haz clic en Crear política.
  6. En la pestaña JSON, pega lo siguiente:
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:GetObject"],
      "Resource": "arn:aws:s3:::slack-audit-logs/*"
    },
    {
      "Effect": "Allow",
      "Action": ["s3:ListBucket"],
      "Resource": "arn:aws:s3:::slack-audit-logs"
    }
  ]
}
  1. Haz clic en Siguiente.
  2. Ingresa el nombre de la política secops-reader-policy.
  3. Haz clic en Crear política.
  4. Vuelve a la página de creación de usuarios, actualiza la lista de políticas y selecciona secops-reader-policy.
  5. Haz clic en Siguiente.
  6. Haz clic en Crear usuario.
  7. Selecciona el usuario creado secops-reader.
  8. Ve a Security credentials > Access keys > Create access key.
  9. Selecciona Third-party service.
  10. Haz clic en Siguiente.
  11. Haz clic en Create access key.
  12. Haz clic en Descargar archivo .csv para guardar las credenciales.

Configura un feed en Google SecOps para transferir registros de auditoría de Slack

  1. Ve a Configuración de SIEM > Feeds.
  2. Haz clic en Agregar nueva.
  3. En el campo Feed name, ingresa un nombre para el feed (por ejemplo, Slack Audit Logs).
  4. Selecciona Amazon S3 V2 como el Tipo de fuente.
  5. Selecciona Slack Audit como Tipo de registro.
  6. Haz clic en Siguiente.
  7. Especifica valores para los siguientes parámetros de entrada:
    • URI de S3: s3://slack-audit-logs/slack/audit/
    • Opciones de eliminación de origen: Selecciona la opción de eliminación según tu preferencia.
    • Maximum File Age: Incluye los archivos modificados en la última cantidad de días. El valor predeterminado es de 180 días.
    • Access Key ID: Clave de acceso de usuario con acceso al bucket de S3 (de secops-reader).
    • Secret Access Key: Clave secreta de usuario con acceso al bucket de S3 (de secops-reader).
    • Espacio de nombres del recurso: Es el espacio de nombres del recurso.
    • Etiquetas de ingesta: Es la etiqueta que se aplica a los eventos de este feed.
  8. Haz clic en Siguiente.
  9. Revisa la configuración de tu nuevo feed en la pantalla Finalize y, luego, haz clic en Enviar.

Tabla de asignación de UDM

Campo de registro Asignación de UDM Lógica
action metadata.product_event_type Se asigna directamente desde el campo action en el registro sin procesar.
actor.type principal.labels.value Se asigna directamente desde el campo actor.type, con la clave actor.type agregada.
actor.user.email principal.user.email_addresses Se asigna directamente desde el campo actor.user.email.
actor.user.id principal.user.product_object_id Se asigna directamente desde el campo actor.user.id.
actor.user.id principal.user.userid Se asigna directamente desde el campo actor.user.id.
actor.user.name principal.user.user_display_name Se asigna directamente desde el campo actor.user.name.
actor.user.team principal.user.group_identifiers Se asigna directamente desde el campo actor.user.team.
context.ip_address principal.ip Se asigna directamente desde el campo context.ip_address.
context.location.domain about.resource.attribute.labels.value Se asigna directamente desde el campo context.location.domain, con la clave context.location.domain agregada.
context.location.id about.resource.id Se asigna directamente desde el campo context.location.id.
context.location.name about.resource.name Se asigna directamente desde el campo context.location.name.
context.location.name about.resource.attribute.labels.value Se asigna directamente desde el campo context.location.name, con la clave context.location.name agregada.
context.location.type about.resource.resource_subtype Se asigna directamente desde el campo context.location.type.
context.session_id network.session_id Se asigna directamente desde el campo context.session_id.
context.ua network.http.user_agent Se asigna directamente desde el campo context.ua.
context.ua network.http.parsed_user_agent Información del usuario-agente analizada derivada del campo context.ua con el filtro parseduseragent.
country principal.location.country_or_region Se asigna directamente desde el campo country.
date_create metadata.event_timestamp.seconds La marca de tiempo de la época del campo date_create se convierte en un objeto de marca de tiempo.
details.inviter.email target.user.email_addresses Se asigna directamente desde el campo details.inviter.email.
details.inviter.id target.user.product_object_id Se asigna directamente desde el campo details.inviter.id.
details.inviter.name target.user.user_display_name Se asigna directamente desde el campo details.inviter.name.
details.inviter.team target.user.group_identifiers Se asigna directamente desde el campo details.inviter.team.
details.reason security_result.description Se asigna directamente desde el campo details.reason o, si es un array, se concatena con comas.
details.type about.resource.attribute.labels.value Se asigna directamente desde el campo details.type, con la clave details.type agregada.
details.type security_result.summary Se asigna directamente desde el campo details.type.
entity.app.id target.resource.id Se asigna directamente desde el campo entity.app.id.
entity.app.name target.resource.name Se asigna directamente desde el campo entity.app.name.
entity.channel.id target.resource.id Se asigna directamente desde el campo entity.channel.id.
entity.channel.name target.resource.name Se asigna directamente desde el campo entity.channel.name.
entity.channel.privacy target.resource.attribute.labels.value Se asigna directamente desde el campo entity.channel.privacy, con la clave entity.channel.privacy agregada.
entity.file.filetype target.resource.attribute.labels.value Se asigna directamente desde el campo entity.file.filetype, con la clave entity.file.filetype agregada.
entity.file.id target.resource.id Se asigna directamente desde el campo entity.file.id.
entity.file.name target.resource.name Se asigna directamente desde el campo entity.file.name.
entity.file.title target.resource.attribute.labels.value Se asigna directamente desde el campo entity.file.title, con la clave entity.file.title agregada.
entity.huddle.date_end about.resource.attribute.labels.value Se asigna directamente desde el campo entity.huddle.date_end, con la clave entity.huddle.date_end agregada.
entity.huddle.date_start about.resource.attribute.labels.value Se asigna directamente desde el campo entity.huddle.date_start, con la clave entity.huddle.date_start agregada.
entity.huddle.id about.resource.attribute.labels.value Se asigna directamente desde el campo entity.huddle.id, con la clave entity.huddle.id agregada.
entity.huddle.participants.0 about.resource.attribute.labels.value Se asigna directamente desde el campo entity.huddle.participants.0, con la clave entity.huddle.participants.0 agregada.
entity.huddle.participants.1 about.resource.attribute.labels.value Se asigna directamente desde el campo entity.huddle.participants.1, con la clave entity.huddle.participants.1 agregada.
entity.type target.resource.resource_subtype Se asigna directamente desde el campo entity.type.
entity.user.email target.user.email_addresses Se asigna directamente desde el campo entity.user.email.
entity.user.id target.user.product_object_id Se asigna directamente desde el campo entity.user.id.
entity.user.name target.user.user_display_name Se asigna directamente desde el campo entity.user.name.
entity.user.team target.user.group_identifiers Se asigna directamente desde el campo entity.user.team.
entity.workflow.id target.resource.id Se asigna directamente desde el campo entity.workflow.id.
entity.workflow.name target.resource.name Se asigna directamente desde el campo entity.workflow.name.
id metadata.product_log_id Se asigna directamente desde el campo id.
ip principal.ip Se asigna directamente desde el campo ip. Se determina mediante la lógica basada en el campo action. El valor predeterminado es USER_COMMUNICATION, pero cambia a otros valores como USER_CREATION, USER_LOGIN, USER_LOGOUT, USER_RESOURCE_ACCESS, USER_RESOURCE_UPDATE_PERMISSIONS, o USER_CHANGE_PERMISSIONS según el valor de action. Codificado como "SLACK_AUDIT". Se establece en "Enterprise Grid" si date_create existe; de lo contrario, se establece en "Audit Logs" si user_id existe. Codificado como "Slack". Codificado como "REMOTE". Se establece en "SSO" si action contiene "user_login" o "user_logout". De lo contrario, se establece en "MACHINE". No se asigna en los ejemplos proporcionados. El valor predeterminado es "ALLOW", pero se establece en "BLOCK" si action es "user_login_failed". Se establece en "Slack" si date_create existe; de lo contrario, se establece en "SLACK" si user_id existe.
user_agent network.http.user_agent Se asigna directamente desde el campo user_agent.
user_id principal.user.product_object_id Se asigna directamente desde el campo user_id.
username principal.user.product_object_id Se asigna directamente desde el campo username.

¿Necesitas más ayuda? Obtén respuestas de miembros de la comunidad y profesionales de Google SecOps.