Raccogliere i log di Epic Systems
Questo documento spiega come raccogliere i log di Epic Systems in Google Security Operations utilizzando un agente Bindplane. Il parser trasforma i log non elaborati del sistema EMR/EHR di Epic in un modello UDM (Unified Data Model). Innanzitutto pulisce e struttura i messaggi di log, estrae le coppie chiave-valore e poi mappa i campi estratti con i campi UDM corrispondenti, gestendo vari formati di log e incoerenze dei dati per garantire una rappresentazione dei dati completa e standardizzata.
Prima di iniziare
- Assicurati di avere un'istanza Google Security Operations.
- Assicurati di utilizzare Windows 2016 o versioni successive oppure un host Linux con
systemd
. - Se l'esecuzione avviene tramite un proxy, assicurati che le porte del firewall siano aperte.
- Assicurati di disporre dell'accesso privilegiato a Epic Systems.
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
Installazione di Windows
- Apri il 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
Installazione di Linux
- Apri un terminale con privilegi di 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.sh
Risorse aggiuntive per l'installazione
- Per ulteriori opzioni di installazione, consulta questa guida all'installazione.
Configura l'agente Bindplane per importare Syslog e inviarli a Google SecOps
Accedi al file di configurazione:
- Individua il file
config.yaml
. In genere, si trova nella directory/etc/bindplane-agent/
su Linux o nella directory di installazione su Windows. - Apri il file utilizzando un editor di testo (ad esempio
nano
,vi
o Blocco note).
- Individua il file
Modifica il file
config.yaml
come segue:receivers: udplog: # Replace the port and IP address as required listen_address: "0.0.0.0:514" exporters: chronicle/chronicle_w_labels: compression: gzip # Adjust the path to the credentials file you downloaded in Step 1 creds: '/path/to/ingestion-authentication-file.json' # Replace with your actual customer ID from Step 2 customer_id: <customer_id> endpoint: malachiteingestion-pa.googleapis.com # Add optional ingestion labels for better organization ingestion_labels: log_type: EPIC raw_log_field: body service: pipelines: logs/source0__chronicle_w_labels-0: receivers: - udplog exporters: - chronicle/chronicle_w_labels
Sostituisci la porta e l'indirizzo IP in base alle esigenze della tua infrastruttura.
Sostituisci
<customer_id>
con l'ID cliente effettivo.Aggiorna
/path/to/ingestion-authentication-file.json
al percorso in cui è stato salvato il file di autenticazione nella sezione Recupera il file di autenticazione per l'importazione di Google SecOps.
Riavvia l'agente Bindplane per applicare le modifiche
Per riavviare l'agente Bindplane in Linux, esegui questo comando:
sudo systemctl restart bindplane-agent
Per riavviare l'agente Bindplane in Windows, puoi utilizzare la console Servizi o inserire il seguente comando:
net stop BindPlaneAgent && net start BindPlaneAgent
Configura il servizio SendSIEMSyslogAudit
- Accedi alla console Epic Systems.
- Vai a Start > Epic > Interconnect >
<your instance>
> Editor di configurazione. - Seleziona il modulo Servizi aziendali.
- Nella scheda Categoria di servizio, seleziona SendSIEMSyslogAudit.
- Fai clic su Salva.
Configura Epic Systems per esportare syslog
- Vai a Definizioni di sistema Epic > Sicurezza > Opzioni di controllo > Impostazioni syslog SIEM.
- Fornisci i seguenti dettagli di configurazione:
- Host: inserisci l'indirizzo IP dell'agente Bindplane.
- Porta: inserisci il numero di porta dell'agente Bindplane.
- Formato SIEM: seleziona CEF (Common Event Format).
- Carattere di fine riga Syslog: seleziona Nuova riga "\n".
- Dal menu Impostazioni syslog SIEM, seleziona SIEM syslog.
- Fai clic su Attivata.
Tabella di mappatura UDM
Campo log | Mappatura UDM | Logic |
---|---|---|
APIID | read_only_udm.additional.fields.api.value.string_value | Il valore viene estratto dal campo APIID nel log non elaborato |
APPLICATIONID | read_only_udm.additional.fields.application_id.value.string_value | Il valore viene estratto dal campo APPLICATIONID nel log non elaborato |
APP | read_only_udm.target.application | Il valore viene estratto dal campo APP nel log non elaborato |
SESSIONE DI CONTROLLO | read_only_udm.network.session_id | Il valore viene estratto dal campo AUDIT SESSION nel log non elaborato |
AUTH_SOURCE | Questo campo non è mappato a UDM | |
BCAPCS | read_only_udm.target.application | Il valore viene estratto dal campo BCAPCS nel log non elaborato |
BTGEXPLANATION | read_only_udm.security_result.description | Il valore viene estratto dal campo BTGEXPLANATION nel log non elaborato |
BTGNOACCESSREAS | read_only_udm.security_result.summary | Il valore viene estratto dal campo BTGNOACCESSREAS nel log non elaborato |
BTGREASON | read_only_udm.security_result.summary | Il valore viene estratto dal campo BTGREASON nel log non elaborato |
CLIENTNAME | read_only_udm.principal.hostname | Il valore viene estratto dal campo CLIENTNAME nel log non elaborato |
CSISESS_TOKEN | read_only_udm.network.session_id | Il valore viene estratto dal campo CSISESS_TOKEN nel log non elaborato |
CTXT | read_only_udm.metadata.description | Il valore viene estratto dal campo CTXT nel log non elaborato |
CVG | read_only_udm.additional.fields.cvg.value.string_value | Il valore viene estratto dal campo CVG nel log non elaborato |
DAT | Questo campo non è mappato a UDM | |
DEP | read_only_udm.principal.user.department | Il valore viene estratto dal campo DEP nel log non elaborato. Se nel log non elaborato esistono sia il campo NEWDEPARTMENT che il campo PREVDEPARTMENT, il valore sarà PREVDEPARTMENT:-{PREVDEPARTMENT}, NEWDEPARTMENT:-{NEWDEPARTMENT} . Se esiste solo NEWDEPARTMENT, il valore sarà PREVDEPARTMENT:-NONE, NEWDEPARTMENT:{NEWDEPARTMENT} . Se esiste solo PREVDEPARTMENT, il valore sarà PREVDEPARTMENT:{PREVDEPARTMENT}, NEWDEPARTMENT:-NONE |
devTime | read_only_udm.metadata.event_timestamp | Il valore viene estratto dal campo devTime nel log non elaborato e convertito in secondi trascorsi da epoca |
devTimeFormat | Questo campo non è mappato a UDM | |
E3MID | read_only_udm.network.session_id | Il valore viene estratto dal campo E3MID nel log non elaborato |
CRITTOGRAFATO | read_only_udm.additional.fields.encrypt.value.string_value | Il valore viene estratto dal campo ENCRYPTED nel log non elaborato |
ERRMSG | read_only_udm.security_result.summary | Il valore viene estratto dal campo ERRMSG nel log non elaborato |
eventCnt | Questo campo non è mappato a UDM | |
FILENAME | read_only_udm.target.file.full_path | Il valore viene estratto dal campo FILENAME nel log non elaborato e tutte le occorrenze di \\\\ vengono sostituite con \ |
flag | read_only_udm.security_result.description | Il valore viene estratto dal campo flag nel log non elaborato e tutti i - iniziali e finali vengono rimossi |
HKUAPVER | read_only_udm.metadata.product_version | Il valore viene estratto dal campo HKUAPVER nel log non elaborato |
HKUDVCID | read_only_udm.principal.asset_id | Il valore viene estratto dal campo HKUDVCID nel log non elaborato e formattato come Device ID:{HKUDVCID} |
HKUOSNAM | read_only_udm.principal.platform | Il valore viene estratto dal campo HKUOSNAM nel log non elaborato e mappato a WINDOWS , MAC , LINUX o UNKNOWN_PLATFORM in base al valore |
HKUOSVER | read_only_udm.principal.platform_version | Il valore viene estratto dal campo HKUOSVER nel log non elaborato |
INSTANCEURN | read_only_udm.intermediary.hostname | Il valore viene estratto dal campo INSTANCEURN nel log non elaborato |
IP | read_only_udm.target.ip | Il valore viene estratto dal campo IP nel log non elaborato. Se il valore contiene / , viene suddiviso in due indirizzi IP. Se il valore contiene , , viene suddiviso in più indirizzi IP. |
LOGINERROR | read_only_udm.security_result.summary | Il valore viene estratto dal campo LOGINERROR nel log non elaborato |
LOGIN_CONTEXT | read_only_udm.metadata.description | Il valore viene estratto dal campo LOGIN_CONTEXT nel log non elaborato |
LOGIN_DEVICE | read_only_udm.additional.fields.login_device.value.string_value | Il valore viene estratto dal campo LOGIN_DEVICE nel log non elaborato |
LOGIN_LDAP_ID | read_only_udm.principal.user.userid | Il valore viene estratto dal campo LOGIN_LDAP_ID nel log non elaborato |
LOGIN_REASON | read_only_udm.security_result.summary | Il valore viene estratto dal campo LOGIN_REASON nel log non elaborato |
LOGIN_REVAL | read_only_udm.additional.fields.login_reval.value.string_value | Il valore viene estratto dal campo LOGIN_REVAL nel log non elaborato |
MASKMODE | read_only_udm.additional.fields.masked_mode.value.string_value | Il valore viene estratto dal campo MASKMODE nel log non elaborato |
MYCACCT | read_only_udm.principal.user.userid | Il valore viene estratto dal campo MYCACCT nel log non elaborato |
NEWDEPARTMENT | read_only_udm.principal.user.department | Visualizza la logica per il campo DEP |
NEWUSER | Questo campo non è mappato a UDM | |
NSC | read_only_udm.additional.fields.nsc.value.string_value | Il valore viene estratto dal campo NSC nel log non elaborato |
OSUSR | read_only_udm.target.user.userid | Il valore viene estratto dal campo OSUSR nel log non elaborato |
PATIENT | read_only_udm.target.user.userid | Il valore viene estratto dal campo PATIENT nel log non elaborato |
PREVDEPARTMENT | read_only_udm.principal.user.department | Visualizza la logica per il campo DEP |
PREVPROVIDER | Questo campo non è mappato a UDM | |
PREVUSER | read_only_udm.principal.resource.attribute.labels.prev_user.value | Il valore viene estratto dal campo PREVUSER nel log non elaborato |
PWREASON | read_only_udm.metadata.description | Il valore viene estratto dal campo PWREASON nel log non elaborato |
RUOLO | read_only_udm.principal.user.attribute.roles.name | Il valore viene estratto dal campo ROLE nel log non elaborato |
risorsa | read_only_udm.target.hostname | Il valore viene estratto dal campo della risorsa nel log non elaborato |
SERVICEID | read_only_udm.additional.fields.service_id.value.string_value | Il valore viene estratto dal campo SERVICEID nel log non elaborato |
SERVICECATEGORY | read_only_udm.additional.fields.service_category.value.string_value | Il valore viene estratto dal campo SERVICECATEGORY nel log non elaborato |
SERVICEMSGID | Questo campo non è mappato a UDM | |
SERVICENAME | read_only_udm.target.resource.name | Il valore viene estratto dal campo SERVICENAME nel log non elaborato |
SERVICETYPE | read_only_udm.target.resource.type | Il valore viene estratto dal campo SERVICETYPE nel log non elaborato. Se event_id è PHI_CLIENT_FILE , il valore è impostato su FILE |
SERVICE_USER | read_only_udm.target.user.userid | Il valore viene estratto dal campo SERVICE_USER nel log non elaborato |
SERVICE_USERTYP | read_only_udm.additional.fields.service_user_type.value.string_value | Il valore viene estratto dal campo SERVICE_USERTYP nel log non elaborato |
sev | read_only_udm.security_result.severity | Il valore viene estratto dal campo sev nel log non elaborato e mappato a LOW , HIGH o CRITICAL in base al valore |
shost | read_only_udm.target.resource.attribute.labels.workstation_type.value | Il valore viene estratto dal campo shost nel log non elaborato |
ORIGINE | read_only_udm.additional.fields.login_source.value.string_value | Il valore viene estratto dal campo SOURCE nel log non elaborato |
SUCCESS | read_only_udm.additional.fields.success_yes_no.value.string_value | Il valore viene estratto dal campo SUCCESS nel log non elaborato |
TIMEOUT | read_only_udm.additional.fields.time_out.value.string_value | Il valore viene estratto dal campo TIMEOUT nel log non elaborato |
UID | read_only_udm.principal.user.userid | Il valore viene estratto dal campo UID nel log non elaborato |
USERJOB | Questo campo non è mappato a UDM | |
usrName | read_only_udm.principal.user.userid, read_only_udm.principal.user.user_display_name | Se nel log non elaborato esistono i campi UID o LOGIN_LDAP_ID, usrName viene utilizzato per read_only_udm.principal.user.user_display_name e l'altro campo viene utilizzato per read_only_udm.principal.user.userid. In caso contrario, usrName viene utilizzato per read_only_udm.principal.user.userid |
WEBLGAPP | read_only_udm.target.application | Il valore viene estratto dal campo WEBLGAPP nel log non elaborato |
read_only_udm.extensions.auth.type | Il valore è impostato su SSO se LOGIN_LDAP_ID non è vuoto. In caso contrario, il valore viene impostato su AUTHTYPE_UNSPECIFIED . |
|
read_only_udm.intermediary.ip | Il valore è impostato sull'indirizzo IP dell'origine log. | |
read_only_udm.metadata.event_type | Il valore è impostato su RESOURCE_READ se event_id è uno tra IC_SERVICE_AUDIT , AC_BREAK_THE_GLASS_FAILED_ACCESS , AC_BREAK_THE_GLASS_INAPPROPRIATE_ATTEMPT , AC_BREAK_THE_GLASS_ACCESS o MCMEMEDISA e target_ip_set è true o la risorsa non è vuota. Il valore è impostato su USER_LOGIN se event_id è uno dei seguenti: FAILEDLOGIN , LOGIN , ROVER_FAILED_LOGIN , SWITCHUSER , AUTHENTICATION , EW_LOGIN , ROVER_LOGIN , CTO_FAILED_LOGIN , CTO_LOGIN , HKU_FAILED_LOGIN , HKU_LOGIN , WPSEC_SEC_AUTH_OPT_OUT , WPSEC_SEC_AUTH_OPT_IN , BCA_LOGIN_FAILURE , BCA_LOGIN_SUCCESS , BCA_USER_LOCKED , WPSEC_LOGIN_FAIL o WPSEC_LOGIN_SUCCESS e almeno uno tra target_ip_set, resource, SERVICENAME, SERVICETYPE o shost non è vuoto. Il valore è impostato su USER_CHANGE_PASSWORD se event_id è uno tra E_ADMINPASSWORDCHANGE , E_FAILEDPASSWORDCHANGE , E_SELFPASSWORDCHANGE , WPSEC_USER_PASSWORD_CHANGE_FAIL o WPSEC_USER_PASSWORD_CHANGE . Il valore è impostato su USER_UNCATEGORIZED se event_id è CONTEXTCHANGE . Il valore è impostato su USER_RESOURCE_ACCESS se event_id è uno tra SECURE , UNSECURE , MASKED_DATA_DISPLAY o MASKED_DATA_PRINTING . Il valore è impostato su USER_RESOURCE_UPDATE_CONTENT se event_id è PHI_CLIENT_FILE . Il valore è impostato su STATUS_UPDATE se CLIENTNAME non è vuoto. Il valore è impostato su USER_UNCATEGORIZED se prin_usr_id non è vuoto. In caso contrario, il valore viene impostato su GENERIC_EVENT . |
|
read_only_udm.metadata.log_type | Il valore è impostato su EPIC . |
|
read_only_udm.metadata.product_name | Il valore è impostato su Epic Systems . |
|
read_only_udm.metadata.vendor_name | Il valore è impostato su EPIC . |
|
read_only_udm.network.ip_protocol | Il valore deriva dal campo proto nel log non elaborato e viene mappato al nome del protocollo IP corrispondente. | |
read_only_udm.principal.resource.attribute.labels.workstation_type.key | Il valore è impostato su Workstation ID/Type . |
|
read_only_udm.principal.resource.attribute.labels.prev_user.key | Il valore è impostato su Prev User . |
|
read_only_udm.security_result.action | Il valore è impostato su BLOCK se nel log non elaborato sono presenti i campi ERRMSG o LOGINERROR. |
Hai bisogno di ulteriore assistenza? Ricevi risposte dai membri della community e dai professionisti di Google SecOps.