Raccogliere i log del CMS WordPress
Panoramica
Questo parser estrae i log del CMS WordPress dai messaggi formattati 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, 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 soddisfare i 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
Esistono due diversi punti di accesso per configurare i feed nella piattaforma Google SecOps:
- Impostazioni SIEM > Feed
- Hub dei contenuti > Pacchetti di contenuti
Configura i feed da Impostazioni SIEM > 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.
- Controlla 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 nell'applicazione client.
- Fai clic su Fine.
Configurare i feed dall'hub dei contenuti
Specifica i valori per i seguenti campi:
- Delimitatore di suddivisione: il delimitatore utilizzato per separare le righe di log, ad esempio
\n
.
Opzioni avanzate
- Nome feed: un valore precompilato che identifica il feed.
- Tipo di origine: metodo utilizzato per raccogliere i log in Google SecOps.
- Spazio dei nomi dell'asset: lo spazio dei nomi associato al feed.
Etichette di importazione: etichette applicate a tutti gli eventi di questo feed.
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 nell'applicazione client.
Crea una chiave API per il feed webhook
Vai alla console Google 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.