Coletar registros dos serviços do F5 Distributed Cloud

Compatível com:

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.

  1. Acesse o Console do Google Cloud.
  2. Selecione seu projeto ou crie um novo.
  3. No menu de navegação, acesse Cloud Storage > Buckets.
  4. Clique em Criar bucket.
  5. 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
  6. Clique em Criar.

Configurar o F5 Distributed Cloud para exportar para o GCS

Adicionar bucket do GCS à lista de permissões do firewall

  1. 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/29
    • 185.160.8.152/29
  2. 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

  1. No console do Google Cloud, acesse IAM e administrador > Contas de serviço.
  2. Clique em Criar conta de serviço.
  3. 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
  4. Clique em Criar e continuar.

  5. Na seção Conceda a essa conta de serviço acesso ao projeto:

    1. Clique em Selecionar papel.
    2. Pesquise e selecione Administrador de objetos do Storage.
  6. Clique em Continuar.

  7. Clique em Concluído.

Criar uma chave de conta de serviço

  1. Na lista Contas de serviço, clique na conta de serviço que você criou (por exemplo, f5-dcs-log-writer).
  2. Acesse a guia Chaves.
  3. Clique em Adicionar chave > Criar nova chave.
  4. Selecione JSON como o tipo de chave.
  5. Clique em Criar.
  6. O download do arquivo de chave JSON é feito no seu computador.
  7. Salve esse arquivo com segurança. Você vai precisar dele nas próximas etapas.

Conceder permissões do IAM no bucket do GCS

  1. Acesse Cloud Storage > Buckets.
  2. Clique no nome do bucket (por exemplo, f5-dcs-logs).
  3. Acesse a guia Permissões.
  4. Clique em Conceder acesso.
  5. 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.
  6. Clique em Salvar.

Criar credenciais do Google Cloud no console do F5 Distributed Cloud

  1. Faça login no console do F5 Distributed Cloud em https://<tenant>.console.ves.volterra.io.
  2. Selecione o serviço Multi-Cloud Network Connect na página inicial.
  3. Acesse Gerenciar > Gerenciamento de sites > Credenciais da nuvem.
  4. Clique em Adicionar credenciais da nuvem.
  5. 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
  6. Na seção Tipo de credenciais da nuvem, selecione Credenciais do GCP.
  7. Clique em Configurar no campo Credenciais do GCP.
  8. No menu suspenso Tipo de credencial, selecione Arquivo de credenciais da conta de serviço.
  9. Clique em Fazer upload do arquivo e selecione o arquivo da chave JSON baixado nas etapas anteriores.
  10. Clique em Aplicar.
  11. Clique em Salvar e sair.

Criar um receptor de registros global

  1. No console do F5 Distributed Cloud, verifique se você está no serviço Multi-Cloud Network Connect.
  2. Acesse Gerenciar > Gerenciamento de registros > Receptor global de registros.
  3. Clique em Adicionar receptor de registros global.
  4. 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
  5. 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
  6. 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.
  7. No menu suspenso Configuração do receptor, selecione Receptor do bucket do GCP.

  8. No campo Nome do bucket do GCP, insira o nome do bucket do GCS (por exemplo, f5-dcs-logs).

  9. No menu suspenso Credenciais da nuvem do GCP, selecione as credenciais da nuvem que você criou antes (por exemplo, gcp-chronicle-logs).

  10. 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: 300 segundos).
    • 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: 10485760 bytes / 10 MB).
  11. Clique em Salvar e sair.

Testar a conexão

  1. Na lista Receptor de registros global, localize o receptor que você criou (por exemplo, chronicle-gcs-receiver).
  2. Clique nos três pontos (...) na coluna Ações.
  3. Selecione Testar conexão.
  4. Aguarde a conclusão do teste.
  5. Uma mensagem indicando que a conexão foi estabelecida vai aparecer.

Verificar os registros no bucket do GCS

  1. Acesse Cloud Storage > Buckets no console do GCP.
  2. Clique no nome do bucket (por exemplo, f5-dcs-logs).
  3. Verifique se os arquivos de registro estão sendo criados no bucket.
  4. 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).
  5. 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

  1. Acesse Configurações do SIEM > Feeds.
  2. Clique em Adicionar novo feed.
  3. Clique em Configurar um único feed.
  4. No campo Nome do feed, insira um nome para o feed (por exemplo, F5 DCS Logs).
  5. Selecione Google Cloud Storage V2 como o Tipo de origem.
  6. Selecione F5 Distributed Cloud Services como o Tipo de registro.
  7. 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.com
    
  8. Copie esse endereço de e-mail para usar na próxima etapa.

  9. Clique em Próxima.

  10. 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-logs pelo 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

  11. Clique em Próxima.

  12. 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.

  1. Acesse Cloud Storage > Buckets.
  2. Clique no nome do bucket (por exemplo, f5-dcs-logs).
  3. Acesse a guia Permissões.
  4. Clique em Conceder acesso.
  5. 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.
  6. 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.