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