Recolha registos do CMS WordPress
Vista geral
Este analisador sintático extrai registos do CMS WordPress de mensagens formatadas em JSON ou texto simples. Processa registos formatados em JSON e não JSON, analisando os campos relevantes e mapeando-os para o UDM, incluindo detalhes do utilizador, informações de rede, atributos de recursos e detalhes dos resultados de segurança. O analisador também realiza várias transformações de dados, como a conversão de tipos de dados, a união de campos e o processamento de padrões de registo específicos para o Kubernetes e outros recursos.
Antes de começar
Certifique-se de que tem os seguintes pré-requisitos:
- Instância do Google SecOps.
- Acesso privilegiado a um Website do WordPress.
- Plugin que ativa a funcionalidade de webhook (por exemplo, WP Webhooks).
Configure feeds
Para configurar um feed, siga estes passos:
- Aceda a Definições do SIEM > Feeds.
- Clique em Adicionar novo feed.
- Na página seguinte, clique em Configurar um único feed.
- No campo Nome do feed, introduza um nome para o feed; por exemplo, Registos do CMS Wordpress.
- Selecione Webhook como o Tipo de origem.
- Selecione Wordpress como o Tipo de registo.
- Clicar em Seguinte.
- Opcional: especifique valores para os seguintes parâmetros de entrada:
- Delimitador de divisão: o delimitador usado para separar linhas de registo, como
\n
.
- Delimitador de divisão: o delimitador usado para separar linhas de registo, como
- Clicar em Seguinte.
- Reveja a 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 armazene a chave secreta. Não pode ver esta chave secreta novamente. Se necessário, pode regenerar uma nova chave secreta, mas esta ação torna a chave secreta anterior obsoleta.
- No separador Detalhes, copie o URL do ponto final do feed do campo Informações do ponto final. Tem de especificar este URL do ponto final na sua aplicação cliente.
- Clique em Concluído.
Crie uma chave da API para o feed de webhook
Aceda à Google Cloud consola > Credenciais.
Clique em Criar credenciais e, de seguida, selecione Chave de API.
Restrinja o acesso da chave de API à API Google Security Operations.
Especifique o URL do ponto final
- Na aplicação cliente, especifique o URL do ponto final HTTPS fornecido no feed do webhook.
Ative a autenticação especificando a chave da 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 da API como um cabeçalho em vez de a especificar no URL. Se o seu cliente de webhook não suportar cabeçalhos personalizados, pode especificar a chave da API e a chave secreta através de parâmetros de consulta no seguinte formato:
ENDPOINT_URL?key=API_KEY&secret=SECRET
Substitua o seguinte:
ENDPOINT_URL
: o URL do ponto final do feed.API_KEY
: a chave da API para autenticar no Google Security Operations.SECRET
: a chave secreta que gerou para autenticar o feed.
Configure o webhook do WordPress
- Instale e ative o plugin WP Webhooks (ou o plugin de webhook escolhido) através do diretório de plugins do WordPress.
- Aceda ao submenu WP Webhooks no menu de administrador do WordPress, normalmente localizado em definições.
- Clique em Enviar dados no menu da barra superior.
- Selecione a ação do WordPress que vai acionar o webhook. Os exemplos comuns incluem publish_post (quando é publicado um novo post), user_register (quando um novo utilizador se regista) ou comment_post (quando é publicado um novo comentário). Isto depende dos dados que selecionar e enviar para o Google SecOps.
- Clique em Adicionar URL do webhook.
- Configure o webhook:
- Nome: atribua um nome descritivo ao webhook (por exemplo, Feed do Google SecOps).
- URL do webhook: cole o URL do ponto final do Google SecOps.
- Clique em Guardar webhook.
Tabela de mapeamento da UDM
Campo de registo | Mapeamento de UDM | Lógica |
---|---|---|
ClientIP |
principal.ip |
O endereço IP do cliente é extraído do campo ClientIP no registo não processado. |
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 registo não processado é atribuído como um valor no objeto target.resource.attribute.labels . |
CurrentUserID |
target.user.userid |
O valor CurrentUserID do registo não processado é convertido numa string e mapeado para o campo target.user.userid . |
EditUserLink |
target.url |
O EditUserLink do registo não processado é mapeado para o campo target.url . |
EventType |
metadata.product_event_type |
O EventType do registo não processado é mapeado para o campo metadata.product_event_type . |
FirstName |
target.user.first_name |
O FirstName do registo não processado é mapeado para o campo target.user.first_name . |
insertId |
metadata.product_log_id |
O insertId do registo não processado é 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 registo não processado é 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 "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/instance do registo não processado é 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 registo não processado é 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 registo não processado é atribuído como um valor no objeto target.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-hash do registo não processado é 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 registo não processado é 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 registo não processado é atribuído como um valor no objeto target.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-generation do registo não processado é 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 registo não processado é atribuído como um valor no objeto target.resource.attribute.labels . |
LastName |
target.user.last_name |
O LastName do registo não processado é mapeado para o campo target.user.last_name . |
logName |
target.resource.attribute.labels.key |
O valor "Log Name" é atribuído como uma chave no objeto target.resource.attribute.labels . |
logName |
target.resource.attribute.labels.value |
O valor do campo logName do registo não processado é atribuído como um valor no objeto target.resource.attribute.labels . |
receiveTimestamp |
metadata.event_timestamp |
O receiveTimestamp do registo não processado é analisado e mapeado para o campo metadata.event_timestamp . |
resource.labels.cluster_name |
additional.fields.key |
O valor "Cluster Name" é 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 registo não processado é 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" é 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 juntamente com resource.labels.namespace_name é usado para construir o metadata.product_event_type . |
resource.labels.container_name |
target.resource.name |
O valor de resource.labels.container_name do registo não processado é atribuído ao campo target.resource.name . |
resource.labels.location |
target.location.country_or_region |
O valor de resource.labels.location do registo não processado é atribuído ao campo target.location.country_or_region . |
resource.labels.namespace_name |
additional.fields.key |
O valor "Nome do espaço de nomes" é 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 registo não processado é 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 juntamente com resource.labels.container_name é 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 é usado para construir o metadata.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_name do registo não processado é 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 registo não processado é atribuído como um valor de string no objeto additional.fields . |
resource.type |
target.resource.resource_subtype |
O valor de resource.type do registo não processado é atribuído ao campo target.resource.resource_subtype . |
Roles |
target.user.user_role |
O campo Roles do registo não processado é convertido em letras maiúsculas e mapeado para o campo target.user.user_role . |
SessionID |
network.session_id |
O SessionID do registo não processado é 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" é mapeado para "INFORMATIONAL", "WARN" é mapeado para "MEDIUM" e "ERR" é mapeado para "ERROR". |
TargetUsername |
target.user.user_display_name |
O TargetUsername do registo não processado é mapeado para o campo target.user.user_display_name . |
textPayload |
metadata.description |
Se resource.type for "k8s_node", o valor de textPayload é mapeado para o campo metadata.description . |
textPayload |
network.application_protocol |
O protocolo (por exemplo, HTTP) é extraído do campo textPayload através de padrões grok. |
textPayload |
network.http.method |
O método HTTP (por exemplo, GET, POST) é extraído do campo textPayload através de padrões grok. |
textPayload |
network.http.referral_url |
O URL é extraído do campo textPayload através de padrões grok. |
textPayload |
network.http.response_code |
O código de resposta HTTP é extraído do campo textPayload através de padrões grok e convertido num número inteiro. |
textPayload |
network.received_bytes |
Os bytes recebidos são extraídos do campo textPayload através de padrões grok e convertidos num número inteiro não assinado. |
textPayload |
principal.ip |
O endereço IP de origem é extraído do campo textPayload através de padrões grok. |
textPayload |
security_result.description |
A descrição é extraída do campo textPayload através de padrões grok. |
textPayload |
target.file.full_path |
O caminho é extraído do campo textPayload através de padrões grok. |
UserAgent |
network.http.user_agent |
O UserAgent do registo não processado é mapeado para o campo network.http.user_agent . O valor "USER_RESOURCE_ACCESS" está atribuído a metadata.event_type . |
Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais da Google SecOps.