Coletar registros do Cloudflare
Este documento explica como ingerir registros do Cloudflare no Google Security Operations usando webhook (destino HTTP) ou o Google Cloud Storage. O Cloudflare gera dados operacionais na forma de registros para DNS, HTTP, auditoria, Zero Trust e CASB. Com essa integração, é possível enviar esses registros ao Google SecOps para análise e monitoramento. O analisador primeiro inicializa um conjunto de campos vazios e depois analisa os registros do Cloudflare formatados em JSON, descartando as mensagens que não são JSON válidos. Em seguida, o código usa uma lógica condicional com base na presença e nos valores de campos específicos para determinar o produto e o tipo de evento do Cloudflare, preenchendo os campos do modelo de dados unificado (UDM) de acordo.
Antes de começar
Verifique se você tem os pré-requisitos a seguir:
- Instância do Google SecOps.
- Conta do Cloudflare Enterprise com o LogPush ativado.
- Para o método webhook: acesso privilegiado ao console Google Cloud .
- Para o método do Google Cloud Storage: acesso privilegiado ao Google Cloud Storage.
Método 1: configurar a exportação de registros do Cloudflare usando webhook (destino HTTP)
Esse método permite transmitir registros do Cloudflare diretamente para o Google SecOps sem armazenamento intermediário.
Configurar um feed de webhook no Google SecOps
- Acesse Configurações do SIEM > Feeds.
- Clique em Adicionar novo.
- No campo Nome do feed, insira um nome para o feed (por exemplo,
Cloudflare Webhook
). - Selecione Webhook como o Tipo de origem.
- Selecione Cloudflare como o Tipo de registro.
- Clique em Próxima.
- Especifique valores para os seguintes parâmetros de entrada:
- Delimitador de divisão:
\n
. - Namespace do recurso: o namespace do recurso.
- Rótulos de ingestão: o rótulo a ser aplicado aos eventos deste feed.
- Delimitador de divisão:
- Clique em Próxima.
- Revise a nova configuração do feed na tela Finalizar e clique em Enviar.
- Clique em Gerar chave secreta para autenticar o feed.
- Copie e salve a chave secreta, porque não será possível conferir esse Secret novamente.
- Acesse a guia Detalhes.
- Copie o URL do endpoint do feed no campo Informações do endpoint.
- Clique em Concluído.
Criar uma chave de API para o feed do webhook
- Acesse Google Cloud console > APIs e serviços > Credenciais.
- Clique em Criar credenciais e, em seguida, selecione Chave de API.
- Clique em Editar chave de API.
- Em Restrições de API, selecione Restringir chave.
- Selecione API Google SecOps na lista.
- Clique em Salvar.
- Copie o valor da chave de API.
Configurar o destino HTTP do LogPush do Cloudflare
- Faça login no painel do Cloudflare.
- Selecione a conta empresarial ou o domínio que você quer usar com o LogPush.
- Acesse Análise e registros > Logpush.
- Clique em Criar um job de Logpush.
- Em Selecionar um destino, escolha Destino HTTP.
Insira o URL do endpoint HTTP com parâmetros de autenticação:
<ENDPOINT_URL>?header_X-goog-api-key=<API_KEY>&header_X-Webhook-Access-Key=<SECRET_KEY>
Substitua:
<ENDPOINT_URL>
: o URL do endpoint de feed do Google SecOps.<API_KEY>
: a chave de API do console Google Cloud (codificada por URL se contiver caracteres especiais).<SECRET_KEY>
: a chave secreta do feed de webhook (codificada por URL se contiver caracteres especiais).
Clique em Continuar.
Selecione o conjunto de dados a ser enviado (por exemplo, Solicitações HTTP, DNS, Auditoria, Confiança zero, CASB).
Configure o job logpush:
- Digite o Nome do job.
- Opcional: em Se os registros corresponderem, configure os filtros.
- Em Enviar os seguintes campos, selecione os campos que você quer incluir.
- Escolha o formato do carimbo de data/hora (RFC3 339 recomendado).
- Configure a taxa de amostragem, se necessário.
Clique em Enviar para criar o job logpush.
Verificar a integração do webhook
Após a configuração, os registros vão aparecer no Google SecOps em alguns minutos. Para verificar:
- Acesse Investigação > Pesquisa do SIEM.
- Pesquise registros com o rótulo de ingestão configurado.
- Confirme se os registros do Cloudflare estão sendo analisados corretamente.
Método 2: configurar a exportação de registros do Cloudflare usando o Google Cloud Storage
Configure o Cloudflare para enviar registros a ele, o que envolve conceder ao Cloudflare as permissões necessárias.
Criar um Google Cloud Bucket
- Faça login no console doGoogle Cloud .
- Acesse a página Buckets do Cloud Storage.
- Clique em Criar.
- Na página Criar um bucket, insira as informações do bucket:
- Nome: insira um nome exclusivo que atenda aos requisitos de nomenclatura de bucket (por exemplo,
cloudflare-data
). - Tipo de local: selecione um tipo de local e uma região.
- Para ativar o namespace hierárquico, clique na seta de expansão para abrir Otimizar para cargas de trabalho orientadas a arquivos e com uso intensivo de dados e selecione Ativar namespace hierárquico neste bucket.
- Nome: insira um nome exclusivo que atenda aos requisitos de nomenclatura de bucket (por exemplo,
- Clique em Criar.
Conceder permissões ao bucket
- No console do Cloud Storage, selecione o bucket que você criou anteriormente.
- Clique na guia Permissões.
- Clique em Conceder acesso.
- Adicione a conta
logpush@cloudflare-data.iam.gserviceaccount.com
com a permissão Administrador de objetos do Storage. - Clique em Salvar.
Configurar o LogPush do Cloudflare para o Google Cloud Storage
- Faça login no painel do Cloudflare.
- Selecione a conta empresarial ou o domínio que você quer usar com o LogPush.
- Acesse Análise e registros > Logpush.
- Clique em Criar um job de Logpush.
- Em Selecionar um destino, escolha Google Cloud Storage.
- Insira o caminho do bucket do Google Cloud Storage (por exemplo,
gs://cloudflare-data/logs/
). Clique em Continuar.
Insira o token de propriedade e clique em Continuar.
Selecione o conjunto de dados a ser enviado para o armazenamento.
Configure o job logpush:
- Digite o Nome do job.
- Em Se os registros corresponderem, selecione os eventos que você quer incluir ou remover dos registros.
- Em Enviar os seguintes campos, escolha quais registros enviar.
- Escolha o formato do carimbo de data/hora (RFC 339 recomendado).
- Configure a taxa de amostragem, se necessário.
Clique em Enviar.
Configurar um feed no Google SecOps para ingerir registros do Cloudflare do Google Cloud Storage
- Acesse Configurações do SIEM > Feeds.
- Clique em Adicionar novo.
- No campo Nome do feed, insira um nome para o feed (por exemplo,
Cloudflare GCS Logs
). - Selecione Google Cloud Storage V2 como o Tipo de origem.
- Selecione Cloudflare como o Tipo de registro.
- Clique em Receber conta de serviço.
- Clique em Próxima.
Especifique valores para os seguintes parâmetros de entrada:
- URI do bucket de armazenamento: Google Cloud URL do bucket no formato
gs://my-bucket/<value>/
. O URL precisa terminar com uma barra (/). - Opções de exclusão de fontes: selecione a opção de exclusão de acordo com sua preferência.
- Idade máxima do arquivo: inclui arquivos modificados no último número de dias. O padrão é de 180 dias.
- Namespace do recurso: o namespace do recurso.
- Rótulos de ingestão: o rótulo a ser aplicado aos eventos deste feed.
- URI do bucket de armazenamento: Google Cloud URL do bucket no formato
Clique em Próxima.
Revise a nova configuração do feed na tela Finalizar e clique em Enviar.
Tabela de mapeamento do UDM
Campo de registro | Mapeamento do UDM | Lógica |
---|---|---|
ClientIP | read_only_udm.principal.asset.ip read_only_udm.principal.ip |
O valor é extraído do campo "ClientIP". |
ClientRequestHost | read_only_udm.target.asset.hostname read_only_udm.target.hostname |
O valor é extraído do campo "ClientRequestHost". |
ClientRequestMethod | read_only_udm.network.http.method | O valor é extraído do campo "ClientRequestMethod". |
ClientRequestURI | read_only_udm.target.url | O valor é extraído do campo "ClientRequestURI". Se o campo "ClientRequestHost" não estiver vazio, o valor será concatenado com ele. |
ClientSrcPort | read_only_udm.principal.port | O valor é extraído do campo "ClientSrcPort". |
ClientRequestUserAgent | read_only_udm.network.http.user_agent | O valor é extraído do campo "ClientRequestUserAgent". |
ClientSSLCipher | read_only_udm.network.tls.cipher | O valor é extraído do campo "ClientSSLCipher". |
ClientSSLProtocol | read_only_udm.network.tls.version | O valor é extraído do campo "ClientSSLProtocol". |
País | read_only_udm.target.location.country_or_region | O valor é extraído do campo "País". |
CreatedAt | read_only_udm.metadata.event_timestamp | O valor é extraído do campo "CreatedAt". |
Data/hora | read_only_udm.metadata.event_timestamp | O valor é extraído do campo "Data e hora". |
DestinationIP | read_only_udm.target.asset.ip read_only_udm.target.ip |
O valor é extraído do campo "DestinationIP". |
DestinationPort | read_only_udm.target.port | O valor é extraído do campo "DestinationPort". |
DeviceID | read_only_udm.principal.asset_id | O valor é extraído do campo "DeviceID" e tem o prefixo "Cloudflare:". |
DeviceName | read_only_udm.principal.asset.hostname read_only_udm.principal.hostname |
O valor é retirado do campo "DeviceName". |
DstIP | read_only_udm.target.asset.ip read_only_udm.target.ip |
O valor é extraído do campo "DstIP". |
DstPort | read_only_udm.target.port | O valor é extraído do campo "DstPort". |
EdgeResponseBytes | read_only_udm.network.received_bytes | O valor é extraído do campo "EdgeResponseBytes". |
EdgeResponseStatus | read_only_udm.network.http.response_code | O valor é extraído do campo "EdgeResponseStatus". |
EdgeServerIP | read_only_udm.target.asset.ip read_only_udm.target.ip |
O valor é extraído do campo "EdgeServerIP". |
read_only_udm.principal.user.email_addresses read_only_udm.target.user.email_addresses |
O valor é extraído do campo "E-mail". | |
FirewallMatchesActions | read_only_udm.security_result.action | O valor é definido como "ALLOW" se o campo "FirewallMatchesAction" for "allow", "Allow", "ALLOW", "skip", "SKIP" ou "Skip"; "ALLOW_WITH_MODIFICATION" se o campo "FirewallMatchesAction" for "challengeSolved" ou "jschallengeSolved"; "BLOCK" se o campo "FirewallMatchesAction" for "drop" ou "block"; "UNKNOWN_ACTION" se o campo "FirewallMatchesAction" não estiver vazio. |
FirewallMatchesRuleIDs | read_only_udm.security_result.rule_id | O valor é extraído do campo "FirewallMatchesRuleIDs". |
FirewallMatchesSources | read_only_udm.security_result.rule_name | O valor é extraído do campo "FirewallMatchesSources". |
HTTPMethod | read_only_udm.network.http.method | O valor é extraído do campo "HTTPMethod". |
HTTPHost | read_only_udm.target.hostname | O valor é extraído do campo HTTPHost. |
HTTPVersion | read_only_udm.network.application_protocol | O valor é extraído do campo "HTTPVersion". Se o valor contiver "HTTP", ele será substituído por "HTTP". |
IPAddress | read_only_udm.target.asset.ip read_only_udm.target.ip |
O valor é extraído do campo "IPAddress". |
IsIsolated | read_only_udm.about.labels read_only_udm.security_result.about.resource.attribute.labels |
O valor é extraído do campo "IsIsolated" e convertido em uma string. |
Local | read_only_udm.principal.location.name | O valor é extraído do campo "Local". |
OriginIP | read_only_udm.intermediary.ip read_only_udm.target.asset.ip read_only_udm.target.ip |
O valor é extraído do campo "OriginIP". |
OriginPort | read_only_udm.target.port | O valor é extraído do campo "OriginPort". |
OwnerID | read_only_udm.target.user.product_object_id | O valor é extraído do campo "OwnerID". |
Política | read_only_udm.security_result.rule_name | O valor é extraído do campo "Política". |
PolicyID | read_only_udm.security_result.rule_id | O valor é extraído do campo "PolicyID". |
PolicyName | read_only_udm.security_result.rule_name | O valor é extraído do campo "PolicyName". |
Protocolo | read_only_udm.network.ip_protocol | O valor é extraído do campo "Protocolo" e convertido para maiúsculas. |
QueryCategoryIDs | read_only_udm.security_result.about.labels read_only_udm.security_result.about.resource.attribute.labels |
O valor é extraído do campo "QueryCategoryIDs". |
QueryName | read_only_udm.network.dns.questions.name | O valor é extraído do campo "QueryName". |
QueryNameReversed | read_only_udm.network.dns.questions.name | O valor é extraído do campo "QueryNameReversed". |
QuerySize | read_only_udm.network.sent_bytes | O valor é extraído do campo "QuerySize". |
QueryType | read_only_udm.network.dns.questions.type | O valor é extraído do campo "QueryType". Se o valor for um dos tipos de registro DNS conhecidos, ele será mapeado para o valor numérico correspondente. Caso contrário, o valor é convertido em uma string. |
RData | read_only_udm.network.dns.answers | O valor é extraído do campo RData. O campo "type" é convertido em um número inteiro sem sinal. |
RayID | read_only_udm.metadata.product_log_id | O valor é extraído do campo "RayID". |
Referenciador | read_only_udm.network.http.referral_url | O valor é extraído do campo "Referer". |
RequestID | read_only_udm.metadata.product_log_id | O valor é extraído do campo RequestID. |
ResolverDecision | read_only_udm.security_result.summary | O valor é extraído do campo "ResolverDecision". |
ResourceID | read_only_udm.target.resource.id read_only_udm.target.resource.product_object_id |
O valor é extraído do campo "ResourceID". |
ResourceType | read_only_udm.target.resource.resource_subtype | O valor é extraído do campo "ResourceType". |
SNI | read_only_udm.network.tls.client.server_name | O valor é extraído do campo SNI. |
SecurityAction | read_only_udm.security_result.action | O valor é definido como "ALLOW" se o campo "SecurityAction" ou "sec_action" estiver vazio, "ALLOW_WITH_MODIFICATION" se o campo "SecurityAction" for "challengeSolved" ou "jschallengeSolved", e "BLOCK" se o campo "SecurityAction" for "drop" ou "block". |
SecurityLevel | read_only_udm.security_result.severity | O valor é extraído do campo "SecurityLevel" e mapeado para o valor de gravidade correspondente do UDM. |
SessionID | read_only_udm.network.session_id | O valor é extraído do campo "SessionID". |
SessionStartTime | read_only_udm.metadata.event_timestamp | O valor é extraído do campo "SessionStartTime". |
SourceIP | read_only_udm.principal.asset.ip read_only_udm.principal.ip read_only_udm.src.asset.ip read_only_udm.src.ip |
O valor é extraído do campo "SourceIP". |
SourcePort | read_only_udm.principal.port read_only_udm.src.port |
O valor é extraído do campo "SourcePort". |
SrcIP | read_only_udm.principal.asset.ip read_only_udm.principal.ip |
O valor é extraído do campo "SrcIP". |
SrcPort | read_only_udm.principal.port | O valor é extraído do campo "SrcPort". |
TemporaryAccessDuration | read_only_udm.network.session_duration.seconds | O valor é extraído do campo "TemporaryAccessDuration". |
Carimbo de data/hora | read_only_udm.metadata.event_timestamp | O valor é extraído do campo "Timestamp". |
Transporte | read_only_udm.network.ip_protocol | O valor é extraído do campo "Transporte" e convertido para maiúsculas. |
URL | read_only_udm.target.url | O valor é extraído do campo "URL". |
UserAgent | read_only_udm.network.http.user_agent | O valor é extraído do campo UserAgent. |
UserID | read_only_udm.principal.user.product_object_id | O valor é extraído do campo "UserID". |
UserUID | read_only_udm.target.user.product_object_id | O valor é extraído do campo UserUID. |
VirtualNetworkID | read_only_udm.principal.resource.product_object_id | O valor é extraído do campo "VirtualNetworkID". |
WAFAction | read_only_udm.security_result.about.labels read_only_udm.security_result.about.resource.attribute.labels |
O valor é extraído do campo "WAFAction". |
WAFAttackScore | read_only_udm.security_result.about.resource.attribute.labels | O valor é extraído do campo "WAFAttackScore". |
WAFFlags | read_only_udm.security_result.about.resource.attribute.labels | O valor é extraído do campo WAFFlags. |
WAFProfile | read_only_udm.security_result.about.labels read_only_udm.security_result.about.resource.attribute.labels |
O valor é extraído do campo "WAFProfile". |
WAFRCEAttackScore | read_only_udm.security_result.about.resource.attribute.labels | O valor é extraído do campo "WAFRCEAttackScore". |
WAFRuleID | read_only_udm.security_result.about.labels read_only_udm.security_result.about.resource.attribute.labels read_only_udm.security_result.threat_id |
O valor é extraído do campo "WAFRuleID". |
WAFRuleMessage | read_only_udm.security_result.rule_name read_only_udm.security_result.threat_name |
O valor é extraído do campo WAFRuleMessage. |
WAFSQLiAttackScore | read_only_udm.security_result.about.resource.attribute.labels | O valor é extraído do campo "WAFSQLiAttackScore". |
WAFXSSAttackScore | read_only_udm.security_result.about.resource.attribute.labels | O valor é extraído do campo WAFXSSAttackScore. |
ZoneID | read_only_udm.additional.fields | O valor é extraído do campo "ZoneID". |
read_only_udm.metadata.log_type | O valor é definido como "CLOUDFLARE". | |
read_only_udm.metadata.product_name | O valor é definido como "DNS do Cloudflare Gateway" se o registro for de DNS, "HTTP do Cloudflare Gateway" se for de HTTP do Gateway, "Auditoria do Cloudflare" se for de auditoria ou "Firewall de aplicativos da Web" caso contrário. | |
read_only_udm.metadata.vendor_name | O valor é definido como "Cloudflare". | |
read_only_udm.network.application_protocol | O valor é definido como "DNS" se o registro for de DNS, "HTTP" se o campo "HTTPVersion" contiver "HTTP" ou o valor do campo "Protocol" convertido para maiúsculas se o campo "Protocol" não estiver vazio e não for "tls" ou "TLS". | |
read_only_udm.network.direction | O valor é definido como "OUTBOUND" se o campo "EgressIP" não estiver vazio. | |
read_only_udm.network.http.parsed_user_agent | O valor é extraído do campo UserAgent ou ClientRequestUserAgent e analisado usando o filtro parseduseragent. | |
read_only_udm.extensions.auth.type | O valor é definido como "MACHINE" se o campo "Action" for "login" ou "logout". | |
read_only_udm.metadata.event_type | O valor é definido como "NETWORK_DNS" se o registro for de DNS, "NETWORK_CONNECTION" se for um registro HTTP do gateway, "USER_RESOURCE_ACCESS" se for um registro de auditoria e os campos "ActorIP" e "ActorEmail" estiverem vazios, "USER_RESOURCE_UPDATE_CONTENT" se for um registro de auditoria e os campos "ResourceType" e "newvalue" não estiverem vazios, "USER_LOGIN" se o campo "Action" for "login", "USER_LOGOUT" se o campo "Action" for "logout", "USER_RESOURCE_ACCESS" se o campo "Email" não estiver vazio e corresponder ao formato de endereço de e-mail ou "NETWORK_CONNECTION" se os campos "EgressIP" e "SourceIP" ou "OriginIP" e "SourceIP" não estiverem vazios. | |
read_only_udm.target.file.mime_type | O valor é extraído do campo "EdgeResponseContentType". | |
read_only_udm.target.location.country_or_region | O valor é extraído do campo "País". | |
read_only_udm.target.resource.id | O valor é extraído do campo "AccountID" ou "ResourceID". | |
read_only_udm.target.resource.product_object_id | O valor é extraído dos campos AccountID, AppUUID ou ResourceID. | |
read_only_udm.target.user.product_object_id | O valor é extraído do campo "OwnerID" ou "UserUID". |
Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais do Google SecOps.