Darktrace 로그 수집
이 문서에서는 Bindplane 에이전트를 사용하여 Darktrace 로그를 Google Security Operations로 수집하는 방법을 설명합니다.
Darktrace는 AI 기반 사이버 보안 플랫폼으로, 위협과 이상치를 실시간으로 감지합니다. 파서는 CEF 및 JSON 형식의 Darktrace 로그를 모두 처리하여 필드를 추출하고 통합 데이터 모델 (UDM)에 매핑합니다.
시작하기 전에
다음 기본 요건이 충족되었는지 확인합니다.
- Google SecOps 인스턴스
- Windows Server 2016 이상 또는
systemd가 설치된 Linux 호스트 - Bindplane 에이전트와 Darktrace 어플라이언스 간의 네트워크 연결
- 프록시 뒤에서 실행하는 경우 Bindplane 에이전트 요구사항에 따라 방화벽 포트가 열려 있는지 확인합니다.
- Darktrace 웹 UI에 대한 액세스 권한
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 /etc/bindplane-agent/config.yamlWindows:
notepad "C:\Program Files\observIQ OpenTelemetry Collector\config.yaml"
구성 파일 설정
config.yaml의 전체 내용을 다음 구성으로 바꿉니다.receivers: tcplog: listen_address: "0.0.0.0:10282" exporters: chronicle/darktrace: compression: gzip creds_file_path: '/etc/bindplane-agent/ingestion-auth.json' customer_id: '<customer_id>' endpoint: malachiteingestion-pa.googleapis.com log_type: DARKTRACE raw_log_field: body service: pipelines: logs/darktrace_to_chronicle: receivers: - tcplog exporters: - chronicle/darktrace
구성 매개변수
다음 자리표시자를 바꿉니다.
수신기 구성:
listen_address: 리슨할 IP 주소 및 포트입니다.0.0.0.0: 모든 인터페이스에서 수신 대기 (권장)- 포트
10282은 기본 Darktrace CEF syslog 포트입니다 (필요에 따라 조정).
내보내기 도구 구성:
creds_file_path: 수집 인증 파일의 전체 경로입니다.- Linux:
/etc/bindplane-agent/ingestion-auth.json - Windows:
C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json
- Linux:
customer_id: Google SecOps 콘솔에서 복사한 고객 IDendpoint: 리전 엔드포인트 URL:- 미국:
malachiteingestion-pa.googleapis.com - 유럽:
europe-malachiteingestion-pa.googleapis.com - 아시아:
asia-southeast1-malachiteingestion-pa.googleapis.com - 전체 목록은 리전 엔드포인트를 참고하세요.
- 미국:
구성 파일 저장
- 수정 후 파일을 저장합니다.
- Linux:
Ctrl+O,Enter,Ctrl+X순서로 누릅니다. - Windows: 파일 > 저장을 클릭합니다.
- Linux:
변경사항을 적용하려면 Bindplane 에이전트를 다시 시작하세요.
Linux에서 Bindplane 에이전트를 다시 시작하려면 다음 명령어를 실행합니다.
sudo systemctl restart observiq-otel-collector서비스가 실행 중인지 확인합니다.
sudo systemctl status observiq-otel-collector로그에서 오류를 확인합니다.
sudo journalctl -u observiq-otel-collector -f
Windows에서 Bindplane 에이전트를 다시 시작하려면 다음 옵션 중 하나를 선택합니다.
관리자 권한으로 명령 프롬프트 또는 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"
Darktrace에서 syslog 구성
- Darktrace 웹 UI에 로그인합니다.
- 관리자 > 시스템 구성으로 이동합니다.
- 알림 설정 확인을 클릭합니다.
- 다음 구성 세부정보를 제공합니다.
- CEF Syslog Alerts(CEF Syslog 알림): True(참)를 선택합니다.
- CEF Syslog Server: Bindplane IP 주소를 입력합니다.
- CEF Syslog Server Port: Bindplane 포트 번호 (예:
10282)를 입력합니다. - CEF Syslog TCP Alert: True를 선택합니다.
- 저장을 클릭합니다.
지원되는 Darktrace 샘플 로그
SYSLOG + KV (CEF)
{ "acknowledged": false, "commentCount": 0, "pbid": 900000001, "time": 1604055367000, "creationTime": 1604055367000, "model": { "name": "Compromise::Agent Beacon to New Endpoint", "uuid": "dfd6f10b-b91c-4244-9fd5-7c35caf21b33", "description": "A device is initiating multiple connections to a new external endpoint...", "priority": 2, "category": "Informational", "mitre": { "tactics": [ "command-and-control" ], "techniques": [ "T1071.001" ] } }, "triggeredComponents": [ { "time": 1677679818000, "ip": " ", "port": 443, "metric": { "name": "externalconnections" }, "triggeredFilters": [ { "filterType": "Connection hostname", "trigger": { "value": "beacon.external.io" } } ] } ], "score": 0.85, "device": { "did": 90001, "macaddress": " ", "ip": " ", "hostname": "user-laptop-1" } }SYSLOG + JSON
{ "dpi_engine": "dt-sensor-101", "proto": "tcp", "source_ip": " ", "source_port": 51000, "dest_ip": " ", "dest_port": 389, "src": " ", "dst": " ", "details": "AP request: srealm is [TESTDOMAIN.LOCAL], service is [LDAP/DC99.testdomain.local/testdomain.local], ST cipher is [aes256-cts-hmac-sha1-96]", "epochdate": 1690471502.2252, "@host": "log-collector-host", "uid": "ABCDEFGHIJ1234567890", "note": "KERBEROS::App", "@type": "notice" }
UDM 매핑 테이블
| 로그 필드 | UDM 매핑 | 논리 |
|---|---|---|
| darktraceUrl | security_result.url_back_to_product | 값은 darktraceUrl 필드에서 가져옵니다. |
| darktrace_host | observer.hostname | IP 주소가 아닌 경우 값은 darktrace_host 필드에서 가져옵니다. |
| darktrace_ip | observer.ip | 값은 darktrace_ip 필드에서 가져옵니다. |
| darktrace_user | observer.user.userid | 값은 darktrace_user 필드에서 가져옵니다. |
| 설명 | security_result.summary, metadata.description | 값은 description 필드에서 가져옵니다. |
| device.customFields.DT-AUTO.macaddress | principal.mac | 값은 device.customFields.DT-AUTO.macaddress 필드에서 가져옵니다. |
| device.did | principal.asset.asset_id | 값은 device.did 필드에서 가져와 문자열로 변환되고 Device ID:이 앞에 붙습니다. |
| device.firstSeen | principal.asset.first_seen_time | 값은 device.firstSeen 필드에서 가져와 문자열로 변환되고 밀리초 단위의 UNIX 타임스탬프로 파싱됩니다. |
| device.hostname | principal.hostname, principal.asset.hostname | 값은 device.hostname 필드에서 가져옵니다. |
| device.ip | principal.ip, principal.asset.ip | 값이 IP 주소 형식과 일치하는 경우 device.ip 필드에서 가져옵니다. |
| device.ips.0.subnet | additional.fields.subnet | 값은 device.ips.0.subnet 필드에서 가져오고 subnet이 접두사로 붙습니다. |
| device.ips.ip | principal.ip, principal.asset.ip | 값은 목록에 있는 각 IP 주소의 device.ips.ip 필드에서 가져옵니다. |
| device.lastSeen | principal.asset.last_discover_time | 값은 device.lastSeen 필드에서 가져와 문자열로 변환되고 밀리초 단위의 UNIX 타임스탬프로 파싱됩니다. |
| device.macaddress | principal.mac | 값은 device.macaddress 필드에서 가져옵니다. |
| device.objecttype | principal.asset.type | 값이 device인 경우 UDM 필드가 WORKSTATION로 설정됩니다. |
| device.sid | principal.resource.attribute.labels.sid | 값은 device.sid 필드에서 가져와 문자열로 변환됩니다. |
| device.typelabel | principal.resource.attribute.labels.typelabel | 값은 device.typelabel 필드에서 가져옵니다. |
| device.typename | principal.resource.attribute.labels.typename | 값은 device.typename 필드에서 가져옵니다. |
| dst | target.ip, target.asset.ip | 값은 dst 필드에서 가져옵니다. |
| dpt | target.port | 값은 dpt 필드에서 가져와 정수로 변환됩니다. |
| dvc | principal.ip, principal.asset.ip | dvc 값이 IP 주소인 경우 UDM 필드에 추가됩니다. |
| dvchost | principal.hostname, principal.asset.hostname | 값은 dvchost 필드에서 가져옵니다. |
| endpoint | target.url | 값은 endpoint 필드에서 가져옵니다. |
| event_time | metadata.event_timestamp | 값은 event_time 필드에서 가져와 ISO8601 타임스탬프로 파싱됩니다. |
| externalId | metadata.product_log_id | 값은 externalId 필드에서 가져옵니다. |
| incidentEventUrl | principal.url | 값은 incidentEventUrl 필드에서 가져옵니다. |
| ip | principal.ip, principal.asset.ip | 값이 IP 주소 형식과 일치하는 경우 ip 필드에서 가져옵니다. |
| issue_msg | security_result.summary | 값은 issue_msg 필드에서 가져옵니다. |
| 메시지 | security_result.description | 값은 message 필드에서 가져옵니다. |
| 메서드 | network.http.method | 값은 method 필드에서 가져옵니다. |
| model.description | metadata.description | 값은 model.description 필드에서 가져옵니다. |
| model.name | metadata.product_event_type | 값은 model.name 필드에서 가져옵니다. |
| model.now.category | security_result.severity | 값이 critical인 경우 UDM 필드가 CRITICAL로 설정됩니다. 값이 Informational인 경우 UDM 필드가 INFORMATIONAL로 설정됩니다. 값이 Suspicious인 경우 UDM 필드가 HIGH로 설정되고 카테고리가 NETWORK_SUSPICIOUS로 설정됩니다. |
| model.now.description | metadata.description | 값은 model.now.description 필드에서 가져옵니다. |
| model.now.message | security_result.description | 값은 model.now.message 필드에서 가져옵니다. |
| model.now.name | metadata.product_event_type | 값은 model.now.name 필드에서 가져옵니다. |
| model.now.pid | principal.process.pid | 값은 model.now.pid 필드에서 가져와 문자열로 변환됩니다. |
| model.now.uuid | principal.user.userid | 값은 model.now.uuid 필드에서 가져오고 이벤트 유형은 USER_UNCATEGORIZED로 설정됩니다. |
| model.pid | principal.process.pid | 값은 model.pid 필드에서 가져와 문자열로 변환됩니다. |
| model.then.description | principal.resource.attribute.labels.Model Then Description | 값은 model.then.description 필드에서 가져옵니다. |
| model.then.name | principal.resource.attribute.labels.Model Then Name | 값은 model.then.name 필드에서 가져옵니다. |
| model.then.pid | principal.resource.attribute.labels.Model Then Pid | 값은 model.then.pid 필드에서 가져와 문자열로 변환됩니다. |
| model.then.uuid | principal.resource.attribute.labels.Model Then UUID | 값은 model.then.uuid 필드에서 가져옵니다. |
| model.uuid | principal.user.userid | 값은 model.uuid 필드에서 가져오고 이벤트 유형은 USER_UNCATEGORIZED로 설정됩니다. |
| relatedBreaches.0.modelName | security_result.description | 값은 relatedBreaches.0.modelName 필드에서 가져옵니다. |
| 점수 | security_result.priority, security_result.priority_details | 값이 0.8과 1 사이이면 우선순위가 HIGH_PRIORITY로 설정됩니다. 값이 0.5~0.79이면 우선순위가 MEDIUM_PRIORITY로 설정됩니다. 값이 0~0.49이면 우선순위가 LOW_PRIORITY로 설정됩니다. 우선순위 세부정보는 Score :로 설정되고 그 뒤에 score 값이 문자열로 변환됩니다. |
| 줄이는 것을 | security_result.severity | 값이 2인 경우 UDM 필드가 MEDIUM로 설정됩니다. 값이 2보다 큰 경우 UDM 필드가 HIGH로 설정됩니다. |
| shost | principal.hostname, principal.asset.hostname | 값은 shost 필드에서 가져옵니다. |
| smac | principal.mac | 값은 smac 필드에서 가져옵니다. |
| src | principal.ip, principal.asset.ip | 값은 src 필드에서 가져옵니다. |
| 상태 | network.http.response_code | 값은 status 필드에서 가져와 문자열로 변환됩니다. |
| 요약 | metadata.description | 값은 summary 필드에서 가져옵니다. |
| 시간 | 값은 time 필드에서 가져와 문자열로 변환되고 밀리초 단위의 UNIX 타임스탬프로 파싱됩니다. |
|
| 타임스탬프 | 값은 timestamp 필드에서 가져오며 ISO8601 타임스탬프 또는 밀리초 단위의 UNIX 타임스탬프로 파싱됩니다. |
|
| 제목 | security_result.summary | 값은 title 필드에서 가져옵니다. |
| triggeredComponents.ip | intermediary.ip | 값이 IP 주소 형식과 일치하는 경우 triggeredComponents.ip 필드에서 가져옵니다. |
| triggeredComponents.port | intermediary.port | 값은 triggeredComponents.port 필드에서 가져와 정수로 변환됩니다. |
| 사용자 이름 | principal.user.userid | 값은 username 필드에서 가져옵니다. |
| metadata.vendor_name | DARKTRACE로 설정합니다. |
|
| metadata.product_name | DCIP로 설정합니다. |
|
| metadata.log_type | DARKTRACE로 설정합니다. |
|
| network.ip_protocol | issue_msg에 UDP이 포함되지 않으면 TCP로 설정합니다. 그렇지 않으면 UDP로 설정합니다. |
|
| security_result.action | status가 401이면 BLOCK로 설정하고, 그렇지 않으면 ALLOW로 설정합니다. |
|
| security_result.severity | INFORMATIONAL로 설정합니다. |
|
| network.application_protocol | method이 비어 있지 않으면 HTTP로 설정합니다. |
|
| metadata.event_type | method이 비어 있지 않으면 NETWORK_HTTP로 설정합니다. description에 logged into \\\\S+ over ssh이 포함된 경우 USER_LOGIN로 설정됩니다. target_ip이 비어 있지 않으면 NETWORK_CONNECTION로 설정합니다. 그렇지 않으면 STATUS_UPDATE로 설정합니다. |
|
| extensions.auth.type | description에 logged into \\\\S+ over ssh이 포함된 경우 MACHINE로 설정됩니다. |
|
| security_result.category | issue_msg에 Exfiltration이 포함된 경우 DATA_EXFILTRATION로 설정됩니다. issue_msg에 Compromise이 포함된 경우 NETWORK_MALICIOUS로 설정됩니다. 그렇지 않으면 NETWORK_SUSPICIOUS로 설정합니다. |
도움이 더 필요하신가요? 커뮤니티 회원 및 Google SecOps 전문가에게 문의하여 답변을 받으세요.