Raccogli i log del CMS WordPress

Supportato in:

Panoramica

Questo parser estrae i log del CMS WordPress da messaggi in formato JSON o testo normale. Gestisce i log formattati sia in JSON che in altri formati, analizza i campi pertinenti e li mappa all'UDM, inclusi i dettagli utente, le informazioni di rete, gli attributi delle risorse e i dettagli dei risultati di sicurezza. Il parser esegue anche diverse trasformazioni dei dati, ad esempio la conversione dei tipi di dati, l'unione dei campi e la gestione di pattern di log specifici per Kubernetes e altre risorse.

Prima di iniziare

  • Assicurati di avere un'istanza Google SecOps.
  • Assicurati di disporre dell'accesso privilegiato a un sito web WordPress.
  • Un plug-in che attiva la funzionalità webhook (ad esempio WP Webhooks).

Configurare un feed in Google SecOps per importare i log di WordPress

  1. Vai a Impostazioni SIEM > Feed.
  2. Fai clic su Aggiungi nuovo.
  3. Nel campo Nome feed, inserisci un nome per il feed (ad esempio Log di WordPress).
  4. Seleziona Webhook come Tipo di origine.
  5. Seleziona Wordpress come Tipo di log.
  6. Fai clic su Avanti.
  7. (Facoltativo) Specifica i valori per i seguenti parametri di input:
    • Delimitatore di split: il delimitatore utilizzato per separare le righe di log, ad esempio \n.
    • Spazio dei nomi degli asset: lo spazio dei nomi degli asset.
    • Etichette di importazione: l'etichetta applicata agli eventi di questo feed.
  8. Fai clic su Avanti.
  9. Controlla la configurazione del feed nella schermata Concludi e poi fai clic su Invia.
  10. Fai clic su Genera chiave segreta per generare una chiave segreta per autenticare questo feed.
  11. Copia e memorizza la chiave segreta. Non potrai più visualizzare questa chiave segreta. Se necessario, puoi rigenerare una nuova chiave segreta, ma questa azione rende obsoleta la chiave segreta precedente.
  12. Nella scheda Dettagli, copia l'URL dell'endpoint del feed dal campo Informazioni sull'endpoint. Devi specificare questo URL endpoint nell'applicazione client.
  13. Fai clic su Fine.

Crea una chiave API per il feed webhook

  1. Vai alla console Google Cloud > Credenziali.

    Vai a credenziali

  2. Fai clic su Crea credenziali e poi seleziona Chiave API.

  3. Limita l'accesso alla chiave API all'API Google Security Operations.

Specifica l'URL dell'endpoint

  1. Nell'applicazione client, specifica l'URL dell'endpoint HTTPS fornito nel feed webhook.
  2. Attiva l'autenticazione specificando la chiave API e la chiave segreta nell'intestazione personalizzata nel seguente formato:

    X-goog-api-key = API_KEY
    X-Webhook-Access-Key = SECRET
    

    Consiglio: specifica la chiave API come intestazione anziché nell'URL. Se il client webhook non supporta le intestazioni personalizzate, puoi specificare la chiave API e la chiave segreta utilizzando parametri di ricerca nel seguente formato:

    ENDPOINT_URL?key=API_KEY&secret=SECRET
    

Sostituisci quanto segue:

  • ENDPOINT_URL: l'URL dell'endpoint del feed.
  • API_KEY: la chiave API per l'autenticazione in Google Security Operations.
  • SECRET: la chiave segreta che hai generato per autenticare il feed.

Configurare il webhook di WordPress

  1. Installa e attiva il plug-in WP Webhooks (o il plug-in webhook che hai scelto) tramite la directory dei plug-in di WordPress.
  2. Vai al sottomenu WP Webhooks nel menu Amministrazione di WordPress, in genere in Impostazioni.
  3. Fai clic su Invia dati nel menu della barra in alto.
  4. Seleziona l'azione WordPress che attiverà il webhook. Alcuni esempi comuni sono publish_post (quando viene pubblicato un nuovo post), user_register (quando si registra un nuovo utente) o comment_post (quando viene pubblicato un nuovo commento). Questo dipende dai dati che selezioni e invii a Google SecOps.
  5. Fai clic su Aggiungi URL webhook.
  6. Configura il webhook:
    • Nome: assegna un nome descrittivo all'webhook (ad es. Feed Google SecOps).
    • URL webhook: incolla l'URL endpoint di Google SecOps.
  7. Fai clic su Salva webhook.

Tabella di mappatura UDM

