Coletar registros do F5 Shape
Este documento explica como ingerir registros do F5 Shape no Google Security Operations usando o Google Cloud Storage V2.
O Distributed Cloud Bot Defense da F5 (antigo Shape Security) protege aplicativos contra ataques automatizados identificando e reduzindo bots maliciosos. A Bot Defense usa JavaScript e SDKs nativos para dispositivos móveis para coletar telemetria de navegadores clientes e dispositivos móveis, examinando essa telemetria antes que as solicitações cheguem ao seu aplicativo. O serviço oferece painéis e relatórios integrados para visualizar informações detalhadas sobre o tráfego analisado, incluindo eventos de segurança, registros de acesso e registros de auditoria.
Antes de começar
Verifique se você atende aos seguintes pré-requisitos:
- Uma instância do Google SecOps
- Um projeto do GCP 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
- Uma conta do F5 Distributed Cloud com acesso ao serviço Multi-Cloud Network Connect ou Shared Configuration
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 globalmente exclusivo (por exemplo, f5-xc-logs).Tipo de local Escolha com base nas suas necessidades (região, birregião, multirregião). Local Selecione o local (por exemplo, us-central1).Classe de armazenamento Standard (recomendado para registros acessados com frequência). Controle de acesso Uniforme (recomendado). Ferramentas de proteção Opcional: ative o controle de versões de objetos ou a política de retenção. Clique em Criar.
Gerar credenciais da API F5 Shape
A F5 Distributed Cloud usa certificados de API (mTLS) ou tokens de API para autenticação. Os certificados de API são recomendados para aumentar a segurança.
Criar certificado de API
- Faça login no Console do F5 Distributed Cloud.
- Na página inicial do console, selecione Administração.
- No menu de navegação à esquerda, acesse Gerenciamento pessoal > Credenciais.
- Clique em Add Credentials (Adicionar credenciais).
- Na seção Metadados, insira um Nome para o certificado (por exemplo,
secops-integration). - Na lista Tipo de credencial, selecione Certificado da API.
- Insira uma Senha e confirme no campo Confirmar senha.
Selecione uma Data de expiração na lista de calendários.
Clique em Fazer o download para gerar e baixar o certificado no formato de arquivo
.p12.Salve o arquivo de certificado e a senha baixados em um lugar seguro para uso posterior.
Criar credenciais do Cloud do GCP na F5 Distributed Cloud
O F5 Distributed Cloud exige credenciais de conta de serviço Google Cloud para gravar registros no bucket do GCS.
Criar Google Cloud conta de serviço
- No Console do GCP, 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-xc-log-writer(ou o nome de sua preferência). - 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.
Conceder permissões do IAM no bucket do GCS
- Acesse Cloud Storage > Buckets.
- Clique no nome do bucket (por exemplo,
f5-xc-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-xc-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 chave da conta de serviço
- No Console do GCP, acesse IAM e administrador > Contas de serviço.
- Encontre e clique na conta de serviço (por exemplo,
f5-xc-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 será baixado automaticamente. Salve esse arquivo com segurança.
Adicionar Google Cloud credenciais da nuvem ao F5 Distributed Cloud
- No Console do F5 Distributed Cloud, na página inicial, selecione Multi-Cloud Network Connect ou Shared Configuration.
- No menu de navegação à esquerda, acesse Gerenciar > Gerenciamento de sites > Credenciais da nuvem.
- Clique em Adicionar credenciais da nuvem.
- Na seção Metadados, insira um Nome (por exemplo,
gcp-secops-logs). - Na lista Tipo de credenciais da nuvem, selecione Credenciais do GCP.
- Na seção Credenciais do GCP, clique em Configurar.
- Na seção Chave da conta de serviço:
- Na lista Tipo de secret, selecione Secret com máscara.
- Na lista Ação, selecione Blindfold New Secret.
- Na lista Tipo de política, selecione Integrada.
- No campo Secret to Blindfold, cole todo o conteúdo do arquivo de chave JSON que você baixou.
- Clique em Aplicar.
- Clique em Salvar e sair.
Configurar o receptor de registros global para o GCS
O receptor de registros globais do F5 Distributed Cloud transmite registros para o GCS a cada 5 minutos no formato NDJSON (JSON delimitado por nova linha).
Criar um receptor de registros global
- No Console do F5 Distributed Cloud, na página inicial, selecione Multi-Cloud Network Connect ou Shared Configuration.
- Para o Multi-Cloud Network Connect: acesse Gerenciar > Gerenciamento de registros > Receptor de registros global.
- Para Configuração compartilhada: acesse Gerenciar > Receptor de registros global.
- Clique em Adicionar receptor de registros global.
- Na seção Metadados, insira um Nome (por exemplo,
secops-gcs-receiver). - Se quiser, adicione Rótulos e uma Descrição.
Na lista Tipo de registro, selecione os tipos de registro que você quer coletar:
- Registros de solicitação: registros de acesso HTTP de balanceadores de carga
- Eventos de segurança: eventos de segurança da Bot Defense e do WAF.
- Registros de auditoria: registros de auditoria de configuração e administrativos
- Registros de solicitações DNS: registros de consultas DNS
Na lista Seleção de mensagens de registro:
- Se você estiver usando o serviço Multi-Cloud Network Connect, selecione Selecionar registros do namespace atual (namespace do sistema).
- Se você estiver usando o serviço Configuração compartilhada, escolha uma das seguintes opções:
- Selecionar registros do namespace atual: envia registros somente do namespace compartilhado.
- Selecionar registros de todos os namespaces: envia registros de todos os namespaces.
- Selecionar registros em namespaces específicos: insira nomes de namespaces específicos e clique em Adicionar item para adicionar mais.
Na lista Configuração do receptor, selecione Bucket do GCP.
Na seção Bucket do GCP, forneça a seguinte configuração:
- Nome do bucket do GCP: insira o nome do bucket do GCS (por exemplo,
f5-xc-logs). - Credenciais do GCP Cloud: na lista, selecione as credenciais da nuvem que você criou (por exemplo,
gcp-secops-logs).
- Nome do bucket do GCP: insira o nome do bucket do GCS (por exemplo,
Definir configurações avançadas (opcional)
- Clique no botão Mostrar campos avançados.
Na seção Opções de lote, configure o seguinte (opcional):
- Opções de tempo limite em lote: selecione Segundos de tempo limite e insira um valor (padrão:
300segundos). - Lote de eventos máximos: selecione Eventos máximos e insira um valor entre 32 e 2.000 (opcional).
- Bytes do lote: selecione Bytes máx. 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:
Concluir e testar a configuração
- Clique em Salvar e sair para criar o receptor de registros global.
- Na lista Receptor de registros global, encontre seu receptor (por exemplo,
secops-gcs-receiver). - Na coluna Ações, clique nos três pontos ... e selecione Testar conexão.
Aguarde a conclusão do teste. Uma mensagem de sucesso indica que a conexão está funcionando.
Verifique se os registros estão sendo gravados no GCS:
- Acesse Cloud Storage > Buckets no console do GCP.
- Clique no nome do bucket (por exemplo,
f5-xc-logs). - Em 5 a 10 minutos, você vai ver pastas criadas com a seguinte estrutura:
- Pasta diária:
YYYY-MM-DD/ - Subpasta por hora:
YYYY-MM-DD/HH/ - Arquivos de registro:
YYYY-MM-DD/HH/logs_YYYYMMDDHHMMSS.ndjson.gz
- Pasta diária:
Configurar a lista de permissões do firewall
O F5 Distributed Cloud exige que intervalos de IP específicos sejam permitidos no firewall para a entrega de registros.
Adicione os seguintes intervalos de endereços IP à lista de permissões do firewall:
193.16.236.64/29185.160.8.152/29
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 Distributed Cloud Bot Defense). - Selecione Google Cloud Storage V2 como o Tipo de origem.
- Selecione F5_SHAPE 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:
secops-12345678@secops-gcp-prod.iam.gserviceaccount.comCopie o 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 com o caminho do prefixo:
gs://f5-xc-logs/- Substitua
f5-xc-logspelo nome real do bucket do GCS. - Se você configurou um prefixo específico no receptor de registros global, inclua-o no caminho (por exemplo,
gs://f5-xc-logs/bot-defense/).
- Substitua
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 de Leitor de objetos do Storage no seu bucket do GCS.
- Acesse Cloud Storage > Buckets.
- Clique no nome do bucket (por exemplo,
f5-xc-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 do UDM
| Campo de registro | Mapeamento do UDM | Lógica |
|---|---|---|
| msg.requestHeaders.Proxy-Client-IP, msg.requestHeaders.WF-Forwarded-For, msg.requestHeaders.X-Forwarded-For, msg.requestHeaders.wl-proxy-client-ip, msg.hashedUserAgent, msg.transactionId, msg.hashedUsername, msg.dcgShapeFailedOn, ShapeShifterId, eventType, eventId, latRequest, latResponse, latTotal, latRspWait, count, latEccWait | additional.fields | Mesclados de rótulos criados com base em vários campos |
| intermediário | intermediário | O valor é copiado diretamente se não estiver vazio. |
| descrição | metadata.description | Valor copiado diretamente |
| target, has_principal_machine | metadata.event_type | Definido como NETWORK_HTTP se target != "", caso contrário, STATUS_UPDATE se has_principal_machine == true, caso contrário, GENERIC_EVENT |
| app | network.application_protocol | Valor em maiúsculas |
| requestMethod, msg.method | network.http.method | Valor de requestMethod se não estiver vazio, caso contrário, msg.method |
| requestClientApplication, msg.requestHeaders.User-Agent | network.http.parsed_user_agent | Valor de requestClientApplication se não estiver vazio. Caso contrário, msg.requestHeaders.User-Agent, convertido para user agent analisado. |
| requestContext, msg.requestHeaders.Referer | network.http.referral_url | Valor de requestContext se não estiver vazio. Caso contrário, msg.requestHeaders.Referer. |
| msg.sseResponseCode, prCode | network.http.response_code | Valor de msg.sseResponseCode se não estiver vazio, caso contrário, prCode, convertido em número inteiro. |
| requestClientApplication, msg.requestHeaders.User-Agent | network.http.user_agent | Valor de requestClientApplication se não estiver vazio. Caso contrário, msg.requestHeaders.User-Agent. |
| requestHeader.x-shape-src-virtual | observer.ip | Valor copiado diretamente |
| participante | participante | Valor copiado diretamente |
| msg.host | principal.asset.hostname | Valor copiado diretamente |
| src, msg.src, msg.trueClientIP, requestHeader.X-Forwarded-For | principal.asset.ip | Valor de src se não estiver vazio, caso contrário, msg.src, msg.trueClientIP ou o primeiro IP de X-Forwarded-For se != src |
| msg.host | principal.hostname | Valor copiado diretamente |
| src, msg.src, msg.trueClientIP, requestHeader.X-Forwarded-For | principal.ip | Valor de src se não estiver vazio, caso contrário, msg.src, msg.trueClientIP ou o primeiro IP de X-Forwarded-For se != src |
| msg.requestHeaders | principal.resource.attribute.labels | Unidos de pares de chave-valor em msg.requestHeaders |
| msg.uri | principal.url | Valor copiado diretamente |
| security_result | security_result | Valor copiado diretamente |
| deviceExternalId | security_result.about.asset_id | Valor copiado diretamente |
| flowLabel, agentLabel, requestHeader.Content-Length, requestHeader.Content-Type, requestHeader.Accept, requestHeader.Accept-Encoding, browserType, accountInfo, requestHeader.Via, asn, tid, ctag, requestHeader.Cache-Control, transactionResult | security_result.about.labels | Mesclados de rótulos criados com base em vários campos |
| act, msg.transactionResult | security_result.action | Definido como ALLOW se act corresponder a PASS e isAttack, caso contrário, UNKNOWN_ACTION; ou ALLOW se msg.transactionResult == Success, BLOCK se Failure |
| act, msg.transactionResult | security_result.action_details | Valor da ação, se não estiver vazio. Caso contrário, msg.transactionResult. |
| gravidade, | security_result.severity | Definido como HIGH se estiver em Error, error, warning; CRITICAL se corresponder a critical; MEDIUM se notice; LOW se estiver em information, info, INFO |
| gravidade, | security_result.severity_details | Valor copiado diretamente |
| attackCause | security_result.threat_name | Valor copiado diretamente |
| target | target | Valor copiado diretamente |
| appName | target.application | Valor copiado diretamente |
| dst, msg.dst | target.asset.ip | Valor de dst se não estiver vazio, caso contrário, msg.dst |
| dhost | target.hostname | Valor copiado diretamente |
| dst, msg.dst | target.ip | Valor de dst se não estiver vazio, caso contrário, msg.dst |
| countryName | target.location.country_or_region | Valor copiado diretamente |
| dpt | target.port | Convertido para número inteiro |
| msg.responseHeaders | target.resource.attribute.labels | Unidos de pares de chave-valor em msg.responseHeaders |
| solicitação | target.url | Valor copiado diretamente |
| requestHeader.X-Forwarded-For | intermediary.ip | Definido como IPs subsequentes da matriz X-Forwarded-For |
| metadata.product_name | Definido como "Forma" | |
| metadata.vendor_name | Defina como "F5" |
Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais do Google SecOps.