收集 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 注入身份验证文件

  1. 登录 Google SecOps 控制台。
  2. 依次前往 SIEM 设置 > 收集代理
  3. 下载注入身份验证文件。将文件安全地保存在将要安装 Bindplane 的系统上。

获取 Google SecOps 客户 ID

  1. 登录 Google SecOps 控制台。
  2. 依次前往 SIEM 设置 > 配置文件
  3. 复制并保存组织详细信息部分中的客户 ID

安装 Bindplane 代理

按照以下说明在 Windows 或 Linux 操作系统上安装 Bindplane 代理。

Windows 安装

  1. 以管理员身份打开命令提示符PowerShell
  2. 运行以下命令:

    msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
    
  3. 等待安装完成。

  4. 运行以下命令来验证安装:

    sc query observiq-otel-collector
    

该服务应显示为 RUNNING

Linux 安装

  1. 打开具有 root 或 sudo 权限的终端。
  2. 运行以下命令:

    sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh
    
  3. 等待安装完成。

  4. 运行以下命令来验证安装:

    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 - WindowsC:\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+OEnterCtrl+X
    • Windows:依次点击文件 > 保存

重启 Bindplane 代理以应用更改

  • 如需在 Linux 中重启 Bindplane 代理,请运行以下命令:

    sudo systemctl restart observiq-otel-collector
    
    1. 验证服务是否正在运行:
    sudo systemctl status observiq-otel-collector
    
    1. 检查日志是否存在错误:
    sudo journalctl -u observiq-otel-collector -f
    
  • 如需在 Windows 中重启 Bindplane 代理,请选择以下选项之一:

    • 以管理员身份运行命令提示符或 PowerShell:
    net stop observiq-otel-collector && net start observiq-otel-collector
    
    • 服务控制台:
      1. Win+R,输入 services.msc,然后按 Enter 键。
      2. 找到 observIQ OpenTelemetry 收集器
      3. 右键点击并选择重新启动
    1. 验证服务是否正在运行:
    sc query observiq-otel-collector
    
    1. 检查日志是否存在错误:
    type "C:\Program Files\observIQ OpenTelemetry Collector\log\collector.log"
    

配置 Oracle 数据库统一审核和 syslog 转发

启用统一审核

如果尚未启用统一审核,请使用 uniaud_on 选项重新关联 Oracle 二进制文件。这需要关闭从 Oracle Home 运行的所有 Oracle 进程(数据库实例和监听器)。

  1. oracle 操作系统用户身份连接到 Oracle 数据库主机。
  2. 关闭 Oracle 实例和监听器:

    sqlplus / as sysdba <<EOF
    shutdown immediate;
    exit
    EOF
    lsnrctl stop
    
  3. 重新关联启用了统一审核的 Oracle 二进制文件:

    cd $ORACLE_HOME/rdbms/lib
    make -f ins_rdbms.mk uniaud_on ioracle
    
  4. 启动监听器和 Oracle 实例:

    lsnrctl start
    sqlplus / as sysdba <<EOF
    startup;
    exit
    EOF
    
  5. 如果 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
    
  6. 验证统一审核是否已启用。使用 SQLplus 连接到 Oracle 数据库:

    SELECT VALUE FROM V$OPTION WHERE PARAMETER = 'Unified Auditing';
    

验证该命令是否返回一行,且 VALUE 等于 TRUE

配置统一审核 syslog 输出

设置 UNIFIED_AUDIT_SYSTEMLOG 初始化参数,以将统一审核记录写入 syslog。此参数是在 Oracle 19c 中引入的,取代了已弃用的 AUDIT_SYSLOG_LEVEL 参数(仅适用于传统审核)。

  1. 以 SYSDBA 身份使用 SQLplus 连接到 Oracle 数据库。
  2. 设置 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;
    
  3. 可选:如需将来自 CDB 根容器的常见统一审核政策记录写入 UNIX/Linux 系统上的 syslog,请设置 UNIFIED_AUDIT_COMMON_SYSTEMLOG 参数:

    ALTER SYSTEM SET UNIFIED_AUDIT_COMMON_SYSTEMLOG = TRUE SCOPE=SPFILE;
    
  4. 重启 Oracle 数据库实例,使参数更改生效:

    SHUTDOWN IMMEDIATE;
    STARTUP;
    

在 Oracle 主机上配置 syslog 守护程序

在 Oracle 数据库主机上,配置 syslog 守护程序以将审核日志条目转发到 Bindplane 代理。

  1. root 身份登录到 Oracle 数据库主机。
  2. 打开 syslog 配置文件:

    • 在具有 rsyslog 的 RHEL/CentOS/Oracle Linux 上:
    sudo vi /etc/rsyslog.conf
    
    • 在具有 syslog 的旧版系统上:
    sudo vi /etc/syslog.conf
    
  3. 添加一条转发规则,以匹配您在 UNIFIED_AUDIT_SYSTEMLOG 中配置的设备和优先级。例如,如果您设置了 LOCAL7.INFO

    • 通过 UDP 转发(与 Bindplane udplog 接收器匹配):
    local7.info @<BINDPLANE_HOST_IP>:514
    
    • 通过 TCP 进行转发(如果 Bindplane 使用 tcplog 接收器):
    local7.info @@<BINDPLANE_HOST_IP>:514
    

