Recolha registos de contexto de utilizador do Duo
Este documento explica como carregar registos de contexto do utilizador do Duo para o Google Security Operations através de uma API. O analisador processa dados JSON, mapeando informações do utilizador (incluindo a atribuição de alias de nomes de utilizador a endereços de email, grupos, números de telefone e detalhes do dispositivo) ao UDM e capturando o estado da conta do utilizador. Também processa estruturas de dados aninhadas e realiza várias transformações e uniões de dados para criar o evento UDM final.
Antes de começar
Certifique-se de que tem os seguintes pré-requisitos:
- Instância do Google SecOps
- Acesso privilegiado ao painel de administração do Duo
Configure a aplicação da API Admin e obtenha as chaves
- Inicie sessão no painel de administração do Duo como administrador.
- Na barra lateral esquerda, clique em Aplicações > Gerir aplicações.
- Prima o botão Adicionar aplicação.
- No campo de pesquisa, escreva API Admin e clique em Adicionar junto a API Duo Admin.
- No ecrã seguinte, são apresentadas as seguintes informações:
- Chave de integração: (uma string como
DIYYYYYYYYYYYYYY
). - Chave secreta: uma string de 40 carateres.
- Nome do anfitrião da API: por exemplo,
api-abcd1234.duosecurity.com
.
- Chave de integração: (uma string como
- Copie e guarde a chave de integração, a chave secreta e o nome do anfitrião da API num local seguro.
- Desloque a página até Definições e defina as Autorizações como Conceder recurso de leitura.
- Clique em Guardar alterações.
Configure feeds
- Aceda a Definições do SIEM > Feeds.
- Clique em + Adicionar novo feed.
- No campo Nome do feed, introduza um nome para o feed (por exemplo,
Duo Users Logs
). - Selecione API de terceiros como o Tipo de origem.
- Selecione o tipo de registo Contexto do utilizador do Duo.
- Clicar em Seguinte.
- Especifique valores para os seguintes parâmetros de entrada:
- Nome de utilizador: introduza a chave de integração copiada anteriormente.
- Segredo: introduza a chave secreta copiada anteriormente.
- Nome de anfitrião da API: indique o URL do servidor da API Duo (por exemplo,
api-abcd1234.duosecurity.com
). - Espaço de nomes do recurso: o espaço de nomes do recurso.
- Etiquetas de carregamento: a etiqueta aplicada aos eventos deste feed.
- Clicar em Seguinte.
- Reveja a configuração do feed no ecrã Finalizar e, de seguida, clique em Enviar.
Tabela de mapeamento da UDM
Campo de registo | Mapeamento de UDM | Lógica |
---|---|---|
access_device.browser |
event.idm.entity.entity.resource.attribute.labels.value |
O valor é retirado diretamente do campo access_device.browser ou surfaced_auth.access_device.browser se o primeiro estiver vazio. A chave está definida como "access_device browser". |
access_device.browser_version |
event.idm.entity.entity.resource.attribute.labels.value |
O valor é retirado diretamente do campo access_device.browser_version ou surfaced_auth.access_device.browser_version se o primeiro estiver vazio. A chave está definida como "access_device browser_version". |
access_device.ip.address |
event.idm.entity.entity.ip |
O valor é retirado 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 é retirado 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 é retirado 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 é retirado 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 distinção entre maiúsculas e minúsculas) a "ios" ou "mac", o campo UDM é definido como "MAC". Se corresponder a "windows", o campo UDM é definido como "WINDOWS". Se corresponder a "linux", o campo UDM é definido como "LINUX". |
access_device.os_version |
event.idm.entity.entity.asset.platform_software.platform_version |
O valor é retirado 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 é retirado deste campo se action estiver vazio. |
action.name |
event.idm.entity.sec_result.detection_fields.value |
O valor é retirado diretamente do campo. A chave está definida como "action_name". |
activity_id |
event.idm.entity.sec_result.detection_fields.value |
O valor é retirado diretamente do campo. A chave está definida como "activity_id". |
actor.details.created |
event.idm.entity.entity.user.attribute.labels.value |
O valor é retirado diretamente do campo. A chave está definida como "created" (criada). |
actor.details.email |
event.idm.entity.entity.user.email_addresses |
O valor é retirado diretamente do campo. |
actor.details.groups.key |
event.idm.entity.entity.user.group_identifiers |
O valor é retirado diretamente do campo. |
actor.details.groups.name |
event.idm.entity.entity.user.group_identifiers |
O valor é retirado diretamente do campo. |
actor.details.last_login |
event.idm.entity.entity.user.attribute.labels.value |
O valor é retirado diretamente do campo. A chave está definida como "last_login". |
actor.details.status |
event.idm.entity.entity.user.attribute.labels.value |
O valor é retirado diretamente do campo. A chave está definida como "status". |
actor.key |
event.idm.entity.entity.resource.product_object_id |
O valor é retirado diretamente do campo. |
actor.name |
event.idm.entity.entity.user.user_display_name |
O valor é retirado 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 é retirado diretamente do campo. A chave está definida como "actor type". |
akey |
event.idm.entity.metadata.product_entity_id |
O valor é retirado diretamente do campo ou sekey se akey estiver vazio. |
application |
event.idm.entity.entity.application |
O valor é retirado diretamente do campo. |
collection_time.seconds , create_time.seconds |
event.idm.entity.metadata.collected_timestamp.seconds , event.timestamp.seconds |
O valor superior 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 nanosegundos 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 é retirado 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 etiquetas. A chave de cada etiqueta tem o prefixo "explanation ". |
firstname |
event.idm.entity.entity.user.first_name |
O valor é retirado diretamente do campo. |
from_common_netblock |
event.idm.entity.entity.resource.attribute.labels.value |
O valor é retirado diretamente do campo. A chave está definida como "from_common_netblock". |
from_new_user |
event.idm.entity.entity.resource.attribute.labels.value |
O valor é retirado diretamente do campo. A chave está definida como "from_new_user". |
groups.N.name (N=0..10) |
event.idm.entity.entity.user.group_identifiers |
O valor é retirado diretamente do campo. |
lastname |
event.idm.entity.entity.user.last_name |
O valor é retirado diretamente do campo. |
low_risk_ip |
event.idm.entity.entity.resource.attribute.labels.value |
O valor é retirado diretamente do campo. A chave está definida como "low_risk_ip". |
phones.0.model |
event.idm.entity.relations.entity.asset.hardware.model |
O valor é retirado diretamente do campo. |
phones.0.number |
event.idm.entity.entity.user.phone_numbers |
O valor é retirado diretamente do campo. |
phones.0.phone_id |
event.idm.entity.relations.entity.asset.product_object_id |
O valor é retirado diretamente do campo. |
phones.0.platform |
event.idm.entity.relations.entity.asset.hardware.manufacturer |
O valor é retirado diretamente do campo. |
priority_event |
event.idm.entity.entity.resource.attribute.labels.value |
O valor é retirado diretamente do campo. A chave está definida como "priority_event". |
realname |
event.idm.entity.entity.user.user_display_name |
O valor é retirado diretamente do campo. |
sekey |
event.idm.entity.metadata.product_entity_id |
O valor é retirado diretamente do campo se akey estiver vazio. |
state |
event.idm.entity.entity.resource.attribute.labels.value |
O valor é retirado diretamente do campo. A chave está definida como "state". |
status |
event.idm.entity.entity.user.attribute.labels.value , event.idm.entity.entity.user.user_authentication_status |
O valor é retirado diretamente do campo. A chave da etiqueta está 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 é retirado deste campo se access_device.browser estiver vazio. A chave está definida como "surfaced_auth access_device browser". |
surfaced_auth.access_device.browser_version |
event.idm.entity.entity.resource.attribute.labels.value |
O valor é retirado deste campo se access_device.browser_version estiver vazio. A chave está definida como "surfaced_auth access_device browser_version". |
surfaced_auth.access_device.ip |
event.idm.entity.entity.ip |
O valor é retirado deste campo se access_device.ip.address estiver vazio. |
surfaced_auth.access_device.location.city |
event.idm.entity.entity.location.city |
O valor é retirado deste campo se access_device.location.city estiver vazio. |
surfaced_auth.access_device.location.country |
event.idm.entity.entity.location.country_or_region |
O valor é retirado deste campo se access_device.location.country estiver vazio. |
surfaced_auth.access_device.location.state |
event.idm.entity.entity.location.state |
O valor é retirado deste campo se access_device.location.state estiver vazio. |
surfaced_auth.access_device.os |
event.idm.entity.entity.asset.platform_software.platform |
O valor é retirado deste campo se access_device.os estiver vazio. A lógica de mapeamento para o campo UDM é a mesma que para access_device.os . |
surfaced_auth.access_device.os_version |
event.idm.entity.entity.asset.platform_software.platform_version |
O valor é retirado deste campo se access_device.os_version estiver vazio. |
surfaced_auth.user.key |
event.idm.entity.entity.user.userid |
O valor é retirado deste campo se username estiver vazio. |
surfaced_auth.user.name |
event.idm.entity.entity.user.user_display_name |
O valor é retirado deste campo se actor.name estiver vazio. |
target.details.biometrics_status |
event.idm.entity.entity.asset.attribute.labels.value |
O valor é retirado diretamente do campo. A chave está definida como "biometrics_status". |
target.details.country_code |
event.idm.entity.entity.asset.attribute.labels.value |
O valor é retirado diretamente do campo. A chave está definida como "country_code". |
target.details.extension |
event.idm.entity.entity.asset.attribute.labels.value |
O valor é retirado diretamente do campo. A chave está definida como "extension". |
target.details.manufacturer |
event.idm.entity.entity.asset.hardware.manufacturer |
O valor é retirado diretamente do campo. |
target.details.model |
event.idm.entity.entity.asset.hardware.model |
O valor é retirado diretamente do campo. |
target.details.number |
event.idm.entity.entity.user.phone_numbers |
O valor é retirado diretamente do campo. |
target.details.os |
event.idm.entity.entity.asset.software.name |
O valor é retirado diretamente do campo. |
target.details.os_version |
event.idm.entity.entity.asset.software.version |
O valor é retirado diretamente do campo. |
target.details.passcode_status |
event.idm.entity.entity.asset.attribute.labels.value |
O valor é retirado diretamente do campo. A chave está definida como "passcode_status". |
target.details.tampered_status |
event.idm.entity.entity.asset.attribute.labels.value |
O valor é retirado diretamente do campo. A chave está definida como "tampered_status". |
target.key |
event.idm.entity.entity.asset.asset_id |
O valor é retirado diretamente do campo. |
target.name |
event.idm.entity.entity.asset.attribute.labels.value |
O valor é retirado diretamente do campo. A chave está definida como "name". |
target.type |
event.idm.entity.entity.asset.attribute.labels.value |
O valor é retirado diretamente do campo. A chave está definida como "type". |
triage_event_uri |
event.idm.entity.entity.url |
O valor é retirado diretamente do campo. |
triaged_as_interesting |
event.idm.entity.entity.resource.attribute.labels.value |
O valor é retirado diretamente do campo. A chave está definida como "triaged_as_interesting". |
ts |
event.timestamp.seconds , event.idm.entity.metadata.collected_timestamp.seconds |
A data/hora é analisada a partir deste campo, se estiver presente, usando o formato ISO8601 ou RFC 3339. Os segundos e os 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 é retirado diretamente do campo. A chave está definida como "type". |
user_id |
event.idm.entity.metadata.product_entity_id |
O valor é retirado diretamente do campo. |
username |
event.idm.entity.entity.user.userid |
O valor é retirado 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 de forma rígida para "Contexto do utilizador 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, é definido como "USER". Se asset_mid_present for verdadeiro, é definido como "ASSET". Se ip_present for verdadeiro, é definido como "IP_ADDRESS". Se resource_present for verdadeiro, é definido como "RESOURCE". Caso contrário, é definido como "UNKNOWN_ENTITYTYPE". |
(Lógica do analisador) | event.idm.entity.relations.entity_type |
Definido como "ASSET" se phones[0] não estiver vazio. |
(Lógica do analisador) | event.idm.entity.relations.relationship |
Definido como "OWNS" se phones[0] não estiver vazio. |
(Lógica do analisador) | event.idm.entity.relations.entity.asset.type |
Definido como "MOBILE" se phones[0] não estiver vazio. |
Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais da Google SecOps.