Mengumpulkan log Oracle DB

Didukung di:

Panduan ini menjelaskan cara menyerap log Oracle DB ke Google Security Operations menggunakan agen Bindplane.

Parser mengekstrak kolom dari pesan SYSLOG, menangani beberapa format menggunakan pola grok dan penguraian key-value. Kemudian, alat ini memetakan kolom yang diekstrak ke Model Data Terpadu (UDM), memperkaya data dengan metadata statis seperti nama vendor dan produk, serta menetapkan jenis peristiwa secara dinamis berdasarkan nilai kolom tertentu seperti ACTION dan USERID.

Sebelum memulai

  • Pastikan Anda memiliki prasyarat berikut:

  • Instance Google SecOps

  • Windows Server 2016 atau yang lebih baru, atau host Linux dengan systemd

  • Konektivitas jaringan antara agen Bindplane dan host Oracle Database

  • Jika beroperasi dari balik proxy, pastikan port firewall terbuka sesuai dengan persyaratan agen Bindplane

  • Akses istimewa ke instance Oracle Database (peran SYSDBA atau AUDIT_ADMIN)

  • Oracle Database 19c atau yang lebih baru dengan pengauditan terpadu diaktifkan (atau pengauditan mode campuran di Oracle 12c–18c)

Mendapatkan file autentikasi penyerapan Google SecOps

  1. Login ke konsol Google SecOps.
  2. Buka Setelan SIEM > Agen Pengumpulan.
  3. Download File Autentikasi Penyerapan. Simpan file dengan aman di sistem tempat BindPlane akan diinstal.

Mendapatkan ID pelanggan Google SecOps

  1. Login ke konsol Google SecOps.
  2. Buka Setelan SIEM > Profil.
  3. Salin dan simpan ID Pelanggan dari bagian Detail Organisasi.

Menginstal agen Bindplane

Instal agen Bindplane di sistem operasi Windows atau Linux Anda sesuai dengan petunjuk berikut.

Penginstalan Windows

  1. Buka Command Prompt atau PowerShell sebagai administrator.
  2. Jalankan perintah berikut:

    msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
    
  3. Tunggu hingga penginstalan selesai.

  4. Verifikasi penginstalan dengan menjalankan:

    sc query observiq-otel-collector
    

Layanan akan ditampilkan sebagai RUNNING.

Penginstalan Linux

  1. Buka terminal dengan hak istimewa root atau sudo.
  2. Jalankan perintah berikut:

    sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh
    
  3. Tunggu hingga penginstalan selesai.

  4. Verifikasi penginstalan dengan menjalankan:

    sudo systemctl status observiq-otel-collector
    

Layanan akan ditampilkan sebagai aktif (berjalan).

Referensi penginstalan tambahan

Untuk opsi penginstalan dan pemecahan masalah tambahan, lihat Panduan penginstalan agen BindPlane.

Mengonfigurasi agen BindPlane untuk menyerap syslog dan mengirimkannya ke Google SecOps

Cari file konfigurasi

Linux:

```bash
sudo nano /etc/bindplane-agent/config.yaml
```

Windows:

```cmd
notepad "C:\Program Files\observIQ OpenTelemetry Collector\config.yaml"
```

Edit file konfigurasi

Ganti seluruh konten config.yaml dengan konfigurasi berikut:

```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
```

Parameter konfigurasi

  • Ganti placeholder berikut:

Konfigurasi penerima: * listen_address: Alamat IP dan port yang akan diproses: - Ganti 0.0.0.0 dengan alamat IP tertentu untuk memproses satu antarmuka, atau biarkan sebagai 0.0.0.0 untuk memproses semua antarmuka (direkomendasikan) - Ganti 514 dengan nomor port yang cocok dengan konfigurasi penerusan syslog Oracle

Konfigurasi pengekspor: * creds_file_path: Jalur lengkap ke file autentikasi penyerapan: - Linux: /etc/bindplane-agent/ingestion-auth.json - Windows: C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json * customer_id: ID Pelanggan yang disalin di bagian Dapatkan ID pelanggan Google SecOps * endpoint: URL endpoint regional: - Amerika Serikat: malachiteingestion-pa.googleapis.com - Eropa: europe-malachiteingestion-pa.googleapis.com - Asia: asia-southeast1-malachiteingestion-pa.googleapis.com - Lihat Endpoint Regional untuk daftar lengkap