<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`.
  1. 可选:如需同时保留审核日志的本地副本,请添加以下行:

    local7.info /var/log/oracle_audit.log
    
  2. 保存文件并重启 syslog 守护程序:

    • 在具有 rsyslog 的 RHEL/CentOS/Oracle Linux 上:
    sudo systemctl restart rsyslog
    
    • 在具有 syslog 的旧版系统上:
    sudo service syslog restart
    

验证审核日志转发

  1. 在 Oracle 数据库中执行可审核的操作,以生成测试审核事件。例如,以用户身份连接并运行以下命令:

    SELECT * FROM DBA_USERS WHERE ROWNUM = 1;
    
  2. 检查 Bindplane 代理日志中是否有传入的 syslog 消息:

    sudo journalctl -u observiq-otel-collector -f
    
  3. 验证 syslog 消息是否包含 Oracle Unified Audit 标记以及 TYPEDBIDSESIDDBUSERACTIONRETCODE 等键值对。

UDM 映射表

日志字段 UDM 映射 逻辑
ACTION security_result.action_details 原始日志中的 ACTION 值直接映射到此 UDM 字段。应用其他逻辑来根据 ACTION 的值确定 security_result.actionsecurity_result.description(例如,100 映射到 ALLOWSuccess)。
ACTION_NAME metadata.product_event_type 直接映射。
ACTION_NUMBER additional.fields[action_number].value.string_value 直接映射到键 Source Event。还可与其他字段结合使用,以派生出 metadata.event_typemetadata.product_event_type
APPLICATION_CONTEXTS additional.fields[application_contexts_label].value.string_value 直接映射,键为 APPLICATION_CONTEXTS
AUDIT_POLICY additional.fields[audit_policy_label].value.string_valueadditional.fields[AUDIT_POLICY_#].value.string_value 如果 AUDIT_POLICY 包含英文逗号,则会拆分为多个标签,键分别为 AUDIT_POLICY_0AUDIT_POLICY_1 等。否则,它会直接映射到键 AUDIT_POLICY
AUDIT_TYPE additional.fields[audit_type_label].value.string_value 直接映射,键为 AUDIT_TYPE
AUTHENTICATION_TYPE metadata.event_typeextensions.auth.type 用于在 auth_type(从 AUTHENTICATION_TYPE 中提取)不为空且满足其他条件时,将 metadata.event_type 派生为 USER_LOGINextensions.auth.type 设置为 AUTHTYPE_UNSPECIFIED
CLIENT_ADDRESS principal.ipprincipal.portnetwork.ip_protocolintermediary[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_typetarget.resource.resource_subtypetarget.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.actionsecurity_result.description
RETURNCODE security_result.summary 直接映射。应用逻辑来推导 security_result.actionsecurity_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.actionsecurity_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.hostnameprincipal.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 根据 ACTIONACTION_NUMBERsource_eventOSUSERIDUSERIDSQLTEXTAUTHENTICATION_TYPEDBUSERNAMEdevice_host_namedatabase_name 的值确定。如果未满足任何特定条件,则默认为 USER_RESOURCE_ACCESS
(解析器逻辑) metadata.product_event_type 根据 ACTIONACTION_NUMBERsource_eventp_event_typeACTION_NAME 的值确定。
(解析器逻辑) metadata.log_type 硬编码为 ORACLE_DB
(解析器逻辑) extensions.auth.mechanism 在某些条件下,根据 ACTIONACTION_NUMBERsource_eventOSUSERID 设置为 USERNAME_PASSWORD
(解析器逻辑) extensions.auth.type 在某些条件下,根据 ACTIONACTION_NUMBERAUTHENTICATION_TYPE 设置为 AUTHTYPE_UNSPECIFIED
(解析器逻辑) security_result.description 派生自 RETURNCODESTATUS
(解析器逻辑) security_result.action 派生自 RETURNCODESTATUS
(解析器逻辑) target.resource.attribute.labels 系统会根据各种日志字段的存在情况和值添加多个标签。
(解析器逻辑) additional.fields 系统会根据各种日志字段的存在情况和值,以键值对的形式添加多个字段。
(解析器逻辑) intermediary 根据 DBPROXY_USERRNAMECLIENT_ADDRESS 的存在情况和值创建并填充。
(解析器逻辑) network.ip_protocol 从使用包含文件 parse_ip_protocol.includeCLIENT_ADDRESS 中提取的协议派生而来。

需要更多帮助?获得社区成员和 Google SecOps 专业人士的解答。