Raccogliere i log del CMS WordPress
Panoramica
Questo parser estrae i log del CMS WordPress da messaggi in formato JSON o testo normale. Gestisce i log formattati in formato JSON e non JSON, analizzando i campi pertinenti e mappandoli all'UDM, inclusi i dettagli dell'utente, le informazioni di rete, gli attributi delle risorse e i dettagli dei risultati di sicurezza. Il parser esegue anche diverse trasformazioni dei dati, come 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 disporre dei seguenti prerequisiti:
- Istanza Google SecOps.
- Accesso con privilegi a un sito web WordPress.
- Plug-in che abilita la funzionalità webhook (ad esempio WP Webhooks).
Configurare i feed
Per configurare un feed:
- Vai a Impostazioni SIEM > Feed.
- Fai clic su Aggiungi nuovo feed.
- Nella pagina successiva, fai clic su Configura un singolo feed.
- Nel campo Nome feed, inserisci un nome per il feed, ad esempio Log CMS Wordpress.
- Seleziona Webhook come Tipo di origine.
- Seleziona WordPress come Tipo di log.
- Fai clic su Avanti.
- (Facoltativo) Specifica i valori per i seguenti parametri di input:
- Delimitatore di suddivisione: il delimitatore utilizzato per separare le righe di log, ad esempio
\n
.
- Delimitatore di suddivisione: il delimitatore utilizzato per separare le righe di log, ad esempio
- Fai clic su Avanti.
- Rivedi la configurazione del feed nella schermata Finalizza e poi fai clic su Invia.
- Fai clic su Genera chiave segreta per generare una chiave segreta per autenticare questo feed.
- Copia e memorizza la chiave segreta. Non puoi visualizzare di nuovo questa chiave segreta. Se necessario, puoi rigenerare una nuova chiave segreta, ma questa azione rende obsoleta la chiave segreta precedente.
- Nella scheda Dettagli, copia l'URL dell'endpoint del feed dal campo Informazioni sull'endpoint. Devi specificare questo URL dell'endpoint nella tua applicazione client.
- Fai clic su Fine.
Crea una chiave API per il feed webhook
Vai alla consoleGoogle Cloud > Credenziali.
Fai clic su Crea credenziali e poi seleziona Chiave API.
Limita l'accesso della chiave API all'API Google Security Operations.
Specifica l'URL dell'endpoint
- Nella tua applicazione client, specifica l'URL dell'endpoint HTTPS fornito nel feed webhook.
Attiva l'autenticazione specificando la chiave API e la chiave segreta come parte dell'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 a Google Security Operations.SECRET
: la chiave segreta che hai generato per autenticare il feed.
Configura il webhook di WordPress
- Installa e attiva il plug-in WP Webhooks (o il plug-in webhook che hai scelto) tramite la directory dei plug-in di WordPress.
- Vai al sottomenu WP Webhooks nel menu di amministrazione di WordPress, in genere in Impostazioni.
- Fai clic su Invia dati nel menu della barra in alto.
- Seleziona l'azione di WordPress che attiverà il webhook. Esempi comuni includono publish_post (quando viene pubblicato un nuovo post), user_register (quando viene registrato un nuovo utente) o comment_post (quando viene pubblicato un nuovo commento). Dipende dai dati che selezioni e invii a Google SecOps.
- Fai clic su Aggiungi URL webhook.
- Configura il webhook:
- Nome: assegna al webhook un nome descrittivo (ad esempio, Feed Google SecOps).
- URL webhook: incolla l'URL dell'endpoint Google SecOps.
- Fai clic su Salva webhook.
Tabella di mappatura UDM
Campo log | Mappatura UDM | Logic |
---|---|---|
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 "Code" 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 |
EditUserLink del log non elaborato viene mappato al campo target.url . |
EventType |
metadata.product_event_type |
EventType del log non elaborato viene mappato al campo metadata.product_event_type . |
FirstName |
target.user.first_name |
FirstName del log non elaborato viene mappato al campo target.user.first_name . |
insertId |
metadata.product_log_id |
insertId del log non elaborato viene mappato al campo metadata.product_log_id . |
labels.compute.googleapis.com/resource_name |
additional.fields.key |
Il valore "Resource Name" 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 del log non elaborato viene assegnato come valore 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 del log grezzo 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 del log grezzo viene assegnato come valore nell'oggetto target.resource.attribute.labels . |
labels.k8s-pod/app_kubernetes_io/name |
target.resource.attribute.labels.key |
Il valore "Kubernetes IO Instance Name" 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 del log grezzo 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 del log grezzo 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 del log grezzo 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 del log grezzo viene assegnato come valore nell'oggetto target.resource.attribute.labels . |
labels.k8s-pod/pod-template-generation |
target.resource.attribute.labels.key |
Il valore "Pod Template Generation" 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 del log grezzo viene assegnato come valore nell'oggetto target.resource.attribute.labels . |
labels.k8s-pod/pod-template-hash |
target.resource.attribute.labels.key |
Il valore "Pod Template Hash" 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 del log grezzo viene assegnato come valore nell'oggetto target.resource.attribute.labels . |
LastName |
target.user.last_name |
LastName del log non elaborato viene mappato al campo target.user.last_name . |
logName |
target.resource.attribute.labels.key |
Il valore "Log Name" 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 del log non elaborato viene assegnato come valore 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 creare metadata.product_event_type . |
resource.labels.container_name |
target.resource.name |
Il valore di 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 del log non elaborato viene assegnato al campo target.location.country_or_region . |
resource.labels.namespace_name |
additional.fields.key |
Il valore "Namespace Name" viene assegnato come chiave nell'oggetto additional.fields . |
resource.labels.namespace_name |
additional.fields.value.string_value |
Il valore di resource.labels.namespace_name del log non elaborato viene assegnato come valore 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 creare metadata.product_event_type . |
resource.labels.node_name |
metadata.product_event_type |
Se resource.type è "k8s_node", il valore di resource.labels.node_name viene utilizzato per creare metadata.product_event_type . |
resource.labels.pod_name |
additional.fields.key |
Il valore "Pod Name" viene assegnato come chiave nell'oggetto additional.fields . |
resource.labels.pod_name |
additional.fields.value.string_value |
Il valore di resource.labels.pod_name del log non elaborato viene assegnato come valore 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 del log non elaborato viene assegnato come valore stringa nell'oggetto additional.fields . |
resource.type |
target.resource.resource_subtype |
Il valore di 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 |
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" corrisponde a "MEDIUM" e "ERR" corrisponde a "ERROR". |
TargetUsername |
target.user.user_display_name |
TargetUsername del log non elaborato viene mappato al campo target.user.user_display_name . |
textPayload |
metadata.description |
Se resource.type è "k8s_node", il valore di textPayload viene mappato al campo metadata.description . |
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 senza segno. |
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 |
UserAgent del log non elaborato viene mappato al campo network.http.user_agent . Il valore "USER_RESOURCE_ACCESS" è assegnato a metadata.event_type . |
Hai bisogno di ulteriore assistenza? Ricevi risposte dai membri della community e dai professionisti di Google SecOps.