Raccogli 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 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
- Vai a Impostazioni SIEM > Feed.
- Fai clic su Aggiungi nuovo.
- Nel campo Nome feed, inserisci un nome per il feed (ad esempio Log di 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 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.
- Delimitatore di split: il delimitatore utilizzato per separare le righe di log, ad esempio
- Fai clic su Avanti.
- Controlla la configurazione del feed nella schermata Concludi 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 potrai più visualizzare 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 endpoint nell'applicazione client.
- Fai clic su Fine.
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 alla chiave API all'API Google Security Operations.
Specifica l'URL dell'endpoint
- Nell'applicazione client, specifica l'URL dell'endpoint HTTPS fornito nel feed webhook.
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
- 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 Amministrazione di WordPress, in genere in Impostazioni.
- Fai clic su Invia dati nel menu della barra in alto.
- 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.
- Fai clic su Aggiungi URL webhook.
- Configura il webhook:
- Nome: assegna un nome descrittivo all'webhook (ad es. Feed Google SecOps).
- URL webhook: incolla l'URL endpoint di Google SecOps.
- 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.