Coletar registros do Cloud Compute
Neste documento, explicamos como configurar a exportação de registros do Compute para o Google Security Operations usando o Cloud Storage. Google Cloud O analisador extrai campos, normaliza o campo de mensagem e mapeia os dados extraídos para o esquema do modelo de dados unificado (UDM, na sigla em inglês) para uma representação consistente de eventos de segurança. Ele processa vários formatos de registro, incluindo mensagens semelhantes a syslog e pares de chave-valor, e categoriza eventos com base em campos extraídos, como type e action.
Antes de começar
- Verifique se você tem uma instância do Google SecOps.
- Verifique se o Compute está configurado e ativo no ambiente Google Cloud .
- Verifique se você tem acesso privilegiado a Google Cloud.
Crie um bucket do Google Cloud Storage
- Faça login no console do Google Cloud.
Acesse a página Buckets do Cloud Storage.
Clique em Criar.
Na página Criar um bucket, insira as informações do seu bucket. Após cada uma das etapas a seguir, clique em Continuar para prosseguir para a próxima:
Na seção Começar, faça o seguinte:
- Insira um nome exclusivo que atenda aos requisitos de nome de bucket. Por exemplo, compute-logs.
Para ativar o namespace hierárquico, clique na seta de expansão para abrir a seção Otimizar para cargas de trabalho orientadas a arquivos e com uso intensivo de dados e selecione Ativar namespace hierárquico neste bucket.
- Para adicionar um rótulo de bucket, clique na seta de expansão para abrir a seção Rótulos.
- Clique em Adicionar rótulo e especifique uma chave e um valor para o rótulo.
Na seção Escolha onde armazenar seus dados, faça o seguinte:
Selecione um tipo de local.
- Use o menu do tipo de local para selecionar um Local em que os dados de objetos no bucket serão armazenados permanentemente.
- Para configurar a replicação entre buckets, abra a seção Configurar a replicação entre buckets.
Na seção Escolha uma classe de armazenamento para seus dados, selecione uma classe de armazenamento padrão para o bucket ou selecione Classe automática para gerenciamento automático da classe de armazenamento dos dados do bucket.
Na seção Escolha como controlar o acesso a objetos, selecione não para aplicar a prevenção de acesso público e selecione um modelo de controle de acesso para os objetos do bucket.
Na seção Escolha como proteger os dados do objeto, faça o seguinte:
- Selecione qualquer uma das opções em Proteção de dados que você quer definir para o bucket.
- Para escolher como os dados do objeto serão criptografados, clique na seta de expansão identificada como Criptografia de dados e selecione um método de criptografia de dados.
Clique em Criar.
Configurar Google Cloud exportação de registros do Compute
- No console do Google Cloud, acesse Logging > Roteador de registros.
- Clique em Criar coletor.
Forneça os seguintes detalhes:
- Nome do coletor: forneça um nome significativo. Por exemplo, Compute-Logs-Sink.
- Destino do coletor: selecione Cloud Storage .
- Destino do sink: selecione "Cloud Storage" e insira o URI do bucket. Por exemplo,
gs://<your-bucket-name>/compute-logs
. Filtro de registro: defina filtros para capturar registros do Google Cloud Compute da seguinte maneira:
Nome e tipo do registro:
logName="*compute*"
Campos relacionados à rede (como endereços IP, portas):
jsonPayload.connection.dest_ip="*" OR jsonPayload.connection.src_ip="*"
Detalhes da instância:
jsonPayload.dest_instance.project_id="*" jsonPayload.src_instance.project_id="*"
Detalhes relacionados à segurança:
jsonPayload.rule_details.action="ALLOW" OR jsonPayload.rule_details.action="BLOCK"
Clique em Criar.
Configurar permissões do Cloud Storage
- Acesse IAM > IAM e administrador > Contas de serviço.
- Encontre a conta de serviço do Cloud Logging, por exemplo, service-account@logging.iam.gserviceaccount.com.
- Forneça o papel roles/storage.admin no bucket.
Configurar um feed no Google SecOps para ingerir Google Cloud registros do Compute
- Acesse Configurações do SIEM > Feeds.
- Clique em Adicionar novo.
- No campo Nome do feed, insira um nome para o feed, por exemplo, Google Cloud Registros de computação.
- Selecione Google Cloud Storage como o Tipo de origem.
- Selecione GCP Compute como o Tipo de registro.
- Clique em Pegar conta de serviço como a Conta de serviço do Chronicle.
- Clique em Próxima.
Especifique valores para os seguintes parâmetros de entrada:
- URI do bucket do Cloud Storage: Google Cloud URL do bucket do Cloud Storage no formato
gs://my-bucket/<value>
. - URI Is A: selecione Directory which includes subdirectories.
Opções de exclusão da origem: selecione a opção de exclusão de acordo com sua preferência.
Namespace de recursos: o namespace de recursos.
Rótulos de ingestão: o rótulo aplicado aos eventos desse feed.
- URI do bucket do Cloud Storage: Google Cloud URL do bucket do Cloud Storage no formato
Clique em Próxima.
Revise a configuração do novo feed na tela Finalizar e clique em Enviar.
Tabela de mapeamento do UDM
Campo de registro | Mapeamento de UDM | Lógica |
---|---|---|
addr | read_only_udm.principal.ip | Mesclado à lista de endereços IP principal se o campo não estiver vazio ou "?". |
jsonPayload.connection.dest_ip | read_only_udm.target.ip | Mesclado à lista de endereços IP de destino, se o campo existir. |
jsonPayload.connection.dest_port | read_only_udm.target.port | Conversão para string, depois para número inteiro e mapeamento se nenhum erro ocorrer durante a conversão. |
jsonPayload.connection.protocol | read_only_udm.network.ip_protocol | Convertido em string e depois em número inteiro. É usado para determinar o protocolo IP (TCP, UDP etc.) usando uma tabela de pesquisa e mapeado se nenhum erro ocorrer durante a conversão. |
jsonPayload.connection.src_ip | read_only_udm.principal.ip | Mesclado à lista de endereços IP principal, se o campo existir. |
jsonPayload.connection.src_port | read_only_udm.principal.port | Conversão para string, depois para número inteiro e mapeamento se nenhum erro ocorrer durante a conversão. |
jsonPayload.dest_instance.project_id | read_only_udm.target.resource.product_object_id | Mapeado condicionalmente se jsonPayload.dest_vpc.project_id existir. |
jsonPayload.dest_instance.region | read_only_udm.target.location.name | Mapeado condicionalmente se jsonPayload.dest_vpc.project_id existir. |
jsonPayload.dest_instance.vm_name | read_only_udm.target.resource.attribute.cloud.project.name | Mapeado condicionalmente se jsonPayload.dest_vpc.project_id existir. |
jsonPayload.dest_instance.zone | read_only_udm.target.resource.attribute.cloud.availability_zone | Mapeado condicionalmente se jsonPayload.dest_vpc.project_id existir. |
jsonPayload.dest_vpc.project_id | read_only_udm.target.cloud.vpc.product_object_id | Usada como uma condição para mapear campos relacionados. |
jsonPayload.dest_vpc.subnetwork_name | read_only_udm.target.cloud.vpc.name | Mapeado condicionalmente se jsonPayload.dest_vpc.project_id existir. |
jsonPayload.instance.project_id | read_only_udm.target.resource.product_object_id | Mapeado condicionalmente se jsonPayload.instance.project_id existir. |
jsonPayload.instance.region | read_only_udm.target.location.name | Mapeado condicionalmente se jsonPayload.instance.project_id existir. |
jsonPayload.instance.vm_name | read_only_udm.target.resource.attribute.cloud.project.name | Mapeado condicionalmente se jsonPayload.instance.project_id existir. |
jsonPayload.instance.zone | read_only_udm.target.resource.attribute.cloud.availability_zone | Mapeado condicionalmente se jsonPayload.instance.project_id existir. |
jsonPayload.message | read_only_udm.metadata.product_event_type, read_only_udm.principal.application, read_only_udm.target.process.pid, read_only_udm.target.user.userid, read_only_udm.principal.hostname, read_only_udm.target.process.command_line, read_only_udm.security_result.description, read_only_udm.principal.process.file.full_path | Analisado e mapeado para campos diferentes com base em padrões grok e lógica condicional. |
jsonPayload.rule_details.action | read_only_udm.security_result.action | Usado para determinar a ação do resultado de segurança (PERMITIR/BLOQUEAR) e mapear. |
jsonPayload.rule_details.direction | read_only_udm.network.direction | Usado para determinar a direção da rede (INBOUND/OUTBOUND/UNKNOWN_DIRECTION) e mapear. |
jsonPayload.rule_details.priority | read_only_udm.security_result.priority_details | Conversão em string e mapeamento se não ocorrerem erros durante a conversão. |
jsonPayload.rule_details.reference | read_only_udm.security_result.rule_labels.value | Mapeado para o valor do rótulo da regra. |
jsonPayload.src_instance.project_id | read_only_udm.principal.resource.product_object_id | Mapeado condicionalmente se jsonPayload.src_vpc.project_id existir. |
jsonPayload.src_instance.region | read_only_udm.principal.location.name | Mapeado condicionalmente se jsonPayload.src_vpc.project_id existir. |
jsonPayload.src_instance.vm_name | read_only_udm.principal.resource.attribute.cloud.project.name | Mapeado condicionalmente se jsonPayload.src_vpc.project_id existir. |
jsonPayload.src_instance.zone | read_only_udm.principal.resource.attribute.cloud.availability_zone | Mapeado condicionalmente se jsonPayload.src_vpc.project_id existir. |
jsonPayload.src_vpc.project_id | read_only_udm.principal.cloud.vpc.product_object_id | Usada como uma condição para mapear campos relacionados. |
jsonPayload.src_vpc.subnetwork_name | read_only_udm.principal.cloud.vpc.name | Mapeado condicionalmente se jsonPayload.src_vpc.project_id existir. |
jsonPayload.vpc.project_id | read_only_udm.target.cloud.vpc.product_object_id | Mapeado condicionalmente se jsonPayload.vpc.project_id existir. |
jsonPayload.vpc.subnetwork_name | read_only_udm.target.cloud.vpc.name | Mapeado condicionalmente se jsonPayload.vpc.project_id existir. |
logName | read_only_udm.security_result.category_details | Mapeado diretamente. |
resource.labels.instance_id | read_only_udm.principal.resource.product_object_id, read_only_udm.principal.asset_id | Mapeado condicionalmente. Se o tipo for "PROCTITLE", ele será usado para construir o ID do recurso. |
resource.labels.location | read_only_udm.principal.location.name | Mapeado condicionalmente se o campo existir. |
resource.labels.project_id | read_only_udm.metadata.product_deployment_id | Mapeado condicionalmente se o campo existir. |
resource.labels.zone | read_only_udm.principal.resource.attribute.cloud.availability_zone | Mapeado condicionalmente se o campo existir. |
resource.type | read_only_udm.metadata.event_type | Usado para determinar o tipo de evento e mapear. |
timestamp | read_only_udm.metadata.event_timestamp | Mapeado diretamente. |
tipo | read_only_udm.metadata.product_event_type, read_only_udm.metadata.event_type, read_only_udm.extensions.auth.type | Usado para determinar o tipo de evento, o tipo de evento do produto e o tipo de autenticação e mapear de acordo. |
read_only_udm.metadata.event_type | A lógica define o tipo de evento com base no campo "type" e em outras condições. Se nenhuma correspondência específica for encontrada, o padrão será "GENERIC_EVENT". | |
read_only_udm.metadata.log_type | Valor constante "GCP_COMPUTE". | |
read_only_udm.metadata.vendor_name | Valor constante "Google Cloud Platform". | |
read_only_udm.metadata.product_name | Valor constante "Google Cloud Platform". | |
read_only_udm.security_result.rule_labels.key | Valor constante "Reference". | |
read_only_udm.target.cloud.vpc.resource_type | É definido condicionalmente como "VPC_NETWORK" se jsonPayload.instance.project_id ou jsonPayload.dest_vpc.project_id existir. | |
read_only_udm.target.resource.attribute.cloud.environment | É definido condicionalmente como "GOOGLE_CLOUD_PLATFORM" se jsonPayload.instance.project_id, jsonPayload.dest_vpc.project_id ou jsonPayload.src_vpc.project_id existir. | |
read_only_udm.principal.administrative_domain | Mapeado do campo "Domínio da conta" extraído do campo "kv_data". | |
read_only_udm.principal.user.user_display_name | Mapeado do campo "Nome da conta" extraído do campo "kv_data". | |
read_only_udm.target.resource.name | Mapeado do campo "Nome do objeto" extraído do campo "kv_data". | |
read_only_udm.target.resource.type | Mapeado do campo "Tipo de objeto" extraído do campo "kv_data". | |
read_only_udm.principal.process.pid | Mapeado do campo "ID do processo" extraído do campo "kv_data". | |
read_only_udm.target.user.windows_sid | Mapeado do campo "ID de segurança" extraído do campo "kv_data". | |
read_only_udm.network.session_id | Mapeado do campo "auid". |
Alterações
2024-06-18
Melhoria:
- O "file" foi mapeado para "principal.file.names".
- "function" foi mapeado para "principal.resource.attribute.labels".
- "Linha" foi mapeada para "principal.resource.attribute.labels".
- O "carimbo de tempo" foi mapeado para "event_timestamp".
2023-02-24
Correção de bug:
- Mapeamento adicionado para "asset_id" para facilitar a pesquisa na interface: "asset:resource.labels.instance_id" é mapeado para "principal.asset_id"
2022-06-16
Melhoria:
- Mapeamento adicionado para os seguintes campos novos: jsonPayload.Message como syslog.
- Process Name para principal.application.
- ID do processo para principal.process.pid.
- Domínio da conta para principal.administrative_domain.
- Nome da conta para principal.user.user_display_name.
- Nome do objeto para target.resource.name.
- O tipo de objeto para target.resource.type.
- ID de segurança para target.user.windows_sid.
- addr para principal.ip.
- auid para network.session_id.
- "LINUX - %{type}" mapeado para registros do Linux e "WINDOWS event log" para o registro do Windows para metadata.product_event_type.
- pid para target.process.pid.
- acct para target.user.userid.
- exe para target.process.command_line.
- file_path para principal.process.file.full_path.
- O mapeamento de desc foi alterado de metadata.description para security_result.description.
2022-05-23
Melhoria:
- Mapeamento adicionado para os seguintes campos novos:
- jsonPayload.message como syslog.
- resource.labels.zone para principal.resource.attribute.cloud.availability_zone.
- resource.labels.location para principal.location.name.
- resource.labels.project_id para metadata.product_deployment_id.
- resource.labels.instance_id para principal.resource.product_object_id.
Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais do Google SecOps.