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
    

    서비스가 실행 중으로 표시되어야 합니다.

Linux 설치

  1. 루트 또는 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
    

    서비스가 active (running)으로 표시되어야 합니다.

추가 설치 리소스

추가 설치 옵션 및 문제 해결은 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: 포트 1514 (Linux에 권한이 없는 포트 권장)의 모든 인터페이스에서 수신하려면 0.0.0.0:1514로 설정합니다.
    • 내보내기 도구 구성:

      • 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+O, Enter, Ctrl+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
      
    • 서비스 콘솔 사용:

      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
    

크론으로 예약

  1. 크론을 사용하여 스크립트가 주기적으로 실행되도록 예약합니다.

    sudo crontab -e
    
  2. 매시간 스크립트를 실행하려면 다음 줄을 추가합니다.

    다음 옵션 중 하나를 선택합니다.

    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 시스템이 ''이 아닌 경우 시스템에서 가져온 값
하위 시스템 event.idm.read_only_udm.additional.fields 하위 시스템이 ''이 아닌 경우 하위 시스템에서 가져온 값
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에서 가져온 값
합계 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 작업이 ''이 아닌 경우 작업에서 가져온 값
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 이벤트의 경우 '제품 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 크리에이터가 가져온 값
이름 event.idm.read_only_udm.principal.user.user_display_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'이 포함된 경우 → 허용, 그렇지 않은 경우 USER_LOGIN 이벤트 차단
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의 값이 있는 '연결 유형' 키
계획 event.idm.read_only_udm.target.resource.attribute.labels 계획의 값이 있는 '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의 값이 있는 '메시지 유형' 키
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 deviceAction에서 매핑된 값이 있는 'Device Action' 키: 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 → TABLE, V → VIEW, X → AUXILIARY TABLE
event.idm.read_only_udm.target.resource.resource_type 'DATABASE'로 설정

도움이 더 필요한가요? 커뮤니티 회원 및 Google SecOps 전문가에게 문의하여 답변을 받으세요.