Campo log Mappatura UDM Logica
ClientIP principal.ip L'indirizzo IP del client viene estratto dal campo ClientIP nel log non elaborato.
Code target.resource.attribute.labels.key Il valore "Codice" viene assegnato come chiave nell'oggetto target.resource.attribute.labels.
Code target.resource.attribute.labels.value Il valore del campo Code del log non elaborato viene assegnato come valore nell'oggetto target.resource.attribute.labels.
CurrentUserID target.user.userid Il valore CurrentUserID del log non elaborato viene convertito in una stringa e mappato al campo target.user.userid.
EditUserLink target.url Il valore EditUserLink del log non elaborato è mappato al campo target.url.
EventType metadata.product_event_type Il valore EventType del log non elaborato viene mappato al campo metadata.product_event_type.
FirstName target.user.first_name Il valore FirstName del log non elaborato è mappato al campo target.user.first_name.
insertId metadata.product_log_id Il valore insertId del log non elaborato viene mappato al campo metadata.product_log_id.
labels.compute.googleapis.com/resource_name additional.fields.key Il valore "Nome risorsa" viene assegnato come chiave nell'oggetto additional.fields.
labels.compute.googleapis.com/resource_name additional.fields.value.string_value Il valore di labels.compute.googleapis.com/resource_name dal log non elaborato viene assegnato come valore di stringa nell'oggetto additional.fields.
labels.k8s-pod/app_kubernetes_io/instance target.resource.attribute.labels.key Il valore "Kubernetes IO Instance" viene assegnato come chiave nell'oggetto target.resource.attribute.labels.
labels.k8s-pod/app_kubernetes_io/instance target.resource.attribute.labels.value Il valore di labels.k8s-pod/app_kubernetes_io/instance dal log non elaborato viene assegnato come valore nell'oggetto target.resource.attribute.labels.
labels.k8s-pod/app_kubernetes_io/managed-by target.resource.attribute.labels.key Il valore "Kubernetes IO Instance Manager" viene assegnato come chiave nell'oggetto target.resource.attribute.labels.
labels.k8s-pod/app_kubernetes_io/managed-by target.resource.attribute.labels.value Il valore di labels.k8s-pod/app_kubernetes_io/managed-by dal log non elaborato viene assegnato come valore nell'oggetto target.resource.attribute.labels.
labels.k8s-pod/app_kubernetes_io/name target.resource.attribute.labels.key Il valore "Nome istanza IO Kubernetes" viene assegnato come chiave nell'oggetto target.resource.attribute.labels.
labels.k8s-pod/app_kubernetes_io/name target.resource.attribute.labels.value Il valore di labels.k8s-pod/app_kubernetes_io/name dal log non elaborato viene assegnato come valore nell'oggetto target.resource.attribute.labels.
labels.k8s-pod/controller-revision-hash target.resource.attribute.labels.key Il valore "Controller Revision Hash" viene assegnato come chiave nell'oggetto target.resource.attribute.labels.
labels.k8s-pod/controller-revision-hash target.resource.attribute.labels.value Il valore di labels.k8s-pod/controller-revision-hash dal log non elaborato viene assegnato come valore nell'oggetto target.resource.attribute.labels.
labels.k8s-pod/helm_sh/chart target.resource.attribute.labels.key Il valore "Kubernetes IO Instance Manager SH" viene assegnato come chiave nell'oggetto target.resource.attribute.labels.
labels.k8s-pod/helm_sh/chart target.resource.attribute.labels.value Il valore di labels.k8s-pod/helm_sh/chart dal log non elaborato viene assegnato come valore nell'oggetto target.resource.attribute.labels.
labels.k8s-pod/k8s-app target.resource.attribute.labels.key Il valore "Application" viene assegnato come chiave nell'oggetto target.resource.attribute.labels.
labels.k8s-pod/k8s-app target.resource.attribute.labels.value Il valore di labels.k8s-pod/k8s-app dal log non elaborato viene assegnato come valore nell'oggetto target.resource.attribute.labels.
labels.k8s-pod/pod-template-generation target.resource.attribute.labels.key Il valore "Generazione di modelli di pod" viene assegnato come chiave nell'oggetto target.resource.attribute.labels.
labels.k8s-pod/pod-template-generation target.resource.attribute.labels.value Il valore di labels.k8s-pod/pod-template-generation dal log non elaborato viene assegnato come valore nell'oggetto target.resource.attribute.labels.
labels.k8s-pod/pod-template-hash target.resource.attribute.labels.key Il valore "Hash modello pod" viene assegnato come chiave nell'oggetto target.resource.attribute.labels.
labels.k8s-pod/pod-template-hash target.resource.attribute.labels.value Il valore di labels.k8s-pod/pod-template-hash dal log non elaborato viene assegnato come valore nell'oggetto target.resource.attribute.labels.
LastName target.user.last_name Il valore LastName del log non elaborato viene mappato al campo target.user.last_name.
logName target.resource.attribute.labels.key Il valore "Nome log" viene assegnato come chiave nell'oggetto target.resource.attribute.labels.
logName target.resource.attribute.labels.value Il valore del campo logName del log non elaborato viene assegnato come valore nell'oggetto target.resource.attribute.labels.
receiveTimestamp metadata.event_timestamp Il valore receiveTimestamp del log non elaborato viene analizzato e mappato al campo metadata.event_timestamp.
resource.labels.cluster_name additional.fields.key Il valore "Nome cluster" viene assegnato come chiave nell'oggetto additional.fields.
resource.labels.cluster_name additional.fields.value.string_value Il valore di resource.labels.cluster_name dal log non elaborato viene assegnato come valore di stringa nell'oggetto additional.fields.
resource.labels.cluster_name target.resource.resource_type Se resource.labels.cluster_name è presente, il valore "CLUSTER" viene assegnato a target.resource.resource_type.
resource.labels.container_name metadata.product_event_type Se resource.type è "k8s_container", il valore di resource.labels.container_name insieme a resource.labels.namespace_name viene utilizzato per costruire metadata.product_event_type.
resource.labels.container_name target.resource.name Il valore resource.labels.container_name del log non elaborato viene assegnato al campo target.resource.name.
resource.labels.location target.location.country_or_region Il valore di resource.labels.location dal log non elaborato viene assegnato al campo target.location.country_or_region.
resource.labels.namespace_name additional.fields.key Il valore "Nome spazio dei nomi" viene assegnato come chiave nell'oggetto additional.fields.
resource.labels.namespace_name additional.fields.value.string_value Il valore di resource.labels.namespace_name dal log non elaborato viene assegnato come valore di stringa nell'oggetto additional.fields.
resource.labels.namespace_name metadata.product_event_type Se resource.type è "k8s_container", il valore di resource.labels.namespace_name insieme a resource.labels.container_name viene utilizzato per costruire metadata.product_event_type.
resource.labels.node_name metadata.product_event_type Se resource.type è "k8s_node", il valore di resource.type viene utilizzato per costruire metadata.product_event_type.resource.labels.node_name
resource.labels.pod_name additional.fields.key Il valore "Nome pod" viene assegnato come chiave nell'oggetto additional.fields.
resource.labels.pod_name additional.fields.value.string_value Il valore di resource.labels.pod_name dal log non elaborato viene assegnato come valore di stringa nell'oggetto additional.fields.
resource.labels.project_id additional.fields.key Il valore "Project Id" viene assegnato come chiave nell'oggetto additional.fields.
resource.labels.project_id additional.fields.value.string_value Il valore di resource.labels.project_id dal log non elaborato viene assegnato come valore di stringa nell'oggetto additional.fields.
resource.type target.resource.resource_subtype Il valore resource.type del log non elaborato viene assegnato al campo target.resource.resource_subtype.
Roles target.user.user_role Il campo Roles del log non elaborato viene convertito in maiuscolo e mappato al campo target.user.user_role.
SessionID network.session_id Il valore SessionID del log non elaborato viene mappato al campo network.session_id.
sev security_result.severity Il valore del campo sev determina il valore di security_result.severity. "INFO" o "NOTICE" corrisponde a "INFORMATIONAL", "WARN" a "MEDIUM" e "ERR" a "ERROR".
TargetUsername target.user.user_display_name Il valore TargetUsername del log non elaborato è mappato al campo target.user.user_display_name.
textPayload metadata.description Se resource.type è "k8s_node", il valore di resource.type viene mappato al campo metadata.description.textPayload
textPayload network.application_protocol Il protocollo (ad esempio HTTP) viene estratto dal campo textPayload utilizzando i pattern Grok.
textPayload network.http.method Il metodo HTTP (ad esempio GET, POST) viene estratto dal campo textPayload utilizzando i pattern Grok.
textPayload network.http.referral_url L'URL viene estratto dal campo textPayload utilizzando i pattern Grok.
textPayload network.http.response_code Il codice di risposta HTTP viene estratto dal campo textPayload utilizzando i pattern Grok e convertito in un numero intero.
textPayload network.received_bytes I byte ricevuti vengono estratti dal campo textPayload utilizzando i pattern Grok e convertiti in un numero intero non firmato.
textPayload principal.ip L'indirizzo IP di origine viene estratto dal campo textPayload utilizzando i pattern Grok.
textPayload security_result.description La descrizione viene estratta dal campo textPayload utilizzando i pattern Grok.
textPayload target.file.full_path Il percorso viene estratto dal campo textPayload utilizzando i pattern Grok.
UserAgent network.http.user_agent Il valore UserAgent del log non elaborato è mappato al campo network.http.user_agent. Il valore "USER_RESOURCE_ACCESS" è assegnato a metadata.event_type.

Modifiche

2024-05-07

  • Correzione di bug:
  • È stata modificata la logica dell'analizzatore per analizzare i log non analizzati e eliminati.

2023-05-25

  • Parser appena creato.