Coletar registros do CMS do WordPress

Compatível com:

Visão geral

Esse analisador extrai registros do WordPress CMS 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 o 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 a conversão de tipos de dados, a mesclagem de campos e o processamento de padrões de registro específicos para o Kubernetes e outros recursos.

Antes de começar

  • Verifique se você tem uma instância do Google SecOps.
  • Verifique se você tem acesso privilegiado a um site do WordPress.
  • Um plug-in que ativa a funcionalidade de webhook (por exemplo, WP Webhooks).

Configurar um feed no Google SecOps para processar registros do WordPress

  1. Acesse Configurações do SIEM > Feeds.
  2. Clique em Adicionar novo.
  3. No campo Nome do feed, insira um nome para o feed (por exemplo, Logs do WordPress).
  4. Selecione Webhook como o Tipo de origem.
  5. Selecione Wordpress como o Tipo de registro.
  6. Clique em Próxima.
  7. Opcional: especifique valores para os seguintes parâmetros de entrada:
    • Delimitador de divisão: o delimitador usado para separar linhas de registro, como \n.
    • Namespace de recursos: o namespace de recursos.
    • Rótulos de ingestão: o rótulo aplicado aos eventos desse feed.
  8. Clique em Próxima.
  9. Revise a configuração do feed na tela Finalizar e clique em Enviar.
  10. Clique em Gerar chave secreta para gerar uma chave secreta para autenticar esse feed.
  11. Copie e armazene a chave secreta. Não é possível acessar essa chave secreta novamente. Se necessário, você pode gerar uma nova chave secreta, mas essa ação torna a chave secreta anterior obsoleta.
  12. 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.
  13. Clique em Concluído.

Criar uma chave de API para o feed de webhook

  1. Acesse o console do Google Cloud > Credenciais.

    Ir para Credenciais

  2. Clique em Criar credenciais e, em seguida, selecione Chave de API.

  3. Restrinja o acesso da chave de API à API Google Security Operations.

Especificar o URL do endpoint

  1. No aplicativo cliente, especifique o URL do endpoint HTTPS fornecido no feed de webhook.
  2. 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 especificar no URL. Se o cliente do webhook não tiver suporte a 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 autenticação no Google Security Operations.
  • SECRET: a chave secreta que você gerou para autenticar o feed.

Configurar o webhook do WordPress

  1. Instale e ative o plug-in do WP Webhooks (ou o plug-in de webhook escolhido) no diretório de plug-ins do WordPress.
  2. Acesse o submenu WP Webhooks no menu de administrador do WordPress, geralmente localizado em "Configurações".
  3. Clique em Enviar dados no menu da barra superior.
  4. 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 ao Google SecOps.
  5. Clique em Adicionar URL do webhook.
  6. Configure o webhook:
    • Nome: dê um nome descritivo ao webhook (por exemplo, Feed do Google SecOps).
    • URL do webhook: cole o URL do endpoint do Google SecOps.
  7. Clique em Salvar webhook.

Tabela de mapeamento do UDM

