GitLab 로그 수집
개요
이 파서는 GitLab JSON 로그에서 필드를 추출하고, 통합 데이터 모델 (UDM)로 정규화하고, 추가 컨텍스트로 데이터를 보강합니다. 사용자 작업, 리소스 액세스, 보안 결과에 중점을 두면서 네트워크 및 애플리케이션 관련 정보도 처리합니다. 파서는 GitLab 내의 역할과 작업을 기반으로 로직을 실행하여 이벤트를 분류하고 적절한 심각도를 할당합니다.
시작하기 전에
다음 기본 요건이 충족되었는지 확인합니다.
- Google SecOps 인스턴스
- GitLab에 대한 액세스 권한
피드 설정
피드를 구성하려면 다음 단계를 따르세요.
- SIEM 설정 > 피드로 이동합니다.
- 새 피드 추가를 클릭합니다.
- 다음 페이지에서 단일 피드 구성을 클릭합니다.
- 피드 이름 필드에 피드 이름을 입력합니다 (예: GitLab 로그).
- 소스 유형으로 웹훅을 선택합니다.
- 로그 유형으로 Gitlab을 선택합니다.
- 다음을 클릭합니다.
- 선택사항: 다음 입력 파라미터의 값을 지정합니다.
- 분할 구분 기호: 로그 줄을 구분하는 데 사용되는 구분 기호입니다(예:
\n
). - 애셋 네임스페이스: 애셋 네임스페이스입니다.
- 수집 라벨: 이 피드의 이벤트에 적용된 라벨입니다.
- 분할 구분 기호: 로그 줄을 구분하는 데 사용되는 구분 기호입니다(예:
- 다음을 클릭합니다.
- 확정 화면에서 피드 구성을 검토한 다음 제출을 클릭합니다.
- 보안 비밀 키 생성을 클릭하여 이 피드를 인증하기 위한 보안 비밀 키를 생성합니다.
- 비밀 키를 복사하여 저장합니다. 이 보안 비밀 키는 다시 볼 수 없습니다. 필요한 경우 새 보안 비밀 키를 재생성할 수 있지만 이 작업으로 인해 이전 보안 비밀 키는 더 이상 사용할 수 없게 됩니다.
- 세부정보 탭의 엔드포인트 정보 필드에서 피드 엔드포인트 URL을 복사합니다. 클라이언트 애플리케이션에서 이 엔드포인트 URL을 지정해야 합니다.
- 완료를 클릭합니다.
웹훅 피드에 대한 API 키 만들기
Google Cloud 콘솔 > 사용자 인증 정보로 이동합니다.
사용자 인증 정보 만들기를 클릭한 후 API 키를 선택합니다.
Chronicle API에 대한 API 키 액세스를 제한합니다.
엔드포인트 URL 지정
- 클라이언트 애플리케이션에서 웹훅 피드에 제공된 HTTPS 엔드포인트 URL을 지정합니다.
다음 형식의 커스텀 헤더의 일부로 API 키와 보안 비밀 키를 지정하여 인증을 사용 설정합니다.
X-goog-api-key = API_KEY X-Webhook-Access-Key = SECRET
권장사항: URL에 지정하는 대신 API 키를 헤더로 지정하세요. 웹훅 클라이언트가 커스텀 헤더를 지원하지 않는 경우 쿼리 파라미터를 다음 형식으로 사용하여 API 키와 보안 비밀 키를 지정할 수 있습니다.
ENDPOINT_URL?key=API_KEY&secret=SECRET
다음을 바꿉니다.
ENDPOINT_URL
: 피드 엔드포인트 URL입니다.API_KEY
: Google Security Operations에 인증하기 위한 API 키입니다.SECRET
: 피드를 인증하기 위해 생성한 보안 비밀 키입니다.
Google SecOps용 GitLab에서 웹훅 구성
- 웹브라우저를 열고 웹훅을 구성할 GitLab 프로젝트로 이동합니다.
- 프로젝트에서 설정 > 웹훅으로 이동합니다.
- 새 웹훅 추가를 클릭합니다.
- URL 필드에 Google SecOps 엔드포인트 URL을 붙여넣습니다.
- 맞춤 헤더 추가를 클릭합니다.
- 헤더 이름 필드에 X-Webhook-Access-Key를 입력합니다.
- 헤더 값 필드에 Google SecOps 피드 구성 중에 생성된 보안 비밀 키를 복사합니다.
- 맞춤 헤더 추가를 클릭합니다.
- 헤더 이름 필드에 X-goog-api-key를 입력합니다.
- 헤더 값 필드에 Google SecOps 피드 구성 중에 생성된 API 키를 복사합니다. 참고: 보안을 강화하려면 보안 토큰을 생성하여 GitLab 웹훅 구성과 해당 Google SecOps 피드 구성에 모두 추가하세요. 이렇게 하면 수신 웹훅의 신뢰성을 확인할 수 있습니다.
- 웹훅을 트리거해야 하는 GitLab 이벤트를 선택합니다. 예를 들어 코드가 저장소에 푸시될 때마다 Google SecOps로 데이터를 전송하려면 이벤트 푸시를 선택하면 됩니다. 보안 모니터링 요구사항과 관련된 이벤트를 신중하게 고려하세요. 이벤트가 너무 많으면 불필요한 부하가 발생할 수 있습니다.
- 웹훅의 목적을 더 잘 이해할 수 있도록 Google SecOps 웹훅과 같이 의미 있는 이름을 지정합니다.
- SSL 확인 사용 설정 체크박스가 선택되어 있는지 확인합니다. 이는 보안 통신에 매우 중요합니다.
- 웹훅 추가를 클릭하여 구성을 저장합니다.
UDM 매핑 테이블
로그 필드 | UDM 매핑 | 논리 |
---|---|---|
author_id |
principal.user.userid |
문자열로 변환되었습니다. |
author_name |
principal.user.email_addresses |
값이 이메일 주소 정규식과 일치하는 경우 |
author_name |
principal.user.user_display_name |
값이 이메일 주소 정규식과 일치하지 않는 경우 |
details.as |
principal.resource.attribute.labels |
'as' 키가 있는 라벨로 추가됩니다. |
details.add |
principal.resource.attribute.labels |
'add' 키가 있는 라벨로 추가됩니다. |
details.as |
principal.user.role_name |
원시 로그 필드 값입니다. |
details.as |
principal.user.attribute.roles.type |
details.as 이 'Owner'인 경우 'ADMINISTRATOR', details.as 이 'Developer', 'Maintainer' 또는 'Reporter'인 경우 'SERVICE_ACCOUNT', details.as 이 'Guest'인 경우 'TYPE_UNSPECIFIED'로 설정됩니다. |
details.custom_message |
security_result.description |
원시 로그 필드 값입니다. |
details.custom_message.action |
security_result.summary |
원시 로그 필드 값입니다. |
details.entity_path |
target.file.full_path |
원시 로그 필드 값입니다. |
details.target_id |
target.resource.id |
문자열로 변환되었습니다. |
entity_path |
target.file.full_path |
원시 로그 필드 값입니다. |
entity_type |
target.resource.attribute.labels |
'Entity Type' 키가 있는 라벨로 추가되었습니다. |
event_type |
metadata.product_event_type |
원시 로그 필드 값입니다. |
insertId |
metadata.product_log_id |
원시 로그 필드 값입니다. |
ip_address |
principal.ip , principal.asset.ip |
원시 로그 필드 값입니다. |
jsonPayload.action |
additional.fields |
키가 'action'이고 문자열 값이 있는 필드로 추가됩니다. |
jsonPayload.controller |
additional.fields |
키가 'controller'이고 문자열 값인 필드로 추가되었습니다. |
jsonPayload.correlation_id |
principal.asset_id |
'id: '가 앞에 붙습니다. |
jsonPayload.cpu_s |
additional.fields |
키가 'cpu_s'이고 문자열 값인 필드로 추가되었습니다. |
jsonPayload.details.custom_message.protocol |
network.application_protocol |
값이 'web'인 경우 'UNKNOWN_APPLICATION_PROTOCOL'로 설정되고, 그렇지 않으면 대문자로 변환됩니다. 값이 'web'인 경우 'Application Protocol' 키가 있는 추가 필드로도 추가됩니다. |
jsonPayload.mem_total_bytes |
additional.fields |
키가 'mem_total_bytes'이고 문자열 값인 필드로 추가되었습니다. |
jsonPayload.meta_caller_id |
additional.fields |
키가 '발신자 ID'이고 문자열 값인 필드로 추가되었습니다. |
jsonPayload.meta_client_id |
target.user.userid |
원시 로그 필드 값입니다. |
jsonPayload.meta_feature_category |
additional.fields |
'기능 카테고리' 키와 문자열 값이 있는 필드로 추가되었습니다. |
jsonPayload.meta_remote_ip |
principal.ip , principal.asset.ip |
원시 로그 필드 값으로, JSON 배열로 파싱되어 IP 필드로 병합됩니다. |
jsonPayload.meta_user |
principal.user.userid |
jsonPayload.username 가 비어 있는 경우 대체로 사용됩니다. |
jsonPayload.method |
network.http.method |
원시 로그 필드 값입니다. |
jsonPayload.path |
target.process.file.full_path |
원시 로그 필드 값입니다. |
jsonPayload.pid |
target.process.pid |
문자열로 변환되었습니다. |
jsonPayload.remote_ip |
principal.ip , principal.asset.ip |
원시 로그 필드 값입니다. |
jsonPayload.request_urgency |
additional.fields |
키가 'Request Urgency'이고 문자열 값인 필드로 추가되었습니다. |
jsonPayload.severity |
security_result.severity |
값이 'INFO'인 경우 'INFORMATIONAL', 값이 'ERROR'인 경우 'ERROR', 값이 'NOTICE'인 경우 'MEDIUM'으로 설정됩니다. |
jsonPayload.status |
network.http.response_code |
'ACTIVE'가 아닌 경우 정수로 변환됩니다. |
jsonPayload.ua |
network.http.user_agent |
원시 로그 필드 값입니다. |
jsonPayload.username |
principal.user.userid |
원시 로그 필드 값입니다. |
jsonPayload.worker_id |
principal.application |
원시 로그 필드 값입니다. |
labels.instance_name |
principal.hostname , principal.asset.hostname |
메시지에 '사용자 삭제'가 포함된 경우 사용되는 원시 로그 필드 값입니다. |
logName |
security_result.category_details |
원시 로그 필드 값입니다. |
message |
security_result.summary |
jsonPayload.severity 이 'ERROR'인 경우 사용되는 원시 로그 필드 값입니다. |
protoPayload.@type |
additional.fields |
키가 'protoPayload type'이고 문자열 값이 있는 필드로 추가됩니다. |
protoPayload.authenticationInfo.principalEmail |
principal.user.email_addresses , principal.user.userid |
원시 로그 필드 값입니다. |
protoPayload.authenticationInfo.principalSubject |
additional.fields |
키가 'authenticationInfo principalSubject'이고 문자열 값이 있는 필드로 추가되었습니다. |
protoPayload.authenticationInfo.serviceAccountKeyName |
additional.fields |
키가 'authenticationInfo serviceAccountKeyName'이고 문자열 값인 필드로 추가되었습니다. |
protoPayload.authorizationInfo |
target.resource.attribute.labels , security_result.action |
이 필드의 값은 'authenticationInfo'가 앞에 붙은 키가 있는 라벨로 추가됩니다. granted 내의 값이 true이면 security_result.action 가 'ALLOW'로 설정되고 false이면 'BLOCK'으로 설정됩니다. resourceAttributes 과 같은 중첩 필드도 'authenticationInfo_resourceAttributes'가 접두사로 붙은 키가 있는 라벨로 추가됩니다. |
protoPayload.methodName |
additional.fields |
키가 'protoPayload methodName'이고 문자열 값이 있는 필드로 추가되었습니다. |
protoPayload.request.@type |
additional.fields |
'요청 유형' 키와 문자열 값이 있는 필드로 추가되었습니다. |
protoPayload.request.resource |
target.resource.attribute.labels |
'요청 리소스' 키가 있는 라벨로 추가되었습니다. |
protoPayload.requestMetadata.callerIp |
additional.fields |
키가 'requestMetadata callerIp'이고 문자열 값인 필드로 추가되었습니다. |
protoPayload.requestMetadata.callerSuppliedUserAgent |
additional.fields |
키가 'requestMetadata callerSuppliedUserAgent'이고 문자열 값인 필드로 추가되었습니다. |
protoPayload.serviceName |
additional.fields |
키가 'serviceName'이고 문자열 값이 있는 필드로 추가됩니다. |
protoPayload.status.code |
additional.fields |
키가 'protoPayload status code'이고 문자열 값인 필드로 추가되었습니다. |
protoPayload.status.message |
additional.fields , target.user.email_addresses , target.user.userid |
키가 'protoPayload status message'이고 문자열 값인 필드로 추가되었습니다. 메일에서 이메일 주소를 추출할 수 있는 경우 target.user.email_addresses 및 target.user.userid 에 추가됩니다. |
receiveTimestamp |
metadata.event_timestamp , timestamp |
이벤트 타임스탬프로 파싱됩니다. |
resource.labels.project_id |
target.resource.attribute.labels |
'프로젝트 ID' 키가 있는 라벨로 추가되었습니다. |
resource.labels.zone |
target.cloud.availability_zone |
원시 로그 필드 값입니다. |
resource.type |
target.cloud.environment |
값이 'gce'와 일치하는 경우 'GOOGLE_CLOUD_PLATFORM'으로 설정합니다. |
security_result.action |
security_result.action |
protoPayload.authorizationInfo.granted 에서 파생됨 |
security_result.category_details |
security_result.category_details |
logName 와 병합되었습니다. |
security_result.description |
security_result.description |
jsonPayload.details.custom_message 에서 파생됨 |
security_result.severity |
security_result.severity |
severity 또는 jsonPayload.severity 에서 파생됩니다. |
security_result.summary |
security_result.summary |
jsonPayload.details.custom_message.action 또는 jsonPayload.message 에서 파생됩니다. |
severity |
security_result.severity |
값이 'INFO'인 경우 'INFORMATIONAL', 값이 'ERROR'인 경우 'ERROR', 값이 'NOTICE'인 경우 'MEDIUM'으로 설정됩니다. |
sourceLocation |
principal.resource.attribute.labels |
이 필드의 값은 라벨로 추가됩니다. |
target_details |
target.resource.attribute.labels |
'타겟 세부정보' 키가 있는 라벨로 추가되었습니다. |
target_type |
target.resource.attribute.labels |
'target type' 키가 있는 라벨로 추가됩니다. |
timestamp |
timestamp |
원시 로그 필드 값입니다. 주 필드와 타겟 필드의 존재 여부에 따라 설정됩니다. 특정 조건을 충족하지 않으면 기본값은 'GENERIC_EVENT'입니다. 가능한 값은 'USER_RESOURCE_UPDATE_CONTENT', 'USER_RESOURCE_ACCESS', 'USER_UNCATEGORIZED'입니다. 'GITLAB'으로 설정됩니다. 'GITLAB'으로 설정됩니다. |
도움이 더 필요하신가요? 커뮤니티 회원 및 Google SecOps 전문가로부터 답변을 받으세요.