Raccogliere i log di Microsoft IIS
Questo documento spiega come raccogliere i log di Microsoft Internet Information Services (IIS) in Google Security Operations utilizzando Bindplane. Il parser tenta innanzitutto di pulire e normalizzare i dati di input rimuovendo i caratteri non necessari e standardizzando i nomi dei campi. Poi utilizza una serie di pattern grok per estrarre i campi pertinenti da vari formati di log Microsoft IIS e li mappa al modello UDM (Unified Data Model).
Prima di iniziare
Assicurati di soddisfare i seguenti prerequisiti:
- Un'istanza Google SecOps
- Windows Server 2016 o versioni successive con IIS installato
- Accesso amministrativo al server IIS
- Se l'agente viene eseguito dietro un proxy, assicurati che le porte del firewall siano aperte in base ai requisiti dell'agente Bindplane
Recuperare il file di autenticazione importazione di Google SecOps
- Accedi alla console Google SecOps.
- Vai a Impostazioni SIEM > Agenti di raccolta.
- Scarica il file di autenticazione importazione. Salva il file in modo sicuro sul sistema in cui verrà installato Bindplane (ad esempio
C:\SecOps\ingestion-auth.json).
Recuperare l'ID cliente Google SecOps
- Accedi alla console Google SecOps.
- Vai a Impostazioni SIEM > Profilo.
- Copia e salva l'ID cliente dalla sezione Dettagli dell'organizzazione.
Configura il logging esteso W3C di IIS
Questo è il passaggio più importante. Devi attivare i campi W3C corretti in IIS Manager in modo che Google SecOps possa analizzare correttamente i log e i rilevamenti funzionino in modo affidabile.
Apri IIS Manager
- Fai clic su Avvia.
- Digita
inetmgre premi Invio. - Si apre la finestra Internet Information Services (IIS) Manager.
Metodo alternativo:
- Premi tasto Windows + R.
- Digita
inetmgre premi Invio.
Vai a Configurazione del logging
- Nel riquadro Connessioni (a sinistra), espandi il nome del server.
- Per configurare la registrazione a livello di server (consigliata):
- Fai clic sul nome del server a livello radice.
- Per configurare la registrazione specifica per il sito:
- Espandi Siti > fai clic sul sito specifico (ad esempio, Sito web predefinito).
- Nella visualizzazione Funzionalità (riquadro centrale), fai doppio clic su Logging.
Seleziona il formato W3C Extended Log Format
- Nella pagina Logging, nella sezione File di log:
- Nel menu a discesa Formato, seleziona W3C.
- Fai clic sul pulsante Seleziona campi.
Configura i campi di logging W3C
CRITICO: il parser IIS di Google SecOps supporta esattamente otto configurazioni di campi. Devi attivare TUTTI i campi di UNO dei pattern riportati di seguito. L'attivazione di campi diversi o la combinazione di pattern causerà errori di analisi.
Nella finestra di dialogo Campi di logging W3C, seleziona i campi in base a uno dei seguenti pattern:
Pattern 1: contesto completo del sito con stringa di query e byte
Attiva questi campi nell'ordine esatto:
- Data (data)
- Ora (ora)
- Nome servizio (s-sitename)
- Indirizzo IP del server (s-ip)
- Metodo (cs-method)
- URI Stem (cs-uri-stem)
- Query URI (cs-uri-query)
- Porta server (s-port)
- Nome utente (cs-username)
- Indirizzo IP client (c-ip)
- User agent (cs(User-Agent))
- Referer (cs(Referer))
- Stato del protocollo (sc-status)
- Byte inviati (sc-bytes)
- Byte ricevuti (cs-bytes)
Utilizza questo pattern quando: il formato downstream include il contesto del sito + la stringa di query e richiedi i byte inviati/ricevuti e la pipeline prevede le colonne "username" e "referer" (anche se i valori sono -).
Pattern 2: di base con sottostato, stato Win32 e rendimento (nessun referrer)
Attiva questi campi nell'ordine esatto:
- Data (data)
- Ora (ora)
- Indirizzo IP del server (s-ip)
- Metodo (cs-method)
- URI Stem (cs-uri-stem)
- Query URI (cs-uri-query)
- Porta server (s-port)
- Nome utente (cs-username)
- Indirizzo IP client (c-ip)
- User agent (cs(User-Agent))
- Stato del protocollo (sc-status)
- Sottostato del protocollo (sc-substatus)
- Stato Win32 (sc-win32-status)
- Tempo impiegato (tempo impiegato)
Utilizza questo pattern quando:la tua pipeline non include il referrer, ma hai bisogno di codici di errore e latenza dettagliati (time-taken).
Pattern 3: Basic with Substatus, Win32 Status, and Performance (With Referer)
Attiva questi campi nell'ordine esatto:
- Data (data)
- Ora (ora)
- Indirizzo IP del server (s-ip)
- Metodo (cs-method)
- URI Stem (cs-uri-stem)
- Query URI (cs-uri-query)
- Porta server (s-port)
- Nome utente (cs-username)
- Indirizzo IP client (c-ip)
- User agent (cs(User-Agent))
- Referer (cs(Referer))
- Stato del protocollo (sc-status)
- Sottostato del protocollo (sc-substatus)
- Stato Win32 (sc-win32-status)
- Tempo impiegato (tempo impiegato)
Utilizza questo pattern quando:come nel pattern 2, ma la pipeline include il referrer come colonna dedicata.
Pattern 4: TLS/Protocol-Version Aware con referrer e prestazioni
Attiva questi campi nell'ordine esatto:
- Data (data)
- Ora (ora)
- Indirizzo IP del server (s-ip)
- Metodo (cs-method)
- URI Stem (cs-uri-stem)
- Query URI (cs-uri-query)
- Porta client (c-port)
- Nome utente (cs-username)
- Indirizzo IP client (c-ip)
- Versione del protocollo (cs-version)
- User agent (cs(User-Agent))
- Referer (cs(Referer))
- Stato del protocollo (sc-status)
- Sottostato del protocollo (sc-substatus)
- Stato Win32 (sc-win32-status)
- Tempo impiegato (tempo impiegato)
Utilizza questo pattern quando: il formato downstream registra esplicitamente cs-version (ad es. HTTP/1.1) e include la tempistica, inoltre la porta client è presente come colonna dedicata.
Modello 5: TLS/Protocol-Version Aware con referrer (nessuna prestazione)
Attiva questi campi nell'ordine esatto:
- Data (data)
- Ora (ora)
- Indirizzo IP del server (s-ip)
- Metodo (cs-method)
- URI Stem (cs-uri-stem)
- Query URI (cs-uri-query)
- Porta client (c-port)
- Nome utente (cs-username)
- Indirizzo IP client (c-ip)
- Versione del protocollo (cs-version)
- User agent (cs(User-Agent))
- Referer (cs(Referer))
- Stato del protocollo (sc-status)
- Sottostato del protocollo (sc-substatus)
- Stato Win32 (sc-win32-status)
Utilizza questo pattern quando: come il pattern 4, ma la pipeline non include time-taken.
Pattern 6: With Cookie and Referer (No Performance, No Bytes)
Attiva questi campi nell'ordine esatto:
- Data (data)
- Ora (ora)
- Indirizzo IP del server (s-ip)
- Metodo (cs-method)
- URI Stem (cs-uri-stem)
- Query URI (cs-uri-query)
- Porta client (c-port)
- Nome utente (cs-username)
- Indirizzo IP client (c-ip)
- User agent (cs(User-Agent))
- Cookie (cs(Cookie))
- Referer (cs(Referer))
- Stato del protocollo (sc-status)
- Sottostato del protocollo (sc-substatus)
- Stato Win32 (sc-win32-status)
Utilizza questo pattern quando: il formato downstream prevede sia il cookie sia il referrer come colonne dedicate.
Modello 7: Minimo con referrer (nessun cookie, nessuna metrica di rendimento, nessun byte)
Attiva questi campi nell'ordine esatto:
- Data (data)
- Ora (ora)
- Indirizzo IP del server (s-ip)
- Metodo (cs-method)
- URI Stem (cs-uri-stem)
- Query URI (cs-uri-query)
- Porta client (c-port)
- Nome utente (cs-username)
- Indirizzo IP client (c-ip)
- User agent (cs(User-Agent))
- Referer (cs(Referer))
- Stato del protocollo (sc-status)
- Sottostato del protocollo (sc-substatus)
- Stato Win32 (sc-win32-status)
Utilizza questo pattern quando:il formato downstream include il referrer, ma non include cookie/ora/byte.
Modello 8: Minimo senza referrer (nessun cookie, nessun rendimento, nessun byte)
Attiva questi campi nell'ordine esatto:
- Data (data)
- Ora (ora)
- Indirizzo IP del server (s-ip)
- Metodo (cs-method)
- URI Stem (cs-uri-stem)
- Query URI (cs-uri-query)
- Porta client (c-port)
- Nome utente (cs-username)
- Indirizzo IP client (c-ip)
- User agent (cs(User-Agent))
- Stato del protocollo (sc-status)
- Sottostato del protocollo (sc-substatus)
- Stato Win32 (sc-win32-status)
Utilizza questo pattern quando:il formato downstream non include il referrer e hai bisogno solo del contesto della richiesta principale più i codici di stato.
NON attivare i campi di più pattern. Il parser prevede una di queste configurazioni esatte.
Applica configurazione
- Fai clic su Ok per chiudere la finestra di dialogo Campi di registrazione W3C.
- Verifica il percorso della directory in cui verranno scritti i log.
- Valore predefinito:
%SystemDrive%\inetpub\logs\LogFiles
- Valore predefinito:
- In Rotazione dei file di log, seleziona Giornaliera (opzione consigliata per l'importazione di Google SecOps).
- Fai clic su Applica nel riquadro Azioni (a destra).
Installa l'agente Bindplane
Installa l'agente Bindplane sul server Windows seguendo le istruzioni riportate di seguito.
Installazione di Windows
- Apri Prompt dei comandi o PowerShell come amministratore.
Esegui questo comando:
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
Risorse aggiuntive per l'installazione
- Per ulteriori opzioni di installazione, consulta questa guida all'installazione.
Configura l'agente Bindplane per importare i log IIS e inviarli a Google SecOps
Arresta il servizio Bindplane
Prima di modificare il file di configurazione, arresta il servizio:
Stop-Service "observIQ OpenTelemetry Collector"
Modifica il file di configurazione
- Individua il file
config.yaml.- Percorso predefinito:
C:\Program Files\observIQ OpenTelemetry Collector\config.yaml
- Percorso predefinito:
- Apri il file utilizzando un editor di testo (ad esempio Blocco note, VS Code o Notepad++) come amministratore.
Sostituisci l'intero contenuto con la seguente configurazione:
receivers: iis: collection_interval: 60s processors: resourcedetection: detectors: ["system"] system: hostname_sources: ["os"] normalizesums: batch: exporters: chronicle/iis: endpoint: malachiteingestion-pa.googleapis.com creds: 'C:\SecOps\ingestion-auth.json' log_type: 'IIS' override_log_type: false raw_log_field: body customer_id: '<CUSTOMER_ID>' compression: gzip service: pipelines: logs/iis: receivers: - iis processors: - resourcedetection - normalizesums - batch exporters: - chronicle/iis- Sostituisci i seguenti segnaposto:
creds:: percorso del file di autenticazione dell'importazione (ad esempio,C:\SecOps\ingestion-auth.json).customer_id:: il tuo ID cliente Google SecOps effettivo dalla sezione Recupera l'ID cliente Google SecOps.
- Sostituisci i seguenti segnaposto:
Riavvia l'agente Bindplane per applicare le modifiche
Dopo aver salvato il file
config.yaml, riavvia il servizio Bindplane:Start-Service "observIQ OpenTelemetry Collector"Verifica che il servizio sia in esecuzione:
Get-Service "observIQ OpenTelemetry Collector"
Output previsto:
Status Name DisplayName ------ ---- ----------- Running observiq-otel-collector observIQ OpenTelemetry Collector
Tabella di mappatura UDM
| Campo log | Mappatura UDM | Logic |
|---|---|---|
| @timestamp | metadata.event_timestamp | Il timestamp dell'evento registrato nel log non elaborato. |
| @version | metadata.product_version | La versione del server IIS. |
| AgentDevice | additional.fields.AgentDevice.value.string_value | Il dispositivo che ha generato il log. |
| AgentLogFile | additional.fields.AgentLogFile.value.string_value | Il nome del file di log. |
| ASP.NET_SessionId | network.session_id | L'ID sessione dell'utente. |
| c-ip | principal.ip | L'indirizzo IP del client. |
| Canale | security_result.about.resource.attribute.labels.Channel.value | Il canale in cui è stato registrato l'evento. |
| ChannelID | security_result.about.resource.attribute.labels.ChannelID.value | L'ID del canale in cui è stato registrato l'evento. |
| Computer | target.hostname | Il nome host della macchina di destinazione. |
| cs-bytes | network.received_bytes | Il numero di byte ricevuti dal client. |
| cs-host | principal.hostname, principal.asset.hostname | Il nome host del client. |
| cs-method | network.http.method | Il metodo HTTP utilizzato dal client. |
| cs-uri-query | target.url | La stringa di query dell'URL richiesto dal client. |
| cs-uri-stem | target.url | Il percorso dell'URL richiesto dal client. |
| cs-username | principal.user.user_display_name | Il nome utente del cliente. |
| cs-version | network.tls.version_protocol | La versione HTTP utilizzata dal client. |
| cs(Cookie) | Utilizzato per estrarre informazioni sui cookie. | |
| cs(Referer) | network.http.referral_url | L'URL che ha indirizzato il cliente alla pagina corrente. |
| cs(User-Agent) | network.http.user_agent | Lo user agent del client. |
| csbyte | network.received_bytes | Il numero di byte ricevuti dal client. |
| cshost | principal.hostname, principal.asset.hostname | Il nome host del client. |
| csip | principal.ip, principal.asset.ip | L'indirizzo IP del client. |
| csmethod | network.http.method | Il metodo HTTP utilizzato dal client. |
| csreferer | network.http.referral_url | L'URL che ha indirizzato il cliente alla pagina corrente. |
| csuseragent | network.http.user_agent | Lo user agent del client. |
| csusername | principal.user.user_display_name | Il nome utente del cliente. |
| csversion | network.tls.version_protocol | La versione HTTP utilizzata dal client. |
| data | Utilizzato per creare il timestamp dell'evento se il timestamp del log non elaborato non è valido. | |
| descrizione | security_result.description | Una descrizione dell'evento. |
| devicename | target.hostname | Il nome host della macchina di destinazione. |
| dst_ip | target.ip, target.asset.ip | L'indirizzo IP della macchina di destinazione. |
| dst_port | target.port | Il numero di porta della macchina di destinazione. |
| duration | La durata della richiesta in millisecondi. | |
| EventEnqueuedUtcTime | additional.fields.EventEnqueuedUtcTime.value.string_value | L'ora in cui l'evento è stato messo in coda in formato UTC. |
| EventID | metadata.product_log_id | L'ID dell'evento. |
| EventProcessedUtcTime | additional.fields.EventProcessedUtcTime.value.string_value | L'ora in cui l'evento è stato elaborato nel fuso orario UTC. |
| EventTime | metadata.event_timestamp | Il timestamp dell'evento. |
| EventType | metadata.product_event_type | Il tipo di evento. |
| file_path | target.file.full_path | Il percorso completo del file coinvolto nell'evento. |
| FilterId | security_result.about.resource.attribute.labels.FilterId.value | L'ID del filtro. |
| FilterKey | security_result.about.resource.attribute.labels.FilterKey.value | La chiave del filtro. |
| FilterName | security_result.about.resource.attribute.labels.FilterName.value | Il nome del filtro. |
| FilterType | security_result.about.resource.attribute.labels.FilterType.value | Il tipo di filtro. |
| host | target.hostname | Il nome host della macchina di destinazione. |
| host.architecture | principal.asset.hardware.cpu_platform | L'architettura della macchina host. |
| host.geo.name | additional.fields.geo_name.value.string_value | La posizione geografica della macchina host. |
| host.hostname | target.hostname, target.asset.hostname | Il nome host della macchina host. |
| host.id | observer.asset_id | L'ID della macchina host. |
| host.ip | principal.ip, principal.asset.ip | L'indirizzo IP della macchina host. |
| host.mac | principal.mac | L'indirizzo MAC della macchina host. |
| host.os.build | additional.fields.os_build.value.string_value | Il numero di build del sistema operativo sulla macchina host. |
| host.os.kernel | principal.platform_patch_level | La versione del kernel del sistema operativo sulla macchina host. |
| host.os.name | additional.fields.os_name.value.string_value | Il nome del sistema operativo sulla macchina host. |
| host.os.platform | principal.platform | La piattaforma del sistema operativo sulla macchina host. |
| host.os.version | principal.platform_version | La versione del sistema operativo sulla macchina host. |
| http_method | network.http.method | Il metodo HTTP utilizzato dal client. |
| http_response | network.http.response_code | Il codice di risposta HTTP. |
| http_status_code | network.http.response_code | Il codice di stato HTTP della risposta. |
| http_substatus | additional.fields.sc_substatus.value.string_value | Il codice di stato secondario HTTP della risposta. |
| istanza | additional.fields.instance.value.string_value | L'ID istanza dell'attività. |
| intermediary_devicename | intermediary.hostname, intermediary.asset.hostname | Il nome host del dispositivo intermediario. |
| json_message | Il messaggio di log non elaborato in formato JSON. | |
| kv_fields | Utilizzato per estrarre coppie chiave-valore dal messaggio di log non elaborato. | |
| LayerKey | security_result.about.resource.attribute.labels.LayerKey.value | La chiave del livello. |
| LayerName | security_result.about.resource.attribute.labels.LayerName.value | Il nome del livello. |
| LayerId | security_result.about.resource.attribute.labels.LayerId.value | L'ID del livello. |
| log.file.path | target.file.full_path | Il percorso completo del file di log. |
| log.offset | metadata.product_log_id | L'offset dell'evento nel file di log. |
| logstash.collect.host | observer.hostname | Il nome host della macchina che ha raccolto il log. |
| logstash.process.host | intermediary.hostname | Il nome host del computer che ha elaborato il log. |
| logstash_json_message | Il messaggio di log non elaborato in formato JSON. | |
| messaggio | security_result.description | Il messaggio di log non elaborato. |
| ministero | additional.fields.ministry.value.string_value | Il ministero associato all'evento. |
| nome | Il nome dell'entità. | |
| NewValue | additional.fields.NewValue.value.string_value | Il nuovo valore dell'impostazione di configurazione. |
| OldValue | additional.fields.OldValue.value.string_value | Il valore precedente dell'impostazione di configurazione. |
| porta | principal.port | Il numero di porta del client. |
| priority_code | Il codice di priorità del messaggio syslog. | |
| ProcessID | principal.process.pid | L'ID processo del processo che ha generato l'evento. |
| ProviderGuid | security_result.about.resource.attribute.labels.ProviderGuid.value | Il GUID del fornitore. |
| ProviderKey | security_result.about.resource.attribute.labels.ProviderKey.value | La chiave del fornitore. |
| ProviderName | security_result.about.resource.attribute.labels.ProviderName.value | Il nome del fornitore. |
| referrer_url | network.http.referral_url | L'URL che ha indirizzato il cliente alla pagina corrente. |
| request_url | target.url | L'URL richiesto dal client. |
| s-computername | target.hostname | Il nome host della macchina di destinazione. |
| s-ip | target.ip, target.asset.ip | L'indirizzo IP della macchina di destinazione. |
| s-port | target.port | Il numero di porta della macchina di destinazione. |
| s-sitename | additional.fields.sitename.value.string_value | Il nome del sito. |
| sc-bytes | network.sent_bytes | Il numero di byte inviati al client. |
| sc-status | network.http.response_code | Il codice di stato HTTP della risposta. |
| sc-substatus | additional.fields.sc_substatus.value.string_value | Il codice di stato secondario HTTP della risposta. |
| sc-win32-status | Il codice di stato di Windows della risposta. | |
| scbyte | network.sent_bytes | Il numero di byte inviati al client. |
| scstatus | network.http.response_code | Il codice di stato HTTP della risposta. |
| gravità | security_result.severity | La gravità dell'evento. |
| service.type | additional.fields.service_type.value.string_value | Il tipo di servizio. |
| sIP | principal.ip, principal.asset.ip | L'indirizzo IP del client. |
| sPort | principal.port | Il numero di porta del client. |
| sSiteName | additional.fields.sitename.value.string_value | Il nome del sito. |
| src_ip | principal.ip, principal.asset.ip, observer.ip | L'indirizzo IP del client. |
| src_port | principal.port | Il numero di porta del client. |
| sysdate | La data e l'ora del messaggio syslog. | |
| syslog_facility | security_result.severity_details | La struttura del messaggio syslog. |
| syslog_pri | La priorità del messaggio syslog. | |
| syslog_severity | security_result.severity_details | La gravità del messaggio syslog. |
| syslog_severity_code | Il codice di gravità del messaggio syslog. | |
| Tag | security_result.rule_name | Tag associati all'evento. |
| attività | additional.fields.task.value.string_value | Il nome dell'attività. |
| tempo | Utilizzato per creare il timestamp dell'evento se il timestamp del log non elaborato non è valido. | |
| tempo impiegato | La durata della richiesta in millisecondi. | |
| uri_query | target.url | La stringa di query dell'URL richiesto dal client. |
| user_agent | network.http.user_agent | Lo user agent del client. |
| Nome utente | target.user.userid | Il nome utente dell'utente. |
| UserSid | target.user.windows_sid | Il SID di Windows dell'utente. |
| Peso | security_result.about.resource.attribute.labels.Weight.value | Il peso del filtro. |
| win32_status | Il codice di stato di Windows della risposta. | |
| xforwardedfor | L'intestazione X-Forwarded-For, contenente un elenco di indirizzi IP separati da virgole. | |
| metadata.log_type | "IIS" | |
| network.direction | "INBOUND" | |
| metadata.vendor_name | "Microsoft" | |
| metadata.product_name | "Internet Information Server" | |
| metadata.event_type | "NETWORK_HTTP", "USER_UNCATEGORIZED", "GENERIC_EVENT", "STATUS_UPDATE", "USER_LOGOUT", "USER_LOGIN" | |
| extensions.auth.type | "MACHINE" |
Hai bisogno di ulteriore assistenza? Ricevi risposte dai membri della community e dai professionisti di Google SecOps.