Coletar registros do CMS WordPress
Visão geral
Esse analisador extrai registros do CMS WordPress de mensagens formatadas em JSON ou texto simples. Ele processa registros formatados em JSON e não JSON, analisando campos relevantes e mapeando-os para a UDM, incluindo detalhes do usuário, informações de rede, atributos de recursos e detalhes de resultados de segurança. O analisador também realiza várias transformações de dados, como conversão de tipos de dados, mesclagem de campos e tratamento de padrões de registros específicos para o Kubernetes e outros recursos.
Antes de começar
Verifique se você atende aos seguintes pré-requisitos:
- Instância do Google SecOps.
- Acesso privilegiado a um site do WordPress.
- Plug-in que ativa a funcionalidade de webhook (por exemplo, WP Webhooks).
Configurar feeds
Para configurar um feed, siga estas etapas:
- Acesse Configurações do SIEM > Feeds.
- Clique em Adicionar novo feed.
- Na próxima página, clique em Configurar um único feed.
- No campo Nome do feed, insira um nome para o feed, por exemplo, Registros do CMS do WordPress.
- Selecione Webhook como o Tipo de origem.
- Selecione WordPress como o Tipo de registro.
- Clique em Próxima.
- Opcional: especifique valores para os seguintes parâmetros de entrada:
- Delimitador de divisão: o delimitador usado para separar linhas de registro, como \n.
 
- Delimitador de divisão: o delimitador usado para separar linhas de registro, como 
- Clique em Próxima.
- Revise a configuração do feed na tela Finalizar e clique em Enviar.
- Clique em Gerar chave secreta para autenticar o feed.
- Copie e armazene a chave secreta. Não é possível ver essa chave secreta novamente. Se necessário, você pode gerar uma nova chave secreta, mas isso torna a anterior obsoleta.
- Na guia Detalhes, copie o URL do endpoint do feed no campo Informações do endpoint. É necessário especificar esse URL de endpoint no aplicativo cliente.
- Clique em Concluído.
Criar uma chave de API para o feed de webhook
- Acesse console doGoogle Cloud > Credenciais. 
- Clique em Criar credenciais e, em seguida, selecione Chave de API. 
- Restrinja o acesso da chave de API à API Google Security Operations. 
Especifique o URL do endpoint
- No aplicativo cliente, especifique o URL do endpoint HTTPS fornecido no feed do webhook.
- Ative a autenticação especificando a chave de API e a chave secreta como parte do cabeçalho personalizado no seguinte formato: - X-goog-api-key = API_KEY X-Webhook-Access-Key = SECRET- Recomendação: especifique a chave de API como um cabeçalho em vez de no URL. Se o cliente de webhook não aceitar cabeçalhos personalizados, especifique a chave de API e a chave secreta usando parâmetros de consulta no seguinte formato: - ENDPOINT_URL?key=API_KEY&secret=SECRET
Substitua:
- ENDPOINT_URL: o URL do endpoint do feed.
- API_KEY: a chave de API para autenticar no Google Security Operations.
- SECRET: a chave secreta gerada para autenticar o feed.
Configurar o webhook do WordPress
- Instale e ative o plug-in WP Webhooks (ou o plug-in de webhook escolhido) no diretório de plug-ins do WordPress.
- Acesse o submenu WP Webhooks no menu do administrador do WordPress, geralmente localizado em "Configurações".
- Clique em Enviar dados no menu da barra superior.
- Selecione a ação do WordPress que vai acionar o webhook. Exemplos comuns incluem publish_post (quando uma nova postagem é publicada), user_register (quando um novo usuário se registra) ou comment_post (quando um novo comentário é postado). Isso depende dos dados que você seleciona e envia para o Google SecOps.
- Clique em Adicionar URL do webhook.
- Configure o webhook:
- Nome: dê ao webhook um nome descritivo (por exemplo, Feed do Google SecOps).
- URL do webhook: cole o URL do endpoint do Google SecOps.
 
