GitLab 로그 수집

다음에서 지원:

개요

이 파서는 GitLab JSON 로그에서 필드를 추출하여 통합 데이터 모델 (UDM)로 정규화하고 추가 컨텍스트로 데이터를 보강합니다. 사용자 작업, 리소스 액세스, 보안 결과에 중점을 두고 다양한 GitLab 이벤트 유형을 처리하는 동시에 네트워크 및 애플리케이션 관련 정보를 처리합니다. 또한 파서는 GitLab 내 역할과 작업에 따라 로직을 실행하여 이벤트를 분류하고 적절한 심각도를 할당합니다.

시작하기 전에

  • Google SecOps 인스턴스가 있는지 확인합니다.
  • GitLab에 대한 액세스 권한이 있는지 확인합니다.

GitLab 로그를 수집하도록 Google SecOps에서 피드 구성

  1. SIEM 설정 > 피드로 이동합니다.
  2. 새로 추가를 클릭합니다.
  3. 피드 이름 필드에 피드 이름을 입력합니다 (예: GitLab 로그).
  4. 소스 유형으로 Webhook을 선택합니다.
  5. 로그 유형으로 Gitlab을 선택합니다.
  6. 다음을 클릭합니다.
  7. 선택사항: 다음 입력 매개변수의 값을 지정합니다.
    • 분할 구분 기호: 로그 줄을 구분하는 데 사용되는 구분 기호입니다(예: \n).
    • 애셋 네임스페이스: 애셋 네임스페이스입니다.
    • 수집 라벨: 이 피드의 이벤트에 적용된 라벨입니다.
  8. 다음을 클릭합니다.
  9. 확정 화면에서 피드 구성을 검토한 다음 제출을 클릭합니다.
  10. 보안 비밀 키 생성을 클릭하여 이 피드를 인증하기 위한 보안 비밀 키를 생성합니다.
  11. 비밀 키를 복사하여 저장합니다. 이 보안 비밀 키는 다시 볼 수 없습니다. 필요한 경우 새 보안 비밀 키를 재생성할 수 있지만 이 작업을 하면 이전 보안 비밀 키는 더 이상 사용할 수 없게 됩니다.
  12. 세부정보 탭의 엔드포인트 정보 필드에서 피드 엔드포인트 URL을 복사합니다. 클라이언트 애플리케이션에서 이 엔드포인트 URL을 지정해야 합니다.
  13. 완료를 클릭합니다.

웹훅 피드에 대한 API 키 만들기

  1. Google Cloud 콘솔 > 사용자 인증 정보로 이동합니다.

    사용자 인증 정보로 이동

  2. 사용자 인증 정보 만들기를 클릭한 후 API 키를 선택합니다.

  3. Google Security Operations API에 대한 API 키 액세스를 제한합니다.

엔드포인트 URL 지정

  1. 클라이언트 애플리케이션에서 웹훅 피드에 제공된 HTTPS 엔드포인트 URL을 지정합니다.
  2. 다음 형식의 커스텀 헤더의 일부로 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에서 웹훅 구성

  1. 웹브라우저를 열고 웹훅을 구성하려는 GitLab 프로젝트로 이동합니다.
  2. 프로젝트에서 설정 > Webhooks로 이동합니다.
  3. 새 웹훅 추가를 클릭합니다.
  4. URL 입력란에 Google SecOps 엔드포인트 URL을 붙여넣습니다.
  5. 맞춤 헤더 추가를 클릭합니다.
  6. Header Name(헤더 이름) 입력란에 X-Webhook-Access-Key를 입력합니다.
  7. Header Value(헤더 값) 필드에 Google SecOps 피드 구성 중에 생성된 보안 비밀 키를 복사합니다.
  8. 맞춤 헤더 추가를 클릭합니다.
  9. Header Name 입력란에 X-goog-api-key를 입력합니다.
  10. Header Value(헤더 값) 필드에 Google SecOps 피드 구성 중에 생성된 API 키를 복사합니다. 참고: 보안을 강화하려면 보안 토큰을 생성하여 GitLab webhook 구성과 해당하는 Google SecOps 피드 구성 모두에 추가하세요. 이렇게 하면 수신 webhook의 진위를 확인하는 데 도움이 됩니다.
  11. 웹훅을 트리거할 GitLab 이벤트를 선택합니다. 예를 들어 코드가 저장소에 푸시될 때마다 Google SecOps로 데이터를 전송하려면 이벤트 푸시를 선택할 수 있습니다. 보안 모니터링 요구사항과 관련된 이벤트를 신중하게 고려하세요. 이벤트가 너무 많으면 불필요한 부하가 발생할 수 있습니다.
  12. 웹훅의 목적을 더 잘 이해할 수 있도록 Google SecOps Webhook과 같이 의미 있는 이름을 지정하세요.
  13. SSL 인증 사용 설정 체크박스가 선택되어 있는지 확인합니다. 이는 보안 통신에 매우 중요합니다.
  14. 웹훅 추가를 클릭하여 구성을 저장합니다.

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.actiongranted 내 값이 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_addressestarget.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

  • 파서를 새로 만들었습니다.