Recopila registros del contexto del usuario de Okta
En este documento, se explica cómo recopilar registros de contexto del usuario de Okta configurando un feed de Google Security Operations con la API de terceros.
Antes de comenzar
Asegúrate de cumplir con los siguientes requisitos previos:
- Una instancia de Google SecOps
- Acceso con privilegios al arrendatario de Okta o a la Consola del administrador
- Privilegios de creación de tokens de API en Okta
Configura la lista de IP permitidas
Antes de crear el feed, debes incluir los rangos de IP de Google SecOps en la lista de entidades permitidas de la configuración de red o firewall de Okta.
Obtén los rangos de IP de Google SecOps
- Recupera los rangos de IP del archivo JSON de rangos de direcciones IP de Google.
Agrega rangos de IP al contexto del usuario de Okta
- Accede a la Consola del administrador de Okta.
- Ve a Seguridad > Redes.
- En Restricciones de dirección IP, haz clic en Editar.
- Agrega cada rango de IP de Google SecOps en notación CIDR a las direcciones IP de confianza.
- Haz clic en Guardar.
Configura el acceso a la API de User Context de Okta
Para permitir que Google SecOps extraiga datos de contexto del usuario, debes crear un token de API con permisos de lectura.
Crea un token de API
- Accede a la Consola del administrador de Okta.
- Ve a Seguridad > API.
- Selecciona la pestaña Tokens.
- Haz clic en Create Token.
- Proporciona los siguientes detalles de configuración:
- Nombre: Ingresa un nombre descriptivo (por ejemplo,
Google SecOps Integration). - Descripción (opcional): Ingresa una descripción.
- Nombre: Ingresa un nombre descriptivo (por ejemplo,
- Haz clic en Create Token.
Registra las credenciales de la API
Después de crear el token de API, recibirás la siguiente credencial:
- Token de API: Es el valor de tu token de API (por ejemplo,
00QCGr-1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1).
Permisos de API necesarios
El token de API requiere los siguientes permisos en Okta:
| Permiso o rol | Nivel de acceso | Objetivo |
|---|---|---|
| Administrador de solo lectura | Leer | Accede a los datos del perfil del usuario |
| Administrador avanzado | Leer | Acceso completo a todos los datos del usuario |
Configura feeds
Para configurar un feed, sigue estos pasos:
- Ve a Configuración de SIEM > Feeds.
- Haz clic en Agregar feed nuevo.
- En la siguiente página, haz clic en Configurar un solo feed.
- En el campo Nombre del feed, ingresa un nombre para el feed (por ejemplo,
Okta User Context). - Selecciona API de terceros como el Tipo de origen.
- Selecciona Contexto del usuario de 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 las credenciales de autenticación en el siguiente formato:
Authorization:SSWS your-api-token- Por ejemplo:
Authorization:SSWS 00QCGr-1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1
- Por ejemplo:
Nombre de host de la API: Es el nombre de dominio completamente calificado de tu instancia de Okta (p.ej., example.okta.com, no cualquier dominio personalizado que se pueda configurar).
- Por ejemplo:
company.okta.com
- Por ejemplo:
Campo de referencia del ID del administrador: Es el ID que se requiere cuando usas un ID que no es de Okta para hacer referencia a los administradores (opcional).
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.
Después de la configuración, el feed comienza a recuperar registros de la instancia de Okta User Context en orden cronológico.
Extremos regionales
Okta usa diferentes extremos de API según la región de tu organización:
| Región | URL base o nombre de host |
|---|---|
| EE.UU. (predeterminado) | {org-name}.okta.com |
| UE (EMEA) | {org-name}.okta-emea.com |
| APAC | {org-name}.okta.com.au |
| Versión preliminar (pruebas) | {org-name}.oktapreview.com |
Usa el nombre de host que corresponde a la región de tu instancia de Okta.
Límites de frecuencia de la API
La API de Okta tiene los siguientes límites de frecuencia:
- Límite de frecuencia predeterminado: 600 solicitudes por minuto para la mayoría de los extremos
- API de System Log: 60 solicitudes por minuto
- Extremos de usuario: 600 solicitudes por minuto
Google SecOps controla automáticamente la límite de frecuencia con retirada exponencial. Si tienes problemas, comunícate con el equipo de asistencia de Okta para aumentar los límites de la API.
Tabla de asignación de UDM
| Campo de registro | Asignación de UDM | Lógica |
|---|---|---|
activated |
event.idm.entity.entity.labels |
Si activated existe, su valor se agrega como un par clave-valor con la clave "activated". |
created |
event.idm.entity.entity.labels |
Si created existe, su valor se agrega como un par clave-valor con la clave "created". |
profile.costCenter |
event.idm.entity.entity.labels |
Si existe profile.costCenter, su valor se agrega como un par clave-valor con la clave "costCenter". |
profile.Function |
event.idm.entity.entity.labels |
Si existe profile.Function, su valor se agrega como un par clave-valor con la clave "Function". |
statusChanged |
event.idm.entity.entity.labels |
Si statusChanged existe, su valor se agrega como un par clave-valor con la clave "statusChanged". |
type.id |
event.idm.entity.entity.labels |
Si type.id existe, su valor se agrega como un par clave-valor con la clave "type_id". |
profile.location |
event.idm.entity.entity.location.name |
Valor tomado de profile.location. |
profile.AD_ObjectGUID |
event.idm.entity.entity.user.attribute.labels |
Si existe profile.AD_ObjectGUID, su valor se agrega como un par clave-valor con la clave "AD_ObjectGUID". |
profile.ADpwdLastSet |
event.idm.entity.entity.user.attribute.labels |
Si existe profile.ADpwdLastSet, su valor se agrega como un par clave-valor con la clave "ADpwdLastSet". |
profile.AFF_Code |
event.idm.entity.entity.user.attribute.labels |
Si existe profile.AFF_Code, su valor se agrega como un par clave-valor con la clave "AFF_Code". |
profile.Desk_Location_WD |
event.idm.entity.entity.user.attribute.labels |
Si profile.Desk_Location_WD existe, su valor se agrega como un par clave-valor con la clave "Desk_Location_WD". |
profile.Mailing_Address_WD |
event.idm.entity.entity.user.attribute.labels |
Si profile.Mailing_Address_WD existe, su valor se agrega como un par clave-valor con la clave "Mailing_Address_WD". |
profile.Manager_UPN |
event.idm.entity.entity.user.attribute.labels |
Si profile.Manager_UPN existe, su valor se agrega como un par clave-valor con la clave "Manager_UPN". |
profile.PRIVATE_CONF_Profile |
event.idm.entity.entity.user.attribute.labels |
Si profile.PRIVATE_CONF_Profile existe, su valor se agrega como un par clave-valor con la clave "PRIVATE_CONF_Profile". |
profile.Region_WD |
event.idm.entity.entity.user.attribute.labels |
Si profile.Region_WD existe, su valor se agrega como un par clave-valor con la clave "Region_WD". |
profile.Subsidiary_Company |
event.idm.entity.entity.user.attribute.labels |
Si profile.Subsidiary_Company existe, su valor se agrega como un par clave-valor con la clave "Subsidiary_Company". |
profile.Telephone_Work |
event.idm.entity.entity.user.attribute.labels |
Si profile.Telephone_Work existe, su valor se agrega como un par clave-valor con la clave "Telephone_Work". |
profile.Temp_WD_Primary_Email |
event.idm.entity.entity.user.attribute.labels |
Si profile.Temp_WD_Primary_Email existe, su valor se agrega como un par clave-valor con la clave "Temp_WD_Primary_Email". |
profile.VMware_WS1_Username |
event.idm.entity.entity.user.attribute.labels |
Si profile.VMware_WS1_Username existe, su valor se agrega como un par clave-valor con la clave "VMware_WS1_Username". |
profile.Work_Street_Address_WD |
event.idm.entity.entity.user.attribute.labels |
Si existe profile.Work_Street_Address_WD, su valor se agrega como un par clave-valor con la clave "Work_Street_Address_WD". |
profile.Workato_WD_Primary_Email |
event.idm.entity.entity.user.attribute.labels |
Si profile.Workato_WD_Primary_Email existe, su valor se agrega como un par clave-valor con la clave "Workato_WD_Primary_Email". |
profile.Workday_ID |
event.idm.entity.entity.user.attribute.labels |
Si profile.Workday_ID existe, su valor se agrega como un par clave-valor con la clave "Workday_ID". |
profile.Worker_Type_WD |
event.idm.entity.entity.user.attribute.labels |
Si profile.Worker_Type_WD existe, su valor se agrega como un par clave-valor con la clave "Worker_Type_WD". |
profile.businessUnit |
event.idm.entity.entity.user.attribute.labels |
Si existe profile.businessUnit, su valor se agrega como un par clave-valor con la clave "businessUnit". |
profile.companyName |
event.idm.entity.entity.user.attribute.labels |
Si profile.companyName existe, su valor se agrega como un par clave-valor con la clave "companyName". |
profile.contingentSupplierName |
event.idm.entity.entity.user.attribute.labels |
Si existe profile.contingentSupplierName, su valor se agrega como un par clave-valor con la clave "contingentSupplierName". |
profile.conversationId |
event.idm.entity.entity.user.attribute.labels |
Si existe profile.conversationId, su valor se agrega como un par clave-valor con la clave "conversationId". |
profile.distinguishedName |
event.idm.entity.entity.user.attribute.labels |
Si existe profile.distinguishedName, su valor se agrega como un par clave-valor con la clave "distinguishedName". |
profile.division |
event.idm.entity.entity.user.attribute.labels |
Si existe profile.division, su valor se agrega como un par clave-valor con la clave "division". |
profile.emailPrefix |
event.idm.entity.entity.user.attribute.labels |
Si profile.emailPrefix existe, su valor se agrega como un par clave-valor con la clave "emailPrefix". |
profile.employeeType |
event.idm.entity.entity.user.attribute.labels |
Si existe profile.employeeType, su valor se agrega como un par clave-valor con la clave "employeeType". |
profile.homePostalAddress |
event.idm.entity.entity.user.attribute.labels |
Si profile.homePostalAddress existe, su valor se agrega como un par clave-valor con la clave "homePostalAddress". |
profile.isManager |
event.idm.entity.entity.user.attribute.labels |
Si existe profile.isManager, su valor se agrega como un par clave-valor con la clave "isManager". |
lastLogin |
event.idm.entity.entity.user.attribute.labels |
Si lastLogin existe, su valor se agrega como un par clave-valor con la clave "lastLogin". |
profile.leaveOfAbsence |
event.idm.entity.entity.user.attribute.labels |
Si existe profile.leaveOfAbsence, su valor se agrega como un par clave-valor con la clave "leaveOfAbsence". |
profile.managerDn |
event.idm.entity.entity.user.attribute.labels |
Si existe profile.managerDn, su valor se agrega como un par clave-valor con la clave "managerDn". |
profile.payGroup |
event.idm.entity.entity.user.attribute.labels |
Si profile.payGroup existe, su valor se agrega como un par clave-valor con la clave "payGroup". |
profile.wdemployeeID |
event.idm.entity.entity.user.attribute.labels |
Si profile.wdemployeeID existe, su valor se agrega como un par clave-valor con la clave "wdemployeeID". |
profile.zipCode |
event.idm.entity.entity.user.attribute.labels |
Si existe profile.zipCode, su valor se agrega como un par clave-valor con la clave "zipCode". |
profile.userType |
event.idm.entity.entity.user.attribute.roles |
Si existe profile.userType, su valor se agrega a un array de roles. |
profile.organization, profile.company |
event.idm.entity.entity.user.company_name |
Valor tomado de profile.organization o profile.company si el primero no está presente. |
profile.department |
event.idm.entity.entity.user.department |
Valor tomado de profile.department. |
profile.email, profile.secondEmail, profile.login |
event.idm.entity.entity.user.email_addresses |
Los valores de profile.email, profile.secondEmail y profile.login (si es un correo electrónico y no un duplicado) se combinan en este campo. |
profile.employeeNumber |
event.idm.entity.entity.user.employee_id |
Valor tomado de profile.employeeNumber. |
profile.firstName, profile.Preferred_First_Name |
event.idm.entity.entity.user.first_name |
Valor tomado de profile.firstName o profile.Preferred_First_Name si el primero no está presente. |
profile.EmployeeWorkGroup |
event.idm.entity.entity.user.group_identifiers |
Valor tomado de profile.EmployeeWorkGroup. |
profile.HireDate, profile.hiredate |
event.idm.entity.entity.user.hire_date |
El valor se analiza a partir de profile.HireDate o profile.hiredate si el primero no está presente. |
profile.lastName, profile.preferred_Last_Name |
event.idm.entity.entity.user.last_name |
Valor tomado de profile.lastName si existe profile.lastName o profile.preferred_Last_Name. |
lastLogin |
event.idm.entity.entity.user.last_login_time |
El valor se analiza a partir de lastLogin. |
passwordChanged |
event.idm.entity.entity.user.last_password_change_time |
El valor se analiza a partir de passwordChanged. |
profile.manager, profile.managerEmail, profile.managerId |
event.idm.entity.entity.user.managers |
Se completa con un objeto que contiene user_display_name de profile.manager, email_addresses de profile.managerEmail y employee_id de profile.managerId. |
profile.city, profile.firstBaseCity |
event.idm.entity.entity.user.office_address.city |
Valor tomado de profile.city o profile.firstBaseCity si el primero no está presente. |
profile.countryCode, profile.country |
event.idm.entity.entity.user.office_address.country_or_region |
Valor tomado de profile.countryCode o profile.country si el primero no está presente. |
profile.streetAddress |
event.idm.entity.entity.user.personal_address.name |
Valor tomado de profile.streetAddress. |
profile.state |
event.idm.entity.entity.user.personal_address.state |
Valor tomado de profile.state. |
profile.primaryPhone, profile.mobilePhone, profile.mobile |
event.idm.entity.entity.user.phone_numbers |
Los valores de profile.primaryPhone, profile.mobilePhone y profile.mobile se combinan en este campo. |
profile.terminationDate, profile.terminationdate |
event.idm.entity.entity.user.termination_date |
El valor se analiza a partir de profile.terminationDate o profile.terminationdate si el primero no está presente. |
profile.title |
event.idm.entity.entity.user.title |
Valor tomado de profile.title. |
status |
event.idm.entity.entity.user.user_authentication_status |
Se asigna desde status: ACTIVE/RECOVERY/LOCKED_OUT/PASSWORD_EXPIRED -> ACTIVE; SUSPENDED -> SUSPENDED; DEPROVISIONED -> DELETED; de lo contrario, UNKNOWN_AUTHENTICATION_STATUS. |
profile.displayName |
event.idm.entity.entity.user.user_display_name |
Valor tomado de profile.displayName. |
profile.samAccountName, profile.samaccountname, profile.login, profile.ldapUid |
event.idm.entity.entity.user.userid |
Se completa con la siguiente precedencia: profile.samAccountName, profile.samaccountname, profile.login (si no es un correo electrónico), profile.ldapUid (si profile.login no es un correo electrónico). |
event.idm.entity.metadata.entity_type |
Se define en USER. |
|
id |
event.idm.entity.metadata.product_entity_id |
Valor tomado de id. |
event.idm.entity.metadata.product_name |
Se define en Identity Cloud. |
|
event.idm.entity.metadata.vendor_name |
Se define en Okta. |
¿Necesitas más ayuda? Obtén respuestas de miembros de la comunidad y profesionales de Google SecOps.