- Clique em Salvar webhook.
Tabela de mapeamento da UDM
| Campo de registro | Mapeamento do UDM | Lógica | 
|---|---|---|
| ClientIP | principal.ip | O endereço IP do cliente é extraído do campo ClientIPno registro bruto. | 
| Code | target.resource.attribute.labels.key | O valor "Code" é atribuído como uma chave no objeto target.resource.attribute.labels. | 
| Code | target.resource.attribute.labels.value | O valor do campo Codedo registro bruto é atribuído como um valor no objetotarget.resource.attribute.labels. | 
| CurrentUserID | target.user.userid | O CurrentUserIDdo registro bruto é convertido em uma string e mapeado para o campotarget.user.userid. | 
| EditUserLink | target.url | O EditUserLinkdo registro bruto é mapeado para o campotarget.url. | 
| EventType | metadata.product_event_type | O EventTypedo registro bruto é mapeado para o campometadata.product_event_type. | 
| FirstName | target.user.first_name | O FirstNamedo registro bruto é mapeado para o campotarget.user.first_name. | 
| insertId | metadata.product_log_id | O insertIddo registro bruto é mapeado para o campometadata.product_log_id. | 
| labels.compute.googleapis.com/resource_name | additional.fields.key | O valor "Nome do recurso" é atribuído como uma chave no objeto additional.fields. | 
| labels.compute.googleapis.com/resource_name | additional.fields.value.string_value | O valor de labels.compute.googleapis.com/resource_namedo registro bruto é atribuído como um valor de string no objetoadditional.fields. | 
| labels.k8s-pod/app_kubernetes_io/instance | target.resource.attribute.labels.key | O valor "Kubernetes IO Instance" é atribuído como uma chave no objeto target.resource.attribute.labels. | 
| labels.k8s-pod/app_kubernetes_io/instance | target.resource.attribute.labels.value | O valor de labels.k8s-pod/app_kubernetes_io/instancedo registro bruto é atribuído como um valor no objetotarget.resource.attribute.labels. | 
| labels.k8s-pod/app_kubernetes_io/managed-by | target.resource.attribute.labels.key | O valor "Kubernetes IO Instance Manager" é atribuído como uma chave no objeto target.resource.attribute.labels. | 
| labels.k8s-pod/app_kubernetes_io/managed-by | target.resource.attribute.labels.value | O valor de labels.k8s-pod/app_kubernetes_io/managed-bydo registro bruto é atribuído como um valor no objetotarget.resource.attribute.labels. | 
| labels.k8s-pod/app_kubernetes_io/name | target.resource.attribute.labels.key | O valor "Kubernetes IO Instance Name" é atribuído como uma chave no objeto target.resource.attribute.labels. | 
| labels.k8s-pod/app_kubernetes_io/name | target.resource.attribute.labels.value | O valor de labels.k8s-pod/app_kubernetes_io/namedo registro bruto é atribuído como um valor no objetotarget.resource.attribute.labels. | 
| labels.k8s-pod/controller-revision-hash | target.resource.attribute.labels.key | O valor "Controller Revision Hash" é atribuído como uma chave no objeto target.resource.attribute.labels. | 
| labels.k8s-pod/controller-revision-hash | target.resource.attribute.labels.value | O valor de labels.k8s-pod/controller-revision-hashdo registro bruto é atribuído como um valor no objetotarget.resource.attribute.labels. | 
| labels.k8s-pod/helm_sh/chart | target.resource.attribute.labels.key | O valor "Kubernetes IO Instance Manager SH" é atribuído como uma chave no objeto target.resource.attribute.labels. | 
| labels.k8s-pod/helm_sh/chart | target.resource.attribute.labels.value | O valor de labels.k8s-pod/helm_sh/chartdo registro bruto é atribuído como um valor no objetotarget.resource.attribute.labels. | 
| labels.k8s-pod/k8s-app | target.resource.attribute.labels.key | O valor "Application" é atribuído como uma chave no objeto target.resource.attribute.labels. | 
| labels.k8s-pod/k8s-app | target.resource.attribute.labels.value | O valor de labels.k8s-pod/k8s-appdo registro bruto é atribuído como um valor no objetotarget.resource.attribute.labels. | 
| labels.k8s-pod/pod-template-generation | target.resource.attribute.labels.key | O valor "Pod Template Generation" é atribuído como uma chave no objeto target.resource.attribute.labels. | 
| labels.k8s-pod/pod-template-generation | target.resource.attribute.labels.value | O valor de labels.k8s-pod/pod-template-generationdo registro bruto é atribuído como um valor no objetotarget.resource.attribute.labels. | 
| labels.k8s-pod/pod-template-hash | target.resource.attribute.labels.key | O valor "Pod Template Hash" é atribuído como uma chave no objeto target.resource.attribute.labels. | 
| labels.k8s-pod/pod-template-hash | target.resource.attribute.labels.value | O valor de labels.k8s-pod/pod-template-hashdo registro bruto é atribuído como um valor no objetotarget.resource.attribute.labels. | 
| LastName | target.user.last_name | O LastNamedo registro bruto é mapeado para o campotarget.user.last_name. | 
| logName | target.resource.attribute.labels.key | O valor "Nome do registro" é atribuído como uma chave no objeto target.resource.attribute.labels. | 
| logName | target.resource.attribute.labels.value | O valor do campo logNamedo registro bruto é atribuído como um valor no objetotarget.resource.attribute.labels. | 
| receiveTimestamp | metadata.event_timestamp | O receiveTimestampdo registro bruto é analisado e mapeado para o campometadata.event_timestamp. | 
| resource.labels.cluster_name | additional.fields.key | O valor "Nome do cluster" é atribuído como uma chave no objeto additional.fields. | 
| resource.labels.cluster_name | additional.fields.value.string_value | O valor de resource.labels.cluster_namedo registro bruto é atribuído como um valor de string no objetoadditional.fields. | 
| resource.labels.cluster_name | target.resource.resource_type | Se resource.labels.cluster_nameestiver presente, o valor "CLUSTER" será atribuído atarget.resource.resource_type. | 
| resource.labels.container_name | metadata.product_event_type | Se resource.typefor "k8s_container", o valor deresource.labels.container_namecomresource.labels.namespace_nameserá usado para construir ometadata.product_event_type. | 
| resource.labels.container_name | target.resource.name | O valor de resource.labels.container_namedo registro bruto é atribuído ao campotarget.resource.name. | 
| resource.labels.location | target.location.country_or_region | O valor de resource.labels.locationdo registro bruto é atribuído ao campotarget.location.country_or_region. | 
| resource.labels.namespace_name | additional.fields.key | O valor "Nome do namespace" é atribuído como uma chave no objeto additional.fields. | 
| resource.labels.namespace_name | additional.fields.value.string_value | O valor de resource.labels.namespace_namedo registro bruto é atribuído como um valor de string no objetoadditional.fields. | 
| resource.labels.namespace_name | metadata.product_event_type | Se resource.typefor "k8s_container", o valor deresource.labels.namespace_namecomresource.labels.container_nameserá usado para construir ometadata.product_event_type. | 
| resource.labels.node_name | metadata.product_event_type | Se resource.typefor "k8s_node", o valor deresource.labels.node_nameserá usado para construir ometadata.product_event_type. | 
| resource.labels.pod_name | additional.fields.key | O valor "Pod Name" é atribuído como uma chave no objeto additional.fields. | 
| resource.labels.pod_name | additional.fields.value.string_value | O valor de resource.labels.pod_namedo registro bruto é atribuído como um valor de string no objetoadditional.fields. | 
| resource.labels.project_id | additional.fields.key | O valor "Project Id" é atribuído como uma chave no objeto additional.fields. | 
| resource.labels.project_id | additional.fields.value.string_value | O valor de resource.labels.project_iddo registro bruto é atribuído como um valor de string no objetoadditional.fields. | 
| resource.type | target.resource.resource_subtype | O valor de resource.typedo registro bruto é atribuído ao campotarget.resource.resource_subtype. | 
| Roles | target.user.user_role | O campo Rolesdo registro bruto é convertido em letras maiúsculas e mapeado para o campotarget.user.user_role. | 
| SessionID | network.session_id | O SessionIDdo registro bruto é mapeado para o camponetwork.session_id. | 
| sev | security_result.severity | O valor do campo sevdetermina o valor desecurity_result.severity. "INFO" ou "NOTICE" correspondem a "INFORMATIONAL", "WARN" corresponde a "MEDIUM" e "ERR" corresponde a "ERROR". | 
| TargetUsername | target.user.user_display_name | O TargetUsernamedo registro bruto é mapeado para o campotarget.user.user_display_name. | 
| textPayload | metadata.description | Se resource.typefor "k8s_node", o valor detextPayloadserá mapeado para o campometadata.description. | 
| textPayload | network.application_protocol | O protocolo (por exemplo, HTTP) é extraído do campo textPayloadusando padrões grok. | 
| textPayload | network.http.method | O método HTTP (por exemplo, GET, POST) é extraído do campo textPayloadusando padrões grok. | 
| textPayload | network.http.referral_url | O URL é extraído do campo textPayloadusando padrões grok. | 
| textPayload | network.http.response_code | O código de resposta HTTP é extraído do campo textPayloadusando padrões grok e convertido em um número inteiro. | 
| textPayload | network.received_bytes | Os bytes recebidos são extraídos do campo textPayloadusando padrões grok e convertidos em um número inteiro sem sinal. | 
| textPayload | principal.ip | O endereço IP de origem é extraído do campo textPayloadusando padrões grok. | 
| textPayload | security_result.description | A descrição é extraída do campo textPayloadusando padrões grok. | 
| textPayload | target.file.full_path | O caminho é extraído do campo textPayloadusando padrões grok. | 
| UserAgent | network.http.user_agent | O UserAgentdo registro bruto é mapeado para o camponetwork.http.user_agent. O valor "USER_RESOURCE_ACCESS" é atribuído ametadata.event_type. | 
Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais do Google SecOps.