Recopila registros del contexto del usuario de Duo
En este documento, se explica cómo transferir registros de contexto de usuarios de Duo a Operaciones de seguridad de Google con una API. El analizador procesa los datos JSON, asigna la información del usuario (incluidos los alias de los nombres de usuario a las direcciones de correo electrónico, los grupos, los números de teléfono y los detalles del dispositivo) al UDM y captura el estado de la cuenta del usuario. También controla las estructuras de datos anidadas y realiza varias transformaciones y combinaciones de datos para crear el evento final del UDM.
Antes de comenzar
Asegúrate de cumplir con los siguientes requisitos previos:
- Instancia de Google SecOps
- Acceso con privilegios al Panel de administración de Duo
Configura la aplicación de la API de Admin y obtén las claves
- Accede al Panel de administración de Duo como administrador.
- En la barra lateral izquierda, haz clic en Aplicaciones > Administrar aplicaciones.
- Presiona el botón Add Application.
- En el campo de búsqueda, escribe Admin API y haz clic en Agregar junto a Duo Admin API.
- En la siguiente pantalla, se muestra la siguiente información:
- Clave de integración: (una cadena como
DIYYYYYYYYYYYYYY) - Clave secreta: Es una cadena de 40 caracteres.
- Nombre de host de la API: Por ejemplo,
api-abcd1234.duosecurity.com.
- Clave de integración: (una cadena como
- Copia y guarda la clave de integración, la clave secreta y el nombre de host de la API en una ubicación segura.
- Desplázate hasta Configuración y establece Permisos en Otorgar permiso de lectura del recurso.
- Haz clic en Guardar cambios.
Configura feeds
- Ve a Configuración de SIEM > Feeds.
- Haz clic en + Agregar feed nuevo.
- En el campo Nombre del feed, ingresa un nombre para el feed (por ejemplo,
Duo Users Logs). - Selecciona API de terceros como el Tipo de origen.
- Selecciona el tipo de registro Contexto del usuario de Duo.
- Haz clic en Siguiente.
- Especifica valores para los siguientes parámetros de entrada:
- Nombre de usuario: Ingresa la clave de integración que copiaste antes.
- Secret: Ingresa la clave secreta que copiaste antes.
- Nombre de host de la API: Proporciona la URL del servidor de la API de Duo (por ejemplo,
api-abcd1234.duosecurity.com). - Espacio de nombres del recurso: Es el espacio de nombres del recurso.
- Etiquetas de transmisión: Es la etiqueta que se aplica a los eventos de este feed.
- Haz clic en Siguiente.
- Revisa la 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 |
|---|---|---|
access_device.browser |
event.idm.entity.entity.resource.attribute.labels.value |
El valor se toma directamente del campo access_device.browser o surfaced_auth.access_device.browser si el primero está vacío. La clave se establece en "access_device browser". |
access_device.browser_version |
event.idm.entity.entity.resource.attribute.labels.value |
El valor se toma directamente del campo access_device.browser_version o surfaced_auth.access_device.browser_version si el primero está vacío. La clave se establece en "access_device browser_version". |
access_device.ip.address |
event.idm.entity.entity.ip |
El valor se toma directamente del campo access_device.ip.address o surfaced_auth.access_device.ip si el primero está vacío. |
access_device.location.city |
event.idm.entity.entity.location.city |
El valor se toma directamente del campo access_device.location.city o surfaced_auth.access_device.location.city si el primero está vacío. |
access_device.location.country |
event.idm.entity.entity.location.country_or_region |
El valor se toma directamente del campo access_device.location.country o surfaced_auth.access_device.location.country si el primero está vacío. |
access_device.location.state |
event.idm.entity.entity.location.state |
El valor se toma directamente del campo access_device.location.state o surfaced_auth.access_device.location.state si el primero está vacío. |
access_device.os |
event.idm.entity.entity.asset.platform_software.platform |
El valor se deriva del campo access_device.os o de surfaced_auth.access_device.os si el primero está vacío. Si el valor coincide (sin distinguir mayúsculas de minúsculas) con "ios" o "mac", el campo de UDM se establece en "MAC". Si coincide con "windows", el campo de UDM se establece en "WINDOWS". Si coincide con "linux", el campo de UDM se establece en "LINUX". |
access_device.os_version |
event.idm.entity.entity.asset.platform_software.platform_version |
El valor se toma directamente del campo access_device.os_version o surfaced_auth.access_device.os_version si el primero está vacío. |
action.details |
event.idm.entity.sec_result.action_details |
El valor se toma de este campo si action está vacío. |
action.name |
event.idm.entity.sec_result.detection_fields.value |
El valor se toma directamente del campo. La clave se establece en "action_name". |
activity_id |
event.idm.entity.sec_result.detection_fields.value |
El valor se toma directamente del campo. La clave se establece en "activity_id". |
actor.details.created |
event.idm.entity.entity.user.attribute.labels.value |
El valor se toma directamente del campo. La clave se establece como "creada". |
actor.details.email |
event.idm.entity.entity.user.email_addresses |
El valor se toma directamente del campo. |
actor.details.groups.key |
event.idm.entity.entity.user.group_identifiers |
El valor se toma directamente del campo. |
actor.details.groups.name |
event.idm.entity.entity.user.group_identifiers |
El valor se toma directamente del campo. |
actor.details.last_login |
event.idm.entity.entity.user.attribute.labels.value |
El valor se toma directamente del campo. La clave se establece en "last_login". |
actor.details.status |
event.idm.entity.entity.user.attribute.labels.value |
El valor se toma directamente del campo. La clave se establece en "status". |
actor.key |
event.idm.entity.entity.resource.product_object_id |
El valor se toma directamente del campo. |
actor.name |
event.idm.entity.entity.user.user_display_name |
El valor se toma directamente del campo o surfaced_auth.user.name si el primero está vacío. |
actor.type |
event.idm.entity.entity.user.attribute.labels.value |
El valor se toma directamente del campo. La clave se establece en "actor type". |
akey |
event.idm.entity.metadata.product_entity_id |
El valor se toma directamente del campo o es sekey si akey está vacío. |
application |
event.idm.entity.entity.application |
El valor se toma directamente del campo. |
collection_time.seconds, create_time.seconds |
event.idm.entity.metadata.collected_timestamp.seconds, event.timestamp.seconds |
El valor más alto de collection_time.seconds y create_time.seconds se usa para collected_timestamp.seconds y el timestamp.seconds de nivel superior. |
collection_time.nanos, create_time.nanos |
event.idm.entity.metadata.collected_timestamp.nanos, event.timestamp.nanos |
El valor en nanosegundos correspondiente al mayor de collection_time.seconds y create_time.seconds se usa para collected_timestamp.nanos y el timestamp.nanos de nivel superior. |
email |
event.idm.entity.entity.user.email_addresses |
El valor se toma directamente del campo. |
explanations |
event.idm.entity.entity.resource.attribute.labels |
Los pares clave-valor dentro de cada objeto del array explanations se convierten en etiquetas. La clave de cada etiqueta está precedida por "explanation ". |
firstname |
event.idm.entity.entity.user.first_name |
El valor se toma directamente del campo. |
from_common_netblock |
event.idm.entity.entity.resource.attribute.labels.value |
El valor se toma directamente del campo. La clave se establece en "from_common_netblock". |
from_new_user |
event.idm.entity.entity.resource.attribute.labels.value |
El valor se toma directamente del campo. La clave se establece en "from_new_user". |
groups.N.name (N=0..10) |
event.idm.entity.entity.user.group_identifiers |
El valor se toma directamente del campo. |
lastname |
event.idm.entity.entity.user.last_name |
El valor se toma directamente del campo. |
low_risk_ip |
event.idm.entity.entity.resource.attribute.labels.value |
El valor se toma directamente del campo. La clave se establece en "low_risk_ip". |
phones.0.model |
event.idm.entity.relations.entity.asset.hardware.model |
El valor se toma directamente del campo. |
phones.0.number |
event.idm.entity.entity.user.phone_numbers |
El valor se toma directamente del campo. |
phones.0.phone_id |
event.idm.entity.relations.entity.asset.product_object_id |
El valor se toma directamente del campo. |
phones.0.platform |
event.idm.entity.relations.entity.asset.hardware.manufacturer |
El valor se toma directamente del campo. |
priority_event |
event.idm.entity.entity.resource.attribute.labels.value |
El valor se toma directamente del campo. La clave se establece en "priority_event". |
realname |
event.idm.entity.entity.user.user_display_name |
El valor se toma directamente del campo. |
sekey |
event.idm.entity.metadata.product_entity_id |
El valor se toma directamente del campo si akey está vacío. |
state |
event.idm.entity.entity.resource.attribute.labels.value |
El valor se toma directamente del campo. La clave se establece en "state". |
status |
event.idm.entity.entity.user.attribute.labels.value, event.idm.entity.entity.user.user_authentication_status |
El valor se toma directamente del campo. La clave de la etiqueta se establece en "status". El valor también se usa para determinar el user_authentication_status. "active" y "bypass" se asignan a "ACTIVE", "disabled" y "pending deletion" se asignan a "SUSPENDED", y "locked out" se asigna a "NO_ACTIVE_CREDENTIALS". |
surfaced_auth.access_device.browser |
event.idm.entity.entity.resource.attribute.labels.value |
El valor se toma de este campo si access_device.browser está vacío. La clave se establece en "surfaced_auth access_device browser". |
surfaced_auth.access_device.browser_version |
event.idm.entity.entity.resource.attribute.labels.value |
El valor se toma de este campo si access_device.browser_version está vacío. La clave se establece en "surfaced_auth access_device browser_version". |
surfaced_auth.access_device.ip |
event.idm.entity.entity.ip |
El valor se toma de este campo si access_device.ip.address está vacío. |
surfaced_auth.access_device.location.city |
event.idm.entity.entity.location.city |
El valor se toma de este campo si access_device.location.city está vacío. |
surfaced_auth.access_device.location.country |
event.idm.entity.entity.location.country_or_region |
El valor se toma de este campo si access_device.location.country está vacío. |
surfaced_auth.access_device.location.state |
event.idm.entity.entity.location.state |
El valor se toma de este campo si access_device.location.state está vacío. |
surfaced_auth.access_device.os |
event.idm.entity.entity.asset.platform_software.platform |
El valor se toma de este campo si access_device.os está vacío. La lógica para asignar el campo al UDM es la misma que para access_device.os. |
surfaced_auth.access_device.os_version |
event.idm.entity.entity.asset.platform_software.platform_version |
El valor se toma de este campo si access_device.os_version está vacío. |
surfaced_auth.user.key |
event.idm.entity.entity.user.userid |
El valor se toma de este campo si username está vacío. |
surfaced_auth.user.name |
event.idm.entity.entity.user.user_display_name |
El valor se toma de este campo si actor.name está vacío. |
target.details.biometrics_status |
event.idm.entity.entity.asset.attribute.labels.value |
El valor se toma directamente del campo. La clave se establece en "biometrics_status". |
target.details.country_code |
event.idm.entity.entity.asset.attribute.labels.value |
El valor se toma directamente del campo. La clave se establece en "country_code". |
target.details.extension |
event.idm.entity.entity.asset.attribute.labels.value |
El valor se toma directamente del campo. La clave se establece en "extension". |
target.details.manufacturer |
event.idm.entity.entity.asset.hardware.manufacturer |
El valor se toma directamente del campo. |
target.details.model |
event.idm.entity.entity.asset.hardware.model |
El valor se toma directamente del campo. |
target.details.number |
event.idm.entity.entity.user.phone_numbers |
El valor se toma directamente del campo. |
target.details.os |
event.idm.entity.entity.asset.software.name |
El valor se toma directamente del campo. |
target.details.os_version |
event.idm.entity.entity.asset.software.version |
El valor se toma directamente del campo. |
target.details.passcode_status |
event.idm.entity.entity.asset.attribute.labels.value |
El valor se toma directamente del campo. La clave se establece en "passcode_status". |
target.details.tampered_status |
event.idm.entity.entity.asset.attribute.labels.value |
El valor se toma directamente del campo. La clave se establece en "tampered_status". |
target.key |
event.idm.entity.entity.asset.asset_id |
El valor se toma directamente del campo. |
target.name |
event.idm.entity.entity.asset.attribute.labels.value |
El valor se toma directamente del campo. La clave se establece en "name". |
target.type |
event.idm.entity.entity.asset.attribute.labels.value |
El valor se toma directamente del campo. La clave se establece en "type". |
triage_event_uri |
event.idm.entity.entity.url |
El valor se toma directamente del campo. |
triaged_as_interesting |
event.idm.entity.entity.resource.attribute.labels.value |
El valor se toma directamente del campo. La clave se establece en "triaged_as_interesting". |
ts |
event.timestamp.seconds, event.idm.entity.metadata.collected_timestamp.seconds |
Si está presente, la marca de tiempo se analiza a partir de este campo con el formato ISO8601 o RFC 3339. Los segundos y nanosegundos extraídos se usan tanto para el campo timestamp de nivel superior como para el campo collected_timestamp. |
type |
event.idm.entity.entity.resource.attribute.labels.value |
El valor se toma directamente del campo. La clave se establece en "type". |
user_id |
event.idm.entity.metadata.product_entity_id |
El valor se toma directamente del campo. |
username |
event.idm.entity.entity.user.userid |
El valor se toma directamente del campo o es surfaced_auth.user.key si username está vacío. |
| (Lógica del analizador) | event.idm.entity.metadata.vendor_name |
Se codificó como "Duo". |
| (Lógica del analizador) | event.idm.entity.metadata.product_name |
Está codificado como "Contexto del usuario de Duo". |
| (Lógica del analizador) | event.idm.entity.metadata.entity_type |
Se determina en función de la presencia de otros campos. Si user_present es verdadero, se establece en "USER". Si asset_mid_present es verdadero, se establece en "ASSET". Si ip_present es verdadero, se establece en "IP_ADDRESS". Si resource_present es verdadero, se establece en "RESOURCE". De lo contrario, se establece como "UNKNOWN_ENTITYTYPE". |
| (Lógica del analizador) | event.idm.entity.relations.entity_type |
Se establece en "ASSET" si phones[0] no está vacío. |
| (Lógica del analizador) | event.idm.entity.relations.relationship |
Se establece en "OWNS" si phones[0] no está vacío. |
| (Lógica del analizador) | event.idm.entity.relations.entity.asset.type |
Se establece en "MOBILE" si phones[0] no está vacío. |
¿Necesitas más ayuda? Obtén respuestas de miembros de la comunidad y profesionales de Google SecOps.