收集 Oracle DB 日志
本指南介绍了如何使用 Bindplane 代理将 Oracle 数据库日志注入到 Google Security Operations。
解析器使用 Grok 模式和键值解析从 SYSLOG 消息中提取字段,并处理多种格式。然后,它会将这些提取的字段映射到统一数据模型 (UDM),通过供应商和产品名称等静态元数据来丰富数据,并根据 ACTION 和 USERID 等特定字段值动态设置事件类型。
准备工作
请确保满足以下前提条件:
Google SecOps 实例
Windows Server 2016 或更高版本,或者具有
systemd的 Linux 主机Bindplane 代理与 Oracle 数据库主机之间的网络连接
如果通过代理运行,请确保防火墙端口已根据 Bindplane 代理要求打开
对 Oracle 数据库实例的特权访问权限(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 安装
- 打开具有 root 或 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 代理以注入 syslog 并将其发送到 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 syslog 转发配置匹配的端口号
导出器配置:
* 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 收集器。
- 右键点击并选择重新启动。
- 按
- 验证服务是否正在运行:
sc query observiq-otel-collector- 检查日志是否存在错误:
type "C:\Program Files\observIQ OpenTelemetry Collector\log\collector.log"
配置 Oracle 数据库统一审核和 syslog 转发
启用统一审核
如果尚未启用统一审核,请使用 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 初始化参数,以将统一审核记录写入 syslog。此参数是在 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 系统上,将参数设置为
可选:如需将来自 CDB 根容器的常见统一审核政策记录写入 UNIX/Linux 系统上的 syslog,请设置
UNIFIED_AUDIT_COMMON_SYSTEMLOG参数:ALTER SYSTEM SET UNIFIED_AUDIT_COMMON_SYSTEMLOG = TRUE SCOPE=SPFILE;重启 Oracle 数据库实例,使参数更改生效:
SHUTDOWN IMMEDIATE; STARTUP;
在 Oracle 主机上配置 syslog 守护程序
在 Oracle 数据库主机上,配置 syslog 守护程序以将审核日志条目转发到 Bindplane 代理。
- 以
root身份登录到 Oracle 数据库主机。 打开 syslog 配置文件:
- 在具有 rsyslog 的 RHEL/CentOS/Oracle Linux 上:
sudo vi /etc/rsyslog.conf- 在具有 syslog 的旧版系统上:
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 守护程序:
- 在具有 rsyslog 的 RHEL/CentOS/Oracle Linux 上:
sudo systemctl restart rsyslog- 在具有 syslog 的旧版系统上:
sudo service syslog restart
验证审核日志转发
在 Oracle 数据库中执行可审核的操作,以生成测试审核事件。例如,以用户身份连接并运行以下命令:
SELECT * FROM DBA_USERS WHERE ROWNUM = 1;检查 Bindplane 代理日志中是否有传入的 syslog 消息:
sudo journalctl -u observiq-otel-collector -f验证 syslog 消息是否包含
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 |
从使用包含文件 parse_ip_protocol.include 从 CLIENT_ADDRESS 中提取的协议派生而来。 |
需要更多帮助?获得社区成员和 Google SecOps 专业人士的解答。