Sysdig 로그 수집
이 파서는 Sysdig JSON 로그에서 보안 이벤트 데이터를 추출하여 원시 로그 필드를 변환하고 Google Security Operations UDM 형식으로 매핑합니다. 메타데이터, 사용자/타겟 정보, 보안 결과 세부정보, Kubernetes 관련 컨텍스트를 비롯한 다양한 필드를 처리하여 Google SecOps 내에서 분석할 데이터를 보강합니다. 또한 파서는 필드 값을 기반으로 데이터 유형 변환, 오류 처리, 조건부 로직을 실행하여 정확하고 포괄적인 UDM 표현을 보장합니다.
시작하기 전에
- Google SecOps 인스턴스가 있는지 확인합니다.
- Sysdig Secure에 대한 권한이 있는지 확인합니다.
웹훅 피드에 대한 API 키 만들기
Google Cloud 콘솔 > 사용자 인증 정보로 이동합니다.
사용자 인증 정보 만들기를 클릭한 후 API 키를 선택합니다.
Google Security Operations API에 대한 API 키 액세스를 제한합니다.
옵션 1
Sysdig 로그를 수집하도록 Google SecOps에서 Webhook 피드 구성
- SIEM 설정 > 피드로 이동합니다.
- 새로 추가를 클릭합니다.
- 피드 이름 필드에 피드 이름을 입력합니다 (예: Sysdig Logs).
- 소스 유형으로 Webhook을 선택합니다.
- 로그 유형으로 Sysdig를 선택합니다.
- 다음을 클릭합니다.
- 선택사항: 다음 입력 파라미터의 값을 지정합니다.
- 분할 구분 기호: 로그 줄을 구분하는 데 사용되는 구분 기호입니다(예:
\n
). - 애셋 네임스페이스: 애셋 네임스페이스입니다.
- 수집 라벨: 이 피드의 이벤트에 적용된 라벨입니다.
- 분할 구분 기호: 로그 줄을 구분하는 데 사용되는 구분 기호입니다(예:
- 다음을 클릭합니다.
- 확정 화면에서 피드 구성을 검토한 다음 제출을 클릭합니다.
- 보안 비밀 키 생성을 클릭하여 이 피드를 인증하기 위한 보안 비밀 키를 생성합니다.
- 비밀 키를 복사하여 저장합니다. 이 보안 비밀 키는 다시 볼 수 없습니다. 필요한 경우 새 보안 비밀 키를 재생성할 수 있지만 이 작업을 하면 이전 보안 비밀 키는 더 이상 사용할 수 없게 됩니다.
- 세부정보 탭의 엔드포인트 정보 필드에서 피드 엔드포인트 URL을 복사합니다. 클라이언트 애플리케이션에서 이 엔드포인트 URL을 지정해야 합니다.
- 완료를 클릭합니다.
엔드포인트 URL 지정
- 클라이언트 애플리케이션에서 웹훅 피드에 제공된 HTTPS 엔드포인트 URL을 지정합니다.
다음 형식의 커스텀 헤더의 일부로 API 키와 보안 비밀 키를 지정하여 인증을 사용 설정합니다.
X-goog-api-key = API_KEY X-Webhook-Access-Key = SECRET
권장사항: API 키를 URL에 지정하는 대신 헤더로 지정하세요.
웹훅 클라이언트가 커스텀 헤더를 지원하지 않는 경우 다음 형식의 쿼리 매개변수를 사용하여 API 키와 보안 비밀 키를 지정할 수 있습니다.
ENDPOINT_URL?key=API_KEY&secret=SECRET
다음을 바꿉니다.
ENDPOINT_URL
: 피드 엔드포인트 URL입니다.API_KEY
: Google SecOps에 인증하기 위한 API 키입니다.SECRET
: 피드를 인증하기 위해 생성한 보안 비밀 키입니다.
Sysdig에서 웹훅 구성
- 관리자 권한으로 Sysdig Secure에 로그인합니다.
- 프로필 > 설정 > 이벤트 전달로 이동합니다.
- +통합 추가를 클릭하고 드롭다운에서 Webhook을 선택합니다.
다음 입력 매개변수의 값을 지정합니다.
- 통합 이름: 웹훅을 설명하는 이름을 입력합니다 (예: Google SecOps Webhook).
- 엔드포인트: 웹훅
<ENDPOINT_URL>
뒤에<API_KEY
및<SECRET>
을 입력합니다. 전송할 데이터: 전달해야 하는 Sysdig 데이터 유형을 드롭다운에서 선택합니다.
통합을 테스트한 다음 사용 설정됨을 전환하여 활성화합니다.
저장을 클릭합니다.
옵션 2
Google SecOps로 데이터 직접 전달
- 관리자 사용자 인증 정보를 사용하여 Sysdig Secure에 로그인합니다.
- 설정 > 이벤트 전달로 이동합니다.
- +통합 추가를 클릭하고 드롭다운에서 Google Chronicle을 선택합니다.
- 다음 입력 매개변수의 값을 지정합니다.
- 통합 이름: 통합을 설명하는 이름을 입력합니다 (예: Google SecOps 통합).
- 고객 ID: GCP 계정과 연결된 Google 고객 ID입니다. (Google SecOps의 설정 > 프로필에서 찾을 수 있습니다.)
- 네임스페이스: 선택사항: 색인 생성 및 보강에 적절한 데이터 도메인을 식별하는 태그로 사용합니다.
- JSON 사용자 인증 정보: Google SecOps JSON 사용자 인증 정보를 업로드합니다.
- 지역: 미국, 유럽, 아시아와 같은 지역을 선택합니다.
- 전송할 데이터: 드롭다운에서 전달할 Sysdig 데이터 유형을 선택합니다.
- 통합을 테스트한 다음 사용 설정됨을 전환하여 활성화합니다.
- 저장을 클릭합니다.
UDM 매핑 표
로그 필드 | UDM 매핑 | 논리 |
---|---|---|
agentId |
read_only_udm.metadata.product_deployment_id |
원시 로그의 agentId 값이 이 UDM 필드에 직접 매핑됩니다. |
category |
read_only_udm.security_result.category_details |
원시 로그의 category 값이 이 UDM 필드에 직접 매핑됩니다. |
content.fields.container.id |
read_only_udm.target.asset.asset_id |
원시 로그의 content.fields.container.id 값 앞에 'container_id:'가 추가되고 이 UDM 필드에 매핑됩니다. containerId 가 비어 있는 경우에 사용됩니다. |
content.fields.container.image.repository |
read_only_udm.target.file.full_path |
원시 로그의 content.fields.container.image.repository 값이 이 UDM 필드에 직접 매핑됩니다. |
content.fields.container.image.tag |
키가 tag 인 경우 read_only_udm.metadata.ingestion_labels.value |
원시 로그의 content.fields.container.image.tag 값이 이 UDM 필드에 직접 매핑됩니다. |
content.fields.evt.res |
키가 evt_res 인 경우 read_only_udm.metadata.ingestion_labels.value |
원시 로그의 content.fields.evt.res 값이 이 UDM 필드에 직접 매핑됩니다. |
content.fields.evt.type |
read_only_udm.metadata.event_type |
원시 로그의 content.fields.evt.type 값이 이 UDM 필드에 직접 매핑됩니다. |
content.fields.falco.rule |
read_only_udm.security_result.rule_name |
원시 로그의 content.fields.falco.rule 값이 이 UDM 필드에 직접 매핑됩니다. content.ruleName 가 비어 있는 경우에 사용됩니다. |
content.fields.group.gid |
read_only_udm.target.group.product_object_id |
원시 로그의 content.fields.group.gid 값이 이 UDM 필드에 직접 매핑됩니다. |
content.fields.group.name |
read_only_udm.target.group.group_display_name |
원시 로그의 content.fields.group.name 값이 이 UDM 필드에 직접 매핑됩니다. |
content.fields.proc.cmdline |
read_only_udm.target.process.command_line |
원시 로그의 content.fields.proc.cmdline 값이 이 UDM 필드에 직접 매핑됩니다. |
content.fields.proc.pcmdline |
read_only_udm.target.process.parent_process.command_line |
원시 로그의 content.fields.proc.pcmdline 값이 이 UDM 필드에 직접 매핑됩니다. |
content.fields.proc.pid |
read_only_udm.target.process.pid |
원시 로그의 content.fields.proc.pid 값이 이 UDM 필드에 직접 매핑됩니다. |
content.fields.proc.ppid |
read_only_udm.target.process.parent_process.pid |
원시 로그의 content.fields.proc.ppid 값이 이 UDM 필드에 직접 매핑됩니다. |
content.fields.proc.sid |
키가 sid 인 경우 read_only_udm.metadata.ingestion_labels.value |
원시 로그의 content.fields.proc.sid 값이 이 UDM 필드에 직접 매핑됩니다. |
content.fields.user.loginname |
read_only_udm.principal.user.user_display_name |
원시 로그의 content.fields.user.loginname 값이 이 UDM 필드에 직접 매핑됩니다. |
content.fields.user.uid |
read_only_udm.principal.user.userid |
원시 로그의 content.fields.user.uid 값이 이 UDM 필드에 직접 매핑됩니다. |
content.output |
키가 content_output 인 경우 read_only_udm.additional.fields.value.string_value |
원시 로그의 content.output 값이 이 UDM 필드에 직접 매핑됩니다. |
content.policyId |
read_only_udm.security_result.rule_id |
원시 로그의 content.policyId 값이 이 UDM 필드에 직접 매핑됩니다. |
content.policyOrigin |
키가 content_policyOrigin 인 경우 read_only_udm.additional.fields.value.string_value |
원시 로그의 content.policyOrigin 값이 이 UDM 필드에 직접 매핑됩니다. |
content.policyVersion |
키가 content_policyVersion 인 경우 read_only_udm.additional.fields.value.string_value |
원시 로그의 content.policyVersion 값이 이 UDM 필드에 직접 매핑됩니다. |
content.ruleName |
read_only_udm.security_result.rule_name |
원시 로그의 content.ruleName 값이 이 UDM 필드에 직접 매핑됩니다. |
content.ruleTags |
read_only_udm.security_result.rule_labels |
원시 로그의 content.ruleTags 배열에 있는 값은 이 UDM 필드에 매핑되며 키는 'ruletag_index'로 동적으로 생성됩니다. |
content.ruleType |
키가 content_ruleType 인 경우 read_only_udm.additional.fields.value.string_value |
원시 로그의 content.ruleType 값이 이 UDM 필드에 직접 매핑됩니다. |
containerId |
read_only_udm.target.asset.asset_id |
원시 로그의 containerId 값 앞에 'container_id:'가 추가되고 이 UDM 필드에 매핑됩니다. |
description |
read_only_udm.metadata.description |
원시 로그의 description 값이 이 UDM 필드에 직접 매핑됩니다. |
id |
read_only_udm.metadata.product_log_id |
원시 로그의 id 값이 이 UDM 필드에 직접 매핑됩니다. |
labels.container.label.io.kubernetes.container.name |
키가 container_name 인 경우 read_only_udm.additional.fields.value.string_value |
원시 로그의 labels.container.label.io.kubernetes.container.name 값이 이 UDM 필드에 직접 매핑됩니다. |
labels.container.label.io.kubernetes.pod.name |
키가 pod_name 인 경우 read_only_udm.additional.fields.value.string_value |
원시 로그의 labels.container.label.io.kubernetes.pod.name 값이 이 UDM 필드에 직접 매핑됩니다. labels.kubernetes.pod.name 가 비어 있는 경우에 사용됩니다. |
labels.container.label.io.kubernetes.pod.namespace |
read_only_udm.principal.namespace |
원시 로그의 labels.container.label.io.kubernetes.pod.namespace 값이 이 UDM 필드에 직접 매핑됩니다. labels.kubernetes.namespace.name 가 비어 있는 경우에 사용됩니다. |
labels.aws.instanceId |
read_only_udm.target.resource.product_object_id |
원시 로그의 labels.aws.instanceId 값이 이 UDM 필드에 직접 매핑됩니다. |
labels.aws.region |
read_only_udm.target.resource.attribute.cloud.availability_zone |
원시 로그의 labels.aws.region 값이 이 UDM 필드에 직접 매핑됩니다. |
labels.host.hostName |
read_only_udm.principal.ip 또는 read_only_udm.principal.hostname |
값에 'ip'가 포함된 경우 IP 주소로 파싱되고 principal.ip 에 매핑됩니다. 그렇지 않으면 principal.hostname 에 매핑됩니다. |
labels.host.mac |
read_only_udm.principal.mac |
원시 로그의 labels.host.mac 값이 이 UDM 필드에 직접 매핑됩니다. machineId 가 비어 있는 경우에 사용됩니다. |
labels.kubernetes.cluster.name |
키가 kubernetes_cluster_name 인 경우 read_only_udm.additional.fields.value.string_value |
원시 로그의 labels.kubernetes.cluster.name 값이 이 UDM 필드에 직접 매핑됩니다. |
labels.kubernetes.deployment.name |
키가 kubernetes_deployment_name 인 경우 read_only_udm.additional.fields.value.string_value |
원시 로그의 labels.kubernetes.deployment.name 값이 이 UDM 필드에 직접 매핑됩니다. |
labels.kubernetes.namespace.name |
read_only_udm.principal.namespace |
원시 로그의 labels.kubernetes.namespace.name 값이 이 UDM 필드에 직접 매핑됩니다. |
labels.kubernetes.node.name |
키가 kubernetes_node_name 인 경우 read_only_udm.additional.fields.value.string_value |
원시 로그의 labels.kubernetes.node.name 값이 이 UDM 필드에 직접 매핑됩니다. |
labels.kubernetes.pod.name |
키가 pod_name 인 경우 read_only_udm.additional.fields.value.string_value |
원시 로그의 labels.kubernetes.pod.name 값이 이 UDM 필드에 직접 매핑됩니다. |
labels.kubernetes.service.name |
키가 kubernetes_service_name 인 경우 read_only_udm.additional.fields.value.string_value |
원시 로그의 labels.kubernetes.service.name 값이 이 UDM 필드에 직접 매핑됩니다. |
machineId |
read_only_udm.principal.mac |
원시 로그의 machineId 값이 이 UDM 필드에 직접 매핑됩니다. |
name |
read_only_udm.security_result.summary |
원시 로그의 name 값이 이 UDM 필드에 직접 매핑됩니다. |
severity |
read_only_udm.security_result.severity |
원시 로그의 severity 값은 다음 범위를 기준으로 문자열 값에 매핑됩니다. <4 = HIGH, >3 및 <6 = MEDIUM, 6 = LOW, 7 = INFORMATIONAL |
source |
read_only_udm.security_result.description |
원시 로그의 source 값이 이 UDM 필드에 직접 매핑됩니다. |
timestampRFC3339Nano |
read_only_udm.metadata.event_timestamp |
원시 로그의 timestampRFC3339Nano 값은 타임스탬프로 파싱되고 이 UDM 필드에 매핑됩니다. |
type |
read_only_udm.metadata.product_event_type |
원시 로그의 type 값이 이 UDM 필드에 직접 매핑됩니다. |
(파서 로직) | read_only_udm.metadata.product_name |
'SYSDIG'로 하드코딩되었습니다. |
(파서 로직) | read_only_udm.metadata.vendor_name |
'SYSDIG'로 하드코딩되었습니다. |
(파서 로직) | read_only_udm.metadata.event_type |
기본적으로 'PROCESS_UNCATEGORIZED'로 설정되며 labels.host.hostName 가 비어 있으면 'GENERIC_EVENT'로 설정됩니다. |
(파서 로직) | read_only_udm.metadata.log_type |
'SYSDIG'로 하드코딩되었습니다. |
(파서 로직) | read_only_udm.target.resource.resource_type |
labels.aws.instanceId 가 있는 경우 'CLOUD_PROJECT'로 설정합니다. |
변경사항
2024-01-05
- 'severity'가 0, 1, 2, 3인 경우 'security_result.severity'의 매핑이 'LOW'에서 'HIGH'로 변경되었습니다.
- 'severity'가 6인 경우 'security_result.severity'의 매핑이 'HIGH'에서 'LOW'로 변경되었습니다.
- 'severity'가 7인 경우 'security_result.severity'의 매핑이 'HIGH'에서 'INFORMATIONAL'로 변경되었습니다.
- JSON 형식이 아닌 로그에 'drop'을 추가했습니다.
- 'timestampRFC3339Nano' 날짜 매핑에 'on_error'가 추가되었습니다.
2022-10-07
- 파서를 새로 만들었습니다.