Coletar registros do CMS do WordPress
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
- Acesse Configurações do SIEM > Feeds.
- Clique em Adicionar novo.
- No campo Nome do feed, insira um nome para o feed (por exemplo, Logs 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
. - Namespace de recursos: o namespace de recursos.
- Rótulos de ingestão: o rótulo aplicado aos eventos desse feed.
- 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 gerar uma chave secreta para autenticar esse feed.
- 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.
- 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 o console do Google Cloud > Credenciais.
Clique em Criar credenciais e, em seguida, selecione Chave de API.
Restrinja o acesso da chave de API à API Google Security Operations.
Especificar o URL do endpoint
- No aplicativo cliente, especifique o URL do endpoint HTTPS fornecido no feed de 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 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
- Instale e ative o plug-in do WP Webhooks (ou o plug-in de webhook escolhido) no diretório de plug-ins do WordPress.
- Acesse o submenu WP Webhooks no menu de 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 ao Google SecOps.
- Clique em Adicionar URL do webhook.
- 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.
- 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.