Recolha registos da Cloudflare
Este documento explica como ingerir registos do Cloudflare no Google Security Operations através de um webhook (destino HTTP) ou do Google Cloud Storage. A Cloudflare gera dados operacionais sob a forma de registos para DNS, HTTP, auditoria, confiança zero e CASB. Esta integração permite-lhe enviar estes registos para o Google SecOps para análise e monitorização. O analisador inicializa primeiro um conjunto de campos vazios e, em seguida, analisa os registos do Cloudflare formatados em JSON, ignorando todas as mensagens que não sejam JSON válidos. Em seguida, o código usa a 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) em conformidade.
Antes de começar
Certifique-se de que tem os seguintes pré-requisitos:
- Instância do Google SecOps.
- Conta do Cloudflare Enterprise com o LogPush ativado.
- Para o método de webhook: acesso privilegiado à Google Cloud consola.
- Para o método do Google Cloud Storage: acesso privilegiado ao Google Cloud Storage.
Método 1: configure a exportação de registos do Cloudflare através do webhook (destino HTTP)
Este método permite-lhe fazer stream dos registos do Cloudflare diretamente para o Google SecOps sem armazenamento intermédio.
Configure um feed de webhook no Google SecOps
- Aceda a Definições do SIEM > Feeds.
- Clique em Adicionar novo.
- No campo Nome do feed, introduza um nome para o feed (por exemplo,
Cloudflare Webhook). - Selecione Webhook como o Tipo de origem.
- Selecione Cloudflare como o Tipo de registo.
- Clicar em Seguinte.
- Especifique valores para os seguintes parâmetros de entrada:
- Delimitador de divisão:
\n. - Espaço de nomes do recurso: o espaço de nomes do recurso.
- Etiquetas de carregamento: a etiqueta a aplicar aos eventos deste feed.
- Delimitador de divisão:
- Clicar em Seguinte.
- Reveja a nova configuração do feed no ecrã Finalizar e, de seguida, clique em Enviar.
- Clique em Gerar chave secreta para gerar uma chave secreta para autenticar este feed.
- Copie e guarde a chave secreta, uma vez que não pode ver este segredo novamente.
- Aceda ao separador Detalhes.
- Copie o URL do ponto final do feed do campo Informações do ponto final.
- Clique em Concluído.
Crie uma chave da API para o feed de webhook
- Aceda a Google Cloud console > APIs e serviços > Credenciais.
- Clique em Criar credenciais e, de seguida, selecione Chave de API.
- Clique em Editar chave da API.
- Em Restrições da API, selecione Restringir chave.
- Selecione API Google SecOps na lista.
- Clique em Guardar.
- Copie o valor da chave da API.
Configure o destino HTTP do Cloudflare LogPush
- Inicie sessão no painel de controlo da Cloudflare.
- Selecione a conta empresarial ou o domínio que quer usar com o LogPush.
- Aceda a Analytics e registos > Logpush.
- Clique em Criar uma tarefa Logpush.
- Em Selecionar um destino, escolha Destino HTTP.
Introduza o URL do ponto final HTTP com parâmetros de autenticação:
<ENDPOINT_URL>?header_X-goog-api-key=<API_KEY>&header_X-Webhook-Access-Key=<SECRET_KEY>Substitua o seguinte:
<ENDPOINT_URL>: o URL do ponto final do feed do Google SecOps.<API_KEY>: a chave da API da Google Cloud consola (codificada no URL se contiver carateres especiais).<SECRET_KEY>: a chave secreta do feed do webhook (com URL codificado se contiver carateres especiais).
Clique em Continuar.
Selecione o conjunto de dados a enviar (por exemplo, pedidos HTTP, DNS, auditoria, confiança zero, CASB).
Configure a tarefa logpush:
- Introduza o Nome da tarefa.
- Opcional: em Se os registos corresponderem, configure os filtros.
- Em Enviar os seguintes campos, selecione os campos a incluir.
- Escolha o formato de data/hora (RFC3339 recomendado).
- Configure a taxa de amostragem, se necessário.
Clique em Enviar para criar a tarefa logpush.
Valide a integração de webhook
Após a configuração, os registos devem aparecer no Google SecOps em poucos minutos. Para validar:
- Aceda a Investigação > Pesquisa SIEM.
- Pesquise registos com a etiqueta de carregamento configurada.
- Confirme se os registos do Cloudflare estão a ser analisados corretamente.
Método 2: configure a exportação de registos da Cloudflare através do Google Cloud Storage
Configure a Cloudflare para enviar registos para o mesmo, o que envolve conceder à Cloudflare as autorizações necessárias.
Crie um Google Cloud recipiente
- Inicie sessão na Google Cloud consola.
- Aceda à página Contentores do Cloud Storage.
- Clique em Criar.
- Na página Criar um contentor, introduza as informações do contentor:
- Nome: introduza um nome exclusivo que cumpra os requisitos do nome do contentor (por exemplo,
cloudflare-data). - Tipo de localização: selecione um tipo de localização e uma região.
- Para ativar o espaço de nomes hierárquico, clique na seta de expansão para expandir Otimizar para cargas de trabalho orientadas para ficheiros e com grande volume de dados e, de seguida, selecione Ativar espaço de nomes hierárquico neste contentor.
- Nome: introduza um nome exclusivo que cumpra os requisitos do nome do contentor (por exemplo,
- Clique em Criar.
Conceda autorizações ao contentor
- Na consola do Cloud Storage, selecione o contentor que criou anteriormente.
- Clique no separador Autorizações.
- Clique em Conceder acesso.
- Adicione a conta
logpush@cloudflare-data.iam.gserviceaccount.comcom a autorização Administrador de objetos de armazenamento. - Clique em Guardar.
Configure o LogPush da Cloudflare para o Google Cloud Storage
- Inicie sessão no painel de controlo da Cloudflare.
- Selecione a conta empresarial ou o domínio que quer usar com o LogPush.
- Aceda a Analytics e registos > Logpush.
- Clique em Criar uma tarefa Logpush.
- Em Selecionar um destino, escolha Google Cloud Storage.
- Introduza o caminho do contentor do Google Cloud Storage (por exemplo,
gs://cloudflare-data/logs/). Clique em Continuar.
Introduza o token de propriedade e clique em Continuar.
Selecione o conjunto de dados a enviar para o armazenamento.
Configure a tarefa logpush:
- Introduza o Nome da tarefa.
- Em Se os registos corresponderem, pode selecionar os eventos a incluir ou remover dos seus registos.
- Em Enviar os seguintes campos, escolha os registos a enviar.
- Escolha o formato da data/hora (RFC 339 recomendado).
- Configure a taxa de amostragem, se necessário.
Clique em Enviar.
Configure um feed no Google SecOps para carregar registos da Cloudflare a partir do Google Cloud Storage
- Aceda a Definições do SIEM > Feeds.
- Clique em Adicionar novo.
- No campo Nome do feed, introduza um nome para o feed (por exemplo,
Cloudflare GCS Logs). - Selecione Google Cloud Storage V2 como Tipo de origem.
- Selecione Cloudflare como o Tipo de registo.
- Clique em Obter conta de serviço.
- Clicar em Seguinte.
Especifique valores para os seguintes parâmetros de entrada:
- URI do contentor de armazenamento: Google Cloud URL do contentor no formato
gs://my-bucket/<value>/. Este URL tem de terminar com uma barra invertida (/). - Opções de eliminação de origens: selecione a opção de eliminação de acordo com a sua preferência.
- Idade máxima do ficheiro: inclui ficheiros modificados no último número de dias. A predefinição é 180 dias.
- Espaço de nomes do recurso: o espaço de nomes do recurso.
- Etiquetas de carregamento: a etiqueta a aplicar aos eventos deste feed.
- URI do contentor de armazenamento: Google Cloud URL do contentor no formato
Clicar em Seguinte.
Reveja a nova configuração do feed no ecrã Finalizar e, de seguida, clique em Enviar.
Tabela de mapeamento do UDM
| Campo de registo | Mapeamento do UDM | Lógica |
|---|---|---|
| ClientIP | read_only_udm.principal.asset.ip read_only_udm.principal.ip |
O valor é retirado do campo ClientIP. |
| ClientRequestHost | read_only_udm.target.asset.hostname read_only_udm.target.hostname |
O valor é retirado do campo ClientRequestHost. |
| ClientRequestMethod | read_only_udm.network.http.method | O valor é retirado do campo ClientRequestMethod. |
| ClientRequestURI | read_only_udm.target.url | O valor é retirado do campo ClientRequestURI. Se o campo ClientRequestHost não estiver vazio, o valor é concatenado com o campo ClientRequestHost. |
| ClientSrcPort | read_only_udm.principal.port | O valor é retirado do campo ClientSrcPort. |
| ClientRequestUserAgent | read_only_udm.network.http.user_agent | O valor é retirado do campo ClientRequestUserAgent. |
| ClientSSLCipher | read_only_udm.network.tls.cipher | O valor é retirado do campo ClientSSLCipher. |
| ClientSSLProtocol | read_only_udm.network.tls.version | O valor é retirado do campo ClientSSLProtocol. |
| País | read_only_udm.target.location.country_or_region | O valor é retirado do campo País. |
| CreatedAt | read_only_udm.metadata.event_timestamp | O valor é retirado do campo CreatedAt. |
| Data/hora | read_only_udm.metadata.event_timestamp | O valor é retirado do campo Datetime. |
| DestinationIP | read_only_udm.target.asset.ip read_only_udm.target.ip |
O valor é retirado do campo DestinationIP. |
| DestinationPort | read_only_udm.target.port | O valor é retirado do campo DestinationPort. |
| DeviceID | read_only_udm.principal.asset_id | O valor é retirado 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 é retirado do campo DstIP. |
| DstPort | read_only_udm.target.port | O valor é retirado do campo DstPort. |
| EdgeResponseBytes | read_only_udm.network.received_bytes | O valor é retirado do campo EdgeResponseBytes. |
| EdgeResponseStatus | read_only_udm.network.http.response_code | O valor é retirado do campo EdgeResponseStatus. |
| EdgeServerIP | read_only_udm.target.asset.ip read_only_udm.target.ip |
O valor é retirado do campo EdgeServerIP. |
| read_only_udm.principal.user.email_addresses read_only_udm.target.user.email_addresses |
O valor é retirado do campo Email. | |
| 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" e "UNKNOWN_ACTION" se o campo FirewallMatchesAction não estiver vazio. |
| FirewallMatchesRuleIDs | read_only_udm.security_result.rule_id | O valor é retirado do campo FirewallMatchesRuleIDs. |
| FirewallMatchesSources | read_only_udm.security_result.rule_name | O valor é retirado do campo FirewallMatchesSources. |
| HTTPMethod | read_only_udm.network.http.method | O valor é retirado do campo HTTPMethod. |
| HTTPHost | read_only_udm.target.hostname | O valor é retirado do campo HTTPHost. |
| HTTPVersion | read_only_udm.network.application_protocol | O valor é retirado do campo HTTPVersion. Se o valor contiver "HTTP", é substituído por "HTTP". |
| IPAddress | read_only_udm.target.asset.ip read_only_udm.target.ip |
O valor é retirado do campo IPAddress. |
| IsIsolated | read_only_udm.about.labels read_only_udm.security_result.about.resource.attribute.labels |
O valor é retirado do campo IsIsolated e é convertido numa string. |
| Localização | read_only_udm.principal.location.name | O valor é retirado do campo Localização. |
| OriginIP | read_only_udm.intermediary.ip read_only_udm.target.asset.ip read_only_udm.target.ip |
O valor é retirado do campo OriginIP. |
| OriginPort | read_only_udm.target.port | O valor é retirado do campo OriginPort. |
| OwnerID | read_only_udm.target.user.product_object_id | O valor é retirado do campo OwnerID. |
| Política | read_only_udm.security_result.rule_name | O valor é retirado do campo Policy. |
| PolicyID | read_only_udm.security_result.rule_id | O valor é retirado do campo PolicyID. |
| PolicyName | read_only_udm.security_result.rule_name | O valor é retirado do campo PolicyName. |
| Protocolo | read_only_udm.network.ip_protocol | O valor é retirado do campo Protocolo e convertido em letras maiúsculas. |
| QueryCategoryIDs | read_only_udm.security_result.about.labels read_only_udm.security_result.about.resource.attribute.labels |
O valor é retirado do campo QueryCategoryIDs. |
| QueryName | read_only_udm.network.dns.questions.name | O valor é retirado do campo QueryName. |
| QueryNameReversed | read_only_udm.network.dns.questions.name | O valor é retirado do campo QueryNameReversed. |
| QuerySize | read_only_udm.network.sent_bytes | O valor é retirado 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 registos DNS conhecidos, é mapeado para o respetivo valor numérico. Caso contrário, o valor é convertido numa string. |
| RData | read_only_udm.network.dns.answers | O valor é retirado do campo RData. O campo de tipo é convertido num número inteiro sem sinal. |
| RayID | read_only_udm.metadata.product_log_id | O valor é retirado do campo RayID. |
| Referenciador | read_only_udm.network.http.referral_url | O valor é retirado do campo Referer. |
| RequestID | read_only_udm.metadata.product_log_id | O valor é retirado do campo RequestID. |
| ResolverDecision | read_only_udm.security_result.summary | O valor é retirado do campo ResolverDecision. |
| ResourceID | read_only_udm.target.resource.id read_only_udm.target.resource.product_object_id |
O valor é retirado do campo ResourceID. |
| ResourceType | read_only_udm.target.resource.resource_subtype | O valor é retirado do campo ResourceType. |
| SNI | read_only_udm.network.tls.client.server_name | O valor é retirado do campo SNI. |
| SecurityAction | read_only_udm.security_result.action | O valor é definido como "ALLOW" se o campo SecurityAction estiver vazio ou o campo sec_action estiver vazio, "ALLOW_WITH_MODIFICATION" se o campo SecurityAction for "challengeSolved" ou "jschallengeSolved", "BLOCK" se o campo SecurityAction for "drop" ou "block". |
| SecurityLevel | read_only_udm.security_result.severity | O valor é retirado do campo SecurityLevel e é mapeado para o respetivo valor de gravidade da UDM. |
| SessionID | read_only_udm.network.session_id | O valor é retirado do campo SessionID. |
| SessionStartTime | read_only_udm.metadata.event_timestamp | O valor é retirado 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 é retirado do campo SourceIP. |
| SourcePort | read_only_udm.principal.port read_only_udm.src.port |
O valor é retirado do campo SourcePort. |
| SrcIP | read_only_udm.principal.asset.ip read_only_udm.principal.ip |
O valor é retirado do campo SrcIP. |
| SrcPort | read_only_udm.principal.port | O valor é retirado do campo SrcPort. |
| TemporaryAccessDuration | read_only_udm.network.session_duration.seconds | O valor é retirado do campo TemporaryAccessDuration. |
| Indicação de tempo | read_only_udm.metadata.event_timestamp | O valor é retirado do campo Timestamp. |
| Transporte | read_only_udm.network.ip_protocol | O valor é retirado do campo Transport e é convertido em letras maiúsculas. |
| URL | read_only_udm.target.url | O valor é retirado do campo URL. |
| UserAgent | read_only_udm.network.http.user_agent | O valor é retirado do campo UserAgent. |
| UserID | read_only_udm.principal.user.product_object_id | O valor é retirado do campo UserID. |
| UserUID | read_only_udm.target.user.product_object_id | O valor é retirado do campo UserUID. |
| VirtualNetworkID | read_only_udm.principal.resource.product_object_id | O valor é retirado do campo VirtualNetworkID. |
| WAFAction | read_only_udm.security_result.about.labels read_only_udm.security_result.about.resource.attribute.labels |
O valor é retirado do campo WAFAction. |
| WAFAttackScore | read_only_udm.security_result.about.resource.attribute.labels | O valor é retirado do campo WAFAttackScore. |
| WAFFlags | read_only_udm.security_result.about.resource.attribute.labels | O valor é retirado do campo WAFFlags. |
| WAFProfile | read_only_udm.security_result.about.labels read_only_udm.security_result.about.resource.attribute.labels |
O valor é retirado do campo WAFProfile. |
| WAFRCEAttackScore | read_only_udm.security_result.about.resource.attribute.labels | O valor é retirado 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 é retirado do campo WAFRuleID. |
| WAFRuleMessage | read_only_udm.security_result.rule_name read_only_udm.security_result.threat_name |
O valor é retirado do campo WAFRuleMessage. |
| WAFSQLiAttackScore | read_only_udm.security_result.about.resource.attribute.labels | O valor é retirado do campo WAFSQLiAttackScore. |
| WAFXSSAttackScore | read_only_udm.security_result.about.resource.attribute.labels | O valor é retirado do campo WAFXSSAttackScore. |
| ZoneID | read_only_udm.additional.fields | O valor é retirado do campo ZoneID. |
| read_only_udm.metadata.log_type | O valor é definido como "CLOUDFLARE". | |
| read_only_udm.metadata.product_name | O valor é definido como "Cloudflare Gateway DNS" se o registo for um registo de DNS, "Cloudflare Gateway HTTP" se o registo for um registo HTTP de gateway, "Cloudflare Audit" se o registo for um registo de auditoria ou "Web Application Firewall" 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 registo for um registo DNS, "HTTP" se o campo HTTPVersion contiver "HTTP" ou o valor do campo Protocol convertido em 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 é retirado do campo UserAgent ou ClientRequestUserAgent e é analisado através do 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 registo for um registo de DNS, "NETWORK_CONNECTION" se o registo for um registo HTTP de gateway, "USER_RESOURCE_ACCESS" se o registo for um registo de auditoria e os campos ActorIP e ActorEmail estiverem vazios, "USER_RESOURCE_UPDATE_CONTENT" se o registo for um registo 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 email, ou "NETWORK_CONNECTION" se os campos EgressIP e SourceIP não estiverem vazios ou os campos OriginIP e SourceIP não estiverem vazios. | |
| read_only_udm.target.file.mime_type | O valor é retirado do campo EdgeResponseContentType. | |
| read_only_udm.target.location.country_or_region | O valor é retirado do campo País. | |
| read_only_udm.target.resource.id | O valor é retirado do campo AccountID ou do campo ResourceID. | |
| read_only_udm.target.resource.product_object_id | O valor é retirado do campo AccountID, do campo AppUUID ou do campo ResourceID. | |
| read_only_udm.target.user.product_object_id | O valor é retirado do campo OwnerID ou do campo UserUID. |
Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais da Google SecOps.