Recoger registros de contexto de usuario de Duo
En este documento se explica cómo ingerir registros de contexto de usuario de Duo en Google Security Operations mediante una API. El analizador procesa los datos JSON, asigna la información del usuario (incluidos los nombres de usuario alternativos a las direcciones de correo electrónico, los grupos, los números de teléfono y los detalles del dispositivo) al UDM y registra el estado de la cuenta de usuario. También gestiona estructuras de datos anidadas y realiza varias transformaciones y combinaciones de datos para crear el evento de UDM final.
Antes de empezar
Asegúrate de que cumples los siguientes requisitos previos:
- Instancia de Google SecOps
- Acceso con privilegios al panel de administración de Duo
Configurar la aplicación de la API Admin y obtener las claves
- Inicia sesión en el panel de administración de Duo como administrador.
- En la barra lateral de la izquierda, haz clic en Aplicaciones > Gestionar aplicaciones.
- Pulsa el botón Añadir aplicación.
- En el campo de búsqueda, escribe API Admin y haz clic en Añadir junto a API Admin de Duo.
- En la siguiente pantalla, se muestra la siguiente información:
- Clave de integración: una cadena como
DIYYYYYYYYYYYYYY
. - Clave secreta: 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 asigna el valor Conceder lectura de recursos a Permisos.
- Haz clic en Guardar cambios.
Configurar feeds
- Ve a Configuración de SIEM > Feeds.
- Haz clic en + Añadir nuevo feed.
- En el campo Nombre del feed, introduce un nombre para el feed (por ejemplo,
Duo Users Logs
). - Seleccione API de terceros como Tipo de fuente.
- Seleccione el tipo de registro Contexto de usuario de Duo.
- Haz clic en Siguiente.
- Especifique valores para los siguientes parámetros de entrada:
- Nombre de usuario: introduce la clave de integración que has copiado antes.
- Secreto: introduce la clave secreta que has copiado antes.
- Nombre de host de la API: proporcione la URL del servidor de la API de Duo (por ejemplo,
api-abcd1234.duosecurity.com
). - Espacio de nombres de recursos: el espacio de nombres de recursos.
- Etiquetas de ingestión: la etiqueta aplicada a los eventos de este feed.
- Haz clic en Siguiente.
- Revise la configuración del feed en la pantalla Finalizar y, a continuación, haga 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 de surfaced_auth.access_device.browser si el primero está vacío. La clave es "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 de surfaced_auth.access_device.browser_version si el primero está vacío. La clave es "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 de 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 de 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 de 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 de 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 (sin distinguir entre mayúsculas y minúsculas) con "ios" o "mac", el campo UDM se define como "MAC". Si coincide con "windows", el campo UDM se define como "WINDOWS". Si coincide con "linux", el campo de UDM se define como "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 de 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 es "action_name". |
activity_id |
event.idm.entity.sec_result.detection_fields.value |
El valor se toma directamente del campo. La clave es "activity_id". |
actor.details.created |
event.idm.entity.entity.user.attribute.labels.value |
El valor se toma directamente del campo. La clave se define como "created". |
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 es "last_login". |
actor.details.status |
event.idm.entity.entity.user.attribute.labels.value |
El valor se toma directamente del campo. La clave se ha definido como "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 campo está vacío. |
actor.type |
event.idm.entity.entity.user.attribute.labels.value |
El valor se toma directamente del campo. La clave es "actor type". |
akey |
event.idm.entity.metadata.product_entity_id |
El valor se toma directamente del campo o 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 |
Se usa el valor mayor de collection_time.seconds y create_time.seconds tanto para collected_timestamp.seconds como para 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 tanto para collected_timestamp.nanos como para 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 de cada objeto de la matriz explanations se convierten en etiquetas. La clave de cada etiqueta va precedida de "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 ha definido como "from_common_netblock". |
from_new_user |
event.idm.entity.entity.resource.attribute.labels.value |
El valor se toma directamente del campo. La clave es "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 es "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 es "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 es "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 es "status". El valor también se usa para determinar el user_authentication_status . "active" y "bypass" se corresponden con "ACTIVE", "disabled" y "pending deletion" se corresponden con "SUSPENDED", y "locked out" se corresponde con "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 define como "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 es "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 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 es "biometrics_status". |
target.details.country_code |
event.idm.entity.entity.asset.attribute.labels.value |
El valor se toma directamente del campo. La clave es "country_code". |
target.details.extension |
event.idm.entity.entity.asset.attribute.labels.value |
El valor se toma directamente del campo. La clave es "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 es "passcode_status". |
target.details.tampered_status |
event.idm.entity.entity.asset.attribute.labels.value |
El valor se toma directamente del campo. La clave es "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 es "name". |
target.type |
event.idm.entity.entity.asset.attribute.labels.value |
El valor se toma directamente del campo. La clave es "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 es "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 tanto para timestamp de nivel superior como para collected_timestamp . |
type |
event.idm.entity.entity.resource.attribute.labels.value |
El valor se toma directamente del campo. La clave es "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 surfaced_auth.user.key si username está vacío. |
(Lógica del analizador) | event.idm.entity.metadata.vendor_name |
Codificado como "Duo". |
(Lógica del analizador) | event.idm.entity.metadata.product_name |
Codificado como "Contexto de 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 true, se le asigna el valor "USER". Si asset_mid_present es true, se le asigna el valor "ASSET". Si ip_present es true, se le asigna el valor "IP_ADDRESS". Si resource_present es true, se le asigna el valor "RESOURCE". De lo contrario, se le asigna el valor "UNKNOWN_ENTITYTYPE". |
(Lógica del analizador) | event.idm.entity.relations.entity_type |
Se asigna el valor "ASSET" si phones[0] no está vacío. |
(Lógica del analizador) | event.idm.entity.relations.relationship |
Asigna el valor "OWNS" si phones[0] no está vacío. |
(Lógica del analizador) | event.idm.entity.relations.entity.asset.type |
Se define como "MOBILE" si phones[0] no está vacío. |
¿Necesitas más ayuda? Recibe respuestas de los miembros de la comunidad y de los profesionales de Google SecOps.