IBM DB2 ログを収集する

以下でサポートされています。

このドキュメントでは、Bindplane エージェントを使用して IBM DB2 ログを Google Security Operations に取り込む方法について説明します。

IBM Db2 は、データへの不明または予期しないアクセスを検出するのに役立つ監査機能を提供するリレーショナル データベース管理システムです。Db2 監査機能は、一連の事前定義されたデータベース イベントの監査証跡を生成して保守できるようにします。

始める前に

次の前提条件を満たしていることを確認してください。

  • Google SecOps インスタンス
  • Windows Server 2016 以降、または systemd を使用する Linux ホスト
  • Bindplane エージェントと IBM DB2 インスタンス間のネットワーク接続
  • プロキシの背後で実行している場合は、Bindplane エージェントの要件に従ってファイアウォール ポートが開いていることを確認します。
  • SYSADM 権限を持つ IBM DB2 インスタンス(バージョン 11.1 以降)
  • 監査ログの保存とアーカイブに十分なディスク容量

Google SecOps の取り込み認証ファイルを取得する

  1. Google SecOps コンソールにログインします。
  2. [SIEM 設定] > [収集エージェント] に移動します。
  3. [ダウンロード] をクリックして、取り込み認証ファイルをダウンロードします。
  4. 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 エージェントのインストール ガイドをご覧ください。

Syslog を取り込んで Google SecOps に送信するように Bindplane エージェントを構成する

構成ファイルを見つける

  • Linux:

    sudo nano /opt/observiq-otel-collector/config.yaml
    
  • Windows:

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

