Coletar registros dos serviços do F5 Distributed Cloud
Versão do analisador:6.0
Este documento explica como ingerir registros dos serviços F5 Distributed Cloud Services 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 na nuvem do Google Cloud com a API Storage ativada
- Permissões para criar e gerenciar intervalos 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 ou crie um projeto.
- 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 globalmente exclusivo, por exemplo, f5-dcs-logs.Tipo de local Escolha de acordo com 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 Conceder acesso a essa conta de serviço 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 arquivo de chave JSON é baixado 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ções: 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, escolha 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 anteriormente (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). - Máximo de eventos em lote: selecione Máximo de eventos 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 4096 e 1048576 (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 Serviços de nuvem distribuída F5 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 seu 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.
Excluir arquivos transferidos e diretórios vazios: exclui arquivos e diretórios vazios após a transferência.
Idade máxima do arquivo: inclua arquivos modificados no último número de 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 principais: 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 de 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 RFC 3339, UNIX, ISO8601 |
| visitor_id | security_result.detection_fields | Unido de visitor_id_label (derivado de visitor_id) |
| tag | security_result.detection_fields | Mesclado de tag_label (derivado de tag) |
| ação | security_result.action | Definido como ALLOW se houver correspondência com permissão, BLOCK se houver correspondência com negação |
| gravidade, | security_result.severity | Definido como "ALTA" se houver erro/aviso; "CRÍTICA" se for crítica; "MÉDIA" se for um aviso; "BAIXA" 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 em ponto flutuante |
| longitude | principal.location.region_longitude | Convertido em ponto flutuante |
| req_params | additional.fields | Mesclado de about_req_params (derivado de req_params) |
| as_number | additional.fields | Mesclado 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 | Unido de policy_label (derivado de policy_hit.policy) |
| policy_hit.policy_namespace | additional.fields | Unido 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 | Mesclado 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 | Mesclado de tls_fingerprint_label (derivado de tls_fingerprint) |
| tempo | additional.fields | Mesclado de time_label (derivado de time) |
| 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 para string de req_size) |
| 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 | Mesclado 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 | Unido 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 | 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 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 | Unido do cookie (derivado de "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 |
rsp_size |
event.idm.read_only_udm.network.received_bytes |
Mapeado do registro de mudanças |
dst |
event.idm.read_only_udm.target.ip e event.idm.read_only_udm.target.asset.ip |
Mapeado do registro de mudanças |
has_sec_event |
event.idm.read_only_udm.additional.fields |
Mapeado do registro de mudanças |
app |
event.idm.read_only_udm.target.application |
Mapeado do registro de mudanças |
node_id |
event.idm.read_only_udm.additional.fields |
Mapeado do registro de mudanças |
sample_rate |
event.idm.read_only_udm.additional.fields |
Mapeado do registro de mudanças |
time_to_first_downstream_tx_byte |
event.idm.read_only_udm.additional.fields |
Mapeado do registro de mudanças |
time_to_first_upstream_rx_byte |
event.idm.read_only_udm.additional.fields |
Mapeado do registro de mudanças |
time_to_first_upstream_tx_byte |
event.idm.read_only_udm.additional.fields |
Mapeado do registro de mudanças |
time_to_last_downstream_tx_byte |
event.idm.read_only_udm.additional.fields |
Mapeado do registro de mudanças |
time_to_last_rx_byte |
event.idm.read_only_udm.additional.fields |
Mapeado do registro de mudanças |
time_to_last_upstream_rx_byte |
event.idm.read_only_udm.additional.fields |
Mapeado do registro de mudanças |
time_to_last_upstream_tx_byte |
event.idm.read_only_udm.additional.fields |
Mapeado do registro de mudanças |
timeseries_enabled |
event.idm.read_only_udm.additional.fields |
Mapeado do registro de mudanças |
sni |
event.idm.read_only_udm.additional.fields |
Mapeado do registro de mudanças |
terminated_time |
event.idm.read_only_udm.additional.fields |
Mapeado do registro de mudanças |
rtt_downstream_seconds |
event.idm.read_only_udm.additional.fields |
Mapeado do registro de mudanças |
rtt_upstream_seconds |
event.idm.read_only_udm.additional.fields |
Mapeado do registro de mudanças |
rsp_code_details |
event.idm.read_only_udm.additional.fields |
Mapeado do registro de mudanças |
authority |
event.idm.read_only_udm.additional.fields |
Mapeado do registro de mudanças |
connected_time |
event.idm.read_only_udm.additional.fields |
Mapeado do registro de mudanças |
req_id |
event.idm.read_only_udm.additional.fields |
Mapeado do registro de mudanças |
proxy_type |
event.idm.read_only_udm.additional.fields |
Mapeado do registro de mudanças |
vh_type |
event.idm.read_only_udm.additional.fields |
Mapeado do registro de mudanças |
dst_instance |
event.idm.read_only_udm.additional.fields |
Mapeado do registro de mudanças |
lb_port |
event.idm.read_only_udm.additional.fields |
Mapeado do registro de mudanças |
mtls |
event.idm.read_only_udm.additional.fields |
Mapeado do registro de mudanças |
ja4_tls_fingerprint |
event.idm.read_only_udm.additional.fields |
Mapeado do registro de mudanças |
duration_with_data_tx_delay |
event.idm.read_only_udm.additional.fields |
Mapeado do registro de mudanças |
dst_site |
event.idm.read_only_udm.additional.fields |
Mapeado do registro de mudanças |
protocol and scheme |
event.idm.read_only_udm.network.application_protocol |
Mapeado do registro de mudanças |
referer |
event.idm.read_only_udm.network.http.referral_url |
Mapeado do registro de mudanças |
tls_cipher_suite |
event.idm.read_only_udm.network.tls.cipher |
Mapeado do registro de mudanças |
tls_version |
event.idm.read_only_udm.network.tls.version |
Mapeado do registro de mudanças |
user_agent |
event.idm.read_only_udm.network.http.user_agent |
Mapeado do registro de mudanças |
user_agent |
event.idm.read_only_udm.network.http.parsed_user_agent |
Mapeado do registro de mudanças |
browser_type |
event.idm.read_only_udm.principal.browser.browser_type |
Mapeado do registro de mudanças |
content-type |
event.idm.read_only_udm.principal.process.file.mime_type |
Mapeado do registro de mudanças |
response_flags |
security_result.detection_fields |
Mapeado do registro de mudanças |
original_authority |
event.idm.read_only_udm.target.administrative_domain |
Mapeado do registro de mudanças |
country |
event.idm.read_only_udm.principal.location.country_or_region |
Mapeado do registro de mudanças |
Registro de alterações
Ver o registro de alterações deste analisador
Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais do Google SecOps.