Coletar registros de contexto do usuário do Okta
Este documento explica como coletar registros de contexto do usuário do Okta configurando um feed do Google Security Operations usando a API de terceiros.
Antes de começar
Verifique se você atende os seguintes pré-requisitos:
- Uma instância do Google SecOps
- Acesso privilegiado ao locatário do Okta ou ao Admin Console
- Privilégios de criação de token de API no Okta
Configurar a lista de permissões de IP
Antes de criar o feed, adicione os intervalos de IP do Google SecOps à lista de permissões nas configurações de firewall ou rede do Okta.
Receber intervalos de IP do Google SecOps
- Extraia os intervalos de IP do arquivo JSON de intervalos de endereços IP do Google.
Adicionar intervalos de IP ao contexto do usuário do Okta
- Faça login no Admin Console do Okta.
- Acesse Segurança > Redes.
- Em Restrições de endereço IP, clique em Editar.
- Adicione cada intervalo de IP da SecOps do Google na notação CIDR aos endereços IP confiáveis.
- Clique em Salvar.
Configurar o acesso à API de contexto do usuário do Okta
Para permitir que o Google SecOps extraia dados de contexto do usuário, crie um token de API com permissões de leitura.
Criar token de API
- Faça login no Admin Console do Okta.
- Acesse Segurança > API.
- Selecione a guia Tokens.
- Clique em Criar token.
- Informe os seguintes detalhes de configuração:
- Nome: insira um nome descritivo, por exemplo,
Google SecOps Integration. - Descrição (opcional): insira uma descrição.
- Nome: insira um nome descritivo, por exemplo,
- Clique em Criar token.
Registrar credenciais de API
Depois de criar o token de API, você vai receber a seguinte credencial:
- Token da API: o valor do seu token da API (por exemplo,
00QCGr-1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1)
Permissões de API necessárias
O token da API requer as seguintes permissões no Okta:
| Permissão/papel | Nível de acesso | Finalidade |
|---|---|---|
| Administrador somente leitura | Ler | Acessar dados do perfil do usuário |
| Superadministrador | Ler | Acesso completo a todos os dados do usuário |
Configurar feeds
Para configurar um feed, siga estas etapas:
- Acesse Configurações do SIEM > Feeds.
- Clique em Adicionar novo feed.
- Na próxima página, clique em Configurar um único feed.
- No campo Nome do feed, insira um nome para o feed (por exemplo,
Okta User Context). - Selecione API de terceiros como o Tipo de origem.
- Selecione Contexto do usuário do Okta como o Tipo de registro.
- Clique em Próxima.
Especifique valores para os seguintes parâmetros de entrada:
Cabeçalho HTTP de autenticação: insira as credenciais de autenticação no seguinte formato:
Authorization:SSWS your-api-token- Por exemplo:
Authorization:SSWS 00QCGr-1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1
- Por exemplo:
Nome do host da API: o nome de domínio totalmente qualificado da sua instância do Okta (por exemplo, example.okta.com, não um domínio personalizado que possa estar configurado).
- Por exemplo:
company.okta.com
- Por exemplo:
Campo de referência do ID do gerente: ID obrigatório quando você usa um ID que não é do Okta para referenciar gerentes (opcional).
Namespace do recurso: o namespace do recurso.
Rótulos de ingestão: o rótulo a ser aplicado aos eventos deste feed.
Clique em Próxima.
Revise a nova configuração do feed na tela Finalizar e clique em Enviar.
Após a configuração, o feed começa a recuperar registros da instância de contexto do usuário do Okta em ordem cronológica.
Endpoints regionais
O Okta usa diferentes endpoints de API com base na região da sua organização:
| Região | URL de base / nome do host |
|---|---|
| EUA (padrão) | {org-name}.okta.com |
| UE (EMEA) | {org-name}.okta-emea.com |
| APAC (Ásia-Pacífico) | {org-name}.okta.com.au |
| Pré-lançamento (teste) | {org-name}.oktapreview.com |
Use o nome do host que corresponde à região da sua instância do Okta.
Limites de taxa de API
A API Okta tem os seguintes limites de taxa:
- Limite de taxa padrão: 600 solicitações por minuto para a maioria dos endpoints
- API System Log: 60 solicitações por minuto
- Endpoints de usuário: 600 solicitações por minuto
O Google SecOps processa automaticamente a limitação de taxa com espera exponencial. Se você tiver problemas, entre em contato com o suporte da Okta para aumentar os limites da API.
Tabela de mapeamento do UDM
| Campo de registro | Mapeamento do UDM | Lógica |
|---|---|---|
activated |
event.idm.entity.entity.labels |
Se activated existir, o valor dele será adicionado como um par de chave-valor com a chave "activated". |
created |
event.idm.entity.entity.labels |
Se created existir, o valor dele será adicionado como um par de chave-valor com a chave "created". |
profile.costCenter |
event.idm.entity.entity.labels |
Se profile.costCenter existir, o valor dele será adicionado como um par de chave-valor com a chave "costCenter". |
profile.Function |
event.idm.entity.entity.labels |
Se profile.Function existir, o valor dele será adicionado como um par de chave-valor com a chave "Function". |
statusChanged |
event.idm.entity.entity.labels |
Se statusChanged existir, o valor dele será adicionado como um par de chave-valor com a chave "statusChanged". |
type.id |
event.idm.entity.entity.labels |
Se type.id existir, o valor dele será adicionado como um par de chave-valor com a chave "type_id". |
profile.location |
event.idm.entity.entity.location.name |
Valor extraído de profile.location. |
profile.AD_ObjectGUID |
event.idm.entity.entity.user.attribute.labels |
Se profile.AD_ObjectGUID existir, o valor dele será adicionado como um par de chave-valor com a chave "AD_ObjectGUID". |
profile.ADpwdLastSet |
event.idm.entity.entity.user.attribute.labels |
Se profile.ADpwdLastSet existir, o valor dele será adicionado como um par de chave-valor com a chave "ADpwdLastSet". |
profile.AFF_Code |
event.idm.entity.entity.user.attribute.labels |
Se profile.AFF_Code existir, o valor dele será adicionado como um par de chave-valor com a chave "AFF_Code". |
profile.Desk_Location_WD |
event.idm.entity.entity.user.attribute.labels |
Se profile.Desk_Location_WD existir, o valor dele será adicionado como um par de chave-valor com a chave "Desk_Location_WD". |
profile.Mailing_Address_WD |
event.idm.entity.entity.user.attribute.labels |
Se profile.Mailing_Address_WD existir, o valor dele será adicionado como um par de chave-valor com a chave "Mailing_Address_WD". |
profile.Manager_UPN |
event.idm.entity.entity.user.attribute.labels |
Se profile.Manager_UPN existir, o valor dele será adicionado como um par de chave-valor com a chave "Manager_UPN". |
profile.PRIVATE_CONF_Profile |
event.idm.entity.entity.user.attribute.labels |
Se profile.PRIVATE_CONF_Profile existir, o valor dele será adicionado como um par de chave-valor com a chave "PRIVATE_CONF_Profile". |
profile.Region_WD |
event.idm.entity.entity.user.attribute.labels |
Se profile.Region_WD existir, o valor dele será adicionado como um par de chave-valor com a chave "Region_WD". |
profile.Subsidiary_Company |
event.idm.entity.entity.user.attribute.labels |
Se profile.Subsidiary_Company existir, o valor dele será adicionado como um par de chave-valor com a chave "Subsidiary_Company". |
profile.Telephone_Work |
event.idm.entity.entity.user.attribute.labels |
Se profile.Telephone_Work existir, o valor dele será adicionado como um par de chave-valor com a chave "Telephone_Work". |
profile.Temp_WD_Primary_Email |
event.idm.entity.entity.user.attribute.labels |
Se profile.Temp_WD_Primary_Email existir, o valor dele será adicionado como um par de chave-valor com a chave "Temp_WD_Primary_Email". |
profile.VMware_WS1_Username |
event.idm.entity.entity.user.attribute.labels |
Se profile.VMware_WS1_Username existir, o valor dele será adicionado como um par de chave-valor com a chave "VMware_WS1_Username". |
profile.Work_Street_Address_WD |
event.idm.entity.entity.user.attribute.labels |
Se profile.Work_Street_Address_WD existir, o valor dele será adicionado como um par de chave-valor com a chave "Work_Street_Address_WD". |
profile.Workato_WD_Primary_Email |
event.idm.entity.entity.user.attribute.labels |
Se profile.Workato_WD_Primary_Email existir, o valor dele será adicionado como um par de chave-valor com a chave "Workato_WD_Primary_Email". |
profile.Workday_ID |
event.idm.entity.entity.user.attribute.labels |
Se profile.Workday_ID existir, o valor dele será adicionado como um par de chave-valor com a chave "Workday_ID". |
profile.Worker_Type_WD |
event.idm.entity.entity.user.attribute.labels |
Se profile.Worker_Type_WD existir, o valor dele será adicionado como um par de chave-valor com a chave "Worker_Type_WD". |
profile.businessUnit |
event.idm.entity.entity.user.attribute.labels |
Se profile.businessUnit existir, o valor dele será adicionado como um par de chave-valor com a chave "businessUnit". |
profile.companyName |
event.idm.entity.entity.user.attribute.labels |
Se profile.companyName existir, o valor dele será adicionado como um par de chave-valor com a chave "companyName". |
profile.contingentSupplierName |
event.idm.entity.entity.user.attribute.labels |
Se profile.contingentSupplierName existir, o valor dele será adicionado como um par de chave-valor com a chave "contingentSupplierName". |
profile.conversationId |
event.idm.entity.entity.user.attribute.labels |
Se profile.conversationId existir, o valor dele será adicionado como um par de chave-valor com a chave "conversationId". |
profile.distinguishedName |
event.idm.entity.entity.user.attribute.labels |
Se profile.distinguishedName existir, o valor dele será adicionado como um par de chave-valor com a chave "distinguishedName". |
profile.division |
event.idm.entity.entity.user.attribute.labels |
Se profile.division existir, o valor dele será adicionado como um par de chave-valor com a chave "division". |
profile.emailPrefix |
event.idm.entity.entity.user.attribute.labels |
Se profile.emailPrefix existir, o valor dele será adicionado como um par de chave-valor com a chave "emailPrefix". |
profile.employeeType |
event.idm.entity.entity.user.attribute.labels |
Se profile.employeeType existir, o valor dele será adicionado como um par de chave-valor com a chave "employeeType". |
profile.homePostalAddress |
event.idm.entity.entity.user.attribute.labels |
Se profile.homePostalAddress existir, o valor dele será adicionado como um par de chave-valor com a chave "homePostalAddress". |
profile.isManager |
event.idm.entity.entity.user.attribute.labels |
Se profile.isManager existir, o valor dele será adicionado como um par de chave-valor com a chave "isManager". |
lastLogin |
event.idm.entity.entity.user.attribute.labels |
Se lastLogin existir, o valor dele será adicionado como um par de chave-valor com a chave "lastLogin". |
profile.leaveOfAbsence |
event.idm.entity.entity.user.attribute.labels |
Se profile.leaveOfAbsence existir, o valor dele será adicionado como um par de chave-valor com a chave "leaveOfAbsence". |
profile.managerDn |
event.idm.entity.entity.user.attribute.labels |
Se profile.managerDn existir, o valor dele será adicionado como um par de chave-valor com a chave "managerDn". |
profile.payGroup |
event.idm.entity.entity.user.attribute.labels |
Se profile.payGroup existir, o valor dele será adicionado como um par de chave-valor com a chave "payGroup". |
profile.wdemployeeID |
event.idm.entity.entity.user.attribute.labels |
Se profile.wdemployeeID existir, o valor dele será adicionado como um par de chave-valor com a chave "wdemployeeID". |
profile.zipCode |
event.idm.entity.entity.user.attribute.labels |
Se profile.zipCode existir, o valor dele será adicionado como um par de chave-valor com a chave "zipCode". |
profile.userType |
event.idm.entity.entity.user.attribute.roles |
Se profile.userType existir, o valor dele será adicionado a uma matriz de funções. |
profile.organization, profile.company |
event.idm.entity.entity.user.company_name |
Valor extraído de profile.organization ou profile.company se o primeiro não estiver presente. |
profile.department |
event.idm.entity.entity.user.department |
Valor extraído de profile.department. |
profile.email, profile.secondEmail, profile.login |
event.idm.entity.entity.user.email_addresses |
Os valores de profile.email, profile.secondEmail e profile.login (se for um e-mail e não um duplicado) são mesclados nesse campo. |
profile.employeeNumber |
event.idm.entity.entity.user.employee_id |
Valor extraído de profile.employeeNumber. |
profile.firstName, profile.Preferred_First_Name |
event.idm.entity.entity.user.first_name |
Valor extraído de profile.firstName ou profile.Preferred_First_Name se o primeiro não estiver presente. |
profile.EmployeeWorkGroup |
event.idm.entity.entity.user.group_identifiers |
Valor extraído de profile.EmployeeWorkGroup. |
profile.HireDate, profile.hiredate |
event.idm.entity.entity.user.hire_date |
O valor é analisado de profile.HireDate ou profile.hiredate se o primeiro não estiver presente. |
profile.lastName, profile.preferred_Last_Name |
event.idm.entity.entity.user.last_name |
Valor extraído de profile.lastName se profile.lastName ou profile.preferred_Last_Name existir. |
lastLogin |
event.idm.entity.entity.user.last_login_time |
O valor é analisado de lastLogin. |
passwordChanged |
event.idm.entity.entity.user.last_password_change_time |
O valor é analisado de passwordChanged. |
profile.manager, profile.managerEmail, profile.managerId |
event.idm.entity.entity.user.managers |
Preenchido com um objeto que contém user_display_name de profile.manager, email_addresses de profile.managerEmail e employee_id de profile.managerId. |
profile.city, profile.firstBaseCity |
event.idm.entity.entity.user.office_address.city |
Valor extraído de profile.city ou profile.firstBaseCity se o primeiro não estiver presente. |
profile.countryCode, profile.country |
event.idm.entity.entity.user.office_address.country_or_region |
Valor extraído de profile.countryCode ou profile.country se o primeiro não estiver presente. |
profile.streetAddress |
event.idm.entity.entity.user.personal_address.name |
Valor extraído de profile.streetAddress. |
profile.state |
event.idm.entity.entity.user.personal_address.state |
Valor extraído de profile.state. |
profile.primaryPhone, profile.mobilePhone, profile.mobile |
event.idm.entity.entity.user.phone_numbers |
Os valores de profile.primaryPhone, profile.mobilePhone e profile.mobile são mesclados nesse campo. |
profile.terminationDate, profile.terminationdate |
event.idm.entity.entity.user.termination_date |
O valor é analisado de profile.terminationDate ou profile.terminationdate se o primeiro não estiver presente. |
profile.title |
event.idm.entity.entity.user.title |
Valor extraído de profile.title. |
status |
event.idm.entity.entity.user.user_authentication_status |
Mapeado de status: ACTIVE/RECOVERY/LOCKED_OUT/PASSWORD_EXPIRED -> ACTIVE; SUSPENDED -> SUSPENDED; DEPROVISIONED -> DELETED; caso contrário, UNKNOWN_AUTHENTICATION_STATUS. |
profile.displayName |
event.idm.entity.entity.user.user_display_name |
Valor extraído de profile.displayName. |
profile.samAccountName, profile.samaccountname, profile.login, profile.ldapUid |
event.idm.entity.entity.user.userid |
Preenchido com precedência: profile.samAccountName, profile.samaccountname, profile.login (se não for um e-mail), profile.ldapUid (se profile.login não for um e-mail). |
event.idm.entity.metadata.entity_type |
Defina como USER. |
|
id |
event.idm.entity.metadata.product_entity_id |
Valor extraído de id. |
event.idm.entity.metadata.product_name |
Defina como Identity Cloud. |
|
event.idm.entity.metadata.vendor_name |
Defina como Okta. |
Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais do Google SecOps.