Recopila registros de contexto de usuarios de Duo
Versión del analizador: 1.0
En este documento, se explica cómo transferir registros de contexto de usuarios de Duo a Google Security Operations 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 de usuario. También controla las estructuras de datos anidadas y realiza varias transformaciones y combinaciones de datos para crear el evento de UDM final.
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 Agregar aplicación.
- En el campo de búsqueda, escribe API de Admin y haz clic en Agregar junto a API de Duo Admin.
- 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 recurso de lectura.
- Haz clic en Guardar cambios.
Configura feeds
- Ve a Configuración > Administración de datos > Feeds. Si estás en una plataforma solo de SIEM, ve a Configuración > 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 Tipo de fuente.
- Selecciona el tipo de registro Duo User Context.
- 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.
- Secreto: 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 transferencia: 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 surfaced_auth.access_device.os si el primero está vacío. Si el valor coincide (no distingue 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 en "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 de 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 de 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 de 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 se antepone con "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 la asignación al campo de 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 |
La marca de tiempo se analiza a partir de este campo, si está presente, con el formato ISO8601 o RFC 3339. Los segundos y nanosegundos extraídos se usan para el timestamp de nivel superior y el 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 de surfaced_auth.user.key si username está vacío. |
| (Lógica del analizador) | event.idm.entity.metadata.vendor_name |
Está codificado como "Duo". |
| (Lógica del analizador) | event.idm.entity.metadata.product_name |
Está codificado como "Duo User Context". |
| (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 en "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. |
Registro de cambios
Consulta el registro de cambios de este analizador
¿Necesitas más ayuda? Obtén respuestas de miembros de la comunidad y profesionales de Google SecOps.