GitLab 로그 수집
다음에서 지원:
Google SecOps
SIEM
개요
이 파서는 GitLab JSON 로그에서 필드를 추출하여 통합 데이터 모델 (UDM)로 정규화하고 추가 컨텍스트로 데이터를 보강합니다. 사용자 작업, 리소스 액세스, 보안 결과에 중점을 두고 다양한 GitLab 이벤트 유형을 처리하는 동시에 네트워크 및 애플리케이션 관련 정보를 처리합니다. 또한 파서는 GitLab 내 역할과 작업에 따라 로직을 실행하여 이벤트를 분류하고 적절한 심각도를 할당합니다.
시작하기 전에
- Google SecOps 인스턴스가 있는지 확인합니다.
- GitLab에 대한 액세스 권한이 있는지 확인합니다.
GitLab 로그를 수집하도록 Google SecOps에서 피드 구성
- SIEM 설정 > 피드로 이동합니다.
- 새로 추가를 클릭합니다.
- 피드 이름 필드에 피드 이름을 입력합니다 (예: GitLab 로그).
- 소스 유형으로 Webhook을 선택합니다.
- 로그 유형으로 Gitlab을 선택합니다.
- 다음을 클릭합니다.
- 선택사항: 다음 입력 매개변수의 값을 지정합니다.
- 분할 구분 기호: 로그 줄을 구분하는 데 사용되는 구분 기호입니다(예:
\n
). - 애셋 네임스페이스: 애셋 네임스페이스입니다.
- 수집 라벨: 이 피드의 이벤트에 적용된 라벨입니다.
- 분할 구분 기호: 로그 줄을 구분하는 데 사용되는 구분 기호입니다(예:
- 다음을 클릭합니다.
- 확정 화면에서 피드 구성을 검토한 다음 제출을 클릭합니다.
- 보안 비밀 키 생성을 클릭하여 이 피드를 인증하기 위한 보안 비밀 키를 생성합니다.
- 비밀 키를 복사하여 저장합니다. 이 보안 비밀 키는 다시 볼 수 없습니다. 필요한 경우 새 보안 비밀 키를 재생성할 수 있지만 이 작업을 하면 이전 보안 비밀 키는 더 이상 사용할 수 없게 됩니다.
- 세부정보 탭의 엔드포인트 정보 필드에서 피드 엔드포인트 URL을 복사합니다. 클라이언트 애플리케이션에서 이 엔드포인트 URL을 지정해야 합니다.
- 완료를 클릭합니다.
웹훅 피드에 대한 API 키 만들기
Google Cloud 콘솔 > 사용자 인증 정보로 이동합니다.
사용자 인증 정보 만들기를 클릭한 후 API 키를 선택합니다.
Google Security Operations API에 대한 API 키 액세스를 제한합니다.
엔드포인트 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 Security Operations에 인증하기 위한 API 키입니다.SECRET
: 피드를 인증하기 위해 생성한 보안 비밀 키입니다.
Google SecOps용으로 GitLab에서 웹훅 구성
- 웹브라우저를 열고 웹훅을 구성하려는 GitLab 프로젝트로 이동합니다.
- 프로젝트에서 설정 > Webhooks로 이동합니다.
- 새 웹훅 추가를 클릭합니다.
- URL 입력란에 Google SecOps 엔드포인트 URL을 붙여넣습니다.
- 맞춤 헤더 추가를 클릭합니다.
- Header Name(헤더 이름) 입력란에 X-Webhook-Access-Key를 입력합니다.
- Header Value(헤더 값) 필드에 Google SecOps 피드 구성 중에 생성된 보안 비밀 키를 복사합니다.
- 맞춤 헤더 추가를 클릭합니다.
- Header Name 입력란에 X-goog-api-key를 입력합니다.
- Header Value(헤더 값) 필드에 Google SecOps 피드 구성 중에 생성된 API 키를 복사합니다. 참고: 보안을 강화하려면 보안 토큰을 생성하여 GitLab webhook 구성과 해당하는 Google SecOps 피드 구성 모두에 추가하세요. 이렇게 하면 수신 webhook의 진위를 확인하는 데 도움이 됩니다.
- 웹훅을 트리거할 GitLab 이벤트를 선택합니다. 예를 들어 코드가 저장소에 푸시될 때마다 Google SecOps로 데이터를 전송하려면 이벤트 푸시를 선택할 수 있습니다. 보안 모니터링 요구사항과 관련된 이벤트를 신중하게 고려하세요. 이벤트가 너무 많으면 불필요한 부하가 발생할 수 있습니다.
- 웹훅의 목적을 더 잘 이해할 수 있도록 Google SecOps Webhook과 같이 의미 있는 이름을 지정하세요.
- 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 이 '소유자'인 경우 'ADMINISTRATOR'로, details.as 이 '개발자', '관리자' 또는 '신고자'인 경우 'SERVICE_ACCOUNT'로, details.as 이 '게스트'인 경우 '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 |
'Caller 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'가 접두사로 추가된 키가 있는 라벨로 추가됩니다. security_result.action 는 granted 내 값이 true인 경우 'ALLOW'로, false인 경우 'BLOCK'로 설정됩니다. resourceAttributes 와 같은 중첩된 필드도 'authenticationInfo_resourceAttributes' 접두사가 있는 키가 있는 라벨로 추가됩니다. |
protoPayload.methodName |
additional.fields |
'protoPayload methodName' 키와 문자열 값을 가진 필드로 추가되었습니다. |
protoPayload.request.@type |
additional.fields |
'Request Type' 키와 문자열 값이 있는 필드로 추가되었습니다. |
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 상태 코드' 키와 문자열 값을 가진 필드로 추가되었습니다. |
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 |
'Project 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'로 설정합니다. |
변경사항
2024-04-08
- 'custom_message.action'이 'security_result.summary'에 매핑되었습니다.
- 'ip_address'가 'principal.ip'에 매핑되었습니다.
- 'applicationProtocol'이 'network.application_protocol'에 매핑되었습니다.
- 'details.author_name'이 'principal.user.email_addresses'에 매핑되었습니다.
- 'author_id'가 'principal.user.userid'에 매핑되었습니다.
- 'target_id'가 'target.resource.id'에 매핑되었습니다.
- 'details.entity_path'가 'target.file.full_path'에 매핑되었습니다.
- 'event_type'이 'product_event_type'에 매핑되었습니다.
- 'target_type', 'entity_type', 'target_details'가 'resource.attribute.labels'에 매핑되었습니다.
2023-10-20
- 'db_'로 시작하는 필드를 'additional_fields'에 매핑했습니다.
- 'redis_'로 시작하는 필드를 'additional_fields'에 매핑했습니다.
- 값이 'ERROR' 또는 'NOTICE'인 경우 'severity' 또는 'jsonPayload.severity'가 'security_result.severity'에 매핑되었습니다.
- 'jsonPayload.correlation_id'가 'principal.asset_id'에 매핑되었습니다.
- 'unmapped fields of jsonPayload'가 'additional_fields'에 매핑되었습니다.
- 'jsonPayload.worker_id'가 'principal.application'에 매핑되었습니다.
- 'jsonPayload.method'가 'network.http.method'에 매핑되었습니다.
- 'jsonPayload.pid'가 'target.process.pid'에 매핑되었습니다.
- 'jsonPayload.status'가 'network.http.response_code'에 매핑되었습니다.
- 'resource.labels.zone'이 'target.cloud.availability_zone'에 매핑되었습니다.
- 'resource.type'이 'target.cloud.environment'에 매핑되었습니다.
- 'jsonPayload.meta_user'가 'target.user.userid'에 매핑되었습니다.
- 'jsonPayload.username'이 'principal.user.userid'에 매핑되었습니다.
- 'jsonPayload.remote_ip'가 'principal.ip'에 매핑되었습니다.
- 'jsonPayload.ua'가 'network.http.user_agent'에 매핑되었습니다.
- 'jsonPayload.meta_client_id'가 'target.user.userid'에 매핑되었습니다.
- 'jsonPayload.path'가 'target.process.file.full_path'에 매핑되었습니다.
- 'protoPayload.authenticationInfo.principalEmail'이 'principal.user.email_addresses'에 매핑되었습니다.
- 'protoPayload'의 추가 필드를 'additional.fields'에 매핑했습니다.
- 'metadata.event_type'을 매핑하기 전에 필요한 매핑이 있는지 확인하는 조건부 검사를 제공했습니다.
2023-10-10
- 'jsonPayload.details.as'가 'principal.resource.attribute.labels' 및 'principal.user.role_name'에 매핑되었습니다.
- 'jsonPayload.details.as'가 'Owner'인 로그의 'principal_role.type'을 'ADMINISTRATOR'로 설정합니다.
- 'jsonPayload.details.as'가 'Developer', 'Maintainer' 또는 'Reporter'로 설정된 로그의 경우 'principal_role.type'을 'SERVICE_ACCOUNT'로 설정합니다.
- 'jsonPayload.details.as'가 'Guest'인 로그의 경우 'principal_role.type'을 'TYPE_UNSPECIFIED'로 설정합니다.
- 'jsonPayload.details.add'가 'principal.resource.attribute.labels'에 매핑되었습니다.
- 'jsonPayload.entity_type'이 'target.resource.attribute.labels'에 매핑되었습니다.
2023-08-31
- 파서를 새로 만들었습니다.