構成ファイルを編集します。

  1. config.yaml の内容全体を次の構成に置き換えます。

    receivers:
      tcplog:
        listen_address: "0.0.0.0:1514"
    
    exporters:
      chronicle/db2_audit:
        compression: gzip
        creds_file_path: '/opt/observiq-otel-collector/ingestion-auth.json'
        customer_id: 'YOUR_CUSTOMER_ID'
        endpoint: malachiteingestion-pa.googleapis.com
        log_type: DB2_DB
        raw_log_field: body
        ingestion_labels:
          env: production
    
    service:
      pipelines:
        logs/db2_to_chronicle:
          receivers:
            - tcplog
          exporters:
            - chronicle/db2_audit
    
  2. 各プレースホルダを次のように置き換えます。

    • レシーバーの構成:

      • listen_address: 0.0.0.0:1514 に設定すると、ポート 1514 のすべてのインターフェースでリッスンします(Linux では非特権ポートが推奨されます)。
    • エクスポータの構成:

      • creds_file_path: 取り込み認証ファイルのフルパス:

        • Linux: /opt/observiq-otel-collector/ingestion-auth.json
        • Windows: C:\\Program Files\\observIQ OpenTelemetry Collector\\ingestion-auth.json
      • customer_id: 前の手順の顧客 ID

      • endpoint: リージョン エンドポイント URL:

        • 米国: malachiteingestion-pa.googleapis.com
        • ヨーロッパ: europe-malachiteingestion-pa.googleapis.com
        • アジア: asia-southeast1-malachiteingestion-pa.googleapis.com
        • 完全なリストについては、リージョン エンドポイントをご覧ください。
      • log_type: DB2_DB に設定します。

      • ingestion_labels: YAML 形式の省略可能なラベル(例: env: production

構成ファイルを保存する

  • 編集が完了したら、ファイルを保存します。

    • Linux: Ctrl+OEnterCtrl+X の順に押します。
    • Windows: [ファイル>保存] をクリックします。

Bindplane エージェントを再起動して変更を適用する

  • Linux

    sudo systemctl restart observiq-otel-collector
    
    1. サービスが実行されていることを確認します。

      sudo systemctl status observiq-otel-collector
      
    2. ログでエラーを確認します。

      sudo journalctl -u observiq-otel-collector -f
      
  • Windows

    次のいずれかを選択してください。

    • 管理者としてコマンド プロンプトまたは PowerShell を使用します。

      net stop observiq-otel-collector && net start observiq-otel-collector
      
    • Services コンソールを使用する場合:

      1. Win+R キーを押して「services.msc」と入力し、Enter キーを押します。
      2. observIQ OpenTelemetry Collector を見つけます。
      3. 右クリックして [再起動] を選択します。
      4. サービスが実行されていることを確認します。

        sc query observiq-otel-collector
        
      5. ログでエラーを確認します。

        type "C:\Program Files\observIQ OpenTelemetry Collector\log\collector.log"
        

IBM DB2 監査機能を構成する

セキュリティ イベントをキャプチャして syslog に抽出するように DB2 監査機能を構成します。

現在の監査構成を確認する

  • SYSADM 権限を持つユーザーとして DB2 インスタンスに接続し、次のコマンドを実行します。

    db2audit describe
    

    監査ステータス、カテゴリ、パスなど、現在の監査構成が表示されます。

監査パスを構成する

  1. 監査ログが保存されるディレクトリを設定します。

    db2audit configure datapath /db2audit/data
    db2audit configure archivepath /db2audit/archive
    
  2. これらのディレクトリが存在し、DB2 インスタンスのオーナーに適切な権限があることを確認します。

    mkdir -p /db2audit/data /db2audit/archive
    chown db2inst1:db2iadm1 /db2audit/data /db2audit/archive
    chmod 750 /db2audit/data /db2audit/archive
    

監査のスコープとカテゴリを構成する

  • すべてのセキュリティ イベントをキャプチャするように監査機能を構成します。

    db2audit configure scope all status both errortype normal
    

    これにより、次の構成が行われます。

    • scope all: すべてのカテゴリ(audit、checking、objmaint、secmaint、sysadmin、validate、context)を監査します。
    • status both: 成功したイベントと失敗したイベントの両方をキャプチャします
    • errortype normal: 標準エラー処理

監査機能を起動する

  1. 監査を開始:

    db2audit start
    
  2. 監査が有効になっていることを確認します。

    db2audit describe
    

    出力には Audit active: "TRUE" が表示されます。

DB2 監査ログを受信するように syslog を構成する

DB2 監査メッセージを受信して保存するようにシステム syslog デーモンを構成します。

Linux(rsyslog)

  1. rsyslog 構成ファイルを編集します。

    sudo nano /etc/rsyslog.conf
    
  2. 次の行を追加して、DB2 監査メッセージを専用ファイルに転送します。

    user.info /var/log/db2/db2audit.log
    
  3. ログ ディレクトリとファイルを作成します。

    sudo mkdir -p /var/log/db2
    sudo touch /var/log/db2/db2audit.log
    sudo chmod 640 /var/log/db2/db2audit.log
    
  4. rsyslog を再起動します。

    sudo systemctl restart rsyslog
    

AIX(syslogd)

  1. syslog 構成ファイルを編集します。

    sudo vi /etc/syslog.conf
    
  2. 次の行を追加します。

    user.info /var/log/db2/db2audit.log
    
  3. ログ ディレクトリとファイルを作成します。

    sudo mkdir -p /var/log/db2
    sudo touch /var/log/db2/db2audit.log
    sudo chmod 640 /var/log/db2/db2audit.log
    
  4. syslogd を再起動します。

    sudo refresh -s syslogd
    

DB2 監査ログを syslog に抽出する

アーカイブされた監査ログを抽出し、システムの syslog デーモンに送信します。

監査ログをフラッシュしてアーカイブする

  • 抽出の前に、保留中の監査レコードをすべてフラッシュし、現在の監査ログをアーカイブします。

    db2audit flush
    db2audit archive
    

    アーカイブ コマンドは、アーカイブ パス(db2audit.instance.log.0.20250110123456 など)にタイムスタンプ付きのファイルを作成します。

監査ログを syslog に抽出する

  • アーカイブされた監査ログを抽出し、user.info ファシリティと優先度を使用して syslog に送信します。

    db2audit extract syslog user.info from files /db2audit/archive/db2audit.instance.log.0.*
    

    このコマンドは以下を行います。

    • アーカイブされたログファイルから監査レコードを抽出します
    • ファシリティ user と優先度 info でシステム syslog デーモンに送信します。
    • syslog デーモンは、/etc/syslog.conf または /etc/rsyslog.conf に従ってメッセージを転送します。

ログが送信されていることを確認する

  • 監査メッセージが syslog ファイルに書き込まれていることを確認します。

    tail -f /var/log/db2/db2audit.log
    

    ログファイルに DB2 監査レコードが表示されます。

ログを Bindplane エージェントに転送するように rsyslog を構成する

DB2 監査ログを Bindplane エージェントに転送するように rsyslog を構成します。

  1. 新しい rsyslog 構成ファイルを作成します。

    sudo nano /etc/rsyslog.d/50-db2-forward.conf
    
  2. ログを Bindplane エージェントに転送する構成を追加します。

    # Forward DB2 audit logs to Bindplane agent
    user.info @@127.0.0.1:1514
    

    @@ 接頭辞は TCP 転送を示します。必要に応じて、UDP に @ を使用します。

  3. rsyslog を再起動します。

    sudo systemctl restart rsyslog
    

監査ログの抽出を自動化する

フラッシュ、アーカイブ、抽出のプロセスを自動化するスクリプトを作成します。

抽出スクリプトを作成する

  1. 監査ログの抽出を自動化するスクリプトを作成します。

    sudo nano /usr/local/bin/db2audit-extract.sh
    
  2. 次の内容を追加します。

    #!/bin/bash
    # DB2 Audit Log Extraction Script
    
    # Set DB2 environment
    export DB2INSTANCE=db2inst1
    . /home/db2inst1/sqllib/db2profile
    
    # Flush pending audit records
    db2audit flush
    
    # Archive current audit log
    db2audit archive
    
    # Extract archived logs to syslog
    db2audit extract syslog user.info from files /db2audit/archive/db2audit.instance.log.0.*
    
    # Optional: Clean up old archived logs (older than 30 days)
    find /db2audit/archive -name "db2audit.instance.log.0.*" -mtime +30 -delete
    
    exit 0
    
  3. スクリプトを実行可能にします。

    sudo chmod +x /usr/local/bin/db2audit-extract.sh
    

cron を使用してスケジュールを設定する

  1. cron を使用してスクリプトを定期的に実行するようにスケジュールします。

    sudo crontab -e
    
  2. 次の行を追加して、スクリプトを 1 時間ごとに実行します。

    次のいずれかを選択してください。

    0 * * * * /usr/local/bin/db2audit-extract.sh >> /var/log/db2/db2audit-extract.log 2>&1
    

    抽出頻度を上げるには、15 分ごとに実行します。

    */15 * * * * /usr/local/bin/db2audit-extract.sh >> /var/log/db2/db2audit-extract.log 2>&1
    

Google SecOps でログの取り込みを確認する

  1. Google SecOps コンソールにログインします。
  2. [検索] に移動します。
  3. 検索クエリを実行して、DB2 ログが取り込まれていることを確認します。

    metadata.log_type = "DB2_DB"
    
  4. ログが正しいタイムスタンプとフィールドで表示されることを確認します。

UDM マッピング テーブル

ログフィールド UDM マッピング 論理
msg event.idm.read_only_udm.additional.fields msg != "" の場合、msg から取得された値
システム event.idm.read_only_udm.additional.fields System != "" の場合、System から値を取得
サブシステム event.idm.read_only_udm.additional.fields Subsystem != "" の場合、Subsystem から取得された値
auth_mechanism event.idm.read_only_udm.extensions.auth.mechanism USER_LOGIN イベントの場合は「USERNAME_PASSWORD」に設定します
CorrelationUser event.idm.read_only_udm.intermediary.user.userid CorrelationUser != "" の場合、CorrelationUser から取得された値
sum event.idm.read_only_udm.metadata.description 合計から取得された値
date_time event.idm.read_only_udm.metadata.event_timestamp 日付と時刻のフィールドの両方が「」でない場合、ISO8601 形式に変換されます
leef_event_id event.idm.read_only_udm.metadata.product_event_type leef_event_id から取得した値
event.idm.read_only_udm.metadata.event_type leef_event_id から派生します。["102-87", "102-83"] の場合 → USER_LOGIN、["102-6", "102-7", "102-8", "102-10", "102-24", "102-143"] の場合 → インテントに基づいて USER_RESOURCE_ACCESS または USER_RESOURCE_UPDATE_CONTENT、「102-319」の場合 → USER_RESOURCE_ACCESS、それ以外の場合 → GENERIC_EVENT
event.idm.read_only_udm.metadata.product_name 「DB2」に設定
event.idm.read_only_udm.metadata.vendor_name 「IBM」に設定
SSID event.idm.read_only_udm.network.session_id SSID != "" の場合、SSID から取得された値
ジョブ event.idm.read_only_udm.principal.application job != "" の場合、ジョブから取得された値
sourceServiceName event.idm.read_only_udm.principal.application sourceServiceName から取得された値
sourceHostName event.idm.read_only_udm.principal.asset.hostname sourceHostName != "" の場合、sourceHostName から取得された値
principal_ip event.idm.read_only_udm.principal.asset.ip 102 ~ 319 イベントの principal_ip から取得された値
product_id event.idm.read_only_udm.principal.asset_id 102 ~ 319 のイベントの場合は「Product ID: %{product_id}」に設定
sourceHostName event.idm.read_only_udm.principal.hostname sourceHostName != "" の場合、sourceHostName から取得された値
principal_ip event.idm.read_only_udm.principal.ip 102 ~ 319 イベントの principal_ip から取得された値
作成者 event.idm.read_only_udm.principal.user.user_display_name クリエイターから取得した値
name event.idm.read_only_udm.principal.user.user_display_name name != "" の場合、name から取得された値
AuthenticatedUser event.idm.read_only_udm.principal.user.userid AuthenticatedUser != "" の場合、AuthenticatedUser から取得された値
sourceUserName event.idm.read_only_udm.principal.user.userid sourceUserName から取得された値
usrName event.idm.read_only_udm.principal.user.userid usrName から取得した値
_action event.idm.read_only_udm.security_result.action 合計から派生: 「successful」が含まれている場合は ALLOW、それ以外の場合は USER_LOGIN イベントに対して BLOCK
deviceHostName event.idm.read_only_udm.target.asset.hostname deviceHostName から取得した値
conn_location3 event.idm.read_only_udm.target.asset.hostname conn_location3 != "" の場合、conn_location3 から取得された値
file_name event.idm.read_only_udm.target.file.full_path file_name != "" の場合、file_name から値を取得
deviceHostName event.idm.read_only_udm.target.hostname deviceHostName から取得した値
conn_location3 event.idm.read_only_udm.target.hostname conn_location3 != "" の場合、conn_location3 から取得された値
conn_location、conn_location2 event.idm.read_only_udm.target.location.name conn_location と conn_location2 の両方が「」でない場合は、連結されます。
deviceProcessName event.idm.read_only_udm.target.process.command_line deviceProcessName から取得した値
SQL event.idm.read_only_udm.target.process.command_line SQL != "" の場合、SQL から取得された値
Connection_Type event.idm.read_only_udm.target.resource.attribute.labels Connection_Type の値を持つキー「Connection Type」
計画 event.idm.read_only_udm.target.resource.attribute.labels 値が Plan のキー「Plan」
DB2_Subsystem event.idm.read_only_udm.target.resource.attribute.labels DB2_Subsystem の値を持つキー「DB2 Subsystem」
Priv_Check_Code event.idm.read_only_udm.target.resource.attribute.labels Priv_Check_Code の値を持つキー「Priv Check Code」
Table_Name event.idm.read_only_udm.target.resource.attribute.labels キー「Table Name」と Table_Name の値
MessageType event.idm.read_only_udm.target.resource.attribute.labels MessageType の値を持つキー「Message Type」
Check_type event.idm.read_only_udm.target.resource.attribute.labels Check_type の値を持つキー「Check Type」
deviceAction event.idm.read_only_udm.target.resource.attribute.labels キー「Device Action」、値は deviceAction からマッピング: G → GRANT、R → REVOKE
SSID event.idm.read_only_udm.target.resource.attribute.labels 値が「」でない場合、SSID の値を持つキー「SSID」
SQL event.idm.read_only_udm.target.resource.attribute.labels SQL != "" の場合、SQL からの値を持つキー「SQL Query」
messageid event.idm.read_only_udm.target.resource.id messageid から取得された値
Object_Class_Code event.idm.read_only_udm.target.resource.parent Object_Class_Code から取得した値
obj event.idm.read_only_udm.target.resource.name obj から取得された値
resource_name event.idm.read_only_udm.target.resource.name SQL != "" かつ空でない場合、SQL から抽出された resource_name から取得された値
Database_Name event.idm.read_only_udm.target.resource.name Database_Name から取得された値
objtyp event.idm.read_only_udm.target.resource.resource_subtype objtyp != "" の場合、objtyp から取得した値(大文字)
タイプ event.idm.read_only_udm.target.resource.resource_subtype 派生元タイプ: T → テーブル、V → ビュー、X → 補助テーブル
event.idm.read_only_udm.target.resource.resource_type 「DATABASE」に設定

ご不明な点がございましたら、コミュニティ メンバーや Google SecOps のプロフェッショナルから回答を得ることができます。