收集 Epic Systems 記錄
剖析器版本:4.0
本文說明如何使用 Bindplane 代理程式,將 Epic Systems 記錄檔擷取至 Google Security Operations。
Epic Systems 是電子健康記錄 (EHR) 平台,會針對稽核事件、使用者登入/登出、病患存取和檔案作業,產生 CEF syslog 訊息。剖析器會擷取鍵/值組合,並對應至統一資料模型 (UDM)。
事前準備
請確認您符合下列必要條件:
Google SecOps 執行個體
Windows Server 2016 以上版本,或搭載
systemd的 Linux 主機Bindplane 代理程式與 Epic Systems 伺服器之間的網路連線
如果是在 Proxy 後方執行,請確認防火牆通訊埠已按照 Bindplane 代理程式規定開啟
Epic Systems 的特殊存取權
取得 Bindplane 代理程式的 Google SecOps 憑證
如要向 Google SecOps 驗證 Bindplane 代理程式,請選擇下列其中一種方法:
- 新部署作業:使用 Chronicle API (選項 1)。
- 舊版部署作業:繼續使用擷取驗證檔案 (選項 2),直到 Ingestion API 於 2027 年 7 月 20 日停用。
方法 1:為 Chronicle API 建立服務帳戶 (建議)
- 登入 Google Cloud 控制台,選取連結至 Google SecOps 執行個體的 Google Cloud 專案。
- 依序前往 「IAM & Admin」(IAM 與管理) >「Service Accounts」(服務帳戶)。
- 按一下「建立服務帳戶」。
- 提供下列設定詳細資料:
- 「Service account name」(服務帳戶名稱):輸入帳戶名稱 (例如
bindplane-ingest)。 - 服務帳戶說明:輸入說明 (例如
Bindplane agent log ingestion)。
- 「Service account name」(服務帳戶名稱):輸入帳戶名稱 (例如
- 點按「Create and continue」(建立並繼續)。
- 在「將專案存取權授予這個服務帳戶」部分,按一下「選取角色」,然後選取「Chronicle 編輯者」。
- 依序點選「繼續」和「完成」。
- 按一下您建立的服務帳戶,然後前往「金鑰」分頁。
- 依序點選「新增金鑰」>「建立新的金鑰」。
- 選取「JSON」,然後點選「建立」。金鑰檔案會下載到電腦。
- 將金鑰檔案儲存為 Bindplane 收集器目錄中的
ingestion-auth.json(Linux 為/opt/observiq-otel-collector/ingestion-auth.json,Windows 為C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json),或更新config.yaml中的creds_file_path,使其與儲存檔案的路徑相符。 - 依序前往「IAM & Admin」(IAM 與管理) >「Settings」(設定),然後複製「Project number」(專案編號)。匯出工具設定時會用到。
方法 2:下載擷取驗證檔案 (舊版)
- 登入 Google SecOps 控制台。
- 依序前往「SIEM 設定」>「收集代理程式」。
- 下載擷取驗證檔案。
- 將檔案安全地儲存在要安裝 Bindplane 代理程式的系統中。
取得 Google SecOps 客戶 ID
- 登入 Google SecOps 控制台。
- 依序前往「SIEM 設定」 > 「設定檔」。
複製並儲存「機構詳細資料」部分的客戶 ID。
安裝 Bindplane 代理程式
請按照下列操作說明,在 Windows 或 Linux 作業系統上安裝 Bindplane 代理程式。
Windows 安裝
- 以管理員身分開啟「命令提示字元」或「PowerShell」。
執行下列指令:
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet等待安裝完成。
執行下列指令,確認安裝成功:
sc query observiq-otel-collector服務應顯示為「RUNNING」。
Linux 安裝
- 開啟具有根層級或 sudo 權限的終端機。
執行下列指令:
sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh等待安裝完成。
執行下列指令,確認安裝成功:
sudo systemctl status observiq-otel-collector服務應顯示為「active (running)」。
其他安裝資源
如需其他安裝選項和疑難排解資訊,請參閱 Bindplane 代理程式安裝指南。
設定 Bindplane 代理程式,擷取系統記錄並傳送至 Google SecOps
找出設定檔
Linux:
sudo nano /opt/observiq-otel-collector/config.yamlWindows:
notepad "C:\Program Files\observIQ OpenTelemetry Collector\config.yaml"
編輯設定檔
將
config.yaml的全部內容替換為下列設定:receivers: udplog: listen_address: "0.0.0.0:514" exporters: chronicle/epic: protocol: https # Region of your instance, for example us, europe, asia-southeast1 location: <LOCATION> # Project number of the Google Cloud project linked to the instance project: '<PROJECT_NUMBER>' compression: gzip creds_file_path: '/opt/observiq-otel-collector/ingestion-auth.json' customer_id: '<customer_id>' endpoint: chronicle.googleapis.com log_type: EPIC raw_log_field: body service: pipelines: logs/epic_to_chronicle: receivers: - udplog exporters: - chronicle/epic
設定參數
替換下列預留位置:
接收器設定:
listen_address:要接聽的 IP 位址和通訊埠:0.0.0.0在所有介面接聽電話 (建議)- 通訊埠
514是標準的系統記錄通訊埠 (在 Linux 上需要根層級權限;如果沒有根層級權限,請使用1514)
匯出工具設定:
creds_file_path:服務帳戶 JSON 金鑰檔案的完整路徑 (選項 1):- Linux:
/opt/observiq-otel-collector/ingestion-auth.json - Windows:
C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json
- Linux:
customer_id:從 Google SecOps 控制台複製的客戶 IDlocation:將<LOCATION>替換為 Google SecOps 執行個體的區域 (例如us、europe或asia-southeast1)。匯出工具會以這個值做為chronicle.googleapis.com的前置字元。如需完整清單,請參閱「區域性端點」。project:將<PROJECT_NUMBER>替換為「IAM 與管理」>「設定」中的專案編號。endpoint:請將此值設為chronicle.googleapis.com。
舊版擷取 API 匯出工具
如果您使用方式 2 的擷取驗證檔案,請將
exporters區塊替換成下列內容。將creds_file_path設為擷取驗證檔案的路徑,如果您的執行個體位於美國境外,請將malachiteingestion-pa.googleapis.com替換為區域端點 (例如europe-malachiteingestion-pa.googleapis.com)。exporters: chronicle/epic: compression: gzip creds_file_path: '/opt/observiq-otel-collector/ingestion-auth.json' customer_id: '<customer_id>' endpoint: malachiteingestion-pa.googleapis.com log_type: EPIC raw_log_field: body
儲存設定檔
- 編輯完成後,請儲存檔案:
- Linux:依序按下
Ctrl+O、Enter和Ctrl+X - Windows:依序點選「檔案」 > 「儲存」
- Linux:依序按下
重新啟動 Bindplane 代理程式,套用變更
如要在 Linux 中重新啟動 Bindplane 代理程式,請執行下列指令:
sudo systemctl restart observiq-otel-collector確認服務正在執行:
sudo systemctl status observiq-otel-collector查看記錄檔是否有錯誤:
sudo journalctl -u observiq-otel-collector -f
如要在 Windows 中重新啟動 Bindplane 代理程式,請選擇下列其中一個選項:
以管理員身分開啟命令提示字元或 PowerShell:
net stop observiq-otel-collector && net start observiq-otel-collector服務控制台:
- 按下
Win+R鍵,輸入services.msc,然後按下 Enter 鍵。 - 找出「observIQ OpenTelemetry Collector」。
- 按一下滑鼠右鍵,然後選取「重新啟動」。
確認服務是否正在執行:
sc query observiq-otel-collector檢查記錄是否有錯誤:
type "C:\Program Files\observIQ OpenTelemetry Collector\log\collector.log"
- 按下
設定 SendSIEMSyslogAudit 服務
- 登入 Epic Systems 控制台。
- 依序前往「Start」>「Epic」>「Interconnect」>「
<your instance>」>「Configuration editor」。 - 選取「Business services」(商家服務) 表單。
- 在「服務類別」分頁,選取「SendSIEMSyslogAudit」。
- 按一下 [儲存]。
設定 Epic Systems 匯出系統記錄檔
- 依序前往 「Epic system definitions」 > 「Security」 > 「Auditing options」 > 「SIEM syslog settings」。
- 提供下列設定詳細資料:
- 主機:輸入 Bindplane 代理程式 IP 位址。
- 「通訊埠」:輸入 Bindplane 代理程式通訊埠編號。
- SIEM 格式:選取「CEF (Common Event Format)」。
- Syslog 結尾字元:選取「新行 \n」。
- 在「SIEM syslog settings」選單中,選取「SIEM syslog」。
- 按一下「啟用」。
UDM 對應表
| 記錄欄位 | UDM 對應 | 邏輯 |
|---|---|---|
| APIID | read_only_udm.additional.fields.api.value.string_value | 值取自原始記錄中的 APIID 欄位 |
| APPLICATIONID | read_only_udm.additional.fields.application_id.value.string_value | 值取自原始記錄中的 APPLICATIONID 欄位 |
| 應用程式 | read_only_udm.target.application | 值取自原始記錄中的 APP 欄位 |
| 稽核工作階段 | read_only_udm.network.session_id | 值取自原始記錄中的 AUDIT SESSION 欄位 |
| AUTH_SOURCE | 這個欄位未對應至 UDM | |
| BCAPCS | read_only_udm.target.application | 值取自原始記錄中的 BCAPCS 欄位 |
| BTGEXPLANATION | read_only_udm.security_result.description | 值取自原始記錄中的 BTGEXPLANATION 欄位 |
| BTGNOACCESSREAS | read_only_udm.security_result.summary | 值取自原始記錄中的 BTGNOACCESSREAS 欄位 |
| BTGREASON | read_only_udm.security_result.summary | 值取自原始記錄中的 BTGREASON 欄位 |
| CLIENTNAME | read_only_udm.principal.hostname | 值取自原始記錄中的 CLIENTNAME 欄位 |
| CSISESS_TOKEN | read_only_udm.network.session_id | 值取自原始記錄中的 CSISESS_TOKEN 欄位 |
| CTXT | read_only_udm.metadata.description | 值取自原始記錄中的 CTXT 欄位 |
| CVG | read_only_udm.additional.fields.cvg.value.string_value | 值取自原始記錄中的 CVG 欄位 |
| DAT | 這個欄位未對應至 UDM | |
| DEP | read_only_udm.principal.user.department | 這個值取自原始記錄中的 DEP 欄位。如果原始記錄中同時存在 NEWDEPARTMENT 和 PREVDEPARTMENT 欄位,值會是 PREVDEPARTMENT:-{PREVDEPARTMENT}, NEWDEPARTMENT:-{NEWDEPARTMENT}。如果只有 NEWDEPARTMENT,值會是 PREVDEPARTMENT:-NONE, NEWDEPARTMENT:{NEWDEPARTMENT}。如果只有 PREVDEPARTMENT,值會是 PREVDEPARTMENT:{PREVDEPARTMENT}, NEWDEPARTMENT:-NONE |
| devTime | read_only_udm.metadata.event_timestamp | 值取自原始記錄中的 devTime 欄位,並轉換為自 Epoch 起算的秒數 |
| devTimeFormat | 這個欄位未對應至 UDM | |
| E3MID | read_only_udm.network.session_id | 值取自原始記錄中的 E3MID 欄位 |
| 已加密 | read_only_udm.additional.fields.encrypt.value.string_value | 值取自原始記錄中的 ENCRYPTED 欄位 |
| ERRMSG | read_only_udm.security_result.summary | 值取自原始記錄中的 ERRMSG 欄位 |
| eventCnt | 這個欄位未對應至 UDM | |
| FILENAME | read_only_udm.target.file.full_path | 值取自原始記錄中的 FILENAME 欄位,且所有 \\\\ 都會替換為 \ |
| 旗標 | read_only_udm.security_result.description | 值取自原始記錄中的標記欄位,且所有開頭和結尾的 - 都會移除 |
| HKUAPVER | read_only_udm.metadata.product_version | 值取自原始記錄中的 HKUAPVER 欄位 |
| HKUDVCID | read_only_udm.principal.asset_id | 值取自原始記錄中的 HKUDVCID 欄位,並格式化為 Device ID:{HKUDVCID} |
| HKUOSNAM | read_only_udm.principal.platform | 值取自原始記錄中的 HKUOSNAM 欄位,並根據值對應至 WINDOWS、MAC、LINUX 或 UNKNOWN_PLATFORM |
| HKUOSVER | read_only_udm.principal.platform_version | 值取自原始記錄中的 HKUOSVER 欄位 |
| INSTANCEURN | read_only_udm.intermediary.hostname | 值取自原始記錄中的 INSTANCEURN 欄位 |
| IP | read_only_udm.target.ip | 值取自原始記錄中的 IP 欄位。如果值包含 /,則會分割為兩個 IP 位址。如果值包含 ,,系統會將其拆分成多個 IP 位址。 |
| LOGINERROR | read_only_udm.security_result.summary | 值取自原始記錄中的 LOGINERROR 欄位 |
| LOGIN_CONTEXT | read_only_udm.metadata.description | 值取自原始記錄中的 LOGIN_CONTEXT 欄位 |
| LOGIN_DEVICE | read_only_udm.additional.fields.login_device.value.string_value | 值取自原始記錄中的 LOGIN_DEVICE 欄位 |
| LOGIN_LDAP_ID | read_only_udm.principal.user.userid | 值取自原始記錄中的 LOGIN_LDAP_ID 欄位 |
| LOGIN_REASON | read_only_udm.security_result.summary | 值取自原始記錄中的 LOGIN_REASON 欄位 |
| LOGIN_REVAL | read_only_udm.additional.fields.login_reval.value.string_value | 值取自原始記錄中的 LOGIN_REVAL 欄位 |
| MASKMODE | read_only_udm.additional.fields.masked_mode.value.string_value | 值取自原始記錄中的 MASKMODE 欄位 |
| MYCACCT | read_only_udm.principal.user.userid | 值取自原始記錄中的 MYCACCT 欄位 |
| NEWDEPARTMENT | read_only_udm.principal.user.department | 查看 DEP 欄位的邏輯 |
| NEWUSER | 這個欄位未對應至 UDM | |
| NSC | read_only_udm.additional.fields.nsc.value.string_value | 值取自原始記錄中的 NSC 欄位 |
| OSUSR | read_only_udm.target.user.userid | 值取自原始記錄中的 OSUSR 欄位 |
| PATIENT | read_only_udm.target.user.userid | 值取自原始記錄中的 PATIENT 欄位 |
| PREVDEPARTMENT | read_only_udm.principal.user.department | 查看 DEP 欄位的邏輯 |
| PREVPROVIDER | 這個欄位未對應至 UDM | |
| PREVUSER | read_only_udm.principal.resource.attribute.labels.prev_user.value | 值取自原始記錄中的 PREVUSER 欄位 |
| PWREASON | read_only_udm.metadata.description | 值取自原始記錄中的 PWREASON 欄位 |
| 角色 | read_only_udm.principal.user.attribute.roles.name | 值取自原始記錄中的 ROLE 欄位 |
| 資源 | read_only_udm.target.hostname | 值取自原始記錄中的資源欄位 |
| SERVICEID | read_only_udm.additional.fields.service_id.value.string_value | 值取自原始記錄中的 SERVICEID 欄位 |
| SERVICECATEGORY | read_only_udm.additional.fields.service_category.value.string_value | 值取自原始記錄中的 SERVICECATEGORY 欄位 |
| SERVICEMSGID | 這個欄位未對應至 UDM | |
| SERVICENAME | read_only_udm.target.resource.name | 值取自原始記錄中的 SERVICENAME 欄位 |
| SERVICETYPE | read_only_udm.target.resource.type | 值取自原始記錄中的 SERVICETYPE 欄位。如果 event_id 為 PHI_CLIENT_FILE,值會設為 FILE |
| SERVICE_USER | read_only_udm.target.user.userid | 值取自原始記錄中的 SERVICE_USER 欄位 |
| SERVICE_USERTYP | read_only_udm.additional.fields.service_user_type.value.string_value | 值取自原始記錄中的 SERVICE_USERTYP 欄位 |
| sev | read_only_udm.security_result.severity | 系統會從原始記錄的 sev 欄位擷取值,並根據該值對應至 LOW、HIGH 或 CRITICAL |
| shost | read_only_udm.target.resource.attribute.labels.workstation_type.value | 值取自原始記錄中的 shost 欄位 |
| 來源 | read_only_udm.additional.fields.login_source.value.string_value | 值取自原始記錄中的 SOURCE 欄位 |
| 成功 | read_only_udm.additional.fields.success_yes_no.value.string_value | 值取自原始記錄中的 SUCCESS 欄位 |
| 逾時 | read_only_udm.additional.fields.time_out.value.string_value | 值取自原始記錄中的 TIMEOUT 欄位 |
| UID | read_only_udm.principal.user.userid | 值取自原始記錄中的 UID 欄位 |
| USERJOB | 這個欄位未對應至 UDM | |
| usrName | read_only_udm.principal.user.userid, read_only_udm.principal.user.user_display_name | 如果原始記錄中存在 UID 或 LOGIN_LDAP_ID 欄位,usrName 會用於 read_only_udm.principal.user.user_display_name,另一個欄位則用於 read_only_udm.principal.user.userid。否則,usrName 會用於 read_only_udm.principal.user.userid |
| WEBLGAPP | read_only_udm.target.application | 值取自原始記錄中的 WEBLGAPP 欄位 |
| read_only_udm.extensions.auth.type | 如果 LOGIN_LDAP_ID 不為空白,值會設為 SSO。否則,值會設為 AUTHTYPE_UNSPECIFIED。 |
|
| read_only_udm.intermediary.ip | 此值會設為記錄來源的 IP 位址。 | |
| read_only_udm.metadata.event_type | 如果 event_id 為 IC_SERVICE_AUDIT、AC_BREAK_THE_GLASS_FAILED_ACCESS、AC_BREAK_THE_GLASS_INAPPROPRIATE_ATTEMPT、AC_BREAK_THE_GLASS_ACCESS 或 MCMEMEDISA,且 target_ip_set 為 true 或 resource 不為空白,則值會設為 RESOURCE_READ。如果 event_id 是 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 或 WPSEC_LOGIN_SUCCESS,且 target_ip_set、resource、SERVICENAME、SERVICETYPE 或 shost 至少有一項不為空白,值會設為 USER_LOGIN。如果 event_id 是 E_ADMINPASSWORDCHANGE、E_FAILEDPASSWORDCHANGE、E_SELFPASSWORDCHANGE、WPSEC_USER_PASSWORD_CHANGE_FAIL 或 WPSEC_USER_PASSWORD_CHANGE,值會設為 USER_CHANGE_PASSWORD。如果 event_id 為 CONTEXTCHANGE,值會設為 USER_UNCATEGORIZED。如果 event_id 是 SECURE、UNSECURE、MASKED_DATA_DISPLAY 或 MASKED_DATA_PRINTING,值會設為 USER_RESOURCE_ACCESS。如果 event_id 為 PHI_CLIENT_FILE,值會設為 USER_RESOURCE_UPDATE_CONTENT。如果 CLIENTNAME 不為空白,值會設為 STATUS_UPDATE。如果 prin_usr_id 不是空白,值會設為 USER_UNCATEGORIZED。否則,值會設為 GENERIC_EVENT。 |
|
| read_only_udm.metadata.log_type | 值設為 EPIC。 |
|
| read_only_udm.metadata.product_name | 值設為 Epic Systems。 |
|
| read_only_udm.metadata.vendor_name | 值設為 EPIC。 |
|
| read_only_udm.network.ip_protocol | 值衍生自原始記錄中的 proto 欄位,並對應至相應的 IP 通訊協定名稱。 | |
| read_only_udm.principal.resource.attribute.labels.workstation_type.key | 值設為 Workstation ID/Type。 |
|
| read_only_udm.principal.resource.attribute.labels.prev_user.key | 值設為 Prev User。 |
|
| read_only_udm.security_result.action | 如果原始記錄中存在 ERRMSG 或 LOGINERROR 欄位,值會設為 BLOCK。 |
|
REMOTEIP |
event.idm.read_only_udm.additional.fields |
從變更記錄對應 |
CLIENTTYPE |
event.idm.read_only_udm.additional.fields |
從變更記錄對應 |
INTERNETAREA |
event.idm.read_only_udm.additional.fields |
從變更記錄對應 |
LOGINCLIENTID |
event.idm.read_only_udm.additional.fields |
從變更記錄對應 |
LOGINCONTEXT |
event.idm.read_only_udm.additional.fields |
從變更記錄對應 |
PERIMAUTHST |
event.idm.read_only_udm.additional.fields |
從變更記錄對應 |
HYPACCESSID |
event.idm.read_only_udm.additional.fields |
從變更記錄對應 |
UNRECDEVICE |
event.idm.read_only_udm.additional.fields |
從變更記錄對應 |
變更記錄
還有其他問題嗎?向社群成員和 Google SecOps 專家尋求解答。