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 수집 인증 파일 가져오기
- Google SecOps 콘솔에 로그인합니다.
- SIEM 설정 > 수집 에이전트로 이동합니다.
- 다운로드를 클릭하여 수집 인증 파일을 다운로드합니다.
Bindplane 에이전트가 설치될 시스템에 파일을 안전하게 저장합니다.
Google SecOps 고객 ID 가져오기
- Google SecOps 콘솔에 로그인합니다.
- SIEM 설정 > 프로필로 이동합니다.
조직 세부정보 섹션에서 고객 ID를 복사하여 저장합니다.
Bindplane 에이전트 설치
다음 안내에 따라 Windows 또는 Linux 운영체제에 Bindplane 에이전트를 설치합니다.
Windows 설치
- 명령 프롬프트 또는 PowerShell을 관리자로 엽니다.
다음 명령어를 실행합니다.
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet설치가 완료될 때까지 기다립니다.
다음을 실행하여 설치를 확인합니다.
sc query observiq-otel-collector서비스가 실행 중으로 표시되어야 합니다.
Linux 설치
- 루트 또는 sudo 권한으로 터미널을 엽니다.
다음 명령어를 실행합니다.
sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh설치가 완료될 때까지 기다립니다.
다음을 실행하여 설치를 확인합니다.
sudo systemctl status observiq-otel-collector서비스가 active (running)으로 표시되어야 합니다.
추가 설치 리소스
추가 설치 옵션 및 문제 해결은 Bindplane 에이전트 설치 가이드를 참고하세요.
syslog를 수집하여 Google SecOps로 전송하도록 Bindplane 에이전트 구성
구성 파일 찾기
Linux:
sudo nano /opt/observiq-otel-collector/config.yamlWindows:
notepad "C:\Program Files\observIQ OpenTelemetry Collector\config.yaml"
구성 파일 설정
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다음 자리표시자를 바꿉니다.
수신기 구성:
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
- Linux:
customer_id: 이전 단계의 고객 IDendpoint: 리전 엔드포인트 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: 파일 > 저장을 클릭합니다.
- Linux:
변경사항을 적용하려면 Bindplane 에이전트를 다시 시작하세요.
Linux
sudo systemctl restart observiq-otel-collector서비스가 실행 중인지 확인합니다.
sudo systemctl status observiq-otel-collector로그에서 오류를 확인합니다.
sudo journalctl -u observiq-otel-collector -f
Windows
다음 옵션 중 하나를 선택합니다.
명령 프롬프트 또는 PowerShell을 관리자로 사용합니다.
net stop observiq-otel-collector && net start observiq-otel-collector서비스 콘솔 사용:
Win+R키를 누르고services.msc을 입력한 다음 Enter 키를 누릅니다.- observIQ OpenTelemetry Collector를 찾습니다.
- 마우스 오른쪽 버튼을 클릭하고 다시 시작을 선택합니다.
서비스가 실행 중인지 확인합니다.
sc query observiq-otel-collector로그에서 오류를 확인합니다.
type "C:\Program Files\observIQ OpenTelemetry Collector\log\collector.log"
IBM DB2 감사 기능 구성
보안 이벤트를 캡처하고 syslog로 추출하도록 DB2 감사 기능을 구성합니다.
현재 감사 구성 확인
SYSADM 권한이 있는 사용자로 DB2 인스턴스에 연결하고 다음을 실행합니다.
db2audit describe감사 상태, 카테고리, 경로를 포함한 현재 감사 구성이 표시됩니다.
감사 경로 구성
감사 로그가 저장될 디렉터리를 설정합니다.
db2audit configure datapath /db2audit/data db2audit configure archivepath /db2audit/archive다음 디렉터리가 있고 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: 표준 오류 처리
감사 기능 시작
감사 시작:
db2audit start감사가 활성 상태인지 확인합니다.
db2audit describe출력에
Audit active: "TRUE"이 표시되어야 합니다.
DB2 감사 로그를 수신하도록 syslog 구성
DB2 감사 메시지를 수신하고 저장하도록 시스템 syslog 데몬을 구성합니다.
Linux (rsyslog)
rsyslog 구성 파일을 수정합니다.
sudo nano /etc/rsyslog.confDB2 감사 메시지를 전용 파일로 라우팅하려면 다음 줄을 추가합니다.
user.info /var/log/db2/db2audit.log로그 디렉터리와 파일을 만듭니다.
sudo mkdir -p /var/log/db2 sudo touch /var/log/db2/db2audit.log sudo chmod 640 /var/log/db2/db2audit.logrsyslog를 다시 시작합니다.
sudo systemctl restart rsyslog
AIX (syslogd)
syslog 구성 파일을 수정합니다.
sudo vi /etc/syslog.conf다음 줄을 추가합니다.
user.info /var/log/db2/db2audit.log로그 디렉터리와 파일을 만듭니다.
sudo mkdir -p /var/log/db2 sudo touch /var/log/db2/db2audit.log sudo chmod 640 /var/log/db2/db2audit.logsyslogd를 다시 시작합니다.
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를 구성합니다.
새 rsyslog 구성 파일을 만듭니다.
sudo nano /etc/rsyslog.d/50-db2-forward.conf로그를 Bindplane 에이전트로 전달하도록 다음 구성을 추가합니다.
# Forward DB2 audit logs to Bindplane agent user.info @@127.0.0.1:1514@@접두사는 TCP 전달을 나타냅니다. 필요한 경우 UDP에@를 사용합니다.rsyslog를 다시 시작합니다.
sudo systemctl restart rsyslog
감사 로그 추출 자동화
플러시, 보관처리, 추출 프로세스를 자동화하는 스크립트를 만듭니다.
추출 스크립트 만들기
감사 로그 추출을 자동화하는 스크립트를 만듭니다.
sudo nano /usr/local/bin/db2audit-extract.sh다음 콘텐츠를 추가합니다.
#!/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스크립트를 실행 가능하게 만듭니다.
sudo chmod +x /usr/local/bin/db2audit-extract.sh
크론으로 예약
크론을 사용하여 스크립트가 주기적으로 실행되도록 예약합니다.
sudo crontab -e매시간 스크립트를 실행하려면 다음 줄을 추가합니다.
다음 옵션 중 하나를 선택합니다.
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에서 로그 수집 확인
- Google SecOps 콘솔에 로그인합니다.
- 검색으로 이동합니다.
검색 쿼리를 실행하여 DB2 로그가 수집되고 있는지 확인합니다.
metadata.log_type = "DB2_DB"로그가 올바른 타임스탬프와 필드로 표시되는지 확인합니다.
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 전문가에게 문의하여 답변을 받으세요.