Simpan file konfigurasi

  • Setelah mengedit, simpan file:
    • Linux: Tekan Ctrl+O, lalu Enter, lalu Ctrl+X
    • Windows: Klik File > Save

Mulai ulang agen Bindplane untuk menerapkan perubahan

  • Untuk memulai ulang agen Bindplane di Linux, jalankan perintah berikut:

    sudo systemctl restart observiq-otel-collector
    
    1. Pastikan layanan sedang berjalan:
    sudo systemctl status observiq-otel-collector
    
    1. Periksa log untuk mengetahui error:
    sudo journalctl -u observiq-otel-collector -f
    
  • Untuk memulai ulang agen Bindplane di Windows, pilih salah satu opsi berikut:

    • Command Prompt atau PowerShell sebagai administrator:
    net stop observiq-otel-collector && net start observiq-otel-collector
    
    • Konsol layanan:
      1. Tekan Win+R, ketik services.msc, lalu tekan Enter.
      2. Temukan observIQ OpenTelemetry Collector.
      3. Klik kanan, lalu pilih Mulai Ulang.
    1. Pastikan layanan sedang berjalan:
    sc query observiq-otel-collector
    
    1. Periksa log untuk mengetahui error:
    type "C:\Program Files\observIQ OpenTelemetry Collector\log\collector.log"
    

Mengonfigurasi pengauditan terpadu Oracle Database dan penerusan syslog

Mengaktifkan audit terpadu

Jika audit terpadu belum diaktifkan, tautkan kembali biner Oracle dengan opsi uniaud_on. Hal ini mengharuskan penonaktifan semua proses Oracle yang berjalan dari Oracle Home (instance database dan listener).

  1. Hubungkan ke host Oracle Database sebagai pengguna sistem operasi oracle.
  2. Nonaktifkan instance dan pendengar Oracle:

    sqlplus / as sysdba <<EOF
    shutdown immediate;
    exit
    EOF
    lsnrctl stop
    
  3. Tautkan kembali biner Oracle dengan audit terpadu yang diaktifkan:

    cd $ORACLE_HOME/rdbms/lib
    make -f ins_rdbms.mk uniaud_on ioracle
    
  4. Mulai pendengar dan instance Oracle:

    lsnrctl start
    sqlplus / as sysdba <<EOF
    startup;
    exit
    EOF
    
  5. Jika Oracle Enterprise Manager Cloud Control berjalan di host yang sama, mulai ulang:

    cd /u01/app/oracle/product/middleware/oms
    export OMS_HOME=/u01/app/oracle/product/middleware/oms
    $OMS_HOME/bin/emctl start oms
    
  6. Pastikan audit terpadu diaktifkan. Hubungkan ke Oracle Database dengan SQLplus:

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

Verifikasi bahwa perintah menampilkan satu baris dengan VALUE sama dengan TRUE.

Mengonfigurasi output syslog audit terpadu

Tetapkan parameter inisialisasi UNIFIED_AUDIT_SYSTEMLOG untuk menulis data audit terpadu ke syslog. Parameter ini diperkenalkan di Oracle 19c dan menggantikan parameter AUDIT_SYSLOG_LEVEL yang tidak digunakan lagi (yang hanya berlaku untuk audit tradisional).

  1. Hubungkan ke Oracle Database dengan SQLplus sebagai SYSDBA.
  2. Tetapkan parameter UNIFIED_AUDIT_SYSTEMLOG:

    • Pada sistem UNIX/Linux, setel parameter ke nilai facility.priority:
    ALTER SYSTEM SET UNIFIED_AUDIT_SYSTEMLOG = 'LOCAL7.INFO' SCOPE=SPFILE;
    
    • Pada sistem Windows, tetapkan parameter ke TRUE untuk menulis ke Windows Event Viewer:
    ALTER SYSTEM SET UNIFIED_AUDIT_SYSTEMLOG = TRUE SCOPE=SPFILE;
    
  3. Opsional: Untuk menulis rekaman kebijakan audit terpadu umum dari container root CDB ke syslog di sistem UNIX/Linux, tetapkan parameter UNIFIED_AUDIT_COMMON_SYSTEMLOG:

    ALTER SYSTEM SET UNIFIED_AUDIT_COMMON_SYSTEMLOG = TRUE SCOPE=SPFILE;
    
  4. Mulai ulang instance Oracle Database agar perubahan parameter diterapkan:

    SHUTDOWN IMMEDIATE;
    STARTUP;
    

