Recopila registros de Okta
En este documento, se explica cómo transferir registros de Okta a Google Security Operations con la API de Okta. El analizador extrae registros del sistema y controla eventos individuales y por lotes dentro de un array JSON. Normaliza los datos en el formato UDM, asigna campos de Okta a equivalentes de UDM, enriquece los datos con agentes de usuario analizados, información geográfica y detalles de autenticación, y genera eventos de resultados de seguridad en función de los resultados y la información de riesgo.
Antes de comenzar
- Asegúrate de tener una instancia de Google SecOps.
- Asegúrate de tener acceso con privilegios a Okta.
Configura Okta
Para configurar el SSO de Okta, completa las siguientes tareas:
Crea un usuario administrador de Okta con privilegios de solo lectura
- Accede a la consola de administración de Okta.
Crea un usuario estándar.
- Ve a Directorio > Personas.
- Haz clic en Agregar a una persona y completa los campos obligatorios.
Selecciona Seguridad > Administradores.
Haz clic en Agregar administrador.
En el campo Asignación de administrador por administrador, busca el usuario estándar.
En la sección roles, selecciona Administrador de solo lectura en la lista.
Sal de la cuenta de administrador.
Obtén una clave de API
- Accede a la Consola del administrador de Okta con el usuario administrador de solo lectura.
- Ve a Seguridad > API > Tokens.
- Haz clic en Create Token.
- Proporciona un nombre significativo para el token.
- Proporciona la zona de IP en la que se usará la API (puedes seleccionar cualquier IP si no lo sabes).
- Haz clic en Create Token.
- Copie la clave de API.
- Haz clic en Entendido.
Configura un feed en Google SecOps para transferir registros de Okta
- Ve a Configuración de SIEM > Feeds.
- Haz clic en Agregar nueva.
- En el campo Nombre del feed, ingresa un nombre para el feed (por ejemplo, Registros de Okta).
- Selecciona API de terceros como el Tipo de origen.
- Selecciona Okta como el Tipo de registro.
- Haz clic en Siguiente.
- Especifica valores para los siguientes parámetros de entrada:
- Encabezado HTTP de autenticación: Ingresa la clave de API de Okta en el siguiente formato:
Authorization:<API_KEY>
. - Nombre de host de la API: Especifica el nombre de dominio de tu host de Okta (por ejemplo,
<your-domain>.okta.com
). - Espacio de nombres de recursos: Es el espacio de nombres de recursos.
- Etiquetas de transferencia: Es la etiqueta que se aplica a los eventos de este feed.
- Encabezado HTTP de autenticación: Ingresa la clave de API de Okta en el siguiente formato:
- 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 |
---|---|---|
actor.alternateId |
principal.user.email_addresses |
Se extrae de actor.alternateId si es una dirección de correo electrónico. Si no es una dirección de correo electrónico, se usa como principal.user.userid . |
actor.displayName |
principal.user.user_display_name |
Se asignan directamente. |
actor.id |
principal.user.product_object_id |
Se asignan directamente. |
actor.type |
principal.user.attribute.roles.name |
Se asignan directamente. |
authenticationContext.authenticationProvider |
security_result.detection_fields.value |
Se asignan directamente, con la clave authenticationProvider . |
authenticationContext.credentialProvider |
security_result.detection_fields.value |
Se asignan directamente, con la clave credentialProvider . |
authenticationContext.credentialType |
extensions.auth.mechanism |
Se usa para derivar el mecanismo de autenticación (OTP, USERNAME_PASSWORD, LOCAL). |
authenticationContext.externalSessionId |
network.parent_session_id |
Se asignan directamente. |
client.device |
principal.asset.type /additional.fields.value.string_value |
Se asigna a principal.asset.type (WORKSTATION, MOBILE, ROLE_UNSPECIFIED) según el valor. También se asigna como valor de cadena con la clave device en additional.fields . |
client.geographicalContext.city |
principal.location.city |
Se asignan directamente. |
client.geographicalContext.country |
principal.location.country_or_region |
Se asignan directamente. |
client.geographicalContext.geolocation.lat |
principal.location.region_latitude |
Se asignan directamente. |
client.geographicalContext.geolocation.lon |
principal.location.region_longitude |
Se asignan directamente. |
client.geographicalContext.postalCode |
additional.fields.value.string_value |
Se asigna directamente como valor de cadena con la clave Postal code en additional.fields . |
client.geographicalContext.state |
principal.location.state |
Se asignan directamente. |
client.ipAddress |
principal.ip , principal.asset.ip |
Se asignan directamente. |
client.userAgent.browser |
target.resource.attribute.labels.value |
Se asignan directamente, con la clave Browser . |
client.userAgent.os |
principal.platform |
Se asignan a la plataforma (LINUX, WINDOWS, MAC) según el valor. |
client.userAgent.rawUserAgent |
network.http.user_agent , network.http.parsed_user_agent |
Se asignan y analizan directamente. |
client.zone |
additional.fields.value.string_value |
Se asigna directamente como valor de cadena con la clave zone en additional.fields . |
debugContext.debugData.behaviors |
security_result.description , security_result.detection_fields |
Se asignan directamente a la descripción. Los comportamientos individuales se extraen y se agregan como campos de detección. |
debugContext.debugData.changedAttributes |
security_result.detection_fields.value |
Se asignan directamente, con la clave changedAttributes . |
debugContext.debugData.clientAddress |
principal.ip , principal.asset.ip |
Se asigna directamente si faltan request.ipChain y client.ipAddress . |
debugContext.debugData.deviceFingerprint |
target.asset.asset_id |
Se asignan directamente y tienen el prefijo device_finger_print: . |
debugContext.debugData.dtHash |
security_result.detection_fields.value |
Se asignan directamente, con la clave dtHash . |
debugContext.debugData.factor |
security_result.detection_fields.value |
Se asignan directamente, con la clave factor . |
debugContext.debugData.factorIntent |
security_result.detection_fields.value |
Se asignan directamente, con la clave factorIntent . |
debugContext.debugData.logOnlySecurityData.risk.reasons |
security_result.detection_fields.value |
Se asignan directamente, con la clave Risk Reasons . |
debugContext.debugData.privilegeGranted |
target.user.attribute.roles |
Se dividieron en privilegios individuales y se agregaron como roles con nombre y descripción. |
debugContext.debugData.pushOnlyResponseType |
security_result.detection_fields.value |
Se asignan directamente, con la clave pushOnlyResponseType . |
debugContext.debugData.pushWithNumberChallengeResponseType |
security_result.detection_fields.value |
Se asignan directamente, con la clave pushWithNumberChallengeResponseType . |
debugContext.debugData.requestUri |
extensions.auth.auth_details |
Se asignan directamente. |
debugContext.debugData.suspiciousActivityEventId |
security_result.detection_fields.value |
Se asignan directamente, con la clave suspiciousActivityEventId . |
debugContext.debugData.suspiciousActivityEventType |
security_result.detection_fields.value |
Se asignan directamente, con la clave suspiciousActivityEventType . |
debugContext.debugData.threatDetections |
security_result.detection_fields.value |
Se asignan directamente, con la clave threatDetections . |
debugContext.debugData.threatSuspected |
security_result.detection_fields.value , security_result.threat_status |
Se asigna como un campo de detección con la clave threatSuspected . Se usa para obtener el estado de amenaza (ACTIVE o FALSE_POSITIVE). |
debugContext.debugData.url |
target.url |
Se asignan directamente. |
displayMessage |
security_result.summary |
Se asignan directamente. |
eventType |
metadata.product_event_type , metadata.event_type |
Se asignan directamente a product_event_type . Se usa para derivar event_type (USER_LOGIN, USER_LOGOUT, USER_CHANGE_PASSWORD, USER_CHANGE_PERMISSIONS, USER_DELETION, GROUP_MODIFICATION, SETTING_MODIFICATION, SCHEDULED_TASK_ENABLE, RESOURCE_CREATION, USER_UNCATEGORIZED). |
legacyEventType |
security_result.detection_fields.value |
Se asignan directamente, con la clave legacyEventType . |
outcome.reason |
security_result.category_details |
Se asignan directamente. |
outcome.result |
security_result.action |
Se asignan a una acción (ALLOW, CHALLENGE, BLOCK) según el valor. |
published |
metadata.event_timestamp |
Se analizó en una marca de tiempo. |
request.ipChain.n.geographicalContext |
intermediary.location |
Es el contexto geográfico de las IP intermediarias en la cadena de solicitudes. |
request.ipChain.n.ip |
intermediary.ip |
Direcciones IP de los intermediarios en la cadena de solicitudes |
securityContext.asNumber |
security_result.detection_fields.value |
Se asignan directamente, con la clave asNumber . |
securityContext.asOrg |
security_result.detection_fields.value |
Se asignan directamente, con la clave asOrg . |
securityContext.domain |
security_result.detection_fields.value |
Se asignan directamente, con la clave domain . |
securityContext.isp |
security_result.detection_fields.value |
Se asignan directamente, con la clave isp . |
securityContext.isProxy |
security_result.detection_fields.value |
Se asignan directamente, con la clave anonymized IP . |
target.n.alternateId |
target.user.email_addresses /target.user.userid |
Si es una dirección de correo electrónico, se asigna a target.user.email_addresses . Si no es una dirección de correo electrónico, se usa como target.user.userid . |
target.n.detailEntry.clientAppId |
target.asset_id |
Se asignan directamente y tienen el prefijo Client_app_id: . |
target.n.detailEntry.methodTypeUsed |
target.resource_ancestors.attribute.labels.value |
Se asigna directamente, con la clave methodTypeUsed cuando el tipo de destino es AuthenticatorEnrollment. |
target.n.detailEntry.methodUsedVerifiedProperties |
target.resource_ancestors.attribute.labels.value |
Se asigna directamente, con la clave methodUsedVerifiedProperties cuando el tipo de destino es AuthenticatorEnrollment. |
target.n.detailEntry.policyType |
target.resource_ancestors.attribute.labels.value |
Se asignan directamente, con la clave Policy Type . |
target.n.detailEntry.signOnModeType |
security_result.detection_fields.value |
Se asignan directamente, con la clave signOnModeType . |
target.n.displayName |
target.user.user_display_name / target.application / target.resource.name |
Se asignan según el tipo de objetivo. |
target.n.id |
target.user.product_object_id / target.resource.product_object_id / target.resource_ancestors.product_object_id |
Se asignan según el tipo de objetivo. |
target.n.type |
target.user.attribute.roles.name / target.resource.resource_subtype / target.resource_ancestors.resource_subtype |
Se asignan según el tipo de objetivo. |
transaction.id |
network.session_id |
Se asignan directamente. |
transaction.type |
additional.fields.value.string_value |
Se asigna directamente como valor de cadena con la clave type en additional.fields . |
uuid |
metadata.product_log_id |
Se asignan directamente. |
N/A | metadata.vendor_name |
Se define en Okta . |
N/A | metadata.product_name |
Se define en Okta . |
N/A | extensions.auth.type |
Se define en SSO . |
N/A | is_alert |
Se establece como verdadero para los eventos security.threat.detected y user.account.report_suspicious_activity_by_enduser . |
N/A | is_significant |
Se establece como verdadero para los eventos security.threat.detected y user.account.report_suspicious_activity_by_enduser . |
Cambios
16 de mayo de 2024
- Si
is_alert
es verdadero yis_significant
es verdadero, establecesecurity_result.alert_state
comoALERTING
.
2024-03-05
- Se actualizó el campo
security_result.action
para reflejar si se permitió o bloqueó el tráfico.
2024-02-16
Corrección de errores:
- Cuando
target.0.type
esUser
oAppUser
, se asignatarget.0.alternateId
atarget.user.userid
. - Cuando
target.1.type
esUser
oAppUser
, se asignatarget.1.alternateId
atarget.user.userid
.
2023-12-14
- Se asignó
securityContext.asNumber
asecurity_result.detection_fields
. - Se asignó
legacyEventType
asecurity_result.detection_fields
. - Se agregó
conditional_check
antes de configurarmetadata.event_type
.
2023-06-28
- Se asignó el valor completo de
debugContext.debugData.suspiciousActivityEventType
asecurity_result.detection_fields
. - Se asignó el valor completo de
debugContext.debugData.logOnlySecurityData.behaviors.New Device
asecurity_result.detection_fields
.
2023-06-09
- El campo
debugContext.debugData.deviceFingerprint
se asigna atarget.asset.asset_id
. - Se asignó el valor completo de
debugContext.debugData.risk.reasons
asecurity_result.detection_fields
.
2023-05-17
- El campo "authenticationContext.externalSessionId" se asigna a "network.parent_session_id".
- El campo "debugContext.debugData.pushOnlyResponseType" se asigna a "security_result.detection_fields.key/value".
- El campo "debugContext.debugData.factor" se asigna a "security_result.detection_fields.key/value".
- El campo "debugContext.debugData.factorIntent" se asigna a "security_result.detection_fields.key/value".
- El campo "debugContext.debugData.pushWithNumberChallengeResponseType" se asigna a "security_result.detection_fields.key/value".
- El campo "debugContext.debugData.dtHash" se asigna a "security_result.detection_fields.key/value".
- El campo "client.userAgent.rawUserAgent" se asigna a "network.http.user_agent".
- Se cambió la asignación de "ALLOW_WITH_MODIFICATION" al valor de enumeración "CHALLENGE" en "security_result.action".
- Para el eventType "system.api_token.create", se cambió metadata.event_type de "USER_UNCATEGORIZED" a "RESOURCE_CREATION".
2023-04-28
Corrección de errores:
- Se modificó la asignación de
security_result.threat_status
aACTIVE
cuandodebugContext.debugData.threatSuspected
estrue
, de lo contrario, se asigna aFALSE_POSITIVE
.
24-3-2023
- Se asignaron campos
logOnlySecurityData
asecurity_result.detection_fields
. - Además, se resolvió el error de análisis agregando
DEFERRED
a la lista de acciones.
2023-04-11
- Se volvieron a asignar los campos que se asignaron a
http.user_agent
ahttp.parsed_user_agent
. - Se asignó
target.displayName
atarget.resource_ancestors.name
. - Se asignó
targetfield.detailEntry.methodTypeUsed
atarget.resource_ancestors.attribute.labels
. - Se asignó
targetfield.detailEntry.methodUsedVerifiedProperties
atarget.resource_ancestors.attribute.labels
.
2023-02-20
- Se cambió
metadata.event_type
deUSER_LOGIN
aSTATUS_UPDATE
, dondeeventType
esuser.authentication.auth_via_AD_agent
2022-12-14
- Se asignó
debugContext.debugData.changedAttributes
asecurity_result.detection_fields
. - Se agregó la verificación de nulos para
detail.actor.alternateId
.
2022-11-17
- El campo
target[n].alternateId
se asigna atarget.resource.attribute.labels
. - El campo
detail.target.0.alternateId
se asigna atarget.resource.attribute.labels
.
2022-11-08
Corrección de errores:
- Se agregó una condición para realizar una verificación de correo electrónico adecuada en el campo
user_email
. - Se agregó la comprobación de que el campo
Action1
no esté enRATE_LIMIT
. - Se agregó una verificación nula y desconocida para
actor.displayName
.
2022-11-04
- Se agregó compatibilidad con registros que tienen varios eventos.
2022-10-15
signOnModeType
se asignó asecurity_result.detection_fields
.authenticationProvider
se asignó asecurity_result.detection_fields
.credentialProvider
se asignó asecurity_result.detection_fields
.device
se asignó aadditional.fields
.zone
se asignó aadditional.fields
.type
se asignó aadditional.fields
.
2022-10-14
Corrección de errores:
- Se agregó la verificación condicional para "principal.user.email_addresses" y "target.user.email_addresses".
- Se agregó grok para verificar si hay una ip_address válida para el campo "request.ipChain.0.ip" asignado a "principal.ip".
- Se agregó la condición on_error para el campo "debugContext.debugData.url" asignado a "target.url".
2022-10-03
- Se asignó
client.userAgent.os
aprincipal.platform
. - Se asignó
client.device
aprincipal.asset.type
. - Se asignó
anonymized IP
(cadena codificada) a security_result.detection_fields.key, donde el valor de "securityContext.isProxy" es security_result.detection_fields.value correspondiente.
2022-09-16
- "securityContext.asOrg" se asignó a "security_result.category_details".
- "securityContext.isProxy" se asignó a "security_result.detection_fields".
- "securityContext.domain" asignado a "security_result.detection_fields".
- "securityContext.isp" se asignó a "security_result.detection_fields".
- "debugContext.debugData.risk.level" se asignó a "security_result.severity".
- 'debugContext.debugData.risk.reasons' se asignó a 'security_result.detection_fields'.
2022-08-12
- Los registros recién transferidos se analizaron y se asignaron a los siguientes campos:
- "detail.uuid" se asignó a "metadata.product_log_id".
- 'detail.eventType' asignado a 'metadata.product_event_type'
- "detail.actor.id" asignado a "principal.user.product_object_id".
- if 'detail.actor.alternateId' mapped to 'principal.user.userid' else
- "detail.actor.alternateId" asignado a "principal.user.email_addresses".
- "detail.actor.displayName" asignado a "principal.user.user_display_name".
- "detail.actor.type" asignado a ".principal.user.attribute.roles"
- 'detail.client.ipChain.0.ip' asignado a 'principal.ip'
- 'detail.client.ipChain.0.geographicalContext.state' asignado a 'principal.location.state'.
- 'detail.client.ipChain.0.geographicalContext.city' asignado a 'principal.location.city'.
- "detail.client.ipChain.0.geographicalContext.country" asignado a "principal.location.country_or_region"
- "detail.debugContext.debugData.requestUri" asignado a "target.url".
- "detail.target.0.type" asignado a "target.resource.resource_subtype"
- 'detail.target.0.id' asignado a 'target.resource.resource.product_object_id'.
- "detail.target.0.displayName" asignado a "target.resource.resource_subtype".
- "detail.target.0.detailEntry.policyType" asignado a "target.resource_ancestors.attribute.labels".
- "detail.outcome.reason" se asignó a "security_result.category_details".
- "detail.debugContext.debugData.threatSuspected" se asignó a "security_result.detection_fields".
- "detail.displayMessage" se asignó a "security_result.summary".
- "detail.outcome.result" se asignó a "security_result.action".
- "detail.severity" se asignó a "security_result.severity".
- 'detail.transaction.id' asignado a 'network.session_id'
- 'detail.debugContext.debugData.requestUri' se asignó a 'extensions.auth.auth_details'.
2022-07-08
- Se modificó la asignación de
actor.type
deprincipal.user.role_name
aprincipal.user.attribute.roles
. - Se modificó la asignación de
target.0.type
detarget.user.role_name
atarget.user.attribute.roles
. - Se modificó la asignación de
target.1.type
detarget.user.role_name
atarget.user.attribute.roles
.
2022-06-15
Mejora:
- para
target.0.type
==Token
. - Se asignó
target.0.detailEntry.clientAppId
atarget.asset_id
. - Se agregó una verificación condicional para el campo "transaction.id" asignado al campo "network.session_id" de la AUA.
2022-06-03
Mejora:
- Se asignó debugContext.debugData.privilegeGranted a target.user.attribute.roles.name además.
- Se asignó debugContext.debugData.requestUri a extensions.auth.auth_details.
- Se asignaron debugContext.debugData.suspiciousActivityEventId, debugContext.debugData.threatDetections y debugContext.debugData.threatSuspected a security_result.detection_fields.
2022-03-22
Mejora:
- debugContext.debugData.behaviors asignado a security_result.description.
- debugContext.debugData.threatSuspected se asigna a security_result.threat_status.
- debugContext.debugData.risk se asignó a security_result.severity.
¿Necesitas más ayuda? Obtén respuestas de miembros de la comunidad y profesionales de Google SecOps.