Campo de registro Mapeamento do UDM Lógica
ClientIP principal.ip O endereço IP do cliente é extraído do campo ClientIP no 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 Code do registro bruto é atribuído como um valor no objeto target.resource.attribute.labels.
CurrentUserID target.user.userid O CurrentUserID do registro bruto é convertido em uma string e mapeado para o campo target.user.userid.
EditUserLink target.url O EditUserLink do registro bruto é mapeado para o campo target.url.
EventType metadata.product_event_type O EventType do registro bruto é mapeado para o campo metadata.product_event_type.
FirstName target.user.first_name O FirstName do registro bruto é mapeado para o campo target.user.first_name.
insertId metadata.product_log_id O insertId do registro bruto é mapeado para o campo metadata.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_name do registro bruto é atribuído como um valor de string no objeto additional.fields.
labels.k8s-pod/app_kubernetes_io/instance target.resource.attribute.labels.key O valor "Instância de E/S do Kubernetes" é 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/instance do registro bruto é atribuído como um valor no objeto target.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-by do registro bruto é atribuído como um valor no objeto target.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/name do registro bruto é atribuído como um valor no objeto target.resource.attribute.labels.
labels.k8s-pod/controller-revision-hash target.resource.attribute.labels.key O valor "Hash de revisão do controlador" é 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-hash do registro bruto é atribuído como um valor no objeto target.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/chart do registro bruto é atribuído como um valor no objeto target.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-app do registro bruto é atribuído como um valor no objeto target.resource.attribute.labels.
labels.k8s-pod/pod-template-generation target.resource.attribute.labels.key O valor "Geração de modelo de pod" é 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-generation do registro bruto é atribuído como um valor no objeto target.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-hash do registro bruto é atribuído como um valor no objeto target.resource.attribute.labels.
LastName target.user.last_name O LastName do registro bruto é mapeado para o campo target.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 logName do registro bruto é atribuído como um valor no objeto target.resource.attribute.labels.
receiveTimestamp metadata.event_timestamp O receiveTimestamp do registro bruto é analisado e mapeado para o campo metadata.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_name do registro bruto é atribuído como um valor de string no objeto additional.fields.
resource.labels.cluster_name target.resource.resource_type Se resource.labels.cluster_name estiver presente, o valor "CLUSTER" será atribuído a target.resource.resource_type.
resource.labels.container_name metadata.product_event_type Se resource.type for "k8s_container", o valor de resource.labels.container_name com resource.labels.namespace_name será usado para construir o metadata.product_event_type.
resource.labels.container_name target.resource.name O valor de resource.labels.container_name do registro bruto é atribuído ao campo target.resource.name.
resource.labels.location target.location.country_or_region O valor de resource.labels.location do registro bruto é atribuído ao campo target.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_name do registro bruto é atribuído como um valor de string no objeto additional.fields.
resource.labels.namespace_name metadata.product_event_type Se resource.type for "k8s_container", o valor de resource.labels.namespace_name com resource.labels.container_name será usado para construir o metadata.product_event_type.
resource.labels.node_name metadata.product_event_type Se resource.type for "k8s_node", o valor de resource.labels.node_name será usado para construir o metadata.product_event_type.
resource.labels.pod_name additional.fields.key O valor "Nome do pod" é atribuído como uma chave no objeto additional.fields.
resource.labels.pod_name additional.fields.value.string_value O valor de resource.labels.pod_name do registro bruto é atribuído como um valor de string no objeto additional.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_id do registro bruto é atribuído como um valor de string no objeto additional.fields.
resource.type target.resource.resource_subtype O valor de resource.type do registro bruto é atribuído ao campo target.resource.resource_subtype.
Roles target.user.user_role O campo Roles do registro bruto é convertido em letras maiúsculas e mapeado para o campo target.user.user_role.
SessionID network.session_id O SessionID do registro bruto é mapeado para o campo network.session_id.
sev security_result.severity O valor do campo sev determina o valor de security_result.severity. "INFO" ou "NOTICE" são mapeados para "INFORMATIONAL", "WARN" é mapeado para "MEDIUM" e "ERR" é mapeado para "ERROR".
TargetUsername target.user.user_display_name O TargetUsername do registro bruto é mapeado para o campo target.user.user_display_name.
textPayload metadata.description Se resource.type for "k8s_node", o valor de textPayload será mapeado para o campo metadata.description.
textPayload network.application_protocol O protocolo (por exemplo, HTTP) é extraído do campo textPayload usando padrões grok.
textPayload network.http.method O método HTTP (por exemplo, GET, POST) é extraído do campo textPayload usando padrões grok.
textPayload network.http.referral_url O URL é extraído do campo textPayload usando padrões grok.
textPayload network.http.response_code O código de resposta HTTP é extraído do campo textPayload usando padrões grok e convertido em um número inteiro.
textPayload network.received_bytes Os bytes recebidos são extraídos do campo textPayload usando padrões grok e convertidos em um número inteiro não assinado.
textPayload principal.ip O endereço IP de origem é extraído do campo textPayload usando padrões grok.
textPayload security_result.description A descrição é extraída do campo textPayload usando padrões grok.
textPayload target.file.full_path O caminho é extraído do campo textPayload usando padrões grok.
UserAgent network.http.user_agent O UserAgent do registro bruto é mapeado para o campo network.http.user_agent. O valor "USER_RESOURCE_ACCESS" é atribuído a metadata.event_type.

Alterações

2024-05-07

  • Correção de bugs:
  • A lógica do analisador foi alterada para analisar registros não analisados e descartados.

2023-05-25

  • Parser recém-criado.