Carbon Black EDR 로그 수집
이 문서에서는 AWS S3를 사용하여 클라우드 및 온프레미스 환경에서 Carbon Black EDR 로그를 수집하는 방법을 설명합니다. 파서는 JSON, CSV 또는 syslog 형식 메시지에서 필드를 추출하고 정규화한 후 UDM에 매핑합니다. 네트워크 연결, 프로세스 이벤트, 파일 수정, 레지스트리 변경, IOC 조회 등 다양한 Carbon Black 이벤트 유형을 처리하여 가능한 경우 위협 인텔리전스 및 기기 정보로 데이터를 보강합니다.
시작하기 전에
다음을 확인하세요.
- 구성된 Google SecOps 인스턴스
- AWS IAM 및 S3에 대한 권한이 있는 액세스
- 클라우드 또는 온프레미스 Carbon Black EDR에 대한 액세스 권한
Carbon Black EDR 온프레임 구성
온프레미스용 Amazon S3 버킷 구성
- 버킷 만들기 사용자 가이드에 따라 Amazon S3 버킷을 만듭니다.
- 나중에 사용할 수 있도록 버킷 이름 및 리전을 저장합니다.
- IAM 사용자 만들기 사용자 가이드에 따라 사용자를 만듭니다.
- 만든 사용자를 선택합니다.
- 보안 사용자 인증 정보 탭을 선택합니다.
- 액세스 키 섹션에서 액세스 키 만들기를 클릭합니다.
- 사용 사례로 서드 파티 서비스를 선택합니다.
- 다음을 클릭합니다.
- 선택사항: 설명 태그를 추가합니다.
- 액세스 키 만들기를 클릭합니다.
- CSV 파일 다운로드를 클릭하여 나중에 사용할 수 있도록 액세스 키 및 비밀 액세스 키를 저장합니다.
- 완료를 클릭합니다.
- 권한 탭을 선택합니다.
- 권한 정책 섹션에서 권한 추가를 클릭합니다.
- 권한 추가를 선택합니다.
- Attach policies directly(정책 직접 연결)를 선택합니다.
- AmazonS3FullAccess 정책을 검색하여 선택합니다.
- 다음을 클릭합니다.
- 권한 추가를 클릭합니다.
온프레미스 EDR 서버에 cb-event-forwarder 설치
CbOpenSource 저장소가 아직 없는 경우 설치합니다.
cd /etc/yum.repos.d curl -O https://opensource.carbonblack.com/release/x86_64/CbOpenSource.repo
YUM을 사용하여 RPM을 설치합니다.
yum install cb-event-forwarder
EDR 7.1.0 이상을 사용하는 경우 다음 스크립트를 실행하여 EDR에 필요한 적절한 권한을 설정합니다.
/usr/share/cb/integrations/event-forwarder/cb-edr-fix-permissions.sh
JSON 로그를 출력하도록 cb-event-forwarder 구성
구성 파일을 엽니다.
sudo nano /etc/cb/integrations/event-forwarder/cb-event-forwarder.conf
다음 매개변수를 수정합니다.
[event_forwarder] output_format=json # Enable JSON format output_type=s3 # Send logs to AWS S3 s3_bucket_name=YOUR-S3-BUCKET-NAME s3_region=YOUR-S3-BUCKET-NAME s3_access_key_id=YOUR_AWS_ACCESS_KEY s3_secret_access_key=YOUR_AWS_SECRET_KEY s3_prefix=carbonblack/edr/logs
키보드를 사용하여 저장하고 종료합니다.
- Ctrl + X, Y, Enter
cb-event-forwarder를 시작합니다.
sudo systemctl enable cb-event-forwarder sudo systemctl restart cb-event-forwarder sudo systemctl status cb-event-forwarder
S3용 Carbon Black Cloud Event Forwarder 구성
AWS S3 버킷 만들기
- AWS Management Console에 로그인합니다.
- AWS 리전이 이벤트 전달자의 리전과 일치하는지 확인합니다.
- AWS 콘솔 페이지에서 리전을 찾습니다.
- 드롭다운을 사용하여 이벤트 전달자의 올바른 지역을 선택합니다.
- 다음 목록에는 각 Carbon Black EDR URL에 적용되는 AWS 리전이 나와 있습니다.
- 'instance-alias'.my.carbonblack.io - 지역: 미국 동부 (북부 버지니아) (us-east-1)
- 'instance-alias'.my.cbcloud.de - 리전: 유럽 (프랑크푸르트) (eu-central-1)
- 'instance-alias'.my.cbcloud.sg 지역: 아시아 태평양 (싱가포르) (ap-southeast-1)
- 서비스를 선택합니다.
- S3 콘솔로 이동합니다.
- 버킷 만들기를 클릭하여 버킷 만들기 마법사를 엽니다.
- 버킷 이름에 버킷의 고유한 이름을 입력합니다 (예: CB-EDR).
- 리전이 이전에 선택한 리전으로 기본 설정되어 있는지 확인합니다.
- 공개 액세스 차단 기본값을 업데이트하여 공개 액세스를 허용합니다 (Google SecOps에 로그를 처리하는 데 필요).
- 버킷 만들기를 선택합니다.
Event Forwarder가 이벤트를 쓸 수 있도록 S3 버킷 구성
- IAM 사용자 만들기 사용자 가이드에 따라 사용자를 만듭니다.
- 만든 사용자를 선택합니다.
- 보안 사용자 인증 정보 탭을 선택합니다.
- 액세스 키 섹션에서 액세스 키 만들기를 클릭합니다.
- 사용 사례로 서드 파티 서비스를 선택합니다.
- 다음을 클릭합니다.
- 선택사항: 설명 태그를 추가합니다.
- 액세스 키 만들기를 클릭합니다.
- CSV 파일 다운로드를 클릭하여 나중에 사용할 수 있도록 액세스 키 및 비밀 액세스 키를 저장합니다.
- 완료를 클릭합니다.
- 권한 탭을 선택합니다.
- 권한 정책 섹션에서 권한 추가를 클릭합니다.
- 권한 추가를 선택합니다.
- Attach policies directly(정책 직접 연결)를 선택합니다.
- AmazonS3FullAccess 정책을 검색합니다.
- 정책을 선택합니다.
- 다음을 클릭합니다.
- 권한 추가를 클릭합니다.
EDR Console에서 이벤트 전달 구성
- VMware Carbon Black Cloud에 로그인합니다.
- 이벤트 전달자 탭으로 이동합니다.
- 제품이 S3에 업로드할 이벤트를 사용 설정합니다.
- Output and Type(출력 및 유형)으로 이동하여 S3로 설정합니다.
- S3 버킷 이름을
<region>:<bucket-name>
형식으로 입력합니다 (예:us-east-1:cb-edr
). - INI 형식의 AWS 사용자 인증 정보 업로드 파일을 선택합니다.
다음은 프로필의 예입니다.
AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY Default region name [None]: us-east-1
저장을 클릭하고 서비스를 다시 시작하여 변경사항을 적용합니다.
Carbon Black EDR 로그를 수집하도록 Google SecOps에서 피드 구성
- SIEM 설정 > 피드로 이동합니다.
- 새로 추가를 클릭합니다.
- 피드 이름 필드에 피드 이름을 입력합니다 (예: Carbon Black EDR 로그).
- 소스 유형으로 Amazon S3를 선택합니다.
- 로그 유형으로 Carbon Black EDR을 선택합니다.
- 다음을 클릭합니다.
다음 입력 매개변수의 값을 지정합니다.
- 리전: Amazon S3 버킷이 있는 리전입니다.
- S3 URI: 버킷 URI입니다.
s3:/BUCKET_NAME
BUCKET_NAME
을 버킷의 실제 이름으로 바꿉니다.
- URI: 로그 스트림 구성 (단일 파일 | 디렉터리 | 하위 디렉터리가 포함된 디렉터리)에 따라 URI_TYPE을 선택합니다.
- 소스 삭제 옵션: 원하는 삭제 옵션을 선택합니다.
- 액세스 키 ID: S3 버킷에 대한 액세스 권한이 있는 사용자 액세스 키입니다.
- 보안 비밀 액세스 키: S3 버킷에 액세스할 수 있는 사용자 보안 비밀 키입니다.
- 애셋 네임스페이스: 애셋 네임스페이스입니다.
- 수집 라벨: 이 피드의 이벤트에 적용할 라벨입니다.
다음을 클릭합니다.
확정 화면에서 새 피드 구성을 검토한 다음 제출을 클릭합니다.
UDM 매핑 표
로그 필드 | UDM 매핑 | 논리 |
---|---|---|
action |
security_result.detection_fields[?key == 'action'].value |
원시 로그의 action 필드 값입니다. |
cb_server |
intermediary.hostname |
원시 로그의 cb_server 필드 값입니다. |
cb_version |
metadata.product_version |
원시 로그의 cb_version 필드 값입니다. |
child_pid |
target.process.pid (ingress.event.childproc 이벤트의 경우) |
type 이 ingress.event.childproc 인 경우 원시 로그의 child_pid 필드 값입니다. |
child_process_guid |
target.process.product_specific_process_id (ingress.event.childproc 이벤트의 경우) |
'CB:': type 이 ingress.event.childproc 인 경우 원시 로그의 child_process_guid 필드 값과 연결됩니다. |
child_username |
target.user.userid (ingress.event.childproc 이벤트의 경우) |
type 이 ingress.event.childproc 인 경우 원시 로그의 child_username 필드 값입니다. |
childproc_guid |
target.process.product_specific_process_id (endpoint.event.procstart 이벤트의 경우) |
'CB:': type 이 endpoint.event.procstart 인 경우 원시 로그의 childproc_guid 필드 값과 연결됩니다. |
childproc_hash.0 |
target.process.file.md5 (endpoint.event.procstart 이벤트의 경우) |
type 이 endpoint.event.procstart 인 경우 원시 로그의 childproc_hash 배열의 첫 번째 요소입니다. |
childproc_hash.1 |
target.process.file.sha256 (endpoint.event.procstart 이벤트의 경우) |
type 이 endpoint.event.procstart 인 경우 원시 로그의 childproc_hash 배열의 두 번째 요소입니다. |
childproc_name |
target.process.file.full_path (endpoint.event.procstart 이벤트의 경우) |
type 이 endpoint.event.procstart 인 경우 원시 로그의 childproc_name 필드 값입니다. |
childproc_pid |
target.process.pid (endpoint.event.procstart 이벤트의 경우) |
type 이 endpoint.event.procstart 인 경우 원시 로그의 childproc_pid 필드 값입니다. |
childproc_publisher.0.name |
security_result.detection_fields[?key == 'childproc_publisher_name'].value (endpoint.event.procstart 이벤트의 경우) |
type 이 endpoint.event.procstart 인 경우 원시 로그의 childproc_publisher.0.name 값과 연결된 'childproc_publisher_name:' |
childproc_publisher.0.state |
security_result.detection_fields[?key == 'childproc_publisher_state'].value (endpoint.event.procstart 이벤트의 경우) |
'childproc_publisher_state:' type 이 endpoint.event.procstart 인 경우 원시 로그의 childproc_publisher.0.state 값과 연결됩니다. |
childproc_reputation |
security_result.detection_fields[?key == 'childproc_reputation'].value (endpoint.event.procstart 이벤트의 경우) |
type 이 endpoint.event.procstart 인 경우 원시 로그의 childproc_reputation 필드 값입니다. |
childproc_username |
target.user.userid (endpoint.event.procstart 이벤트의 경우) |
type 이 endpoint.event.procstart 인 경우 원시 로그의 childproc_username 필드 값입니다. |
clientIp |
principal.ip , principal.asset.ip |
원시 로그의 clientIp 필드 값입니다. |
cmdline |
target.process.command_line (feed.query.hit.process 및 feed.storage.hit.process 이벤트의 경우), additional.fields[?key == 'cmdline_*'].value.string_value (watchlist.storage.hit.process 이벤트의 경우) |
type 이 feed.query.hit.process 또는 feed.storage.hit.process 인 경우 원시 로그의 cmdline 필드 값입니다. watchlist.storage.hit.process 이벤트의 경우 additional.fields 에 'cmdline_*' 키로 저장됩니다. |
command_line |
target.process.command_line (ingress.event.procstart 이벤트의 경우) |
type 이 ingress.event.procstart 인 경우 원시 로그의 command_line 필드 값입니다. |
comms_ip |
intermediary.ip |
원시 로그의 comms_ip 필드 값입니다. |
computer_name |
principal.hostname , principal.asset.hostname |
원시 로그의 computer_name 필드 값입니다. |
crossproc_api |
additional.fields[?key == 'crossproc_api'].value.string_value (endpoint.event.apicall 이벤트의 경우) |
type 이 endpoint.event.apicall 인 경우 원시 로그의 crossproc_api 필드 값입니다. |
crossproc_guid |
additional.fields[?key == 'crossproc_guid'].value.string_value (endpoint.event.crossproc 이벤트의 경우) |
type 이 endpoint.event.crossproc 인 경우 원시 로그의 crossproc_guid 필드 값입니다. |
crossproc_hash.0 |
additional.fields[?key == 'crossproc_md5'].value.string_value (endpoint.event.crossproc 이벤트의 경우) |
type 이 endpoint.event.crossproc 인 경우 원시 로그의 crossproc_hash 배열의 첫 번째 요소입니다. |
crossproc_hash.1 |
additional.fields[?key == 'crossproc_sha256'].value.string_value (endpoint.event.crossproc 이벤트의 경우) |
type 이 endpoint.event.crossproc 인 경우 원시 로그의 crossproc_hash 배열의 두 번째 요소입니다. |
crossproc_name |
target.process.file.full_path (endpoint.event.crossproc 이벤트의 경우) |
type 이 endpoint.event.crossproc 인 경우 원시 로그의 crossproc_name 필드 값입니다. |
crossproc_publisher.0.name |
security_result.detection_fields[?key == 'crossproc_publisher_name'].value (endpoint.event.crossproc 이벤트의 경우) |
'crossproc_publisher_name:': type 이 endpoint.event.crossproc 인 경우 원시 로그의 crossproc_publisher.0.name 값과 연결됩니다. |
crossproc_publisher.0.state |
security_result.detection_fields[?key == 'crossproc_publisher_state'].value (endpoint.event.crossproc 이벤트의 경우) |
'crossproc_publisher_state:' type 가 endpoint.event.crossproc 인 경우 원시 로그의 crossproc_publisher.0.state 값과 연결됩니다. |
crossproc_reputation |
additional.fields[?key == 'crossproc_reputation'].value.string_value (endpoint.event.crossproc 이벤트의 경우) |
type 이 endpoint.event.crossproc 인 경우 원시 로그의 crossproc_reputation 필드 값입니다. |
crossproc_target |
additional.fields[?key == 'crossproc_target'].value.string_value (endpoint.event.crossproc 이벤트의 경우) |
type 이 endpoint.event.crossproc 인 경우 원시 로그의 crossproc_target 필드 값입니다. 'true' 또는 'false' 문자열로 변환됩니다. |
변경사항
2024-05-13
- 'alert_url' 필드가 'metadata.url_back_to_product' UDM 필드에 매핑되었습니다.
2024-01-19
- 매핑 전에 'filemod_hash.0' 및 'filemod_hash.1'에 대한 null 검사를 추가했습니다.
2023-12-27
- 파싱되지 않은 로그를 파싱하기 위해 'filemod_hash.0' 및 'filemod_hash.1'을 null로 초기화했습니다.
2023-10-26
- 파싱되지 않은 필드를 파싱하는 'gsub' 함수를 추가했습니다.
2023-10-13
- JSON 블록을 추가하여 새 JSON 로그를 처리했습니다.
- 'computer_name', 'parent_name', 'process_name', 'pid', 'process_path', 'md5', 'sha256', 'process_guid', 'parent_pid', 'docs.0.process_pid', 'cb_version', 'process_hash.0', 'process_hash.1', 'parent_hash.0', 'parent_hash.1' 필드의 중복 코드가 삭제되었습니다.
2023-07-21
- 'security_result.attack_details'에 MITRE ATT&CK 전략 및 기법 세부정보를 추가했습니다.
2023-03-24
- 'protocol' 필드가 'network.ip_protocol'에 매핑되었습니다.
- 'child_username', 'child_pid', 'child_command_line' 필드에 대한 null 조건부 검사가 추가되었습니다.
- 'principal.hostname' 또는 'principal.ip'가 null이 아닌 경우 'metadata.event_type'을 'GENERIC_EVENT'에서 'STATUS_UPDATE'로 변경했습니다.
2023-03-14
- 버그 수정:
- 'type' 필드가 null인 경우 다음 필드를 매핑했습니다.
- 'process_guid' 필드가 'principal.process.product_specific_process_id'에 매핑되었습니다.
- 'device_external_ip' 필드가 'target.ip'에 매핑되었습니다.
- 'device_os' 필드가 'principal.platform'에 매핑되었습니다.
- 'device_group' 필드를 'principal.group.group_display_name'에 매핑했습니다.
- 'process_pid' 필드를 'principal.process.pid'에 매핑했습니다.
- 'process_path' 필드가 'principal.process.file.full_path'에 매핑되었습니다.
- 'process_cmdline' 필드가 'principal.process.command_line'에 매핑되었습니다.
- 'process_hash.0' 필드가 'principal.process.file.md5'에 매핑되었습니다.
- 'principal.1' 필드가 'principal.process.file.sha256'에 매핑되었습니다.
- 'process_username' 필드가 'principal.user.userid'에 매핑되었습니다.
- 'clientIp' 필드가 'principal.ip'에 매핑되었습니다.
- 'description' 필드를 'metadata.description'에 매핑했습니다.
- 'orgName' 필드가 'principal.administrative_domain'에 매핑되었습니다.
- 'ruleName' 필드에 'CYDERES'가 포함된 경우 다음 필드가 매핑되었습니다.
- 'deviceInfo.internalIpAddress' 필드가 'principal.ip'에 매핑되었습니다.
- 'deviceInfo.externalIpAddress' 필드가 'target.ip'에 매핑되었습니다.
- 'ruleName' 필드가 'security_result.rule_name'에 매핑되었습니다.
- 'deviceInfo.deviceType' 필드가 'principal.asset.platform_software.platform'에 매핑되었습니다.
- 'domain' 필드가 'principal.administrative_domain'에 매핑되었습니다.
- 'deviceInfo.groupName' 필드가 'principal.group.group_display_name'에 매핑되었습니다.
- 'deviceInfo.deviceVersion' 필드가 'principal.asset.platform_software.platform_version'에 매핑되었습니다.
- 'deviceInfo.deviceId' 필드가 'principal.asset.asset_id'에 매핑되었습니다.
- 'eventId' 필드가 'additional.fields'에 매핑되었습니다.
- 'principal.ip' 및 'target.ip'가 null이 아닌 경우 'metadata.event_type'이 'GENERIC_EVENT'에서 'NETWORK_CONNECTION'으로 변경되었습니다.
- 'principal.ip'가 null이 아닌 경우 'metadata.event_type'을 'GENERIC_EVENT'에서 'STATUS_UPDATE'로 변경했습니다.
2023-02-03
- 버그 수정: 'filemod_hash'를 'target.process.file'이 아닌 'target.file'에 매핑합니다.
2023-01-20
- 버그 수정: 빈 프로세스 ID의 product_specific_process_id 채우기 및 매핑을 중지했습니다.
2022-11-25
- '인바운드' TCP/UDP 이벤트의 경우 'remote_ip'를 'principal.ip'에, 'local_ip'를 'target.ip'에 매핑했습니다.
- '인바운드' TCP/UDP 이벤트의 'remote_port'를 'principal.port'에, 'local_port'를 'target.port'에 매핑했습니다.
2022-10-06
- 모든 고객별 파서가 기본 파서로 마이그레이션되었습니다.
2022-07-10
- 'endpoint.event' 유형의 로그에 대한 'event_type'의 매핑이 'PROCESS_LAUNCH'로 업데이트되었습니다.'.
도움이 더 필요하신가요? 커뮤니티 회원 및 Google SecOps 전문가의 답변을 받으세요.