收集 Oracle 資料庫記錄
本指南說明如何使用 Bindplane 代理程式,將 Oracle DB 記錄擷取至 Google Security Operations。
剖析器會從 SYSLOG 訊息中擷取欄位,並使用 grok 模式和鍵/值剖析功能處理多種格式。接著,系統會將這些擷取的欄位對應至整合式資料模型 (UDM),並使用供應商和產品名稱等靜態中繼資料擴充資料,以及根據 ACTION 和 USERID 等特定欄位值動態設定事件類型。
事前準備
請確認您已完成下列事前準備事項:
Google SecOps 執行個體
Windows Server 2016 以上版本,或搭載
systemd的 Linux 主機Bindplane 代理程式與 Oracle Database 主機之間的網路連線
如果透過 Proxy 執行,請確保防火牆通訊埠已根據 Bindplane 代理程式需求開啟
Oracle Database 執行個體的特殊權限 (SYSDBA 或 AUDIT_ADMIN 角色)
Oracle Database 19c 以上版本,並啟用統一稽核功能 (或 Oracle 12c 至 18c 的混合模式稽核)
取得 Google SecOps 擷取驗證檔案
- 登入 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
服務應顯示為有效 (執行中)。
其他安裝資源
如需其他安裝選項和疑難排解資訊,請參閱 Bindplane 代理程式安裝指南。
設定 Bindplane 代理程式,擷取系統記錄檔並傳送至 Google SecOps
找出設定檔
Linux:
```bash
sudo nano /etc/bindplane-agent/config.yaml
```
Windows:
```cmd
notepad "C:\Program Files\observIQ OpenTelemetry Collector\config.yaml"
```
編輯設定檔
將 config.yaml 的所有內容替換為下列設定:
```yaml
receivers:
udplog:
listen_address: "0.0.0.0:514"
exporters:
chronicle/oracle_db:
compression: gzip
creds_file_path: '/path/to/ingestion-authentication-file.json'
customer_id: '<customer_id>'
endpoint: malachiteingestion-pa.googleapis.com
log_type: ORACLE_DB
raw_log_field: body
ingestion_labels:
log_type: 'ORACLE_DB'
service:
pipelines:
logs/oracle_to_chronicle:
receivers:
- udplog
exporters:
- chronicle/oracle_db
```
設定參數
- 替換下列預留位置:
接收器設定:
* listen_address:要監聽的 IP 位址和通訊埠:
- 將 0.0.0.0 替換為要監聽的特定 IP 位址,或保留為 0.0.0.0,監聽所有介面 (建議)
- 將 514 替換為與 Oracle 系統記錄檔轉送設定相符的通訊埠編號
匯出工具設定:
* creds_file_path:擷取驗證檔案的完整路徑:
- Linux:/etc/bindplane-agent/ingestion-auth.json
- Windows:C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json
* customer_id:在「取得 Google SecOps 客戶 ID」一節中複製的客戶 ID
* endpoint:區域端點網址:
- 美國:malachiteingestion-pa.googleapis.com
- 歐洲:europe-malachiteingestion-pa.googleapis.com
- 亞洲:asia-southeast1-malachiteingestion-pa.googleapis.com
- 如需完整清單,請參閱「區域端點」
儲存設定檔
- 編輯完成後,請儲存檔案:
- 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"
設定 Oracle Database 統一稽核和系統記錄檔轉送
啟用統合稽核
如果尚未啟用統合稽核,請使用 uniaud_on 選項重新連結 Oracle 二進位檔。這需要關閉從 Oracle Home 執行的所有 Oracle 程序 (資料庫執行個體和接聽程式)。
- 以
oracle作業系統使用者的身分連線至 Oracle 資料庫主機。 關閉 Oracle 執行個體和接聽程式:
sqlplus / as sysdba <<EOF shutdown immediate; exit EOF lsnrctl stop重新連結 Oracle 二進位檔,並啟用統合稽核功能:
cd $ORACLE_HOME/rdbms/lib make -f ins_rdbms.mk uniaud_on ioracle啟動接聽程式和 Oracle 執行個體:
lsnrctl start sqlplus / as sysdba <<EOF startup; exit EOF如果 Oracle Enterprise Manager Cloud Control 執行於同一部主機,請重新啟動:
cd /u01/app/oracle/product/middleware/oms export OMS_HOME=/u01/app/oracle/product/middleware/oms $OMS_HOME/bin/emctl start oms確認已啟用統合稽核功能。使用 SQLplus 連線至 Oracle 資料庫:
SELECT VALUE FROM V$OPTION WHERE PARAMETER = 'Unified Auditing';
確認指令傳回一個資料列,且 VALUE 等於 TRUE。
設定統合稽核 Syslog 輸出
將 UNIFIED_AUDIT_SYSTEMLOG 初始化參數設為將統一稽核記錄寫入系統記錄檔。這個參數是在 Oracle 19c 中導入,並取代已淘汰的 AUDIT_SYSLOG_LEVEL 參數 (僅適用於傳統稽核)。
- 以 SYSDBA 身分透過 SQLplus 連線至 Oracle 資料庫。
設定
UNIFIED_AUDIT_SYSTEMLOG參數:- 在 UNIX/Linux 系統上,將參數設為
facility.priority值:
ALTER SYSTEM SET UNIFIED_AUDIT_SYSTEMLOG = 'LOCAL7.INFO' SCOPE=SPFILE;- 在 Windows 系統上,將參數設為
TRUE,即可寫入 Windows 事件檢視器:
ALTER SYSTEM SET UNIFIED_AUDIT_SYSTEMLOG = TRUE SCOPE=SPFILE;- 在 UNIX/Linux 系統上,將參數設為
選用:如要在 UNIX/Linux 系統上,將 CDB 根容器的常見統一稽核政策記錄寫入系統記錄,請設定
UNIFIED_AUDIT_COMMON_SYSTEMLOG參數:ALTER SYSTEM SET UNIFIED_AUDIT_COMMON_SYSTEMLOG = TRUE SCOPE=SPFILE;重新啟動 Oracle 資料庫執行個體,讓參數變更生效:
SHUTDOWN IMMEDIATE; STARTUP;
在 Oracle 主機上設定 syslog daemon
在 Oracle Database 主機上,將系統記錄檔 Daemon 設為將稽核記錄項目轉送至 Bindplane 代理程式。
- 以
root身分登入 Oracle Database 主機。 開啟系統記錄設定檔:
- 在 RHEL/CentOS/Oracle Linux 上使用 rsyslog:
sudo vi /etc/rsyslog.conf- 在舊版系統上使用系統記錄:
sudo vi /etc/syslog.conf新增與您在
UNIFIED_AUDIT_SYSTEMLOG中設定的設施和優先順序相符的轉送規則。舉例來說,如果您設定LOCAL7.INFO:- 如要透過 UDP 轉送 (符合 Bindplane
udplog接收器):
local7.info @<BINDPLANE_HOST_IP>:514- 如要透過 TCP 轉送 (如果 Bindplane 使用
tcplog接收器):
local7.info @@<BINDPLANE_HOST_IP>:514- 如要透過 UDP 轉送 (符合 Bindplane
將 <BINDPLANE_HOST_IP> 替換為執行 Bindplane 代理程式的系統 IP 位址或主機名稱。
Note: A single `@` prefix indicates UDP forwarding. A double `@@` prefix indicates TCP forwarding. Ensure this matches the receiver type in the Bindplane `config.yaml`.
選用:如要保留稽核記錄的本機副本,請新增下列程式碼行:
local7.info /var/log/oracle_audit.log儲存檔案並重新啟動 syslog daemon:
- 在 RHEL/CentOS/Oracle Linux 上使用 rsyslog:
sudo systemctl restart rsyslog- 在舊版系統上使用系統記錄:
sudo service syslog restart
確認稽核記錄轉寄功能
在 Oracle 資料庫中執行可稽核的動作,產生測試稽核事件。舉例來說,以使用者身分連線並執行:
SELECT * FROM DBA_USERS WHERE ROWNUM = 1;檢查 Bindplane 代理程式記錄,確認是否有傳入的系統記錄訊息:
sudo journalctl -u observiq-otel-collector -f確認系統記錄訊息包含
Oracle Unified Audit標記,以及TYPE、DBID、SESID、DBUSER、ACTION和RETCODE等鍵值組。
UDM 對應表
| 記錄欄位 | UDM 對應 | 邏輯 |
|---|---|---|
ACTION |
security_result.action_details |
原始記錄中的 ACTION 值會直接對應至這個 UDM 欄位。系統會套用額外邏輯,根據 ACTION 的值判斷 security_result.action 和 security_result.description (例如,100 會對應至 ALLOW 和 Success)。 |
ACTION_NAME |
metadata.product_event_type |
直接對應。 |
ACTION_NUMBER |
additional.fields[action_number].value.string_value |
直接對應至 Source Event 鍵。也與其他欄位搭配使用,可衍生出 metadata.event_type 和 metadata.product_event_type。 |
APPLICATION_CONTEXTS |
additional.fields[application_contexts_label].value.string_value |
直接對應至 APPLICATION_CONTEXTS 鍵。 |
AUDIT_POLICY |
additional.fields[audit_policy_label].value.string_value或additional.fields[AUDIT_POLICY_#].value.string_value |
如果 AUDIT_POLICY 包含半形逗號,系統會將其分割為多個標籤,並以 AUDIT_POLICY_0、AUDIT_POLICY_1 等鍵表示。否則,系統會直接以 AUDIT_POLICY 鍵對應。 |
AUDIT_TYPE |
additional.fields[audit_type_label].value.string_value |
直接對應至 AUDIT_TYPE 鍵。 |
AUTHENTICATION_TYPE |
metadata.event_type、extensions.auth.type |
如果 auth_type (從 AUTHENTICATION_TYPE 擷取) 不為空白,且符合其他條件,則用於衍生 metadata.event_type 做為 USER_LOGIN。extensions.auth.type目前設為 AUTHTYPE_UNSPECIFIED。 |
CLIENT_ADDRESS |
principal.ip、principal.port、network.ip_protocol、intermediary[host].user.userid |
系統會使用 grok 模式擷取 IP、通訊埠和通訊協定。如果 CLIENT_ADDRESS 欄位中有使用者名稱,系統會將其對應至 intermediary[host].user.userid。 |
CLIENT_ID |
target.user.userid |
直接對應。 |
CLIENT_PROGRAM_NAME |
additional.fields[client_program_name_label].value.string_value |
直接對應至 CLIENT_PROGRAM_NAME 鍵。 |
CLIENT_TERMINAL |
additional.fields[CLIENT_TERMINAL_label].value |
直接對應至 CLIENT_TERMINAL 鍵。 |
CLIENT_USER |
target.user.user_display_name |
直接對應。 |
COMMENT$TEXT |
additional.fields[comment_text_label].value.string_value |
將 + 替換為 : 後,直接對應至 comment_text 鍵。 |
CURRENT_USER |
additional.fields[current_user_label].value.string_value |
直接對應至 current_user 鍵。 |
CURUSER |
additional.fields[current_user_label].value.string_value |
直接對應至 current_user 鍵。 |
DATABASE_USER |
principal.user.user_display_name |
如果不是空白或 /,則直接對應。 |
DBID |
metadata.product_log_id |
移除單引號後直接對應。 |
DBNAME |
target.resource.resource_type、target.resource.resource_subtype、target.resource.name |
將 resource_type 設為 DATABASE、resource_subtype 設為 Oracle Database,並將 DBNAME 對應至 name。 |
DBPROXY_USERRNAME |
intermediary[dbproxy].user.userid |
直接對應。 |
DBUSERNAME |
target.user.user_display_name |
直接對應。 |
ENTRYID |
target.resource.attribute.labels[entry_id_label].value |
直接對應至 Entry Id 鍵。 |
EXTERNAL_USERID |
additional.fields[external_userid_label].value.string_value |
直接對應至 EXTERNAL_USERID 鍵。 |
LENGTH |
additional.fields[length_label].value.string_value |
直接對應至 length 鍵。 |
LOGOFF$DEAD |
target.resource.attribute.labels[LOGOFFDEAD_label].value |
直接對應至 LOGOFFDEAD 鍵。 |
LOGOFF$LREAD |
target.resource.attribute.labels[LOGOFFLREAD_label].value |
直接對應至 LOGOFFLREAD 鍵。 |
LOGOFF$LWRITE |
target.resource.attribute.labels[LOGOFFLWRITE_label].value |
直接對應至 LOGOFFLWRITE 鍵。 |
LOGOFF$PREAD |
target.resource.attribute.labels[LOGOFFPREAD_label].value |
直接對應至 LOGOFFPREAD 鍵。 |
NTIMESTAMP# |
metadata.event_timestamp |
已剖析並轉換為 RFC 3339 或 ISO8601 格式。 |
OBJCREATOR |
target.resource.attribute.labels[obj_creator_label].value |
直接對應至 OBJ Creator 鍵。 |
OBJNAME |
target.resource.attribute.labels[obj_name_label].value |
直接對應至 OBJ Name 鍵。 |
OS_USERNAME |
principal.user.user_display_name |
直接對應。 |
OSUSERID |
target.user.userid |
直接對應。 |
PDB_GUID |
principal.resource.product_object_id |
直接對應。 |
PRIV$USED |
additional.fields[privused_label].value.string_value |
直接對應至 privused 鍵。 |
PRIVILEGE |
principal.user.attribute.permissions.name |
直接對應。 |
RETURN_CODE |
security_result.summary |
直接對應。系統會套用邏輯來衍生 security_result.action 和 security_result.description。 |
RETURNCODE |
security_result.summary |
直接對應。系統會套用邏輯來衍生 security_result.action 和 security_result.description。 |
RLS_INFO |
additional.fields[rls_info_label].value.string_value |
直接對應至 RLS_INFO 鍵。 |
SCHEMA |
additional.fields[schema_label].value.string_value |
直接對應至 schema 鍵。 |
SESSIONCPU |
target.resource.attribute.labels[SESSIONCPU_label].value |
直接對應至 SESSIONCPU 鍵。 |
SESSIONID |
network.session_id |
直接對應。 |
SESID |
network.session_id |
直接對應。 |
SQL_TEXT |
target.process.command_line |
直接對應。 |
SQLTEXT |
target.process.command_line |
直接對應。 |
STATEMENT |
target.resource.attribute.labels[statement_label].value |
直接對應至 STATEMENT 鍵。 |
STATUS |
security_result.summary |
直接對應。系統會套用邏輯來衍生 security_result.action 和 security_result.description。 |
SYSTEM_PRIVILEGE_USED |
additional.fields[system_privilege_used_label].value.string_value |
直接對應至 SYSTEM_PRIVILEGE_USED 鍵。 |
TARGET_USER |
additional.fields[target_user_label].value.string_value |
直接對應至 TARGET_USER 鍵。 |
TERMINAL |
additional.fields[CLIENT_TERMINAL_label].value |
直接對應至 CLIENT_TERMINAL 鍵。 |
TYPE |
additional.fields[type_label].value.string_value |
直接對應至 type 鍵。 |
USERHOST |
principal.hostname、principal.administrative_domain |
主機名稱和網域是使用 grok 模式擷取。 |
USERID |
principal.user.userid |
直接對應。 |
device_host_name |
target.hostname |
直接對應。 |
event_name |
metadata.product_event_type |
轉換為大寫後直接對應。 |
file_name |
target.file.full_path |
直接對應。 |
hostname |
principal.hostname |
直接對應。 |
length |
additional.fields[length_label].value.string_value |
直接對應至 length 鍵。 |
log_source_name |
principal.application |
直接對應。 |
message |
多項政策 | 用於 grok 剖析,可擷取多個欄位。 |
returncode |
RETURNCODE |
直接對應。 |
src_ip |
principal.ip |
直接對應。 |
t_hostname |
target.hostname |
直接對應。 |
| (剖析器邏輯) | metadata.vendor_name |
硬式編碼為 Oracle。 |
| (剖析器邏輯) | metadata.product_name |
硬式編碼為 Oracle DB。 |
| (剖析器邏輯) | metadata.event_type |
根據 ACTION、ACTION_NUMBER、source_event、OSUSERID、USERID、SQLTEXT、AUTHENTICATION_TYPE、DBUSERNAME、device_host_name、database_name 的值決定。如果未符合任何特定條件,則預設值為 USER_RESOURCE_ACCESS。 |
| (剖析器邏輯) | metadata.product_event_type |
根據 ACTION、ACTION_NUMBER、source_event、p_event_type、ACTION_NAME 的值決定。 |
| (剖析器邏輯) | metadata.log_type |
硬式編碼為 ORACLE_DB。 |
| (剖析器邏輯) | extensions.auth.mechanism |
在特定條件下,根據 ACTION、ACTION_NUMBER、source_event 和 OSUSERID 設為 USERNAME_PASSWORD。 |
| (剖析器邏輯) | extensions.auth.type |
根據 ACTION、ACTION_NUMBER 和 AUTHENTICATION_TYPE,在特定條件下設為 AUTHTYPE_UNSPECIFIED。 |
| (剖析器邏輯) | security_result.description |
衍生自 RETURNCODE 或 STATUS。 |
| (剖析器邏輯) | security_result.action |
衍生自 RETURNCODE 或 STATUS。 |
| (剖析器邏輯) | target.resource.attribute.labels |
系統會根據各種記錄欄位的存在與值,新增多個標籤。 |
| (剖析器邏輯) | additional.fields |
系統會根據各種記錄檔欄位的存在與值,以鍵值組合的形式新增多個欄位。 |
| (剖析器邏輯) | intermediary |
系統會根據 DBPROXY_USERRNAME 和 CLIENT_ADDRESS 的存在與值建立並填入資料。 |
| (剖析器邏輯) | network.ip_protocol |
衍生自使用 include 檔案 parse_ip_protocol.include 從 CLIENT_ADDRESS 擷取的通訊協定。 |
還有其他問題嗎?向社群成員和 Google SecOps 專業人員尋求答案。