Coletar registros dos serviços do F5 Distributed Cloud
Este documento explica como ingerir registros dos serviços de nuvem distribuída da F5 no Google Security Operations usando o Google Cloud Storage V2.
O F5 Distributed Cloud Services é uma plataforma de segurança, rede e gerenciamento de aplicativos baseada em SaaS que oferece infraestrutura em nuvem distribuída, entrega de aplicativos, segurança de API e recursos de firewall de aplicativos da Web em locais multicloud e de borda.
Antes de começar
Verifique se você tem os pré-requisitos a seguir:
- Uma instância do Google SecOps
- Um projeto do Google Cloud com a API Cloud Storage ativada
- Permissões para criar e gerenciar buckets do GCS
- Permissões para gerenciar políticas do IAM em buckets do GCS
- Acesso privilegiado ao console do F5 Distributed Cloud
- Permissões para criar objetos de receptor de registros globais no F5 Distributed Cloud
Criar um bucket do Google Cloud Storage.
- Acesse o Console do Google Cloud.
- Selecione seu projeto ou crie um novo.
- No menu de navegação, acesse Cloud Storage > Buckets.
- Clique em Criar bucket.
Informe os seguintes detalhes de configuração:
Configuração Valor Nomeie seu bucket Insira um nome exclusivo globalmente, por exemplo, f5-dcs-logs.Tipo de local Escolha com base nas suas necessidades (região, birregional, multirregional) Local Selecione o local (por exemplo, us-central1).Classe de armazenamento Padrão (recomendado para registros acessados com frequência) Controle de acesso Uniforme (recomendado) Ferramentas de proteção Opcional: ativar o controle de versões de objetos ou a política de retenção Clique em Criar.
Configurar o F5 Distributed Cloud para exportar para o GCS
Adicionar bucket do GCS à lista de permissões do firewall
O receptor de registros global do F5 Distributed Cloud exige que os seguintes intervalos de endereços IP sejam adicionados à lista de permissões do firewall:
193.16.236.64/29185.160.8.152/29
Se o bucket do GCS usar o VPC Service Controls ou regras de firewall, adicione esses intervalos de IP à lista de permissões.
Criar uma conta de serviço do Google Cloud para o F5 Distributed Cloud
- No console do Google Cloud, acesse IAM e administrador > Contas de serviço.
- Clique em Criar conta de serviço.
Informe os seguintes detalhes de configuração:
- Nome da conta de serviço: insira
f5-dcs-log-writer(ou um nome descritivo). - Descrição da conta de serviço: insira
Service account for F5 Distributed Cloud to write logs to GCS
- Nome da conta de serviço: insira
Clique em Criar e continuar.
Na seção Conceda a essa conta de serviço acesso ao projeto:
- Clique em Selecionar papel.
- Pesquise e selecione Administrador de objetos do Storage.
Clique em Continuar.
Clique em Concluído.
Criar uma chave de conta de serviço
- Na lista Contas de serviço, clique na conta de serviço que você criou (por exemplo,
f5-dcs-log-writer). - Acesse a guia Chaves.
- Clique em Adicionar chave > Criar nova chave.
- Selecione JSON como o tipo de chave.
- Clique em Criar.
- O download do arquivo de chave JSON é feito no seu computador.
- Salve esse arquivo com segurança. Você vai precisar dele nas próximas etapas.
Conceder permissões do IAM no bucket do GCS
- Acesse Cloud Storage > Buckets.
- Clique no nome do bucket (por exemplo,
f5-dcs-logs). - Acesse a guia Permissões.
- Clique em Conceder acesso.
- Informe os seguintes detalhes de configuração:
- Adicionar principais: insira o e-mail da conta de serviço (por exemplo,
f5-dcs-log-writer@PROJECT_ID.iam.gserviceaccount.com). - Atribuir papéis: selecione Administrador de objetos do Storage.
- Adicionar principais: insira o e-mail da conta de serviço (por exemplo,
- Clique em Salvar.
Criar credenciais do Google Cloud no console do F5 Distributed Cloud
- Faça login no console do F5 Distributed Cloud em
https://<tenant>.console.ves.volterra.io. - Selecione o serviço Multi-Cloud Network Connect na página inicial.
- Acesse Gerenciar > Gerenciamento de sites > Credenciais da nuvem.
- Clique em Adicionar credenciais da nuvem.
- Na seção Metadados:
- Nome: insira um nome descritivo, por exemplo,
gcp-chronicle-logs. - Descrição (opcional): insira
Cloud Storage credentials for Google SecOps log export
- Nome: insira um nome descritivo, por exemplo,
- Na seção Tipo de credenciais da nuvem, selecione Credenciais do GCP.
- Clique em Configurar no campo Credenciais do GCP.
- No menu suspenso Tipo de credencial, selecione Arquivo de credenciais da conta de serviço.
- Clique em Fazer upload do arquivo e selecione o arquivo da chave JSON baixado nas etapas anteriores.
- Clique em Aplicar.
- Clique em Salvar e sair.
Criar um receptor de registros global
- No console do F5 Distributed Cloud, verifique se você está no serviço Multi-Cloud Network Connect.
- Acesse Gerenciar > Gerenciamento de registros > Receptor global de registros.
- Clique em Adicionar receptor de registros global.
Na seção Metadados:
- Nome: insira um nome descritivo, por exemplo,
chronicle-gcs-receiver. - Descrição (opcional): insira
Global log receiver for Google SecOps SIEM
- Nome: insira um nome descritivo, por exemplo,
No menu suspenso Tipo de registro, selecione os tipos de registro que você quer exportar:
- Registros de solicitação: registros de solicitação/resposta HTTP com usuário, caminho, método e códigos de resposta
- Eventos de segurança: eventos de WAF, DDoS, proteção de API e defesa contra bots.
- Registros de auditoria: mudanças de configuração por APIs públicas
- Registros de solicitações DNS: registros de consultas DNS
No menu suspenso Seleção de mensagens de registro, selecione uma das seguintes opções:
- Selecionar registros do namespace atual: envia registros apenas do namespace atual.
- Selecionar registros de todos os namespaces: envia registros de todos os namespaces (recomendado para visibilidade abrangente).
- Selecionar registros em namespaces específicos: envia registros de namespaces especificados. Clique em Adicionar item para adicionar nomes de namespaces.
No menu suspenso Configuração do receptor, selecione Receptor do bucket do GCP.
No campo Nome do bucket do GCP, insira o nome do bucket do GCS (por exemplo,
f5-dcs-logs).No menu suspenso Credenciais da nuvem do GCP, selecione as credenciais da nuvem que você criou antes (por exemplo,
gcp-chronicle-logs).Opcional: expanda Mostrar campos avançados para configurar opções de lote:
- Opções de tempo limite em lote: selecione Segundos de tempo limite e insira um valor (padrão:
300segundos). - Eventos máximos em lote: selecione Eventos máximos e insira um valor entre 32 e 2.000 (deixe em branco para não ter limite).
- Bytes do lote: selecione Bytes máximos e insira um valor entre 4.096 e 1.048.576 (padrão:
10485760bytes / 10 MB).
- Opções de tempo limite em lote: selecione Segundos de tempo limite e insira um valor (padrão:
Clique em Salvar e sair.
Testar a conexão
- Na lista Receptor de registros global, localize o receptor que você criou (por exemplo,
chronicle-gcs-receiver). - Clique nos três pontos (...) na coluna Ações.
- Selecione Testar conexão.
- Aguarde a conclusão do teste.
Uma mensagem indicando que a conexão foi estabelecida vai aparecer.
Verificar os registros no bucket do GCS
- Acesse Cloud Storage > Buckets no console do GCP.
- Clique no nome do bucket (por exemplo,
f5-dcs-logs). - Verifique se os arquivos de registro estão sendo criados no bucket.
O F5 Distributed Cloud organiza os registros na seguinte estrutura de pastas:
YYYY/MM/DD/HH/- Uma pasta é criada para cada dia (AAAA/MM/DD)
- Dentro de cada pasta de dia, uma subpasta é criada para cada hora (HH).
- A cada 5 minutos, novos arquivos gzip compactados são gravados na subpasta horária.
- Os arquivos estão no formato NDJSON (JSON delimitado por nova linha).
Clique em um arquivo gzip para baixar e inspecionar o formato do registro.
Recuperar a conta de serviço do Google SecOps
O Google SecOps usa uma conta de serviço exclusiva para ler dados do seu bucket do GCS. Você precisa conceder a essa conta de serviço acesso ao seu bucket.
Receber o e-mail da conta de serviço
- Acesse Configurações do SIEM > Feeds.
- Clique em Adicionar novo feed.
- Clique em Configurar um único feed.
- No campo Nome do feed, insira um nome para o feed (por exemplo,
F5 DCS Logs). - Selecione Google Cloud Storage V2 como o Tipo de origem.
- Selecione F5 Distributed Cloud Services como o Tipo de registro.
Clique em Receber conta de serviço. Um e-mail exclusivo da conta de serviço será exibido, por exemplo:
chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.comCopie esse endereço de e-mail para usar na próxima etapa.
Clique em Próxima.
Especifique valores para os seguintes parâmetros de entrada:
URL do bucket de armazenamento: insira o URI do bucket do GCS:
gs://f5-dcs-logs/Substitua
f5-dcs-logspelo nome do bucket do GCS.Opção de exclusão da fonte: selecione a opção de exclusão de acordo com sua preferência:
- Nunca: nunca exclui arquivos após as transferências (recomendado para testes).
- Excluir arquivos transferidos: exclui os arquivos após a transferência bem-sucedida.
Excluir arquivos transferidos e diretórios vazios: exclui arquivos e diretórios vazios após a transferência bem-sucedida.
Idade máxima do arquivo: inclui arquivos modificados nos últimos dias. O padrão é 180 dias.
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.
Conceder permissões do IAM à conta de serviço do Google SecOps
A conta de serviço do Google SecOps precisa do papel Leitor de objetos do Storage no seu bucket do GCS.
- Acesse Cloud Storage > Buckets.
- Clique no nome do bucket (por exemplo,
f5-dcs-logs). - Acesse a guia Permissões.
- Clique em Conceder acesso.
Informe os seguintes detalhes de configuração:
- Adicionar participantes: cole o e-mail da conta de serviço do Google SecOps.
- Atribuir papéis: selecione Leitor de objetos do Storage.
Clique em Salvar.
Tabela de mapeamento do UDM
| Campo de registro | Mapeamento do UDM | Lógica |
|---|---|---|
| _id | metadata.product_log_id | Valor copiado diretamente |
| src | principal.namespace | Valor copiado diretamente |
| kubernetes_labels_app | target.resource.attribute.labels | Mesclado de app_label (derivado de kubernetes_labels_app) |
| kubernetes_host | target.hostname | Valor copiado diretamente |
| kubernetes_container_name | target.resource.product_object_id | Valor copiado diretamente |
| bot_info.classification | security_result.detection_fields | Mesclado de bot_info_classification_label (derivado de bot_info.classification) |
| bot_info.name | security_result.detection_fields | Mesclado de bot_info_name_label (derivado de bot_info.name) |
| bot_info.type | security_result.detection_fields | Mesclado de bot_info_type_label (derivado de bot_info.type) |
| timestamp | @timestamp | Analisado usando o filtro de data com RFC3339, UNIX, ISO8601 |
| visitor_id | security_result.detection_fields | Unida de visitor_id_label (derivada de visitor_id) |
| tag | security_result.detection_fields | Mesclado de tag_label (derivado de tag) |
| ação | security_result.action | Definido como ALLOW se as correspondências permitirem e BLOCK se as correspondências negarem. |
| gravidade, | security_result.severity | Definido como "HIGH" se houver erro/aviso, "CRITICAL" se for crítico, "MEDIUM" se for um aviso e "LOW" se for uma informação. |
| gravidade, | security_result.severity_details | Valor copiado diretamente |
| api_endpoint | target.labels | Mesclado de "api_endpoint_label" (derivado de "api_endpoint") |
| app_firewall_name | principal.process.command_line | Valor copiado diretamente |
| app_type | security_result.detection_fields | Mesclado de about_app_type (derivado de app_type) |
| as_org | security_result.detection_fields | Mesclado de about_as_org (derivado de as_org) |
| asn | security_result.detection_fields | Mesclado de about_asn (derivado de asn) |
| kubernetes.pod_id | security_result.detection_fields | Mesclado de about_pod_id (derivado de kubernetes.pod_id) |
| kubernetes.pod_name | security_result.detection_fields | Mesclado de about_pod_name (derivado de kubernetes.pod_name) |
| latitude | principal.location.region_latitude | Convertido para ponto flutuante |
| longitude | principal.location.region_longitude | Convertido para ponto flutuante |
| req_params | additional.fields | Mesclado de about_req_params (derivado de req_params) |
| as_number | additional.fields | Unido de "about_as_number" (convertido para string de "as_number") |
| x_forwarded_for | intermediary.ip | Unidos se o IP for válido |
| x_forwarded_for | security_result.about.resource.attribute.labels | Unido de x_forwarded_for_label se não for IP |
| policy_hit.malicious_user_mitigate_action | security_result.detection_fields | Mesclado de malicious_user_label (derivado de policy_hit.malicious_user_mitigate_action) |
| policy_hit.policy | security_result.about.resource.attribute.labels | Mesclado de policy_label (derivado de policy_hit.policy) |
| policy_hit.policy_namespace | additional.fields | Mesclado de policy_namespace_label (derivado de policy_hit.policy_namespace) |
| policy_hit.policy_rule | security_result.rule_name | Valor copiado diretamente |
| policy_hit.policy_rule_description | security_result.description | Valor copiado diretamente |
| policy_hit.policy_set | target.resource.name | Valor copiado diretamente |
| policy_hit.result | additional.fields | Combinado de result_label (derivado de policy_hit.result) |
| vhost_id | security_result.detection_fields | Mesclado de vhostlabel (derivado de vhost_id) |
| ID da mensagem | security_result.detection_fields | Unido de messageid_label (derivado de messageid) |
| sec_event_name | security_result.detection_fields | Mesclado de sec_event_name_label (derivado de sec_event_name) |
| sec_event_type | security_result.detection_fields | Mesclado de "sec_event_type_label" (derivado de "sec_event_type") |
| vh_name | security_result.detection_fields | Unido de vhost_name_label (derivado de vh_name) |
| tls_fingerprint | security_result.detection_fields | Unido de "tls_fingerprint_label" (derivado de "tls_fingerprint") |
| tempo | additional.fields | Mesclado de time_label (derivado de tempo) |
| kubernetes.namespace_name | additional.fields | Mesclado de namespace_name_label (derivado de kubernetes.namespace_name) |
| src_instance | additional.fields | Mesclado de src_instance_label (derivado de src_instance) |
| violation_rating | additional.fields | Mesclado de "violation_rating_label" (derivado de "violation_rating") |
| req_size | additional.fields | Unido de "req_size_label" (convertido de "req_size" para string) |
| rsp_code | additional.fields | Mesclado de rsp_code_label (convertido para string de rsp_code) |
| rsp_code_class | additional.fields | Mesclado de rsp_code_class_label (convertido para string de rsp_code_class) |
| rsp_size | additional.fields | Unido de "rsp_size_label" (convertido para string de "rsp_size") |
| original_path | additional.fields | Mesclado de "original_path_label" (derivado de "original_path") |
| req_path | target.url | Valor copiado diretamente |
| req_headers_size | additional.fields | Mesclado de "req_headers_size_label" (derivado de "req_headers_size") |
| recommended_action | additional.fields | Mesclado de recommended_action_label (derivado de recommended_action) |
| enforcement_mode | additional.fields | Mesclado de "enforcement_mode_label" (derivado de "enforcement_mode") |
| src_ip | principal.ip, principal.asset.ip | Unidas se corresponderem à regex IPv4 |
| host | principal.ip, principal.asset.ip | Unidas se corresponderem à regex IPv4 |
| nome do host | principal.hostname, principal.asset.hostname | O valor é copiado diretamente se não estiver vazio ou |
| http_version | network.application_protocol_version | Valor copiado diretamente |
| http_version | network.application_protocol | Definido como HTTP se contiver HTTP, HTTPS se contiver HTTPS |
| rede | principal.nat_ip | Unidas se corresponderem à regex IPv4 |
| dst_ip | target.ip, target.asset.ip | Unidas se corresponderem à regex IPv4 |
| dst_port | target.port | Convertido para número inteiro |
| src_port | principal.port | Convertido para número inteiro |
| src_site | additional.fields | Mesclado de src_site_field (derivado de src_site) |
| site | additional.fields | Mesclado de site_field (derivado de site) |
| cluster_name | additional.fields | Unido de cluster_name_field (derivado de cluster_name) |
| domínio | principal.administrative_domain | Valor copiado diretamente |
| método | network.http.method | O valor é copiado diretamente se não estiver vazio ou for N/A |
| namespace | target.namespace | Valor copiado diretamente |
| cidade | principal.location.city | Valor copiado diretamente |
| stream | security_result.detection_fields | Unido de stream_label (derivado de stream) |
| região | principal.location.country_or_region | Valor copiado diretamente |
| usuário | principal.user.userid | Extraído do usuário usando o padrão grok para user_id |
| user_ip | target.ip, target.asset.ip | Unido de user_ip extraído |
| Cookie | additional.fields | Mesclado do cookie (derivado do cookie em req_headers) |
| X-F5-Request-Id | security_result.detection_fields | Unido de x_f5_request_id (derivado de X-F5-Request-Id em req_headers) |
| X-Request-Id | security_result.detection_fields | Unido de request_id (derivado de X-Request-Id em req_headers) |
| security_result | security_result | Mesclado diretamente |
| has_network, has_principal, has_target | metadata.event_type | Definido como NETWORK_CONNECTION se tudo for verdadeiro; STATUS_UPDATE se has_principal for verdadeiro; caso contrário, GENERIC_EVENT |
| metadata.vendor_name | Definido como "F5_DCS" | |
| metadata.product_name | Defina como "F5 DCS" | |
| intermediário | intermediário | Mesclado diretamente |
Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais do Google SecOps.