Raccogliere i log IAM di Ergon Informatik Airlock
Questo documento spiega come importare i log IAM di Ergon Informatik Airlock in Google Security Operations utilizzando l'agente Bindplane.
Airlock IAM è una soluzione di gestione di identità e accessi che fornisce funzionalità di autenticazione, autorizzazione e self-service per gli utenti. Genera log JSON strutturati per eventi di autenticazione, attività di tracciamento degli utenti, log di controllo e azioni amministrative nei moduli Loginapp, Adminapp, Approvazione transazioni, Service Container e API Policy Service.
Prima di iniziare
Assicurati di soddisfare i seguenti prerequisiti:
- Un'istanza Google SecOps
- Windows Server 2016 o versioni successive oppure un host Linux con
systemd - Connettività di rete tra l'agente Bindplane e il server Airlock IAM
- Se l'esecuzione avviene tramite un proxy, assicurati che le porte firewall siano aperte in base ai requisiti dell'agente Bindplane.
- Accesso amministrativo all'istanza Airlock IAM
- Accesso SSH o alla console al server Airlock IAM per modificare i file di configurazione
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.
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.
Installa l'agente Bindplane
Installa l'agente Bindplane sul sistema operativo Windows o Linux 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" /quietAttendi il completamento dell'installazione.
Verifica l'installazione eseguendo il comando:
sc query observiq-otel-collectorLo stato del servizio deve essere RUNNING.
Installazione di Linux
- Apri un terminale con privilegi root o sudo.
Esegui questo comando:
sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.shAttendi il completamento dell'installazione.
Verifica l'installazione eseguendo il comando:
sudo systemctl status observiq-otel-collectorLo stato del servizio deve essere attivo (in esecuzione).
Risorse aggiuntive per l'installazione
Per ulteriori opzioni di installazione e risoluzione dei problemi, consulta la Guida all'installazione dell'agente Bindplane.
Configura l'agente Bindplane per importare syslog e inviarli a Google SecOps
Individua il file di configurazione
Linux:
sudo nano /etc/bindplane-agent/config.yamlWindows:
notepad "C:\Program Files\observIQ OpenTelemetry Collector\config.yaml"
Modifica il file di configurazione
Sostituisci l'intero contenuto di
config.yamlcon la seguente configurazione:receivers: udplog: listen_address: "0.0.0.0:514" exporters: chronicle/airlock_iam: compression: gzip creds_file_path: '/etc/bindplane-agent/ingestion-auth.json' customer_id: 'YOUR_CUSTOMER_ID' endpoint: malachiteingestion-pa.googleapis.com log_type: ERGON_INFORMATIK_AIRLOCK_IAM raw_log_field: body ingestion_labels: env: production source: airlock_iam service: pipelines: logs/airlock_to_chronicle: receivers: - udplog exporters: - chronicle/airlock_iamSostituisci i seguenti segnaposto:
Configurazione del ricevitore:
listen_address: impostalo su0.0.0.0:514per ascoltare su tutte le interfacce sulla porta 51. Per i sistemi Linux in esecuzione come non root, utilizza la porta1514o superiore.
Configurazione dell'esportatore:
creds_file_path: Percorso completo del file di autenticazione importazione:- Linux:
/etc/bindplane-agent/ingestion-auth.json - Windows:
C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json
- Linux:
YOUR_CUSTOMER_ID: Sostituisci con l'ID cliente Google SecOps del passaggio precedenteendpoint: URL endpoint regionale:- Stati Uniti:
malachiteingestion-pa.googleapis.com - Europa:
europe-malachiteingestion-pa.googleapis.com - Asia:
asia-southeast1-malachiteingestion-pa.googleapis.com
- Stati Uniti:
ingestion_labels: Etichette facoltative per classificare i log (modifica in base alle esigenze)
Configurazione di esempio per Windows
receivers: udplog: listen_address: "0.0.0.0:514" exporters: chronicle/airlock_iam: compression: gzip creds_file_path: 'C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json' customer_id: 'a1b2c3d4-e5f6-g7h8-i9j0-k1l2m3n4o5p6' endpoint: malachiteingestion-pa.googleapis.com log_type: ERGON_INFORMATIK_AIRLOCK_IAM raw_log_field: body ingestion_labels: env: production source: airlock_iam service: pipelines: logs/airlock_to_chronicle: receivers: - udplog exporters: - chronicle/airlock_iam
Salvare il file di configurazione
Dopo la modifica, salva il file:
- Linux: premi
Ctrl+O, poiEntere infineCtrl+X. - Windows: fai clic su File > Salva.
Riavvia l'agente Bindplane per applicare le modifiche
Per riavviare l'agente Bindplane in Linux:
Esegui questo comando:
sudo systemctl restart observiq-otel-collectorVerifica che il servizio sia in esecuzione:
sudo systemctl status observiq-otel-collectorControlla i log per individuare eventuali errori:
sudo journalctl -u observiq-otel-collector -f
Per riavviare l'agente Bindplane in Windows:
Scegli una delle seguenti opzioni:
Prompt dei comandi o PowerShell come amministratore:
net stop observiq-otel-collector && net start observiq-otel-collectorConsole Services:
- Premi
Win+R, digitaservices.msce premi Invio. - Individua observIQ OpenTelemetry Collector.
- Fai clic con il tasto destro del mouse e seleziona Riavvia.
- Premi
Verifica che il servizio sia in esecuzione:
sc query observiq-otel-collectorControlla i log per individuare eventuali errori:
type "C:\Program Files\observIQ OpenTelemetry Collector\log\collector.log"
Configura l'inoltro di syslog di Airlock IAM
- Connettiti al server Airlock IAM utilizzando SSH o l'accesso alla console.
Vai alla directory dell'istanza:
cd /opt/airlock/iam/instances/<instance_name>/Modifica il file di configurazione Log4j per tutti i moduli:
nano log4j/all-modules.xmlAggiungi la configurazione dell'appender Syslog nella sezione
<Appenders>:<Syslog name="SYSLOG" facility="LOCAL1" host="BINDPLANE_AGENT_IP" port="514" protocol="UDP" format="RFC5424" includeMDC="true" mdcId="mdc" newLine="true"> <ExceptionPattern>%ex{full}</ExceptionPattern> <ThresholdFilter level="INFO"/> </Syslog>Configura i parametri dell'appender Syslog:
- host: sostituisci
BINDPLANE_AGENT_IPcon l'indirizzo IP dell'host dell'agente Bindplane (ad esempio,192.168.1.100) - port: imposta su
514(o1514se l'agente Bindplane è configurato per una porta non privilegiata) - protocol: imposta su
UDP(oTCPse hai configurato il ricevitore tcplog in Bindplane) - format: impostato su
RFC5424per il formato syslog strutturato - facility: impostato su
LOCAL1(o un altro codice struttura in base alle esigenze: daLOCAL0aLOCAL7) - Livello ThresholdFilter: impostalo su
INFOper inviare log di gravità INFO e superiore oppure suDEBUGper tutti i log
- host: sostituisci
Aggiungi il riferimento dell'appender all'interno della sezione del logger
<Root>:<Loggers> <Root level="${sys:iam.log.level}"> <AppenderRef ref="SYSLOG"/> </Root> </Loggers>Configurazione di esempio completa:
<?xml version="1.0" encoding="UTF-8"?> <Configuration name="Custom Log4j 2 Configuration for All IAM Modules"> <Appenders> <Syslog name="SYSLOG" facility="LOCAL1" host="192.168.1.100" port="514" protocol="UDP" format="RFC5424" includeMDC="true" mdcId="mdc" newLine="true"> <ExceptionPattern>%ex{full}</ExceptionPattern> <ThresholdFilter level="INFO"/> </Syslog> </Appenders> <Loggers> <Root level="${sys:iam.log.level}"> <AppenderRef ref="SYSLOG"/> </Root> </Loggers> </Configuration>Salva il file di configurazione:
Premi
Ctrl+O, poiEntere infineCtrl+X.La configurazione di Log4j viene monitorata per rilevare modifiche ogni 60 secondi per impostazione predefinita. Il nuovo inoltro di syslog si attiverà automaticamente senza richiedere un riavvio.
Verifica che i log vengano inviati all'agente Bindplane:
sudo journalctl -u observiq-otel-collector -fVerifica che i log arrivino in Google SecOps:
- Accedi alla console Google SecOps.
- Vai a SIEM > Search (SIEM > Ricerca).
Esegui una query di ricerca:
metadata.log_type = "ERGON_INFORMATIK_AIRLOCK_IAM"Verifica che i log di Airlock IAM vengano visualizzati nei risultati di ricerca.
Opzioni di configurazione aggiuntive
Configura syslog TCP anziché UDP
Se preferisci la distribuzione TCP anziché UDP:
Nel file
config.yamldell'agente Bindplane, modifica il ricevitore intcplog:receivers: tcplog: listen_address: "0.0.0.0:514"Nel file
log4j/all-modules.xmldi Airlock IAM, modifica il protocollo inTCP:<Syslog name="SYSLOG" facility="LOCAL1" host="192.168.1.100" port="514" protocol="TCP" format="RFC5424" includeMDC="true" mdcId="mdc" newLine="true"> <ExceptionPattern>%ex{full}</ExceptionPattern> <ThresholdFilter level="INFO"/> </Syslog>Riavvia l'agente Bindplane per applicare la modifica del ricevitore.
Configurare diversi livelli di log
Per inviare solo i log di livello AVVISO e superiore:
<ThresholdFilter level="WARN"/>Per inviare tutti i log, incluso DEBUG:
<ThresholdFilter level="DEBUG"/>
Livelli di log disponibili, dalla gravità più bassa a quella più alta:
TRACEDEBUGINFOWARNERRORFATAL
Configura più istanze Airlock IAM
Se hai più istanze di Airlock IAM che inviano dati allo stesso agente Bindplane, utilizza le etichette di importazione per distinguerle:
exporters: chronicle/airlock_iam_prod: compression: gzip creds_file_path: '/etc/bindplane-agent/ingestion-auth.json' customer_id: 'YOUR_CUSTOMER_ID' endpoint: malachiteingestion-pa.googleapis.com log_type: ERGON_INFORMATIK_AIRLOCK_IAM raw_log_field: body ingestion_labels: env: production instance: prod-iam-01 chronicle/airlock_iam_dev: compression: gzip creds_file_path: '/etc/bindplane-agent/ingestion-auth.json' customer_id: 'YOUR_CUSTOMER_ID' endpoint: malachiteingestion-pa.googleapis.com log_type: ERGON_INFORMATIK_AIRLOCK_IAM raw_log_field: body ingestion_labels: env: development instance: dev-iam-01 service: pipelines: logs/airlock_prod: receivers: - udplog exporters: - chronicle/airlock_iam_prod logs/airlock_dev: receivers: - udplog exporters: - chronicle/airlock_iam_dev
Risoluzione dei problemi
I log non vengono visualizzati in Google SecOps
Verifica che l'agente Bindplane riceva i log:
sudo journalctl -u observiq-otel-collector -fVerifica la connettività di rete da Airlock IAM all'agente Bindplane:
telnet BINDPLANE_AGENT_IP 514Verifica che la configurazione di Log4j sia valida:
cat /opt/airlock/iam/instances/<instance_name>/log4j/all-modules.xmlControlla la presenza di errori nei log di Airlock IAM:
tail -f /opt/airlock/iam/instances/<instance_name>/logs/loginapp.log
Errori dell'agente Bindplane
Controlla la presenza di errori nei log dell'agente Bindplane:
sudo journalctl -u observiq-otel-collector -n 100Verifica che la sintassi di
config.yamlsia corretta. YAML è sensibile al rientro.Verifica che il percorso del file di autenticazione dell'importazione sia corretto e che il file esista.
Testa la connettività di rete all'endpoint Google SecOps:
curl -v https://malachiteingestion-pa.googleapis.com
Configurazione del firewall
Assicurati che siano configurate le seguenti regole firewall:
Inbound all'agente Bindplane:
- Protocollo: UDP (o TCP se utilizzi tcplog)
- Porta: 514 (o la porta configurata)
- Origine: indirizzo IP del server Airlock IAM
In uscita dall'agente Bindplane:
- Protocollo: HTTPS (TCP 443)
- Destinazione: endpoint regionale Google SecOps
- Scopo: consegna dei log a Google SecOps
Tabella di mappatura UDM
| Campo log | Mappatura UDM | Logic |
|---|---|---|
| expire_time | additional.fields | Unito come etichetta con la chiave "expire_time" se non è vuoto |
| cellulare | additional.fields | Unito come etichetta con la chiave "mobile" se non è vuoto |
| sn | additional.fields | Unito come etichetta con la chiave "sn" se non è vuoto |
| CONFIG_CONTEXT | additional.fields | Unito come etichetta con la chiave "CONFIG_CONTEXT" se non è vuoto |
| reparto | additional.fields | Unito come etichetta con la chiave "department" se non è vuoto |
| ctxData | additional.fields | Unito come etichetta con la chiave "ctxData" se non è vuoto |
| displayLanguage | additional.fields | Unito come etichetta con la chiave "displayLanguage" se non è vuoto |
| nrPwdTrialsForUserDeletion | additional.fields | Unito come etichetta con la chiave "nrPwdTrialsForUserDeletion" se non è vuoto |
| authInstant | additional.fields | Unito come etichetta con la chiave "authInstant" se non è vuoto |
| auditToken | additional.fields | Unito come etichetta con la chiave "auditToken" se non è vuoto |
| authPlugin | additional.fields | Unito come etichetta con la chiave "authPlugin" se non è vuoto |
| latestIdPropagation | additional.fields | Unito come etichetta con la chiave "latestIdPropagation" se non è vuoto |
| servizio | additional.fields | Unito come etichetta con la chiave "service" se non è vuoto |
| ldap_type | additional.fields | Unito come etichetta con la chiave "ldap_type" se non è vuota |
| report_message | additional.fields | Unito come etichetta con la chiave "report_message" se non è vuota |
| authenteeProvidedId | additional.fields | Unito come etichetta con la chiave "authenteeProvidedId" se non è vuota |
| representerId | additional.fields | Unito come etichetta con la chiave "representerId" se non è vuoto |
| motore | additional.fields | Unito come etichetta con la chiave "engine" se non è vuoto |
| canale | additional.fields | Unito come etichetta con la chiave "channel" se non è vuoto |
| authnFactor | additional.fields | Unito come etichetta con la chiave "authnFactor" se non è vuoto |
| authnFactorDetail | additional.fields | Unito come etichetta con la chiave "authnFactorDetail" se non è vuoto |
| required_roles | additional.fields | Unito come etichetta con la chiave "required_roles" se non è vuoto |
| target_pattern | additional.fields | Unito come etichetta con la chiave "target_pattern" se non è vuoto |
| nameid | additional.fields | Unito come etichetta con chiave "nameid" se non è vuoto |
| plugin_name | additional.fields | Unito come etichetta con la chiave "plugin_name" se non è vuoto |
| meccanismo | additional.fields | Unito come etichetta con la chiave "mechanism" se non è vuoto |
| new_session_id | additional.fields | Unito come etichetta con la chiave "new_session_id" se non è vuota |
| former_session_id | additional.fields | Unito come etichetta con la chiave "former_session_id" se non è vuoto |
| req_id | additional.fields | Unito come etichetta con la chiave "req_id" se non è vuoto |
| auth_method | additional.fields | Unito come etichetta con la chiave "auth_method" se non è vuoto |
| otp | additional.fields | Unito come etichetta con la chiave "otp" se non è vuoto |
| mob_num | additional.fields | Unito come etichetta con la chiave "mob_num" se non è vuoto |
| jsessionid | additional.fields | Unito come etichetta con la chiave "jsessionid" se non è vuoto |
| creationDate | additional.fields | Unito come etichetta con la chiave "creationDate" se non è vuoto |
| lastLogin | additional.fields | Unito come etichetta con la chiave "lastLogin" se non è vuoto |
| accountStatus | additional.fields | Unito come etichetta con la chiave "accountStatus" se non è vuota |
| companyAdministrator | additional.fields | Unito come etichetta con la chiave "companyAdministrator" se non è vuoto |
| companyCustomer | additional.fields | Unito come etichetta con la chiave "companyCustomer" se non è vuoto |
| privateCustomer | additional.fields | Unito come etichetta con la chiave "privateCustomer" se non è vuoto |
| otpNotifyChannel | additional.fields | Unito come etichetta con la chiave "otpNotifyChannel" se non è vuota |
| nas_identifier | additional.fields | Unito come etichetta con la chiave "nas_identifier" se non è vuoto |
| session_id | additional.fields | Unito come etichetta con la chiave "session_id" se non è vuoto |
| authPluginClassName | extensions.auth.auth_details | Valore copiato direttamente, se presente |
| authenticator_type | extensions.auth.auth_details | Valore copiato direttamente se presente e authPluginClassName è vuoto |
| logon_type | extensions.auth.mechanism | Valore copiato direttamente |
| N/D | intermediario | Unito dall'oggetto intermedio |
| FORWARD_LOCATION | intermediary.url | Valore copiato direttamente |
| metadata_description | metadata.description | Valore copiato direttamente |
| N/D | metadata.event_type | Impostato in base al contesto dell'evento; determinato dalla logica del parser |
| REQUEST_ID | metadata.product_log_id | Valore copiato direttamente |
| airlock_version | metadata.product_version | Valore copiato direttamente |
| metodo | network.http.method | Valore copiato direttamente |
| user_agent | network.http.user_agent | Valore copiato direttamente |
| packet_size | network.received_packets | Valore convertito in numero intero |
| GSID | network.session_id | Valore copiato direttamente |
| host | principal.hostname | Valore copiato direttamente |
| CLIENT_IP | principal.ip | Valore copiato direttamente |
| UID | principal.user.userid | Valore copiato direttamente |
| role_name | role.name | Valore copiato direttamente |
| authenteeType | role.type | Valore copiato direttamente |
| N/D | security_result | Unito dall'oggetto security_result |
| azione | security_result.action_details | Valore copiato direttamente, se presente |
| authMethodShortDesc | security_result.action_details | Valore unito se presente |
| action_detail | security_result.action_details | Valore unito se presente |
| category_value | security_result.category | Valore copiato direttamente |
| actionGroup | security_result.category_details | Valore copiato direttamente |
| result_description | security_result.description | Valore copiato direttamente |
| eccezione | security_result.summary | Valore copiato direttamente, se presente |
| STATLOG | security_result.summary | Valore copiato direttamente se presente e l'eccezione è vuota |
| mob_num | src.asset.type | Valore copiato direttamente |
| posta | src.email | Valore copiato direttamente, se presente |
| src.email | Valore copiato direttamente se presente e la posta è vuota | |
| src_ip | src.ip | Valore copiato direttamente |
| src_port | src.port | Valore convertito in numero intero |
| ruolo | src.user.attribute.roles | Valore copiato direttamente |
| azienda | src.user.company_name | Valore copiato direttamente |
| firstName | src.user.first_name | Valore copiato direttamente |
| lastName | src.user.last_name | Valore copiato direttamente |
| stato | src.user.user_authentication_status | Valore copiato direttamente |
| displayName | src.user.user_display_name | Valore copiato direttamente, se presente |
| nome utente | src.user.user_display_name | Il valore viene copiato direttamente se presente e displayName è vuoto |
| src_user | src.user.user_display_name | Valore copiato direttamente se presente e displayName/username sono vuoti |
| authenteeId | src.user.userid | Valore copiato direttamente, se presente |
| src_userid | src.user.userid | Valore copiato direttamente se presente e authenteeId è vuoto |
| UID | src.user.userid | Valore copiato direttamente se presente e authenteeId/src_userid sono vuoti |
| file_path | target.file.full_path | Valore copiato direttamente |
| target_hostname | target.hostname | Valore copiato direttamente |
| target_port | target.port | Valore convertito in numero intero |
| task_name | target.resource.name | Valore copiato direttamente |
| target_url | target.url | Valore copiato direttamente |
| N/D | metadata.product_name | Imposta su "Ergon Informatik Airlock IAM" |
| N/D | metadata.vendor_name | Impostato su "Ergon Informatik" |
Hai bisogno di ulteriore assistenza? Ricevi risposte dai membri della community e dai professionisti di Google SecOps.