Mengonfigurasi daemon syslog di host Oracle

Di host Oracle Database, konfigurasi daemon syslog untuk meneruskan entri log audit ke agen BindPlane.

  1. Login ke host Oracle Database sebagai root.
  2. Buka file konfigurasi syslog:

    • Di RHEL/CentOS/Oracle Linux dengan rsyslog:
    sudo vi /etc/rsyslog.conf
    
    • Pada sistem lama dengan syslog:
    sudo vi /etc/syslog.conf
    
  3. Tambahkan aturan penerusan yang cocok dengan fasilitas dan prioritas yang Anda konfigurasi di UNIFIED_AUDIT_SYSTEMLOG. Misalnya, jika Anda menetapkan LOCAL7.INFO:

    • Untuk meneruskan melalui UDP (mencocokkan penerima udplog Bindplane):
    local7.info @<BINDPLANE_HOST_IP>:514
    
    • Untuk meneruskan melalui TCP (jika Bindplane menggunakan penerima tcplog):
    local7.info @@<BINDPLANE_HOST_IP>:514
    

Ganti <BINDPLANE_HOST_IP> dengan alamat IP atau nama host sistem yang menjalankan agen Bindplane.

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. Opsional: Untuk juga menyimpan salinan lokal log audit, tambahkan baris berikut:

    local7.info /var/log/oracle_audit.log
    
  2. Simpan file dan mulai ulang daemon syslog:

    • Di RHEL/CentOS/Oracle Linux dengan rsyslog:
    sudo systemctl restart rsyslog
    
    • Pada sistem lama dengan syslog:
    sudo service syslog restart
    

Memverifikasi penerusan log audit

  1. Buat peristiwa audit pengujian dengan melakukan tindakan yang dapat diaudit di Oracle Database. Misalnya, hubungkan sebagai pengguna dan jalankan:

    SELECT * FROM DBA_USERS WHERE ROWNUM = 1;
    
  2. Periksa log agen Bindplane untuk pesan syslog masuk:

    sudo journalctl -u observiq-otel-collector -f
    
  3. Pastikan pesan syslog berisi tag Oracle Unified Audit dengan pasangan nilai kunci seperti TYPE, DBID, SESID, DBUSER, ACTION, dan RETCODE.

Tabel pemetaan UDM

