收集 Oracle DB 日志
本文档介绍了如何使用 Bindplane 将 Oracle 数据库日志注入到 Google Security Operations。解析器使用 grok 模式和键值对解析从 SYSLOG 消息中提取字段,从而处理多种格式。然后,它会将这些提取的字段映射到统一数据模型 (UDM),通过供应商和产品名称等静态元数据来丰富数据,并根据 ACTION
和 USERID
等特定字段值动态设置事件类型。解析器还会处理各种数据清理操作,例如替换字符和转换数据类型。
准备工作
确保您满足以下前提条件:
- Google SecOps 实例
- Windows 2016 或更高版本,或者具有
systemd
的 Linux 主机 - 如果在代理后运行,防火墙端口处于开放状态
- 对 Oracle 数据库的特权访问权限 (AUDIT_SYSTEM 角色)
获取 Google SecOps 注入身份验证文件
- 登录 Google SecOps 控制台。
- 依次前往 SIEM 设置 > 收集代理。
- 下载注入身份验证文件。将该文件安全地保存在将要安装 Bindplane 的系统上。
获取 Google SecOps 客户 ID
- 登录 Google SecOps 控制台。
- 依次前往 SIEM 设置 > 配置文件。
- 复制并保存组织详细信息部分中的客户 ID。
安装 Bindplane 代理
Windows 安装
- 以管理员身份打开命令提示符或 PowerShell。
运行以下命令:
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
Linux 安装
- 打开具有 root 或 sudo 权限的终端。
运行以下命令:
sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh
其他安装资源
如需了解其他安装选项,请参阅安装指南。
配置 Bindplane 代理以注入 Syslog 并将其发送到 Google SecOps
- 访问配置文件:
- 找到
config.yaml
文件。通常,它位于 Linux 上的/etc/bindplane-agent/
目录中或 Windows 上的安装目录中。 - 使用文本编辑器(例如
nano
、vi
或记事本)打开该文件。
- 找到
按如下方式修改
config.yaml
文件: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_file_path: '/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: 'ORACLE_DB' raw_log_field: body service: pipelines: logs/source0__chronicle_w_labels-0: receivers: - udplog exporters: - chronicle/chronicle_w_labels
根据基础架构的需要替换端口和 IP 地址。
将
<customer_id>
替换为实际的客户 ID。将
/path/to/ingestion-authentication-file.json
更新为获取 Google SecOps 提取身份验证文件部分中保存身份验证文件的路径。
重启 Bindplane 代理以应用更改
如需在 Linux 中重启 Bindplane 代理,请运行以下命令:
sudo systemctl restart bindplane-agent
如需在 Windows 中重启 Bindplane 代理,您可以使用服务控制台,也可以输入以下命令:
net stop BindPlaneAgent && net start BindPlaneAgent
为 Oracle 数据库启用审核
- 使用 SQLplus 连接到 Oracle 数据库。
使用以下命令关闭数据库:
shutdown immediate
输入以下命令,停止 Oracle 监听器服务:
lsnrctl stop
可选:仅在适用情况下,使用以下命令停止 Enterprise Manager:
cd /u01/app/oracle/product/middleware/oms export OMS_HOME=/u01/app/oracle/product/middleware/oms $OMS_HOME/bin/emctl stop oms
使用以下命令,通过 uniaud 选项关联 Oracle 数据库:
cd $ORACLE_HOME/rdbms/lib make -f ins_rdbms.mk uniaud_on ioracle
使用 SQLplus 连接到 Oracle 数据库。
使用以下命令重启数据库:
startup
使用以下命令重启 Oracle 监听器服务:
lsnrctl start
可选:仅在适用时,使用以下命令重启 Enterprise Manager:
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 * from v$option where PARAMETER = 'Unified Auditing';
验证该命令是否返回一行,且 VALUE 等于“TRUE”。
为 Oracle 数据库配置 Syslog
- 登录 Oracle 实例。
使用
vi
打开以下文件:vi ${ORACLE_HOME}/dbs/init${ORACLE_SID}.ora
输入以下命令以进行 syslog 配置:
*.audit_trail='os' *.audit_syslog_level='local0.info'
确保 Oracle 主机上的 syslog 守护程序已配置为转发审核日志。
在 Red Hat Enterprise 上,使用
vi
打开以下文件/etc/syslog.conf
,然后输入以下行:local0.info @ <bindplane-ip>:514
保存并退出文件:
:wq
在 Red Hat Enterprise 上,输入以下命令以重新加载 syslog 配置:
kill -HUP /var/run/syslogd.pid
连接到 SQLplus 并以 sysdba 身份登录以重新启动:
sys as sysdba
使用以下命令关闭数据库:
shutdown immediate
使用以下命令重启数据库:
startup
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 中提取的 protocol 。 |
需要更多帮助?从社区成员和 Google SecOps 专业人士那里获得解答。