Azure DevOps 감사 로그 수집

다음에서 지원:

개요

이 파서는 JSON 형식의 Azure DevOps 감사 로그를 처리합니다. 중첩된 JSON 구조와 최상위 JSON 구조에서 필드를 추출하여 UDM에 매핑합니다. 특정 필드 값을 기반으로 하는 조건부 로직은 이벤트를 분류하고 관련 보안 정보로 출력을 보강합니다. 파서는 grok 패턴을 사용하여 JSON 페이로드를 추출하려고 시도하여 JSON 형식 메시지가 아닌 메시지도 처리합니다.

시작하기 전에

다음 기본 요건이 충족되었는지 확인합니다.

  • Google SecOps 인스턴스
  • 활성 Azure DevOps 조직
  • Azure DevOps 조직 및 Azure에 대한 액세스 권한

피드 설정

Google SecOps 플랫폼에서 피드를 설정하는 방법은 두 가지입니다.

  • SIEM 설정 > 피드 > 새 피드 추가
  • 콘텐츠 허브 > 콘텐츠 팩 > 시작하기

Azure DevOps 감사 피드를 설정하는 방법

  1. Azure 플랫폼 팩을 클릭합니다.
  2. Azure DevOps 감사 로그 유형을 찾아 새 피드 추가를 클릭합니다.
  3. 다음 필드의 값을 지정합니다.

    • 소스 유형: Microsoft Azure Blob Storage V2
    • Azure URI: blob 엔드포인트 URL입니다.
      • ENDPOINT_URL/BLOB_NAME
        • 다음을 바꿉니다.
          • ENDPOINT_URL: blob 엔드포인트 URL (https://<storageaccountname>.blob.core.windows.net)
          • BLOB_NAME: Blob의 이름 (예: insights-logs-<logname>)
    • 소스 삭제 옵션: 수집 환경설정에 따라 삭제 옵션을 선택합니다.

    • 최대 파일 기간: 지난 일수 동안 수정된 파일을 포함합니다. 기본값은 180일입니다.

    • 공유 키: Azure 리소스에 액세스하는 데 사용되는 공유 키 (base-64 인코딩의 512비트 무작위 문자열)입니다.

    고급 옵션

    • 피드 이름: 피드를 식별하는 미리 채워진 값입니다.
    • 애셋 네임스페이스: 애셋 네임스페이스입니다.
    • 수집 라벨: 이 피드의 이벤트에 적용된 라벨입니다.
  4. 피드 만들기를 클릭합니다.

이 제품군 내에서 다양한 로그 유형에 대해 여러 피드를 구성하는 방법에 관한 자세한 내용은 제품별 피드 구성을 참고하세요.

웹훅 피드에 대한 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
    

    권장사항: URL에 지정하는 대신 API 키를 헤더로 지정하세요. 웹훅 클라이언트가 커스텀 헤더를 지원하지 않는 경우 쿼리 파라미터를 다음 형식으로 사용하여 API 키와 보안 비밀 키를 지정할 수 있습니다.

    ENDPOINT_URL?key=API_KEY&secret=SECRET
    

다음을 바꿉니다.

  • ENDPOINT_URL: 피드 엔드포인트 URL입니다.
  • API_KEY: Google Security Operations에 인증하기 위한 API 키입니다.
  • SECRET: 피드를 인증하기 위해 생성한 보안 비밀 키입니다.

Azure DevOps에서 감사 기능 구성

  1. 조직에 로그인합니다 (https://dev.azure.com/{yourorganization}).
  2. 조직 설정의 톱니바퀴 아이콘을 선택합니다.
  3. 보안에서 정책을 선택합니다.
  4. 감사 이벤트 로깅 버튼을 사용으로 전환합니다.

Azure에서 Event Grid 주제 구성

  1. Azure 포털에 로그인합니다.
  2. Event Grid를 검색하고 액세스합니다.
  3. 맞춤 이벤트에서 주제를 찾습니다.
  4. + 만들기를 클릭합니다.
  5. 구독리소스 그룹을 선택합니다. 이름 (예: DevopsAuditLog)을 제공하고 리전을 선택합니다. 검토 후 만들기를 클릭합니다.
  6. 주제에 액세스하고 주제 엔드포인트 URL을 복사합니다.
  7. 설정 > 액세스 키로 이동하여 키 1을 복사합니다.

Azure DevOps 로그 스트림을 Event Grid로 구성

  1. 조직에 로그인합니다 (https://dev.azure.com/{yourorganization}).
  2. 조직 설정의 톱니바퀴 아이콘을 선택합니다.
  3. 감사를 선택합니다.
  4. 스트림 탭으로 이동하여 새 스트림 > Event Grid를 선택합니다.
  5. Azure에서 Event Grid 주제 구성에서 만든 주제 엔드포인트액세스 키를 입력합니다.

Google SecOps용 Azure DevOps에서 웹훅 구성

  1. Azure 포털에서 Event Grid를 검색하여 액세스합니다.
  2. 이전에 만든 주제를 선택합니다.
  3. 엔티티 > 이벤트 구독으로 이동합니다.
  4. + 이벤트 구독을 클릭합니다.
  5. 설명이 포함된 이름 (예: *Google SecOps Integration)을 입력합니다.
  6. 웹훅을 선택하고 엔드포인트 구성을 클릭합니다.
  7. 엔드포인트를 구성합니다.
    1. 구독자 엔드포인트: Google SecOps API 엔드포인트 URL을 입력합니다.
    2. HTTP 헤더 섹션에서 다음 헤더를 추가합니다.
    3. Content-Type 헤더를 application/json로 설정합니다.
  8. 만들기를 클릭합니다.

UDM 매핑 테이블

로그 필드 UDM 매핑 논리
ActivityId metadata.product_log_id records 필드가 없는 경우 원시 로그의 Id 필드에서 직접 매핑되고, records이 있는 경우 data 객체 내의 ActivityId 필드에서 매핑됩니다.
ActionId metadata.product_event_type data 객체 내의 ActionId 필드에서 직접 매핑됩니다.
ActorCUID additional.fields 'Actor CUID' 키가 있는 추가 필드로 포함됩니다.
ActorDisplayName principal.user.user_display_name 'Azure DevOps Service'가 아닌 경우 ActorDisplayName 필드에서 직접 매핑됩니다. 'Azure DevOps Service'인 경우 principal.resource.attribute.labels에 라벨로 추가됩니다.
ActorUPN principal.user.email_addresses 이메일 주소 패턴과 일치하는 경우 ActorUPN 필드에서 직접 매핑됩니다.
ActorUserId principal.user.userid ActorUserId 필드에서 직접 매핑됩니다.
Area target.application Area 값에 'DevOps '를 추가하여 target.application 필드를 구성하는 데 사용됩니다.
AuthenticationMechanism extensions.auth.auth_details, security_result.rule_id 인증 세부정보와 규칙 ID를 추출하기 위해 파싱됩니다. 인증 세부정보가 extensions.auth.auth_details에 매핑됩니다. 추출된 규칙 ID는 security_result.rule_id에 매핑됩니다.
CategoryDisplayName security_result.action_details security_result.action_details에 직접 매핑됩니다.
City principal.location.city City 필드에서 직접 매핑됩니다.
Conditions additional.fields 'Conditions' 키가 있는 추가 필드로 추가되었습니다.
Country principal.location.country_or_region Country 필드에서 직접 매핑됩니다.
Data.* Various Data 객체 내의 필드는 이름과 컨텍스트에 따라 서로 다른 UDM 필드에 매핑됩니다. 구체적인 예는 아래를 참고하세요.
Data.AccessLevel target.resource.attribute.labels 'AccessLevel' 키가 있는 라벨로 추가됩니다.
Data.AgentId target.resource.product_object_id PipelineIdAuthorizationId가 없는 경우 target.resource.product_object_id에 매핑됩니다.
Data.AgentName target.resource.name PipelineName, NamespaceName, DisplayName가 없는 경우 target.resource.name에 매핑됩니다.
Data.AuthorizationId target.resource.product_object_id PipelineId이 없는 경우 target.resource.product_object_id에 매핑됩니다.
Data.CallerProcedure additional.fields 'CallerProcedure' 키가 있는 추가 필드로 추가되었습니다.
Data.CheckSuiteId additional.fields 키가 'CheckSuiteId'인 추가 필드로 추가되었습니다.
Data.CheckSuiteStatus additional.fields 'CheckSuiteStatus' 키가 있는 추가 필드로 추가되었습니다.
Data.ConnectionId additional.fields 키가 'ConnectionId'인 추가 필드로 추가되었습니다.
Data.ConnectionName additional.fields 키가 'ConnectionName'인 추가 필드로 추가됩니다.
Data.ConnectionType additional.fields 'ConnectionType' 키가 있는 추가 필드로 추가되었습니다.
Data.DefinitionId additional.fields 키가 'DefinitionId'인 추가 필드로 추가되었습니다.
Data.DeploymentResult additional.fields 'DeploymentResult' 키가 있는 추가 필드로 추가되었습니다.
Data.DisplayName target.resource.name PipelineNameNamespaceName가 없는 경우 target.resource.name에 매핑됩니다.
Data.EndpointIdList additional.fields 'EndpointIdList' 키가 있는 추가 필드로 추가되었습니다.
Data.EnvironmentName additional.fields 'EnvironmentName' 키가 있는 추가 필드로 추가되었습니다.
Data.Filter.continuationToken target.resource.attribute.labels 'continuation_token' 키가 있는 라벨로 추가됩니다.
Data.Filter.endTime target.resource.attribute.labels 'filter_end_time' 키가 있는 라벨로 추가됩니다.
Data.Filter.startTime target.resource.attribute.labels 'filter_start_time' 키가 있는 라벨로 추가되었습니다.
Data.FinishTime additional.fields 'FinishTime' 키가 있는 추가 필드로 추가되었습니다.
Data.GroupId target.group.product_object_id Data.Updates.0.GroupId이 없는 경우 target.group.product_object_id에 직접 매핑됩니다.
Data.GroupName target.group.group_display_name target.group.group_display_name에 직접 매핑됩니다.
Data.JobName additional.fields 키가 'JobName'인 추가 필드로 추가되었습니다.
Data.MemberId target.user.userid Data.Updates.0.MemberId이 없는 경우 target.user.userid에 직접 매핑됩니다.
Data.MemberDisplayName target.user.user_display_name target.user.user_display_name에 직접 매핑됩니다.
Data.NamespaceId target.resource.product_object_id PipelineId, AuthorizationId, AgentId가 없는 경우 target.resource.product_object_id에 매핑됩니다.
Data.NamespaceName target.resource.name PipelineName이 없는 경우 target.resource.name에 매핑됩니다.
Data.ownerDetails additional.fields 키가 'OwnerDetails'인 추가 필드로 추가되었습니다.
Data.OwnerId additional.fields 키가 'OwnerId'인 추가 필드로 추가되었습니다.
Data.PipelineId target.resource.product_object_id target.resource.product_object_id에 직접 매핑됩니다.
Data.PipelineName target.resource.name target.resource.name에 직접 매핑됩니다.
Data.PipelineRevision target.resource.attribute.labels 'PipelineRevision' 키가 있는 라벨로 추가되었습니다.
Data.PipelineScope target.resource.attribute.labels 'PipelineScope' 키가 있는 라벨로 추가되었습니다.
Data.PlanType additional.fields 'PlanType' 키가 있는 추가 필드로 추가되었습니다.
Data.PreviousAccessLevel target.resource.attribute.labels 'PreviousAccessLevel' 키가 있는 라벨로 추가됩니다.
Data.PublisherName target.resource.attribute.labels 'PublisherName' 키가 있는 라벨로 추가되었습니다.
Data.Reason additional.fields 키가 'Reason'인 추가 필드로 추가되었습니다.
Data.ReleaseId additional.fields 'ReleaseId' 키가 있는 추가 필드로 추가되었습니다.
Data.ReleaseName additional.fields 키가 'ReleaseName'인 추가 필드로 추가되었습니다.
Data.RequesterId additional.fields 'RequesterId' 키가 있는 추가 필드로 추가되었습니다.
Data.RetentionLeaseId additional.fields 키가 'RetentionLeaseId'인 추가 필드로 추가되었습니다.
Data.RetentionOwnerId additional.fields 키가 'RetentionOwnerId'인 추가 필드로 추가되었습니다.
Data.RunName additional.fields 'RunName' 키가 있는 추가 필드로 추가되었습니다.
Data.Scopes target.resource.attribute.labels '범위' 키가 있는 라벨로 추가되었습니다.
Data.StageName additional.fields 'StageName' 키가 있는 추가 필드로 추가되었습니다.
Data.StartTime additional.fields 키가 'StartTime'인 추가 필드로 추가되었습니다.
Data.TargetUser target.user.userid target.user.userid에 직접 매핑됩니다.
Data.Timestamp metadata.event_timestamp metadata.event_timestamp에 파싱되고 매핑됩니다.
Data.TokenType target.resource.attribute.labels 'TokenType' 키가 있는 라벨로 추가됩니다.
Data.Updates.0.GroupId target.group.product_object_id target.group.product_object_id에 직접 매핑됩니다.
Data.Updates.0.MemberId target.user.userid target.user.userid에 직접 매핑됩니다.
Data.ValidFrom target.resource.attribute.labels 'ValidFrom' 키가 있는 라벨로 추가됩니다.
Data.ValidTo target.resource.attribute.labels 'ValidTo' 키가 있는 라벨로 추가됩니다.
DewPoint additional.fields 'DewPoint' 키가 있는 추가 필드로 추가되었습니다.
Details metadata.description metadata.description에 직접 매핑됩니다.
Humidity additional.fields 'Humidity' 키가 있는 추가 필드로 추가되었습니다.
Icon additional.fields 키가 'Icon'인 추가 필드로 추가되었습니다.
Id metadata.product_log_id metadata.product_log_id에 직접 매핑됩니다.
IpAddress principal.ip principal.ip에 직접 매핑됩니다.
MoonPhase additional.fields 키가 'MoonPhase'인 추가 필드로 추가되었습니다.
Moonrise additional.fields 'Moonrise' 키가 있는 추가 필드로 추가되었습니다.
Moonset additional.fields 'Moonset' 키가 있는 추가 필드로 추가되었습니다.
OperationName metadata.product_event_type metadata.product_event_type에 직접 매핑됩니다.
Precipitation additional.fields 'Precipitation' 키가 있는 추가 필드로 추가되었습니다.
Pressure additional.fields 'Pressure' 키가 있는 추가 필드로 추가되었습니다.
ProjectId target.resource_ancestors.product_object_id 상위 요소가 CLOUD_PROJECT 유형인 경우 target.resource_ancestors 내의 product_object_id 필드를 채우는 데 사용됩니다.
ProjectName target.resource_ancestors.name, target.resource.attribute.labels 상위 요소가 CLOUD_PROJECT 유형인 경우 target.resource_ancestors 내의 name 필드를 채우는 데 사용됩니다. 키가 'ProjectName'인 target.resource.attribute.labels에 라벨로도 추가됩니다.
RoleLocation target.location.name target.location.name에 직접 매핑됩니다.
ScopeDisplayName target.resource_ancestors.name 상위 요소가 CLOUD_ORGANIZATION 유형인 경우 target.resource_ancestors 내의 name 필드를 채우는 데 사용됩니다.
ScopeId target.resource_ancestors.product_object_id 상위 요소가 CLOUD_ORGANIZATION 유형인 경우 target.resource_ancestors 내의 product_object_id 필드를 채우는 데 사용됩니다.
ScopeType additional.fields 키가 'ScopeType'인 추가 필드로 추가되었습니다.
Sunrise additional.fields 키가 'Sunrise'인 추가 필드로 추가되었습니다.
Sunset additional.fields 키가 'Sunset'인 추가 필드로 추가되었습니다.
Temperature additional.fields 'Temperature' 키가 있는 추가 필드로 추가되었습니다.
TenantId metadata.product_deployment_id, additional.fields metadata.product_deployment_id에 직접 매핑됩니다. 키가 'TenantId'인 추가 필드로도 추가되었습니다.
TimeGenerated metadata.event_timestamp metadata.event_timestamp에 파싱되고 매핑됩니다.
UserAgent network.http.user_agent, network.http.parsed_user_agent network.http.user_agent에 직접 매핑됩니다. network.http.parsed_user_agent에도 파싱되고 매핑됩니다.
UVIndex additional.fields 'UVIndex' 키가 있는 추가 필드로 추가되었습니다.
Visibility additional.fields 'Visibility' 키가 있는 추가 필드로 추가되었습니다.
WindDirection additional.fields 키가 'WindDirection'인 추가 필드로 추가되었습니다.
WindSpeed additional.fields 키가 'WindSpeed'인 추가 필드로 추가되었습니다.
_Internal_WorkspaceResourceId additional.fields 'workspace_resource_id' 키가 있는 추가 필드로 추가되었습니다.
해당 사항 없음 metadata.event_type OperationName 및 기타 필드를 기반으로 하는 논리에 따라 결정됩니다. 일치하는 특정 이벤트 유형이 없으면 기본값은 'GENERIC_EVENT'입니다. 가능한 값은 'STATUS_SHUTDOWN', 'RESOURCE_CREATION', 'STATUS_UPDATE', 'USER_RESOURCE_DELETION', 'RESOURCE_READ', 'RESOURCE_WRITTEN', 'RESOURCE_DELETION', 'GROUP_MODIFICATION'입니다.
해당 사항 없음 metadata.vendor_name 'Microsoft'로 설정됩니다.
해당 사항 없음 metadata.product_name 'Azure DevOps'로 설정합니다.
해당 사항 없음 metadata.log_type 'AZURE_DEVOPS'로 설정합니다.
해당 사항 없음 principal.user.account_type AuthenticationMechanism에 'ServicePrincipal'이 포함된 경우 'SERVICE_ACCOUNT_TYPE'으로 설정하고, 그렇지 않은 경우 'CLOUD_ACCOUNT_TYPE'으로 설정합니다.
해당 사항 없음 target.asset.attribute.cloud.environment MICROSOFT_AZURE로 설정합니다.
해당 사항 없음 security_result.action 작업이 성공한 경우 (Succeeded, Created, Modified, executed, updated, removed) 'ALLOW'로 설정하고 작업이 실패한 경우 (Failed, TimedOut) 'BLOCK'으로 설정합니다.
해당 사항 없음 extensions.auth.mechanism summary이 'UserAuthToken'인 경우 'USERNAME_PASSWORD'로 설정됩니다.
해당 사항 없음 target.resource.resource_type pipeline_id이 있으면 'SETTING', authorization_id이 있으면 'CREDENTIAL', agent_id이 있으면 'DEVICE', namespace_id이 있으면 'DATABASE'로 설정됩니다. 그렇지 않으면 operationName에 따라 일부 경우에 'STORAGE_BUCKET'으로 설정됩니다.
해당 사항 없음 target.resource.resource_subtype pipeline_id이 있으면 '파이프라인', authorization_id이 있으면 '토큰', agent_id이 있으면 '에이전트', namespace_id이 있으면 '네임스페이스'로 설정됩니다.

도움이 더 필요하신가요? 커뮤니티 회원 및 Google SecOps 전문가로부터 답변을 받으세요.