Recopila registros de inicio de sesión único (SSO) de Delinea
En este documento, se explica cómo transferir registros de inicio de sesión único (SSO) de Delinea (anteriormente Centrify) a Google Security Operations con Google Cloud Storage. El analizador extrae los registros y controla los formatos JSON y syslog. Analiza pares clave-valor, marcas de tiempo y otros campos relevantes, y los asigna al modelo de UDM, con lógica específica para controlar errores de acceso, agentes de usuario, niveles de gravedad, mecanismos de autenticación y varios tipos de eventos. Prioriza FailUserName sobre NormalizedUser para las direcciones de correo electrónico de destino en los eventos de error.
Antes de comenzar
Asegúrate de cumplir con los siguientes requisitos previos:
- Una instancia de Google SecOps
- Un proyecto de GCP con la API de Cloud Storage habilitada
- Permisos para crear y administrar buckets de GCS
- Permisos para administrar políticas de IAM en buckets de GCS
- Permisos para crear funciones de Cloud Run, temas de Pub/Sub y trabajos de Cloud Scheduler
- Acceso privilegiado al arrendatario de SSO de Delinea (Centrify)
Recopila credenciales de SSO de Delinea (Centrify)
Crea una aplicación cliente de OAuth2
- Accede al Delinea Admin Portal.
- Ve a Apps > Agregar apps web.
- Haz clic en la pestaña Personalizada.
- Busca OAuth2 Client y haz clic en Add.
- Haz clic en Sí en el diálogo Agregar aplicación web.
- Haz clic en Cerrar en el diálogo Agregar apps web.
- En la página Configuración de la aplicación, establece los siguientes parámetros de configuración:
- Pestaña Configuración:
- ID de aplicación: Ingresa un identificador único (por ejemplo,
secops-oauth-client). - Nombre de la aplicación: Ingresa un nombre descriptivo (por ejemplo,
SecOps Data Export). - Descripción de la aplicación: Ingresa una descripción (por ejemplo,
OAuth client for exporting audit events to SecOps).
- ID de aplicación: Ingresa un identificador único (por ejemplo,
- Sección Uso general:
- Tipo de ID de cliente: Selecciona Confidencial.
- ID de cliente emitido: Copia y guarda este valor.
- Secreto del cliente emitido: Copia y guarda este valor.
- Pestaña Tokens:
- Auth Methods: Selecciona Client Creds.
- Token Type: Selecciona JwtRS256.
- Pestaña Scope:
- Agrega el alcance
redrock/querycon la descripciónQuery API Access.
- Agrega el alcance
- Pestaña Configuración:
- Haz clic en Guardar para crear el cliente de OAuth.
- Copia y guarda en una ubicación segura los siguientes detalles:
- URL del arrendatario: Es la URL de tu arrendatario de Centrify (por ejemplo,
https://yourtenant.my.centrify.com). - ID de cliente: Del paso 7
- Secreto del cliente: Del paso 7
- ID de la aplicación de OAuth: Se encuentra en la configuración de la aplicación.
- URL del arrendatario: Es la URL de tu arrendatario de Centrify (por ejemplo,
Verifica los permisos
Para verificar que el cliente de OAuth tenga los permisos necesarios, haz lo siguiente:
- Accede al Delinea Admin Portal.
- Ve a Configuración (⚙️) > Recursos > Roles.
- Verifica que el rol asignado al cliente de OAuth incluya el permiso Informe: Eventos de auditoría: Ver.
Si falta el permiso, comunícate con tu administrador de Delinea para que te lo otorgue.
Prueba el acceso a la API
Prueba tus credenciales antes de continuar con la integración:
# Replace with your actual credentials TENANT_URL="https://yourtenant.my.centrify.com" CLIENT_ID="your-client-id" CLIENT_SECRET="your-client-secret" OAUTH_APP_ID="your-oauth-application-id" # Get OAuth token TOKEN=$(curl -s -X POST "${TENANT_URL}/oauth2/token/${OAUTH_APP_ID}" \ -H "Authorization: Basic $(echo -n "${CLIENT_ID}:${CLIENT_SECRET}" | base64)" \ -H "X-CENTRIFY-NATIVE-CLIENT: True" \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "grant_type=client_credentials&scope=redrock/query" | jq -r '.access_token') # Test query API access curl -v -X POST "${TENANT_URL}/Redrock/query" \ -H "Authorization: Bearer ${TOKEN}" \ -H "X-CENTRIFY-NATIVE-CLIENT: True" \ -H "Content-Type: application/json" \ -d '{"Script":"Select * from Event where WhenOccurred > datefunc('"'"'now'"'"', '"'"'-1'"'"') ORDER BY WhenOccurred ASC","args":{"PageNumber":1,"PageSize":10,"Limit":10,"Caching":-1}}'
Si se ejecuta correctamente, deberías ver una respuesta JSON con eventos de auditoría. Si recibes un error 401 o 403, verifica tus credenciales y permisos.
Crea un bucket de Google Cloud Storage
- Ve a Google Cloud Console.
- Selecciona tu proyecto o crea uno nuevo.
- En el menú de navegación, ve a Cloud Storage > Buckets.
- Haz clic en Crear bucket.
Proporciona los siguientes detalles de configuración:
Configuración Valor Asigna un nombre a tu bucket Ingresa un nombre global único (por ejemplo, delinea-centrify-logs-bucket).Tipo de ubicación Elige según tus necesidades (región, birregional, multirregional) Ubicación Selecciona la ubicación (por ejemplo, us-central1).Clase de almacenamiento Estándar (recomendado para los registros a los que se accede con frecuencia) Control de acceso Uniforme (recomendado) Herramientas de protección Opcional: Habilita el control de versiones de objetos o la política de retención Haz clic en Crear.
Crea una cuenta de servicio para la Cloud Run Function
La Cloud Run Function necesita una cuenta de servicio con permisos para escribir en el bucket de GCS y ser invocada por Pub/Sub.
Crear cuenta de servicio
- En GCP Console, ve a IAM y administración > Cuentas de servicio.
- Haz clic en Crear cuenta de servicio.
- Proporciona los siguientes detalles de configuración:
- Nombre de la cuenta de servicio: Ingresa
delinea-sso-collector-sa. - Descripción de la cuenta de servicio: Ingresa
Service account for Cloud Run function to collect Delinea SSO logs.
- Nombre de la cuenta de servicio: Ingresa
- Haz clic en Crear y continuar.
- En la sección Otorga a esta cuenta de servicio acceso al proyecto, agrega los siguientes roles:
- Haz clic en Selecciona un rol.
- Busca y selecciona Administrador de objetos de almacenamiento.
- Haz clic en + Agregar otra función.
- Busca y selecciona Invocador de Cloud Run.
- Haz clic en + Agregar otra función.
- Busca y selecciona Cloud Functions Invoker.
- Haz clic en Continuar.
- Haz clic en Listo.
Estos roles son necesarios para las siguientes acciones:
- Administrador de objetos de almacenamiento: Escribe registros en el bucket de GCS y administra archivos de estado
- Invocador de Cloud Run: Permite que Pub/Sub invoque la función
- Cloud Functions Invoker: Permite la invocación de funciones
Otorga permisos de IAM en el bucket de GCS
Otorga permisos de escritura a la cuenta de servicio en el bucket de GCS:
- Ve a Cloud Storage > Buckets.
- Haz clic en el nombre de tu bucket (por ejemplo,
delinea-centrify-logs-bucket). - Ve a la pestaña Permisos.
- Haz clic en Otorgar acceso.
- Proporciona los siguientes detalles de configuración:
- Agregar principales: Ingresa el correo electrónico de la cuenta de servicio (por ejemplo,
delinea-sso-collector-sa@PROJECT_ID.iam.gserviceaccount.com). - Asignar roles: Selecciona Administrador de objetos de Storage.
- Agregar principales: Ingresa el correo electrónico de la cuenta de servicio (por ejemplo,
- Haz clic en Guardar.
Crear tema de Pub/Sub
Crea un tema de Pub/Sub en el que Cloud Scheduler publicará y al que se suscribirá la función de Cloud Run.
- En GCP Console, ve a Pub/Sub > Temas.
- Haz clic en Crear un tema.
- Proporciona los siguientes detalles de configuración:
- ID del tema: Ingresa
delinea-sso-logs-trigger. - Deja el resto de la configuración con sus valores predeterminados.
- ID del tema: Ingresa
- Haz clic en Crear.
Crea una función de Cloud Run para recopilar registros
La función de Cloud Run se activa con mensajes de Pub/Sub de Cloud Scheduler para recuperar registros de la API de SSO de Delinea y escribirlos en GCS.
- En GCP Console, ve a Cloud Run.
- Haz clic en Crear servicio.
- Selecciona Función (usa un editor intercalado para crear una función).
En la sección Configurar, proporciona los siguientes detalles de configuración:
Configuración Valor Nombre del servicio delinea-sso-log-exportRegión Selecciona la región que coincida con tu bucket de GCS (por ejemplo, us-central1).Tiempo de ejecución Selecciona Python 3.12 o una versión posterior. En la sección Activador (opcional), haz lo siguiente:
- Haz clic en + Agregar activador.
- Selecciona Cloud Pub/Sub.
- En Selecciona un tema de Cloud Pub/Sub, elige el tema de Pub/Sub
delinea-sso-logs-trigger. - Haz clic en Guardar.
En la sección Autenticación, haz lo siguiente:
- Selecciona Solicitar autenticación.
- Verifica Identity and Access Management (IAM).
Desplázate hacia abajo y expande Contenedores, redes y seguridad.
Ve a la pestaña Seguridad:
- Cuenta de servicio: Selecciona la cuenta de servicio
delinea-sso-collector-sa.
- Cuenta de servicio: Selecciona la cuenta de servicio
Ve a la pestaña Contenedores:
- Haz clic en Variables y secretos.
- Haz clic en + Agregar variable para cada variable de entorno:
Nombre de la variable Valor de ejemplo Descripción GCS_BUCKETdelinea-centrify-logs-bucketNombre del bucket de GCS GCS_PREFIXcentrify-sso-logsPrefijo para los archivos de registro STATE_KEYcentrify-sso-logs/state.jsonRuta de acceso al archivo de estado TENANT_URLhttps://yourtenant.my.centrify.comURL del arrendatario de Delinea CLIENT_IDyour-client-idID de cliente de OAuth CLIENT_SECRETyour-client-secretSecreto de cliente de OAuth OAUTH_APP_IDyour-oauth-application-idID de la aplicación de OAuth PAGE_SIZE1000Registros por página MAX_PAGES10Cantidad máxima de páginas para recuperar En la sección Variables y Secrets, desplázate hacia abajo hasta Solicitudes:
- Tiempo de espera de la solicitud: Ingresa
600segundos (10 minutos).
- Tiempo de espera de la solicitud: Ingresa
Ve a la pestaña Configuración:
- En la sección Recursos, haz lo siguiente:
- Memoria: Selecciona 512 MiB o más.
- CPU: Selecciona 1.
- En la sección Recursos, haz lo siguiente:
En la sección Ajuste de escala de revisión, haz lo siguiente:
- Cantidad mínima de instancias: Ingresa
0. - Cantidad máxima de instancias: Ingresa
100(o ajusta según la carga esperada).
- Cantidad mínima de instancias: Ingresa
Haz clic en Crear.
Espera a que se cree el servicio (de 1 a 2 minutos).
Después de crear el servicio, se abrirá automáticamente el editor de código intercalado.
Agregar el código de función
- Ingresa main en Punto de entrada de la función.
En el editor de código intercalado, crea dos archivos:
- Primer archivo: main.py:
import functions_framework from google.cloud import storage import json import os import urllib3 from datetime import datetime, timezone, timedelta import time import base64 # Initialize HTTP client with timeouts http = urllib3.PoolManager( timeout=urllib3.Timeout(connect=5.0, read=30.0), retries=False, ) # Initialize Storage client storage_client = storage.Client() @functions_framework.cloud_event def main(cloud_event): """ Cloud Run function triggered by Pub/Sub to fetch Delinea Centrify SSO audit events and write to GCS. Args: cloud_event: CloudEvent object containing Pub/Sub message """ # Get environment variables bucket_name = os.environ.get('GCS_BUCKET') prefix = os.environ.get('GCS_PREFIX', 'centrify-sso-logs') state_key = os.environ.get('STATE_KEY', 'centrify-sso-logs/state.json') # Centrify API credentials tenant_url = os.environ.get('TENANT_URL') client_id = os.environ.get('CLIENT_ID') client_secret = os.environ.get('CLIENT_SECRET') oauth_app_id = os.environ.get('OAUTH_APP_ID') # Optional parameters page_size = int(os.environ.get('PAGE_SIZE', '1000')) max_pages = int(os.environ.get('MAX_PAGES', '10')) if not all([bucket_name, tenant_url, client_id, client_secret, oauth_app_id]): print('Error: Missing required environment variables') return try: # Get GCS bucket bucket = storage_client.bucket(bucket_name) # Load state (last processed timestamp) state = load_state(bucket, state_key) last_timestamp = state.get('last_timestamp') print(f'Processing logs since {last_timestamp if last_timestamp else "24 hours ago"}') # Get OAuth access token access_token = get_oauth_token(tenant_url, client_id, client_secret, oauth_app_id) # Fetch audit events events = fetch_audit_events(tenant_url, access_token, last_timestamp, page_size, max_pages) if events: # Write events to GCS current_timestamp = datetime.now(timezone.utc) blob_name = f"{prefix}/centrify-sso-events-{current_timestamp.strftime('%Y%m%d_%H%M%S')}.json" blob = bucket.blob(blob_name) # Convert to JSONL format (one JSON object per line) jsonl_content = '\n'.join([json.dumps(event, default=str) for event in events]) blob.upload_from_string(jsonl_content, content_type='application/x-ndjson') print(f'Wrote {len(events)} events to {blob_name}') # Update state with latest timestamp latest_timestamp = get_latest_event_timestamp(events) save_state(bucket, state_key, {'last_timestamp': latest_timestamp, 'updated_at': current_timestamp.isoformat() + 'Z'}) print(f'Successfully processed {len(events)} events') else: print('No new events found') except Exception as e: print(f'Error processing Centrify SSO logs: {str(e)}') raise def get_oauth_token(tenant_url, client_id, client_secret, oauth_app_id): """Get OAuth access token using client credentials flow.""" credentials = f"{client_id}:{client_secret}" basic_auth = base64.b64encode(credentials.encode('utf-8')).decode('utf-8') token_url = f"{tenant_url}/oauth2/token/{oauth_app_id}" headers = { 'Authorization': f'Basic {basic_auth}', 'X-CENTRIFY-NATIVE-CLIENT': 'True', 'Content-Type': 'application/x-www-form-urlencoded' } data = { 'grant_type': 'client_credentials', 'scope': 'redrock/query' } response = http.request('POST', token_url, headers=headers, fields=data) if response.status != 200: raise Exception(f"OAuth token request failed: {response.status} {response.data.decode('utf-8')}") token_data = json.loads(response.data.decode('utf-8')) return token_data['access_token'] def fetch_audit_events(tenant_url, access_token, last_timestamp, page_size, max_pages): """Fetch audit events from Centrify using the Redrock/query API with proper pagination.""" query_url = f"{tenant_url}/Redrock/query" headers = { 'Authorization': f'Bearer {access_token}', 'X-CENTRIFY-NATIVE-CLIENT': 'True', 'Content-Type': 'application/json' } # Build SQL query with timestamp filter if last_timestamp: sql_query = f"Select * from Event where WhenOccurred > '{last_timestamp}' ORDER BY WhenOccurred ASC" else: # First run - get events from last 24 hours sql_query = "Select * from Event where WhenOccurred > datefunc('now', '-1') ORDER BY WhenOccurred ASC" all_events = [] page_num = 1 backoff = 1.0 while page_num <= max_pages: payload = { "Script": sql_query, "args": { "PageNumber": page_num, "PageSize": page_size, "Limit": page_size * max_pages, "Caching": -1 } } try: response = http.request('POST', query_url, headers=headers, body=json.dumps(payload)) # Handle rate limiting with exponential backoff if response.status == 429: retry_after = int(response.headers.get('Retry-After', str(int(backoff)))) print(f"Rate limited (429). Retrying after {retry_after}s...") time.sleep(retry_after) backoff = min(backoff * 2, 30.0) continue backoff = 1.0 if response.status != 200: raise Exception(f"API query failed: {response.status} {response.data.decode('utf-8')}") response_data = json.loads(response.data.decode('utf-8')) if not response_data.get('success', False): raise Exception(f"API query failed: {response_data.get('Message', 'Unknown error')}") # Parse the response result = response_data.get('Result', {}) columns = {col['Name']: i for i, col in enumerate(result.get('Columns', []))} raw_results = result.get('Results', []) if not raw_results: print(f"No more results on page {page_num}") break print(f"Page {page_num}: Retrieved {len(raw_results)} events") for raw_event in raw_results: event = {} row_data = raw_event.get('Row', {}) # Map column names to values for col_name, col_index in columns.items(): if col_name in row_data and row_data[col_name] is not None: event[col_name] = row_data[col_name] # Add metadata event['_source'] = 'centrify_sso' event['_collected_at'] = datetime.now(timezone.utc).isoformat() + 'Z' all_events.append(event) # Check if we've reached the end if len(raw_results) < page_size: print(f"Reached last page (page {page_num} returned {len(raw_results)} < {page_size})") break page_num += 1 except Exception as e: print(f"Error fetching page {page_num}: {e}") raise print(f"Retrieved {len(all_events)} total events from {page_num} pages") return all_events def get_latest_event_timestamp(events): """Get the latest timestamp from the events for state tracking.""" if not events: return datetime.now(timezone.utc).isoformat() + 'Z' latest = None for event in events: when_occurred = event.get('WhenOccurred') if when_occurred: if latest is None or when_occurred > latest: latest = when_occurred return latest or datetime.now(timezone.utc).isoformat() + 'Z' def load_state(bucket, key): """Load state from GCS.""" try: blob = bucket.blob(key) if blob.exists(): state_data = blob.download_as_text() return json.loads(state_data) except Exception as e: print(f'Warning: Could not load state: {str(e)}') return {} def save_state(bucket, key, state): """Save state to GCS.""" try: blob = bucket.blob(key) blob.upload_from_string( json.dumps(state), content_type='application/json' ) except Exception as e: print(f'Warning: Could not save state: {str(e)}')- Segundo archivo: requirements.txt:
functions-framework==3.* google-cloud-storage==2.* urllib3>=2.0.0Haz clic en Implementar para guardar y, luego, implementar la función.
Espera a que se complete la implementación (de 2 a 3 minutos).
Crea un trabajo de Cloud Scheduler
Cloud Scheduler publica mensajes en el tema de Pub/Sub a intervalos regulares, lo que activa la función de Cloud Run.
- En GCP Console, ve a Cloud Scheduler.
- Haz clic en Crear trabajo.
Proporciona los siguientes detalles de configuración:
Configuración Valor Nombre delinea-sso-log-export-hourlyRegión Selecciona la misma región que la función de Cloud Run Frecuencia 0 * * * *(cada hora, en punto)Zona horaria Selecciona la zona horaria (se recomienda UTC) Tipo de orientación Pub/Sub Tema Selecciona el tema de Pub/Sub delinea-sso-logs-trigger.Cuerpo del mensaje {}(objeto JSON vacío)Haz clic en Crear.
Opciones de frecuencia de programación
Elige la frecuencia según los requisitos de latencia y volumen de registros:
Frecuencia Expresión cron Caso de uso Cada 5 minutos */5 * * * *Alto volumen y baja latencia Cada 15 minutos */15 * * * *Volumen medio Cada 1 hora 0 * * * *Estándar (opción recomendada) Cada 6 horas 0 */6 * * *Procesamiento por lotes y volumen bajo Diario 0 0 * * *Recopilación de datos históricos
Prueba la integración
- En la consola de Cloud Scheduler, busca tu trabajo (por ejemplo,
delinea-sso-log-export-hourly). - Haz clic en Forzar ejecución para activar el trabajo de forma manual.
- Espera unos segundos.
- Ve a Cloud Run > Servicios.
- Haz clic en el nombre de la función
delinea-sso-log-export. - Haz clic en la pestaña Registros.
Verifica que la función se haya ejecutado correctamente. Busca lo siguiente:
Processing logs since YYYY-MM-DDTHH:MM:SS+00:00 Page 1: Retrieved X events Wrote X events to centrify-sso-logs/centrify-sso-events_YYYYMMDD_HHMMSS.json Successfully processed X eventsVe a Cloud Storage > Buckets.
Haz clic en el nombre de tu bucket (por ejemplo,
delinea-centrify-logs-bucket).Navega a la carpeta de prefijo
centrify-sso-logs/.Verifica que se haya creado un archivo
.jsonnuevo con la marca de tiempo actual.
Si ves errores en los registros, haz lo siguiente:
- HTTP 401: Verifica las credenciales de la API en las variables de entorno (CLIENT_ID, CLIENT_SECRET, OAUTH_APP_ID).
- HTTP 403: Verifica que el cliente de OAuth tenga permiso de Informe: Eventos de auditoría: Ver.
- HTTP 429: Limitación de frecuencia. La función volverá a intentarlo automáticamente con una espera exponencial.
- Faltan variables de entorno: Verifica que todas las variables requeridas estén configuradas en la configuración de la función de Cloud Run.
Recupera la cuenta de servicio de Google SecOps
Las Operaciones de seguridad de Google usan una cuenta de servicio única para leer datos de tu bucket de GCS. Debes otorgar acceso a tu bucket a esta cuenta de servicio.
Obtén el correo electrónico de la cuenta de servicio
- Ve a Configuración de SIEM > Feeds.
- Haz clic en Agregar feed nuevo.
- Haz clic en Configura un feed único.
- En el campo Nombre del feed, ingresa un nombre para el feed (por ejemplo,
Delinea Centrify SSO logs). - Selecciona Google Cloud Storage V2 como el Tipo de fuente.
- Selecciona Centrify como el Tipo de registro.
Haz clic en Obtener cuenta de servicio. Se mostrará un correo electrónico único de la cuenta de servicio, por ejemplo:
chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.comCopia esta dirección de correo electrónico para usarla en el siguiente paso.
Otorga permisos de IAM a la cuenta de servicio de Google SecOps
La cuenta de servicio de Google SecOps necesita el rol de visualizador de objetos de almacenamiento en tu bucket de GCS.
- Ve a Cloud Storage > Buckets.
- Haz clic en el nombre de tu bucket (por ejemplo,
delinea-centrify-logs-bucket). - Ve a la pestaña Permisos.
- Haz clic en Otorgar acceso.
- Proporciona los siguientes detalles de configuración:
- Agregar principales: Pega el correo electrónico de la cuenta de servicio de Google SecOps.
- Asignar roles: Selecciona Visualizador de objetos de Storage.
Haz clic en Guardar.
Configura un feed en Google SecOps para transferir registros de SSO de Delinea (Centrify)
- Ve a Configuración de SIEM > Feeds.
- Haz clic en Agregar feed nuevo.
- Haz clic en Configura un feed único.
- En el campo Nombre del feed, ingresa un nombre para el feed (por ejemplo,
Delinea Centrify SSO logs). - Selecciona Google Cloud Storage V2 como el Tipo de fuente.
- Selecciona Centrify como el Tipo de registro.
- Haz clic en Siguiente.
Especifica valores para los siguientes parámetros de entrada:
URL del bucket de almacenamiento: Ingresa el URI del bucket de GCS con la ruta de acceso del prefijo:
gs://delinea-centrify-logs-bucket/centrify-sso-logs/Reemplaza lo siguiente:
delinea-centrify-logs-bucket: Es el nombre de tu bucket de GCS.centrify-sso-logs: Es el prefijo o la ruta de carpeta opcionales en los que se almacenan los registros (déjalo vacío para la raíz).
Ejemplos:
- Bucket raíz:
gs://company-logs/ - Con prefijo:
gs://company-logs/centrify-sso-logs/ - Con subcarpeta:
gs://company-logs/delinea/sso/
- Bucket raíz:
Opción de borrado de la fuente: Selecciona la opción de borrado según tu preferencia:
- Nunca: Nunca borra ningún archivo después de las transferencias (se recomienda para las pruebas).
- Borrar archivos transferidos: Borra los archivos después de la transferencia exitosa.
Borrar los archivos transferidos y los directorios vacíos: Borra los archivos y los directorios vacíos después de la transferencia exitosa.
Antigüedad máxima del archivo: Incluye los archivos modificados en la cantidad de días especificada. El valor predeterminado es de 180 días.
Espacio de nombres del recurso: Es el espacio de nombres del recurso.
Etiquetas de transmisión: Es la etiqueta que se aplicará a los eventos de este feed.
Haz clic en Siguiente.
Revisa la nueva configuración del feed en la pantalla Finalizar y, luego, haz clic en Enviar.
Tabla de asignación de UDM
| Campo de registro | Asignación de UDM | Lógica |
|---|---|---|
| AccountID | security_result.detection_fields.value | El valor de AccountID del registro sin procesar se asigna a un objeto security_result.detection_fields con la clave: Account ID. |
| ApplicationName | target.application | El valor de ApplicationName del registro sin procesar se asigna al campo target.application. |
| AuthorityFQDN | target.asset.network_domain | El valor de AuthorityFQDN del registro sin procesar se asigna al campo target.asset.network_domain. |
| AuthorityID | target.asset.asset_id | El valor de AuthorityID del registro sin procesar se asigna al campo target.asset.asset_id, con el prefijo "AuthorityID:". |
| AzDeploymentId | security_result.detection_fields.value | El valor de AzDeploymentId del registro sin procesar se asigna a un objeto security_result.detection_fields con la clave AzDeploymentId. |
| AzRoleId | additional.fields.value.string_value | El valor de AzRoleId del registro sin procesar se asigna a un objeto additional.fields con la clave AzRoleId. |
| AzRoleName | target.user.attribute.roles.name | El valor de AzRoleName del registro sin procesar se asigna al campo target.user.attribute.roles.name. |
| ComputerFQDN | principal.asset.network_domain | El valor de ComputerFQDN del registro sin procesar se asigna al campo principal.asset.network_domain. |
| ComputerID | principal.asset.asset_id | El valor de ComputerID del registro sin procesar se asigna al campo principal.asset.asset_id, con el prefijo "ComputerId:". |
| ComputerName | about.hostname | El valor de ComputerName del registro sin procesar se asigna al campo about.hostname. |
| CredentialId | security_result.detection_fields.value | El valor de CredentialId del registro sin procesar se asigna a un objeto security_result.detection_fields con la clave Credential Id. |
| DirectoryServiceName | security_result.detection_fields.value | El valor de DirectoryServiceName del registro sin procesar se asigna a un objeto security_result.detection_fields con la clave Directory Service Name. |
| DirectoryServiceNameLocalized | security_result.detection_fields.value | El valor de DirectoryServiceNameLocalized del registro sin procesar se asigna a un objeto security_result.detection_fields con la clave Directory Service Name Localized. |
| DirectoryServiceUuid | security_result.detection_fields.value | El valor de DirectoryServiceUuid del registro sin procesar se asigna a un objeto security_result.detection_fields con la clave Directory Service Uuid. |
| EventMessage | security_result.summary | El valor de EventMessage del registro sin procesar se asigna al campo security_result.summary. |
| EventType | metadata.product_event_type | El valor de EventType del registro sin procesar se asigna al campo metadata.product_event_type. También se usa para determinar el valor de metadata.event_type. |
| FailReason | security_result.summary | El valor de FailReason del registro sin procesar se asigna al campo security_result.summary cuando está presente. |
| FailUserName | target.user.email_addresses | El valor de FailUserName del registro sin procesar se asigna al campo target.user.email_addresses cuando está presente. |
| FromIPAddress | principal.ip | El valor de FromIPAddress del registro sin procesar se asigna al campo principal.ip. |
| ID | security_result.detection_fields.value | El valor del ID del registro sin procesar se asigna a un objeto security_result.detection_fields con la clave ID. |
| InternalTrackingID | metadata.product_log_id | El valor de InternalTrackingID del registro sin procesar se asigna al campo metadata.product_log_id. |
| JumpType | additional.fields.value.string_value | El valor de JumpType del registro sin procesar se asigna a un objeto additional.fields con la clave Jump Type. |
| NormalizedUser | target.user.email_addresses | El valor de NormalizedUser del registro sin procesar se asigna al campo target.user.email_addresses. |
| OperationMode | additional.fields.value.string_value | El valor de OperationMode del registro sin procesar se asigna a un objeto additional.fields con la clave: Operation Mode. |
| ProxyId | security_result.detection_fields.value | El valor de ProxyId del registro sin procesar se asigna a un objeto security_result.detection_fields con la clave Proxy Id. |
| RequestUserAgent | network.http.user_agent | El valor de RequestUserAgent del registro sin procesar se asigna al campo network.http.user_agent. |
| SessionGuid | network.session_id | El valor de SessionGuid del registro sin procesar se asigna al campo network.session_id. |
| Usuario | additional.fields.value.string_value | El valor de Tenant del registro sin procesar se asigna a un objeto additional.fields con la clave Tenant. |
| ThreadType | additional.fields.value.string_value | El valor de ThreadType del registro sin procesar se asigna a un objeto additional.fields con la clave Thread Type. |
| UserType | principal.user.attribute.roles.name | El valor de UserType del registro sin procesar se asigna al campo principal.user.attribute.roles.name. |
| WhenOccurred | metadata.event_timestamp | El valor de WhenOccurred del registro sin procesar se analiza y se asigna al campo metadata.event_timestamp. Este campo también propaga el campo de marca de tiempo de nivel superior. |
| Valor codificado | metadata.product_name | "SSO". |
| Valor codificado | metadata.event_type | Se determina según el campo EventType. El valor predeterminado es STATUS_UPDATE si EventType no está presente o no coincide con ningún criterio específico. Puede ser USER_LOGIN, USER_CREATION, USER_RESOURCE_ACCESS, USER_LOGOUT o USER_CHANGE_PASSWORD. |
| Valor codificado | metadata.vendor_name | "CENTRIFY_SSO". |
| Valor codificado | metadata.product_version | "SSO". |
| Valor codificado | metadata.log_type | "Centrify". |
| Extraído del campo de mensaje | network.session_id | Si el campo de mensaje contiene un ID de sesión, se extrae y se usa. De lo contrario, el valor predeterminado es “1”. |
| Se extrajo del campo host | principal.hostname | Se extrae del campo host si está disponible, que proviene del encabezado de syslog. |
| Se extrajo del campo PID. | principal.process.pid | Se extrae del campo PID si está disponible, que proviene del encabezado de syslog. |
| UserGuid o extraído del mensaje | target.user.userid | Si UserGuid está presente, se usa su valor. De lo contrario, si el campo de mensaje contiene un ID de usuario, se extraerá y se usará. |
| Determinado por Level y FailReason | security_result.action | Se establece en "ALLOW" si el nivel es "Info" y en "BLOCK" si está presente FailReason. |
| Determinado por FailReason | security_result.category | Se establece en "AUTH_VIOLATION" si FailReason está presente. |
| Determinado por el campo Nivel | security_result.severity | Se determina según el campo Nivel. Se establece en "INFORMATIONAL" si el nivel es "Info", "MEDIUM" si el nivel es "Warning" y "ERROR" si el nivel es "Error". |
¿Necesitas más ayuda? Obtén respuestas de miembros de la comunidad y profesionales de Google SecOps.