Kolom Log Pemetaan UDM Logika
ACTION security_result.action_details Nilai ACTION dari log mentah dipetakan langsung ke kolom UDM ini. Logika tambahan diterapkan untuk menentukan security_result.action dan security_result.description berdasarkan nilai ACTION (misalnya, 100 dipetakan ke ALLOW dan Success).
ACTION_NAME metadata.product_event_type Dipetakan secara langsung.
ACTION_NUMBER additional.fields[action_number].value.string_value Dipetakan langsung dengan tombol Source Event. Juga digunakan bersama dengan kolom lain untuk mendapatkan metadata.event_type dan metadata.product_event_type.
APPLICATION_CONTEXTS additional.fields[application_contexts_label].value.string_value Dipetakan langsung dengan tombol APPLICATION_CONTEXTS.
AUDIT_POLICY additional.fields[audit_policy_label].value.string_value atau additional.fields[AUDIT_POLICY_#].value.string_value Jika AUDIT_POLICY berisi koma, AUDIT_POLICY akan dibagi menjadi beberapa label dengan kunci seperti AUDIT_POLICY_0, AUDIT_POLICY_1, dll. Jika tidak, AUDIT_POLICY akan dipetakan langsung dengan kunci AUDIT_POLICY.
AUDIT_TYPE additional.fields[audit_type_label].value.string_value Dipetakan langsung dengan tombol AUDIT_TYPE.
AUTHENTICATION_TYPE metadata.event_type, extensions.auth.type Digunakan untuk mendapatkan metadata.event_type sebagai USER_LOGIN jika auth_type (diekstrak dari AUTHENTICATION_TYPE) tidak kosong dan kondisi lainnya terpenuhi. extensions.auth.type disetel ke AUTHTYPE_UNSPECIFIED.
CLIENT_ADDRESS principal.ip, principal.port, network.ip_protocol, intermediary[host].user.userid IP, port, dan protokol diekstrak menggunakan pola grok. Jika ada nama pengguna di kolom CLIENT_ADDRESS, nama pengguna tersebut dipetakan ke intermediary[host].user.userid.
CLIENT_ID target.user.userid Dipetakan secara langsung.
CLIENT_PROGRAM_NAME additional.fields[client_program_name_label].value.string_value Dipetakan langsung dengan tombol CLIENT_PROGRAM_NAME.
CLIENT_TERMINAL additional.fields[CLIENT_TERMINAL_label].value Dipetakan langsung dengan tombol CLIENT_TERMINAL.
CLIENT_USER target.user.user_display_name Dipetakan secara langsung.
COMMENT$TEXT additional.fields[comment_text_label].value.string_value Dipetakan langsung dengan kunci comment_text setelah mengganti + dengan :.
CURRENT_USER additional.fields[current_user_label].value.string_value Dipetakan langsung dengan tombol current_user.
CURUSER additional.fields[current_user_label].value.string_value Dipetakan langsung dengan tombol current_user.
DATABASE_USER principal.user.user_display_name Dipetakan secara langsung jika tidak kosong atau /.
DBID metadata.product_log_id Dipetakan secara langsung setelah menghapus tanda petik tunggal.
DBNAME target.resource.resource_type, target.resource.resource_subtype, target.resource.name Menetapkan resource_type ke DATABASE, resource_subtype ke Oracle Database, dan memetakan DBNAME ke name.
DBPROXY_USERRNAME intermediary[dbproxy].user.userid Dipetakan secara langsung.
DBUSERNAME target.user.user_display_name Dipetakan secara langsung.
ENTRYID target.resource.attribute.labels[entry_id_label].value Dipetakan langsung dengan tombol Entry Id.
EXTERNAL_USERID additional.fields[external_userid_label].value.string_value Dipetakan langsung dengan tombol EXTERNAL_USERID.
LENGTH additional.fields[length_label].value.string_value Dipetakan langsung dengan tombol length.
LOGOFF$DEAD target.resource.attribute.labels[LOGOFFDEAD_label].value Dipetakan langsung dengan tombol LOGOFFDEAD.
LOGOFF$LREAD target.resource.attribute.labels[LOGOFFLREAD_label].value Dipetakan langsung dengan tombol LOGOFFLREAD.
LOGOFF$LWRITE target.resource.attribute.labels[LOGOFFLWRITE_label].value Dipetakan langsung dengan tombol LOGOFFLWRITE.
LOGOFF$PREAD target.resource.attribute.labels[LOGOFFPREAD_label].value Dipetakan langsung dengan tombol LOGOFFPREAD.
NTIMESTAMP# metadata.event_timestamp Diuraikan dan dikonversi ke format RFC 3339 atau ISO8601.
OBJCREATOR target.resource.attribute.labels[obj_creator_label].value Dipetakan langsung dengan tombol OBJ Creator.
OBJNAME target.resource.attribute.labels[obj_name_label].value Dipetakan langsung dengan tombol OBJ Name.
OS_USERNAME principal.user.user_display_name Dipetakan secara langsung.
OSUSERID target.user.userid Dipetakan secara langsung.
PDB_GUID principal.resource.product_object_id Dipetakan secara langsung.
PRIV$USED additional.fields[privused_label].value.string_value Dipetakan langsung dengan tombol privused.
PRIVILEGE principal.user.attribute.permissions.name Dipetakan secara langsung.
RETURN_CODE security_result.summary Dipetakan secara langsung. Logika diterapkan untuk mendapatkan security_result.action dan security_result.description.
RETURNCODE security_result.summary Dipetakan secara langsung. Logika diterapkan untuk mendapatkan security_result.action dan security_result.description.
RLS_INFO additional.fields[rls_info_label].value.string_value Dipetakan langsung dengan tombol RLS_INFO.
SCHEMA additional.fields[schema_label].value.string_value Dipetakan langsung dengan tombol schema.
SESSIONCPU target.resource.attribute.labels[SESSIONCPU_label].value Dipetakan langsung dengan tombol SESSIONCPU.
SESSIONID network.session_id Dipetakan secara langsung.
SESID network.session_id Dipetakan secara langsung.
SQL_TEXT target.process.command_line Dipetakan secara langsung.
SQLTEXT target.process.command_line Dipetakan secara langsung.
STATEMENT target.resource.attribute.labels[statement_label].value Dipetakan langsung dengan tombol STATEMENT.
STATUS security_result.summary Dipetakan secara langsung. Logika diterapkan untuk mendapatkan security_result.action dan security_result.description.
SYSTEM_PRIVILEGE_USED additional.fields[system_privilege_used_label].value.string_value Dipetakan langsung dengan tombol SYSTEM_PRIVILEGE_USED.
TARGET_USER additional.fields[target_user_label].value.string_value Dipetakan langsung dengan tombol TARGET_USER.
TERMINAL additional.fields[CLIENT_TERMINAL_label].value Dipetakan langsung dengan tombol CLIENT_TERMINAL.
TYPE additional.fields[type_label].value.string_value Dipetakan langsung dengan tombol type.
USERHOST principal.hostname, principal.administrative_domain Nama host dan domain diekstrak menggunakan pola grok.
USERID principal.user.userid Dipetakan secara langsung.
device_host_name target.hostname Dipetakan secara langsung.
event_name metadata.product_event_type Dipetakan secara langsung setelah dikonversi menjadi huruf besar.
file_name target.file.full_path Dipetakan secara langsung.
hostname principal.hostname Dipetakan secara langsung.
length additional.fields[length_label].value.string_value Dipetakan langsung dengan tombol length.
log_source_name principal.application Dipetakan secara langsung.
message Bervariasi Digunakan untuk parsing grok guna mengekstrak beberapa kolom.
returncode RETURNCODE Dipetakan secara langsung.
src_ip principal.ip Dipetakan secara langsung.
t_hostname target.hostname Dipetakan secara langsung.
(Logika Parser) metadata.vendor_name Hardcode ke Oracle.
(Logika Parser) metadata.product_name Hardcode ke Oracle DB.
(Logika Parser) metadata.event_type Ditentukan berdasarkan nilai ACTION, ACTION_NUMBER, source_event, OSUSERID, USERID, SQLTEXT, AUTHENTICATION_TYPE, DBUSERNAME, device_host_name, database_name. Nilai defaultnya adalah USER_RESOURCE_ACCESS jika tidak ada kondisi tertentu yang terpenuhi.
(Logika Parser) metadata.product_event_type Ditentukan berdasarkan nilai ACTION, ACTION_NUMBER, source_event, p_event_type, ACTION_NAME.
(Logika Parser) metadata.log_type Hardcode ke ORACLE_DB.
(Logika Parser) extensions.auth.mechanism Ditetapkan ke USERNAME_PASSWORD dalam kondisi tertentu berdasarkan ACTION, ACTION_NUMBER, source_event, dan OSUSERID.
(Logika Parser) extensions.auth.type Disetel ke AUTHTYPE_UNSPECIFIED dalam kondisi tertentu berdasarkan ACTION, ACTION_NUMBER, dan AUTHENTICATION_TYPE.
(Logika Parser) security_result.description Berasal dari RETURNCODE atau STATUS.
(Logika Parser) security_result.action Berasal dari RETURNCODE atau STATUS.
(Logika Parser) target.resource.attribute.labels Beberapa label ditambahkan berdasarkan keberadaan dan nilai berbagai kolom log.
(Logika Parser) additional.fields Beberapa kolom ditambahkan sebagai pasangan nilai kunci berdasarkan keberadaan dan nilai berbagai kolom log.
(Logika Parser) intermediary Dibuat dan diisi berdasarkan keberadaan dan nilai DBPROXY_USERRNAME dan CLIENT_ADDRESS.
(Logika Parser) network.ip_protocol Diperoleh dari protokol yang diekstrak dari CLIENT_ADDRESS menggunakan file include parse_ip_protocol.include.

Perlu bantuan lain? Dapatkan jawaban dari anggota Komunitas dan profesional Google SecOps.