Coletar registros de EDR do Uptycs
Este documento explica como ingerir registros do EDR da Uptycs no Google Security Operations usando o Amazon S3. O analisador transforma registros JSON brutos em um modelo de dados unificado (UDM). Primeiro, ele extrai campos do JSON, realiza limpeza e enriquecimento de dados e mapeia as informações relevantes para os campos correspondentes do UDM, processando vários tipos de dados e casos extremos para garantir uma representação precisa e consistente no esquema do UDM.
Antes de começar
Verifique se você tem os pré-requisitos a seguir:
- Uma instância do Google SecOps
- Acesso privilegiado ao Uptycs
- Acesso privilegiado à AWS (S3, IAM)
Conferir os pré-requisitos do Uptycs
- Faça login no Admin Console da Uptycs.
- Acesse Configuração > Usuários.
- Selecione seu usuário ou crie um usuário de conta de serviço.
- Clique em Chave de API do usuário.
- Copie e salve em um local seguro os seguintes detalhes:
- Chave de API
- API Secret
- ID do cliente
- Domínio da API (derivado do seu URL do Uptycs, por exemplo,
mystack.uptycs.io)
Configurar o bucket do AWS S3 e o IAM para o Google SecOps
- Crie um bucket do Amazon S3 seguindo este guia do usuário: Como criar um bucket.
- Salve o Nome e a Região do bucket para referência futura (por exemplo,
uptycs-telemetry-export). - Crie um usuário seguindo este guia: Como criar um usuário do IAM.
- Selecione o usuário criado.
- Selecione a guia Credenciais de segurança.
- Clique em Criar chave de acesso na seção Chaves de acesso.
- Selecione Serviço de terceiros como Caso de uso.
- Clique em Próxima.
- Opcional: adicione uma tag de descrição.
- Clique em Criar chave de acesso.
- Clique em Fazer o download do arquivo CSV para salvar a chave de acesso e a chave de acesso secreta para referência futura.
- Clique em Concluído.
- Selecione a guia Permissões.
- Clique em Adicionar permissões na seção Políticas de permissões.
- Selecione Adicionar permissões.
- Selecione Anexar políticas diretamente.
- Pesquise a política AmazonS3FullAccess.
- Selecione a política.
- Clique em Próxima.
- Clique em Adicionar permissões
Configurar a política e o papel do IAM para uploads do S3
- No console da AWS, acesse IAM > Políticas.
- Clique em Criar política > guia JSON.
Insira a seguinte política:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowPutObjects", "Effect": "Allow", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::uptycs-telemetry-export/*" }, { "Sid": "AllowListBucket", "Effect": "Allow", "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::uptycs-telemetry-export" } ] }- Substitua
uptycs-telemetry-exportse você tiver inserido um nome de bucket diferente.
- Substitua
Clique em Próxima > Criar política.
Nomeie a política como
uptycs-s3-write-policy.Acesse IAM > Usuários.
Selecione o usuário criado para exportações da Uptycs.
Clique em Adicionar permissões > Anexar políticas diretamente.
Pesquise e selecione
uptycs-s3-write-policy.Clique em Próxima > Adicionar permissões.
Configurar a exportação de telemetria bruta do Uptycs
- Faça login no console do Uptycs.
- Acesse a seção de configuração de exportação.
- Configure o destino de exportação do S3.
- Informe os seguintes detalhes de configuração:
- Tipo de exportação: selecione Telemetria bruta.
- Destino: selecione Amazon S3.
- Formato: selecione JSON.
- Bucket do S3: insira
uptycs-telemetry-export. - Prefixo do caminho do S3: insira
telemetry/. - Região da AWS: selecione a região do bucket.
- ID da chave de acesso da AWS: insira a chave de acesso do usuário do IAM.
- Chave de acesso secreta da AWS: insira a chave de acesso secreta.
- Tipos de evento: selecione todos os tipos de telemetria necessários.
- Teste e ative a exportação.
Criar um usuário do IAM com acesso somente leitura para o Google SecOps
- Acesse Console da AWS > IAM > Usuários.
- Clique em Add users.
- Informe os seguintes detalhes de configuração:
- Usuário: insira
secops-reader. - Tipo de acesso: selecione Chave de acesso – Acesso programático.
- Usuário: insira
- Clique em Criar usuário.
- Anexe a política de leitura mínima (personalizada): Usuários > secops-reader > Permissões > Adicionar permissões > Anexar políticas diretamente > Criar política.
No editor JSON, insira a seguinte política:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:GetObject"], "Resource": "arn:aws:s3:::uptycs-telemetry-export/*" }, { "Effect": "Allow", "Action": ["s3:ListBucket"], "Resource": "arn:aws:s3:::uptycs-telemetry-export" } ] }Defina o nome como
secops-reader-policy.Acesse Criar política > pesquise/selecione > Próxima > Adicionar permissões.
Acesse Credenciais de segurança > Chaves de acesso > Criar chave de acesso.
Faça o download do CSV (esses valores são inseridos no feed).
Configurar um feed no Google SecOps para ingerir registros do Uptycs
- Acesse Configurações do SIEM > Feeds.
- Clique em + Adicionar novo feed.
- No campo Nome do feed, insira um nome para o feed (por exemplo,
Uptycs EDR logs). - Selecione Amazon S3 V2 como o Tipo de origem.
- Selecione EDR da Uptycs como o Tipo de registro.
- Clique em Próxima.
- Especifique valores para os seguintes parâmetros de entrada:
- URI do S3:
s3://uptycs-telemetry-export/telemetry/ - Opções de exclusão da fonte: selecione a opção de exclusão de acordo com sua preferência.
- Idade máxima do arquivo: inclui arquivos modificados no último número de dias. O padrão é de 180 dias.
- ID da chave de acesso: chave de acesso do usuário com acesso ao bucket do S3.
- Chave de acesso secreta: chave secreta do usuário com acesso ao bucket do S3.
- Namespace do recurso: o namespace do recurso.
- Rótulos de ingestão: o rótulo aplicado aos eventos deste feed.
- URI do S3:
- Clique em Próxima.
- Revise a nova configuração do feed na tela Finalizar e clique em Enviar.
Tabela de mapeamento do UDM
| Campo de registro | Mapeamento do UDM | Lógica |
|---|---|---|
| osquery_raw_data.answer | read_only_udm.network.dns.answers.name | Valor extraído de osquery_raw_data.answer se osquery_raw_data.answer não estiver vazio. |
| osquery_raw_data.container_id | read_only_udm.metadata.product_log_id | Valor extraído de osquery_raw_data.container_id se osquery_raw_data.container_id não estiver vazio. |
| osquery_raw_data.local_address | read_only_udm.principal.ip | Valor extraído de osquery_raw_data.local_address se osquery_raw_data.local_address não estiver vazio e for um endereço IP válido. |
| osquery_raw_data.local | read_only_udm.principal.ip | Caso contrário, o valor será extraído de osquery_raw_data.local se ele não estiver vazio e for um endereço IP válido. |
| osquery_raw_data.local_port | read_only_udm.principal.port | Valor extraído de osquery_raw_data.local_port e convertido em número inteiro se osquery_raw_data.local_port não estiver vazio. |
| osquery_raw_data.md5 | read_only_udm.target.process.file.md5 | Valor extraído de osquery_raw_data.md5 se osquery_raw_data.md5 não estiver vazio. |
| osquery_raw_data.port | read_only_udm.target.port | Valor extraído de osquery_raw_data.port e convertido em número inteiro se osquery_raw_data.port não estiver vazio. |
| osquery_raw_data.question | read_only_udm.network.dns.questions.name | Valor extraído de osquery_raw_data.question se osquery_raw_data.question não estiver vazio. |
| osquery_raw_data.remote_address | read_only_udm.intermediary.ip | Valor extraído de osquery_raw_data.remote_address se osquery_raw_data.remote_address não estiver vazio. |
| osquery_raw_data.remote_port | read_only_udm.intermediary.port | Valor extraído de osquery_raw_data.remote_port e convertido em número inteiro se osquery_raw_data.remote_port não estiver vazio. |
| osquery_raw_data.type | read_only_udm.network.dns.questions.type | Valor extraído de osquery_raw_data.type e convertido em número inteiro se osquery_raw_data.type não estiver vazio. |
| osquery_raw_data.uid | read_only_udm.principal.user.userid | Valor extraído de osquery_raw_data.uid se osquery_raw_data.uid não estiver vazio e não for igual a "0". |
| osquery_raw_data.worker_instance_id | read_only_udm.principal.user.userid | Caso contrário, o valor será extraído de osquery_raw_data.worker_instance_id se osquery_raw_data.worker_instance_id não estiver vazio. |
| upt_asset_group_id | read_only_udm.principal.user.group_identifiers | Valor extraído de upt_asset_group_id se upt_asset_group_id não estiver vazio. |
| upt_asset_group_name | read_only_udm.principal.group.group_display_name | Valor extraído de upt_asset_group_name se upt_asset_group_name não estiver vazio. |
| upt_asset_id | read_only_udm.principal.asset.asset_id | String concatenada "UPT ASSET ID:" com o valor de upt_asset_id se upt_asset_id não estiver vazio. |
| upt_hash | read_only_udm.target.file.md5 | Todas as ocorrências de "-" são substituídas por "" em upt_hash. Em seguida, o valor é atribuído a read_only_udm.target.file.md5 se upt_hash não estiver vazio. |
| upt_hostname | read_only_udm.principal.hostname | Valor extraído de upt_hostname se upt_hostname não estiver vazio. |
| upt_resource_type | read_only_udm.target.resource.type | Valor extraído de upt_resource_type se upt_resource_type não estiver vazio. |
| upt_time | read_only_udm.metadata.event_timestamp.seconds | Valor extraído de upt_time se upt_time não estiver vazio. |
| read_only_udm.metadata.event_type | O valor é definido como "PROCESS_LAUNCH" se osquery_raw_data.pid não estiver vazio. O valor é definido como "NETWORK_DNS" se osquery_raw_data.question não estiver vazio. O valor é definido como "GENERIC_EVENT" se event_type estiver vazio. | |
| read_only_udm.metadata.log_type | O valor é definido como "UPTYCS_EDR". | |
| read_only_udm.metadata.product_name | O valor é definido como "UPTYCS_EDR". | |
| read_only_udm.metadata.vendor_name | O valor é definido como "UPTYCS". | |
| read_only_udm.network.application_protocol | O valor é definido como "DNS" se "osquery_raw_data.question" não estiver vazio. | |
| read_only_udm.security_result.action | O valor é definido como "ALLOW" se osquery_raw_data.return_code for igual a "SUCCESS" ou osquery_raw_data.success for igual a "1". | |
| read_only_udm.target.process.command_line | Valor extraído de osquery_raw_data.cmdline se osquery_raw_data.cmdline não estiver vazio. | |
| read_only_udm.target.process.file.full_path | Valor extraído de osquery_raw_data.path se osquery_raw_data.path não estiver vazio. | |
| read_only_udm.target.process.parent_process | O valor é construído iterando sobre a matriz ancestor_list em osquery_raw_data.ancestor_list. Para cada elemento na matriz, a linha de comando, o full_path do arquivo e o pid são extraídos e formatados em uma estrutura JSON que representa a cadeia de processos. | |
| read_only_udm.target.process.pid | Valor extraído de osquery_raw_data.pid se osquery_raw_data.pid não estiver vazio. |
Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais do Google SecOps.