Raccogliere i log di NGINX
Questo parser NGINX gestisce i log in formato JSON e syslog. Estrae i campi da vari formati di log e li normalizza nel formato UDM. Il parser arricchisce l'evento con metadati per la gestione del server e l'attività di rete, inclusi gli accessi utente e le richieste HTTP. Gestisce anche la logica per gli eventi SSH e compila i campi UDM in base ai dati estratti.
Prima di iniziare
- Assicurati di avere un'istanza Google Security Operations.
- Assicurati che NGINX sia in esecuzione e generi log.
- Assicurati di disporre dell'accesso root alla macchina host NGINX.
Recupera il file di autenticazione di importazione di Google SecOps
- Accedi alla console Google SecOps.
- Vai a Impostazioni SIEM > Agenti di raccolta.
- Scarica il file di autenticazione dell'importazione.
Ottenere 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.
Installa BindPlane Agent
- Per l'installazione di Windows, esegui il seguente script:
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
- Per l'installazione su Linux, esegui il seguente script:
sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh
- Ulteriori opzioni di installazione sono disponibili in questa guida all'installazione.
Configura l'agente BindPlane per importare i syslog e inviarli a Google SecOps
- Accedi al computer su cui è installato BindPlane.
Modifica il file
config.yaml
come segue:receivers: tcplog: # Replace the below port <54525> and IP <0.0.0.0> with your specific values listen_address: "0.0.0.0:54525" exporters: chronicle/chronicle_w_labels: compression: gzip # Adjust the creds location below according the placement of the credentials file you downloaded creds: '{ json file for creds }' # Replace <customer_id> below with your actual ID that you copied customer_id: <customer_id> endpoint: malachiteingestion-pa.googleapis.com # You can apply ingestion labels below as preferred ingestion_labels: log_type: SYSLOG namespace: auditd raw_log_field: body service: pipelines: logs/source0__chronicle_w_labels-0: receivers: - tcplog exporters: - chronicle/chronicle_w_labels
Riavvia l'agente BindPlane per applicare le modifiche:
sudo systemctl restart bindplane
Identificare la posizione dei file di log di NGINX
I log NGINX vengono archiviati in:
* Log di accesso: /var/log/nginx/access.log
* Log di errore: /var/log/nginx/error.log
1. Accedi all'host NGINX utilizzando le credenziali amministrative.
1. Esegui il seguente comando e cerca i percorsi dei file di log sull'host NGINX:
sudo cat /etc/nginx/nginx.conf | grep log
Configurare NGINX per inoltrare i log a Bindplane
Apri il file di configurazione di NGINX (ad esempio
/etc/nginx/nginx.conf
):sudo vi /etc/nginx/nginx.conf
Modifica la configurazione sostituendo
<BINDPLANE_SERVER>
e<BINDPLANE_PORT>
con i tuoi valori:http { access_log syslog:server=<BINDPLANE_SERVER>:<BINDPLANE_PORT>,facility=local7,tag=nginx_access; error_log syslog:server=<BINDPLANE_SERVER>:<BINDPLANE_PORT>,facility=local7,tag=nginx_error; }
Riavvia NGINX per applicare le modifiche:
sudo systemctl reload nginx
Tabella di mappatura UDM
Campo log | Mappatura UDM | Logica |
---|---|---|
_Internal_WorkspaceResourceId |
target.resource.product_object_id |
Mappatura diretta |
Computer |
principal.asset.hostname |
Mappatura diretta |
Facility |
additional.fields["facility"] |
Mappatura diretta |
HostName |
principal.asset.hostname |
Mappatura diretta se src_ip non è presente |
ProcessName |
principal.application |
Mappatura diretta |
SeverityLevel |
security_result.severity |
Mappato a INFORMATIONAL se il valore è "info" |
SourceSystem |
principal.asset.platform |
Mappato a LINUX se il valore corrisponde a "Linux" |
SyslogMessage |
Più campi | Analizzata utilizzando grok per estrarre time , method , target_path , protocol , response_code , referral_url , user_agent , target_ip , target_host e cache |
TenantId |
additional.fields["TenantId"] |
Mappatura diretta |
acct |
principal.user.user_id |
Mappato direttamente se non vuoto o "?" |
addr |
principal.asset.ip |
Mappatura diretta |
audit_epoch |
metadata.event_timestamp |
Convertito in timestamp utilizzando il formato "UNIX". I nanosecondi vengono estratti dal messaggio di log originale. |
cache |
additional.fields["cache"] |
Mappatura diretta |
collection_time.nanos |
metadata.event_timestamp.nanos |
Utilizzato per i nanosecondi del timestamp dell'evento, se disponibile |
collection_time.seconds |
metadata.event_timestamp.seconds |
Utilizzato per i secondi del timestamp dell'evento, se disponibili |
data |
Più campi | L'origine principale dei dati, analizzata in modo diverso in base al formato del log (Syslog, JSON o altro) |
exe |
target.process.command_line |
Mappatura diretta dopo la rimozione di barre oblique e virgolette |
hostname |
principal.asset.hostname OPPURE principal.asset.ip |
Se si tratta di un indirizzo IP, deve essere mappato a principal.asset.ip . In caso contrario, mappato a principal.asset.hostname |
msg |
metadata.description |
Mappata direttamente come descrizione |
node |
target.asset.hostname |
Mappatura diretta |
pid |
target.process.pid |
Mappatura diretta |
protocol |
network.application_protocol |
Mappato a HTTP se il valore corrisponde a "HTTP" |
referral_url |
network.http.referral_url |
Mappato direttamente se non vuoto o "-" |
res |
security_result.action_details |
Mappatura diretta |
response_code |
network.http.response_code |
Mappato direttamente e convertito in numero intero |
ses |
network.session_id |
Mappatura diretta |
src_ip |
principal.asset.ip |
Mappatura diretta |
target_host |
target.asset.hostname |
Mappatura diretta |
target_ip |
target.asset.ip |
Mappato direttamente, dopo aver convertito la rappresentazione di stringa in un array JSON ed estratto i singoli IP |
target_path |
target.url |
Mappatura diretta |
time |
metadata.event_timestamp |
Analizzata per estrarre il timestamp utilizzando il formato "dd/MMM/yyyy:HH:mm:ss Z" |
user_agent |
network.http.user_agent |
Mappato direttamente se non vuoto o "-" |
metadata.event_type |
Impostato inizialmente su "GENERIC_EVENT", quindi potenzialmente sovrascritto in base ad altri campi come terminal e protocol . Il valore predefinito è "USER_UNCATEGORIZED" se il pattern grok principale non corrisponde. Imposta su "NETWORK_HTTP" se protocol è HTTP e target_ip è presente e su "STATUS_UPDATE" se protocol è HTTP, ma target_ip non è presente |
|
metadata.log_type |
Impostato su "NGINX" | |
metadata.product_name |
Impostato su "NGINX" | |
metadata.vendor_name |
Impostato su "NGINX" | |
network.ip_protocol |
Impostato su "TCP" se terminal è "sshd" o "ssh" oppure se il pattern grok principale non corrisponde |
|
principal.asset_id |
Imposta su "GCP.GCE:0001" se terminal è "sshd" o "ssh". Impostato su "GCP.GCE:0002" se il pattern Grok principale non corrisponde |
|
extensions.auth.type |
Imposta su "MACCHINA" se terminal è "sshd" o "ssh" |
Modifiche
2022-09-10
- È stato creato un parser predefinito ed eliminato quello specifico per il cliente.
- Versione iniziale del parser.