Coletar registros de contexto do usuário do Duo
Este documento explica como ingerir registros de contexto do usuário do Duo no Google Security Operations usando uma API. O analisador processa dados JSON, mapeando informações do usuário (incluindo nomes de usuário com alias para endereços de e-mail, grupos, números de telefone e detalhes do dispositivo) para a UDM e capturando o status da conta do usuário. Ele também processa estruturas de dados aninhadas e realiza várias transformações e fusões de dados para criar o evento final da UDM.
Antes de começar
Verifique se você tem os pré-requisitos a seguir:
- Instância do Google SecOps
- Acesso privilegiado ao painel de admin do Duo
Configurar o aplicativo da API Admin e receber as chaves
- Faça login no painel de administração do Duo como administrador.
- Na barra lateral à esquerda, clique em Aplicativos > Gerenciar aplicativos.
- Pressione o botão Adicionar aplicativo.
- No campo de pesquisa, digite API Admin e clique em Adicionar ao lado de API Duo Admin.
- Na próxima tela, as seguintes informações serão exibidas:
- Chave de integração:uma string como
DIYYYYYYYYYYYYYY
. - Chave secreta: uma string de 40 caracteres.
- Nome do host da API: por exemplo,
api-abcd1234.duosecurity.com
.
- Chave de integração:uma string como
- Copie e salve a chave de integração, a chave secreta e o nome do host da API em um local seguro.
- Role até Configurações e defina Permissões como Conceder recurso de leitura.
- Clique em Salvar alterações.
Configurar feeds
- Acesse Configurações do SIEM > Feeds.
- Clique em + Adicionar novo feed.
- No campo Nome do feed, insira um nome para o feed (por exemplo,
Duo Users Logs
). - Selecione API de terceiros como o Tipo de origem.
- Selecione o tipo de registro Contexto do usuário do Duo.
- Clique em Próxima.
- Especifique valores para os seguintes parâmetros de entrada:
- Nome de usuário: insira a chave de integração copiada anteriormente.
- Secret: insira a Chave secreta copiada anteriormente.
- Nome do host da API: forneça o URL do servidor da API Duo (por exemplo,
api-abcd1234.duosecurity.com
). - Namespace do recurso: o namespace do recurso.
- Rótulos de ingestão: o rótulo aplicado aos eventos deste feed.
- Clique em Próxima.
- Revise a configuração do feed na tela Finalizar e clique em Enviar.
Tabela de mapeamento da UDM
Campo de registro | Mapeamento do UDM | Lógica |
---|---|---|
access_device.browser |
event.idm.entity.entity.resource.attribute.labels.value |
O valor é extraído diretamente do campo access_device.browser ou surfaced_auth.access_device.browser se o primeiro estiver vazio. A chave é definida como "navegador do dispositivo de acesso". |
access_device.browser_version |
event.idm.entity.entity.resource.attribute.labels.value |
O valor é extraído diretamente do campo access_device.browser_version ou surfaced_auth.access_device.browser_version se o primeiro estiver vazio. A chave é definida como "access_device browser_version". |
access_device.ip.address |
event.idm.entity.entity.ip |
O valor é extraído diretamente do campo access_device.ip.address ou surfaced_auth.access_device.ip se o primeiro estiver vazio. |
access_device.location.city |
event.idm.entity.entity.location.city |
O valor é extraído diretamente do campo access_device.location.city ou surfaced_auth.access_device.location.city se o primeiro estiver vazio. |
access_device.location.country |
event.idm.entity.entity.location.country_or_region |
O valor é extraído diretamente do campo access_device.location.country ou surfaced_auth.access_device.location.country se o primeiro estiver vazio. |
access_device.location.state |
event.idm.entity.entity.location.state |
O valor é extraído diretamente do campo access_device.location.state ou surfaced_auth.access_device.location.state se o primeiro estiver vazio. |
access_device.os |
event.idm.entity.entity.asset.platform_software.platform |
O valor é derivado do campo access_device.os ou surfaced_auth.access_device.os se o primeiro estiver vazio. Se o valor corresponder (sem diferenciar maiúsculas de minúsculas) a "ios" ou "mac", o campo UDM será definido como "MAC". Se corresponder a "windows", o campo UDM será definido como "WINDOWS". Se corresponder a "linux", o campo UDM será definido como "LINUX". |
access_device.os_version |
event.idm.entity.entity.asset.platform_software.platform_version |
O valor é extraído diretamente do campo access_device.os_version ou surfaced_auth.access_device.os_version se o primeiro estiver vazio. |
action.details |
event.idm.entity.sec_result.action_details |
O valor é extraído desse campo se action estiver vazio. |
action.name |
event.idm.entity.sec_result.detection_fields.value |
O valor é extraído diretamente do campo. A chave é definida como "action_name". |
activity_id |
event.idm.entity.sec_result.detection_fields.value |
O valor é extraído diretamente do campo. A chave é definida como "activity_id". |
actor.details.created |
event.idm.entity.entity.user.attribute.labels.value |
O valor é extraído diretamente do campo. A chave é definida como "criada". |
actor.details.email |
event.idm.entity.entity.user.email_addresses |
O valor é extraído diretamente do campo. |
actor.details.groups.key |
event.idm.entity.entity.user.group_identifiers |
O valor é extraído diretamente do campo. |
actor.details.groups.name |
event.idm.entity.entity.user.group_identifiers |
O valor é extraído diretamente do campo. |
actor.details.last_login |
event.idm.entity.entity.user.attribute.labels.value |
O valor é extraído diretamente do campo. A chave é definida como "last_login". |
actor.details.status |
event.idm.entity.entity.user.attribute.labels.value |
O valor é extraído diretamente do campo. A chave é definida como "status". |
actor.key |
event.idm.entity.entity.resource.product_object_id |
O valor é extraído diretamente do campo. |
actor.name |
event.idm.entity.entity.user.user_display_name |
O valor é extraído diretamente do campo ou surfaced_auth.user.name se o primeiro estiver vazio. |
actor.type |
event.idm.entity.entity.user.attribute.labels.value |
O valor é extraído diretamente do campo. A chave é definida como "actor type". |
akey |
event.idm.entity.metadata.product_entity_id |
O valor é extraído diretamente do campo ou sekey se akey estiver vazio. |
application |
event.idm.entity.entity.application |
O valor é extraído diretamente do campo. |
collection_time.seconds , create_time.seconds |
event.idm.entity.metadata.collected_timestamp.seconds , event.timestamp.seconds |
O maior valor de collection_time.seconds e create_time.seconds é usado para collected_timestamp.seconds e timestamp.seconds de nível superior. |
collection_time.nanos , create_time.nanos |
event.idm.entity.metadata.collected_timestamp.nanos , event.timestamp.nanos |
O valor de nanossegundos correspondente ao maior valor entre collection_time.seconds e create_time.seconds é usado para collected_timestamp.nanos e timestamp.nanos de nível superior. |
email |
event.idm.entity.entity.user.email_addresses |
O valor é extraído diretamente do campo. |
explanations |
event.idm.entity.entity.resource.attribute.labels |
Os pares de chave-valor em cada objeto na matriz explanations são convertidos em rótulos. A chave de cada rótulo é precedida por "explanation ". |
firstname |
event.idm.entity.entity.user.first_name |
O valor é extraído diretamente do campo. |
from_common_netblock |
event.idm.entity.entity.resource.attribute.labels.value |
O valor é extraído diretamente do campo. A chave é definida como "from_common_netblock". |
from_new_user |
event.idm.entity.entity.resource.attribute.labels.value |
O valor é extraído diretamente do campo. A chave é definida como "from_new_user". |
groups.N.name (N=0..10) |
event.idm.entity.entity.user.group_identifiers |
O valor é extraído diretamente do campo. |
lastname |
event.idm.entity.entity.user.last_name |
O valor é extraído diretamente do campo. |
low_risk_ip |
event.idm.entity.entity.resource.attribute.labels.value |
O valor é extraído diretamente do campo. A chave é definida como "low_risk_ip". |
phones.0.model |
event.idm.entity.relations.entity.asset.hardware.model |
O valor é extraído diretamente do campo. |
phones.0.number |
event.idm.entity.entity.user.phone_numbers |
O valor é extraído diretamente do campo. |
phones.0.phone_id |
event.idm.entity.relations.entity.asset.product_object_id |
O valor é extraído diretamente do campo. |
phones.0.platform |
event.idm.entity.relations.entity.asset.hardware.manufacturer |
O valor é extraído diretamente do campo. |
priority_event |
event.idm.entity.entity.resource.attribute.labels.value |
O valor é extraído diretamente do campo. A chave é definida como "priority_event". |
realname |
event.idm.entity.entity.user.user_display_name |
O valor é extraído diretamente do campo. |
sekey |
event.idm.entity.metadata.product_entity_id |
O valor é extraído diretamente do campo se akey estiver vazio. |
state |
event.idm.entity.entity.resource.attribute.labels.value |
O valor é extraído diretamente do campo. A chave é definida como "state". |
status |
event.idm.entity.entity.user.attribute.labels.value , event.idm.entity.entity.user.user_authentication_status |
O valor é extraído diretamente do campo. A chave do rótulo é definida como "status". O valor também é usado para determinar o user_authentication_status . "active" e "bypass" são mapeados para "ACTIVE", "disabled" e "pending deletion" são mapeados para "SUSPENDED", e "locked out" é mapeado para "NO_ACTIVE_CREDENTIALS". |
surfaced_auth.access_device.browser |
event.idm.entity.entity.resource.attribute.labels.value |
O valor é extraído desse campo se access_device.browser estiver vazio. A chave é definida como "surfaced_auth access_device browser". |
surfaced_auth.access_device.browser_version |
event.idm.entity.entity.resource.attribute.labels.value |
O valor é extraído desse campo se access_device.browser_version estiver vazio. A chave é definida como "surfaced_auth access_device browser_version". |
surfaced_auth.access_device.ip |
event.idm.entity.entity.ip |
O valor é extraído desse campo se access_device.ip.address estiver vazio. |
surfaced_auth.access_device.location.city |
event.idm.entity.entity.location.city |
O valor é extraído desse campo se access_device.location.city estiver vazio. |
surfaced_auth.access_device.location.country |
event.idm.entity.entity.location.country_or_region |
O valor é extraído desse campo se access_device.location.country estiver vazio. |
surfaced_auth.access_device.location.state |
event.idm.entity.entity.location.state |
O valor é extraído desse campo se access_device.location.state estiver vazio. |
surfaced_auth.access_device.os |
event.idm.entity.entity.asset.platform_software.platform |
O valor é extraído desse campo se access_device.os estiver vazio. A lógica para mapear o campo do UDM é a mesma de access_device.os . |
surfaced_auth.access_device.os_version |
event.idm.entity.entity.asset.platform_software.platform_version |
O valor é extraído desse campo se access_device.os_version estiver vazio. |
surfaced_auth.user.key |
event.idm.entity.entity.user.userid |
O valor é extraído desse campo se username estiver vazio. |
surfaced_auth.user.name |
event.idm.entity.entity.user.user_display_name |
O valor é extraído desse campo se actor.name estiver vazio. |
target.details.biometrics_status |
event.idm.entity.entity.asset.attribute.labels.value |
O valor é extraído diretamente do campo. A chave é definida como "biometrics_status". |
target.details.country_code |
event.idm.entity.entity.asset.attribute.labels.value |
O valor é extraído diretamente do campo. A chave é definida como "country_code". |
target.details.extension |
event.idm.entity.entity.asset.attribute.labels.value |
O valor é extraído diretamente do campo. A chave é definida como "extension". |
target.details.manufacturer |
event.idm.entity.entity.asset.hardware.manufacturer |
O valor é extraído diretamente do campo. |
target.details.model |
event.idm.entity.entity.asset.hardware.model |
O valor é extraído diretamente do campo. |
target.details.number |
event.idm.entity.entity.user.phone_numbers |
O valor é extraído diretamente do campo. |
target.details.os |
event.idm.entity.entity.asset.software.name |
O valor é extraído diretamente do campo. |
target.details.os_version |
event.idm.entity.entity.asset.software.version |
O valor é extraído diretamente do campo. |
target.details.passcode_status |
event.idm.entity.entity.asset.attribute.labels.value |
O valor é extraído diretamente do campo. A chave é definida como "passcode_status". |
target.details.tampered_status |
event.idm.entity.entity.asset.attribute.labels.value |
O valor é extraído diretamente do campo. A chave é definida como "tampered_status". |
target.key |
event.idm.entity.entity.asset.asset_id |
O valor é extraído diretamente do campo. |
target.name |
event.idm.entity.entity.asset.attribute.labels.value |
O valor é extraído diretamente do campo. A chave é definida como "name". |
target.type |
event.idm.entity.entity.asset.attribute.labels.value |
O valor é extraído diretamente do campo. A chave é definida como "type". |
triage_event_uri |
event.idm.entity.entity.url |
O valor é extraído diretamente do campo. |
triaged_as_interesting |
event.idm.entity.entity.resource.attribute.labels.value |
O valor é extraído diretamente do campo. A chave é definida como "triaged_as_interesting". |
ts |
event.timestamp.seconds , event.idm.entity.metadata.collected_timestamp.seconds |
O carimbo de data/hora é analisado desse campo, se presente, usando o formato ISO8601 ou RFC 3339. Os segundos e nanossegundos extraídos são usados para o timestamp de nível superior e o collected_timestamp . |
type |
event.idm.entity.entity.resource.attribute.labels.value |
O valor é extraído diretamente do campo. A chave é definida como "type". |
user_id |
event.idm.entity.metadata.product_entity_id |
O valor é extraído diretamente do campo. |
username |
event.idm.entity.entity.user.userid |
O valor é extraído diretamente do campo ou surfaced_auth.user.key se username estiver vazio. |
(Lógica do analisador) | event.idm.entity.metadata.vendor_name |
Codificado como "Duo". |
(Lógica do analisador) | event.idm.entity.metadata.product_name |
Codificado como "Contexto do usuário do Duo". |
(Lógica do analisador) | event.idm.entity.metadata.entity_type |
Determinado com base na presença de outros campos. Se user_present for verdadeiro, ele será definido como "USER". Se asset_mid_present for verdadeiro, ele será definido como "ASSET". Se ip_present for verdadeiro, ele será definido como "IP_ADDRESS". Se resource_present for verdadeiro, ele será definido como "RESOURCE". Caso contrário, será definido como "UNKNOWN_ENTITYTYPE". |
(Lógica do analisador) | event.idm.entity.relations.entity_type |
Defina como "ASSET" se phones[0] não estiver vazio. |
(Lógica do analisador) | event.idm.entity.relations.relationship |
Defina como "OWNS" se phones[0] não estiver vazio. |
(Lógica do analisador) | event.idm.entity.relations.entity.asset.type |
Defina como "MOBILE" se phones[0] não estiver vazio. |
Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais do Google SecOps.