Microsoft Azure 활동 로그 수집
다음에서 지원:
Google SecOps
SIEM
이 문서에서는 Microsoft Azure 활동 로그(AZURE_ACTIVITY
)를 Google Security Operations에 수집하는 데 필요한 단계를 설명합니다.
스토리지 계정 구성
스토리지 계정을 구성하려면 다음 단계를 완료합니다.
- Azure Console에서 스토리지 계정을 검색합니다.
- 만들기를 클릭합니다.
- 계정에 필요한 구독, 리소스 그룹, 리전, 성능(Standard 권장), 중복성(GRS 또는 LRS 권장)을 선택하고, 새 스토리지 계정의 이름을 입력합니다.
- 검토 + 만들기를 클릭하고 계정 개요를 검토하고 만들기를 클릭합니다.
- 스토리지 계정 개요 페이지의 창 왼쪽 탐색에서 액세스 키를 선택합니다.
- 키 표시를 클릭하고 스토리지 계정의 공유 키를 기록해 둡니다.
- 창 왼쪽 탐색에서 엔드포인트를 선택합니다.
- Blob 서비스 엔드포인트를 기록해 둡니다. (https://<storageaccountname>.blob.core.windows.net/)
Azure 활동 로깅 구성
Azure 활동 로깅을 구성하려면 다음 단계를 완료합니다.
- Azure Console에서 Monitor를 검색합니다.
- 페이지 왼쪽 탐색에서 활동 로그 링크를 클릭합니다.
- 창 상단에서 활동 로그 내보내기를 클릭합니다.
- 진단 설정 추가를 클릭합니다.
- Google SecOps에 내보내려는 모든 카테고리를 선택합니다.
- 대상 세부정보에서 스토리지 계정에 아카이브를 선택합니다.
- 이전 단계에서 만든 구독 및 스토리지 계정을 선택합니다.
- 저장을 클릭합니다.
피드 설정
Google SecOps 플랫폼에서 피드를 설정하는 방법은 두 가지입니다.
- SIEM 설정 > 피드 > 새 피드 추가
- 콘텐츠 허브 > 콘텐츠 팩 > 시작하기
Microsoft Azure 활동 피드를 설정하는 방법
- Azure 플랫폼 팩을 클릭합니다.
- Microsoft Azure 활동 피드를 찾습니다.
다음 필드의 값을 지정합니다.
- 소스 유형: Microsoft Azure Blob Storage V2
- Azure URI: 앞에서 기록한 Blob 서비스 엔드포인트 값을 insights-activity-logs를 서픽스로 추가하여 입력합니다 (예: https://acme-azure-chronicle.blob.core.windows.net/insights-activity-logs).
- 소스 삭제 옵션: 전송 후 파일과 디렉터리를 삭제할지 여부를 지정합니다.
- 최대 파일 기간: 지난 일수 동안 수정된 파일을 포함합니다. 기본값은 180일입니다.
- 공유 키: 앞에서 캡처한 공유 키 값을 입력합니다.
고급 옵션
- 피드 이름: 피드를 식별하는 미리 채워진 값입니다.
- 애셋 네임스페이스: 피드와 연결된 네임스페이스입니다.
- 수집 라벨: 이 피드의 모든 이벤트에 적용되는 라벨입니다.
피드 만들기를 클릭합니다.
이 제품군 내에서 다양한 로그 유형에 대해 여러 피드를 구성하는 방법에 관한 자세한 내용은 제품별 피드 구성을 참고하세요.
필드 매핑 참조
이 파서 코드는 먼저 많은 필드를 빈 문자열로 초기화한 다음 일련의 문자열 조작 및 JSON 파싱 작업을 실행하여 Azure 활동 로그 메시지에서 관련 정보를 추출합니다. 마지막으로 추출된 데이터를 통합 데이터 모델 (UDM) 필드에 매핑하여 이벤트 유형을 분류하고 심각도, 주체 정보, 네트워크 데이터와 같은 추가 세부정보로 보강합니다.
UDM 매핑 테이블
로그 필드 | UDM 매핑 | 논리 |
---|---|---|
카테고리 | read_only_udm.security_result.category_details |
원시 로그의 'category' 필드에서 직접 매핑됩니다. |
callerIpAddress | read_only_udm.principal.asset.ip , read_only_udm.principal.ip |
원시 로그의 'callerIpAddress' 필드에서 직접 매핑됩니다. |
correlationId | read_only_udm.security_result.detection_fields.correlationId |
원시 로그의 'correlationId' 필드에서 직접 매핑됩니다. |
data.callerIpAddress | read_only_udm.principal.asset.ip , read_only_udm.principal.ip |
원시 로그의 'data' 객체 내 'callerIpAddress' 필드에서 직접 매핑됩니다. |
data.correlationId | read_only_udm.security_result.detection_fields.correlationId |
원시 로그의 'data' 객체 내 'correlationId' 필드에서 직접 매핑됩니다. |
data.DeploymentUnit | read_only_udm.target.resource.name |
원시 로그의 'data' 객체 내 'DeploymentUnit' 필드에서 직접 매핑됩니다. |
data.details | read_only_udm.metadata.description |
'세부정보' 필드가 '알 수 없음'이 아닌 경우 원시 로그의 '데이터' 객체 내 '세부정보' 필드에서 직접 매핑됩니다. |
data.entity | read_only_udm.additional.fields.entity |
원시 로그의 'data' 객체 내 'entity' 필드에서 직접 매핑됩니다. |
data.EventName | read_only_udm.metadata.product_event_type |
원시 로그의 'data' 객체 내 'EventName' 필드에서 직접 매핑됩니다. |
data.hierarchy | read_only_udm.additional.fields.hierarchy |
원시 로그의 'data' 객체 내 'hierarchy' 필드에서 직접 매핑됩니다. |
data.identity.authorization.action | read_only_udm.security_result.detection_fields.action |
원시 로그의 'identity' 객체에 있는 'authorization' 객체의 'action' 필드에서 직접 매핑됩니다. |
data.identity.authorization.evidence.principalId | read_only_udm.principal.user.product_object_id , read_only_udm.principal.resource.product_object_id , read_only_udm.principal.group.product_object_id |
원시 로그의 'identity' 객체의 'authorization' 객체에 있는 'evidence' 객체의 'principalId' 필드에서 직접 매핑됩니다. 매핑되는 특정 UDM 필드는 'principalType' 필드의 값에 따라 달라집니다. 'principalType'이 'User' 또는 'ServicePrincipal'인 경우 principal.user.product_object_id 에 매핑됩니다. 'principalType'이 'Group'인 경우 principal.group.product_object_id 에 매핑됩니다. 'principalType'이 'ServicePrincipal'인 경우 principal.resource.product_object_id 에 매핑됩니다. |
data.identity.authorization.evidence.principalType | read_only_udm.principal.resource.resource_subtype |
원시 로그의 'identity' 객체의 'authorization' 객체의 'evidence' 객체 내 'principalType' 필드에서 직접 매핑됩니다. |
data.identity.authorization.evidence.role | read_only_udm.principal.user.role_name |
원시 로그의 'identity' 객체의 'authorization' 객체의 'evidence' 객체 내 'role' 필드에서 직접 매핑됩니다. |
data.identity.authorization.evidence.roleAssignmentId | read_only_udm.principal.resource.attribute.labels.roleAssignmentId |
원시 로그의 'identity' 객체의 'authorization' 객체의 'evidence' 객체 내 'roleAssignmentId' 필드에서 직접 매핑됩니다. |
data.identity.authorization.evidence.roleAssignmentScope | read_only_udm.principal.resource.attribute.labels.roleAssignmentScope |
원시 로그의 'identity' 객체의 'authorization' 객체의 'evidence' 객체 내 'roleAssignmentScope' 필드에서 직접 매핑됩니다. |
data.identity.authorization.evidence.roleDefinitionId | read_only_udm.principal.resource.attribute.labels.roleDefinitionId |
원시 로그의 'identity' 객체의 'authorization' 객체에 있는 'evidence' 객체의 'roleDefinitionId' 필드에서 직접 매핑됩니다. |
data.identity.authorization.scope | read_only_udm.security_result.detection_fields.scope |
원시 로그의 'identity' 객체에 있는 'authorization' 객체의 'scope' 필드에서 직접 매핑됩니다. |
data.identity.claims.aio | read_only_udm.security_result.detection_fields.aio |
원시 로그의 'identity' 객체에 있는 'claims' 객체의 'aio' 필드에서 직접 매핑됩니다. |
data.identity.claims.appid | read_only_udm.security_result.detection_fields.appid |
원시 로그의 'identity' 객체에 있는 'claims' 객체의 'appid' 필드에서 직접 매핑됩니다. |
data.identity.claims.appidacr | read_only_udm.security_result.detection_fields.appidacr |
원시 로그의 'identity' 객체에 있는 'claims' 객체의 'appidacr' 필드에서 직접 매핑됩니다. |
data.identity.claims.aud | read_only_udm.security_result.detection_fields.aud |
원시 로그의 'identity' 객체에 있는 'claims' 객체의 'aud' 필드에서 직접 매핑됩니다. |
data.identity.claims.exp | read_only_udm.security_result.detection_fields.exp |
원시 로그의 'identity' 객체에 있는 'claims' 객체의 'exp' 필드에서 직접 매핑됩니다. |
data.identity.claims.http://schemas.microsoft.com/identity/claims/identityprovider |
read_only_udm.security_result.detection_fields.identityprovider |
원시 로그의 'identity' 객체의 'claims' 객체 내 'http://schemas.microsoft.com/identity/claims/identityprovider' 필드에서 직접 매핑됩니다. |
data.identity.claims.http://schemas.microsoft.com/identity/claims/objectidentifier |
read_only_udm.security_result.detection_fields.objectidentifier |
원시 로그의 'identity' 객체에 있는 'claims' 객체의 'http://schemas.microsoft.com/identity/claims/objectidentifier' 필드에서 직접 매핑됩니다. |
data.identity.claims.http://schemas.microsoft.com/identity/claims/tenantid |
read_only_udm.security_result.detection_fields.tenantid |
원시 로그의 'identity' 객체에 있는 'claims' 객체의 'http://schemas.microsoft.com/identity/claims/tenantid' 필드에서 직접 매핑됩니다. |
data.identity.claims.http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier |
read_only_udm.security_result.detection_fields.nameidentifier |
원시 로그의 'identity' 객체에 있는 'claims' 객체의 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier' 필드에서 직접 매핑됩니다. |
data.identity.claims.iat | read_only_udm.security_result.detection_fields.iat |
원시 로그의 'identity' 객체에 있는 'claims' 객체의 'iat' 필드에서 직접 매핑됩니다. |
data.identity.claims.iss | read_only_udm.security_result.detection_fields.iss |
원시 로그의 'identity' 객체에 있는 'claims' 객체의 'iss' 필드에서 직접 매핑됩니다. |
data.identity.claims.nbf | read_only_udm.security_result.detection_fields.nbf |
원시 로그의 'identity' 객체에 있는 'claims' 객체의 'nbf' 필드에서 직접 매핑됩니다. |
data.identity.claims.rh | read_only_udm.security_result.detection_fields.rh |
원시 로그의 'identity' 객체 내 'claims' 객체의 'rh' 필드에서 직접 매핑됩니다. |
data.identity.claims.uti | read_only_udm.security_result.detection_fields.uti |
원시 로그의 'identity' 객체에 있는 'claims' 객체의 'uti' 필드에서 직접 매핑됩니다. |
data.identity.claims.ver | read_only_udm.security_result.detection_fields.ver |
원시 로그의 'identity' 객체에 있는 'claims' 객체의 'ver' 필드에서 직접 매핑됩니다. |
data.identity.claims.xms_tcdt | read_only_udm.security_result.detection_fields.xms_tcdt |
원시 로그의 'identity' 객체에 있는 'claims' 객체의 'xms_tcdt' 필드에서 직접 매핑됩니다. |
data.identity.UserName | read_only_udm.principal.user.user_display_name |
원시 로그의 'identity' 객체 내 'UserName' 필드에서 직접 매핑됩니다. |
data.level | read_only_udm.security_result.severity , read_only_udm.security_result.severity_details |
원시 로그의 'data' 객체 내 'level' 필드에서 직접 매핑됩니다. 'level' 필드는 severity 필드의 값을 결정하는 데도 사용됩니다. 'level'이 'Information' 또는 'Informational'인 경우 severity 은 'INFORMATIONAL'로 설정됩니다. 'level'이 'Warning'이면 severity 이 'MEDIUM'으로 설정됩니다. 'level'이 'Error'인 경우 severity 이 'ERROR'로 설정됩니다. 'level'이 'Critical'인 경우 severity 이 'CRITICAL'로 설정됩니다. |
data.location | read_only_udm.target.location.name |
원시 로그의 'data' 객체 내 'location' 필드에서 직접 매핑됩니다. |
data.operationName | read_only_udm.metadata.product_event_type |
원시 로그의 'data' 객체 내 'operationName' 필드에서 직접 매핑됩니다. |
data.properties.EventChannel | read_only_udm.additional.fields.properties EventChannel |
원시 로그의 'data' 객체에 있는 'properties' 객체의 'EventChannel' 필드에서 직접 매핑됩니다. |
data.properties.EventSource | read_only_udm.additional.fields.properties EventSource |
원시 로그의 'data' 객체에 있는 'properties' 객체의 'EventSource' 필드에서 직접 매핑됩니다. |
data.properties.EventId | read_only_udm.metadata.product_log_id |
원시 로그의 'data' 객체에 있는 'properties' 객체의 'EventId' 필드에서 직접 매핑됩니다. |
data.properties.eventProperties.cause | read_only_udm.security_result.detection_fields.cause |
원시 로그의 'data' 객체에 있는 'properties' 객체의 'eventProperties' 객체 내 'cause' 필드에서 직접 매핑됩니다. |
data.properties.eventProperties.clientIPAddress | read_only_udm.principal.asset.ip , read_only_udm.principal.ip |
원시 로그의 'data' 객체에 있는 'properties' 객체의 'eventProperties' 객체에 있는 'clientIPAddress' 필드에서 직접 매핑됩니다. |
data.properties.eventProperties.compromisedHost | read_only_udm.principal.asset.hostname , read_only_udm.principal.hostname |
원시 로그의 'data' 객체에 있는 'properties' 객체의 'eventProperties' 객체에 있는 'compromisedHost' 필드에서 직접 매핑됩니다. |
data.properties.eventProperties.currentHealthStatus | read_only_udm.security_result.detection_fields.currentHealthStatus |
원시 로그의 'data' 객체에 있는 'properties' 객체의 'eventProperties' 객체에 있는 'currentHealthStatus' 필드에서 직접 매핑됩니다. |
data.properties.eventProperties.previousHealthStatus | read_only_udm.security_result.detection_fields.previousHealthStatus |
원시 로그의 'data' 객체에 있는 'properties' 객체의 'eventProperties' 객체에 있는 'previousHealthStatus' 필드에서 직접 매핑됩니다. |
data.properties.eventProperties.type | read_only_udm.security_result.detection_fields.type |
원시 로그의 'data' 객체에 있는 'properties' 객체의 'eventProperties' 객체 내 'type' 필드에서 직접 매핑됩니다. |
data.properties.eventProperties.User | read_only_udm.principal.user.userid |
원시 로그의 'data' 객체의 'properties' 객체에 있는 'eventProperties' 객체의 'User' 필드에서 직접 매핑됩니다. |
data.properties.eventProperties.userName | read_only_udm.principal.user.user_display_name |
'SECURE\' 접두사를 삭제한 후 원시 로그의 'data' 객체의 'properties' 객체의 'eventProperties' 객체 내 'userName' 필드에서 직접 매핑됩니다. |
data.properties.ipAddress | read_only_udm.principal.asset.ip , read_only_udm.principal.ip |
원시 로그의 'data' 객체에 있는 'properties' 객체의 'ipAddress' 필드에서 직접 매핑됩니다. |
data.properties.legacyChannels | read_only_udm.security_result.detection_fields.legacyChannels |
원시 로그의 'data' 객체 내 'properties' 객체의 'legacyChannels' 필드에서 직접 매핑됩니다. |
data.properties.legacyEventDataId | read_only_udm.security_result.detection_fields.legacyEventDataId |
원시 로그의 'data' 객체에 있는 'properties' 객체의 'legacyEventDataId' 필드에서 직접 매핑됩니다. |
data.properties.legacyResourceId | read_only_udm.security_result.detection_fields.legacyResourceId |
원시 로그의 'data' 객체에 있는 'properties' 객체의 'legacyResourceId' 필드에서 직접 매핑됩니다. |
data.properties.legacyResourceGroup | read_only_udm.security_result.detection_fields.legacyResourceGroup |
원시 로그의 'data' 객체에 있는 'properties' 객체의 'legacyResourceGroup' 필드에서 직접 매핑됩니다. |
data.properties.legacyResourceProviderName | read_only_udm.security_result.detection_fields.legacyResourceProviderName |
원시 로그의 'data' 객체에 있는 'properties' 객체의 'legacyResourceProviderName' 필드에서 직접 매핑됩니다. |
data.properties.legacyResourceType | read_only_udm.security_result.detection_fields.legacyResourceType |
원시 로그의 'data' 객체에 있는 'properties' 객체의 'legacyResourceType' 필드에서 직접 매핑됩니다. |
data.properties.legacySubscriptionId | read_only_udm.security_result.detection_fields.legacySubscriptionId |
원시 로그의 'data' 객체에 있는 'properties' 객체의 'legacySubscriptionId' 필드에서 직접 매핑됩니다. |
data.properties.operationId | read_only_udm.security_result.detection_fields.operationId |
원시 로그의 'data' 객체에 있는 'properties' 객체의 'operationId' 필드에서 직접 매핑됩니다. |
data.properties.result | read_only_udm.security_result.action_details |
원시 로그의 'data' 객체에 있는 'properties' 객체의 'result' 필드에서 직접 매핑됩니다. |
data.properties.statusCode | read_only_udm.network.http.response_code |
원시 로그의 'data' 객체 내 'properties' 객체의 'statusCode' 필드에서 직접 매핑됩니다. |
data.properties.suspiciousCommandLine | read_only_udm.target.process.command_line |
원시 로그의 'data' 객체에 있는 'properties' 객체의 'suspiciousCommandLine' 필드에서 직접 매핑됩니다. |
data.properties.suspiciousProcess | read_only_udm.target.process.file.full_path |
원시 로그의 'data' 객체에 있는 'properties' 객체의 'suspiciousProcess' 필드에서 직접 매핑됩니다. |
data.properties.suspiciousProcessId | read_only_udm.target.process.pid |
원시 로그의 'data' 객체에 있는 'properties' 객체의 'suspiciousProcessId' 필드에서 직접 매핑됩니다. |
data.properties.tlsVersion | read_only_udm.network.tls.version |
원시 로그의 'data' 객체에 있는 'properties' 객체의 'tlsVersion' 필드에서 직접 매핑됩니다. |
data.properties.userAgent | read_only_udm.network.http.user_agent , read_only_udm.network.http.parsed_user_agent |
원시 로그의 'data' 객체에 있는 'properties' 객체의 'userAgent' 필드에서 직접 매핑됩니다. |
data.properties.userAgentHeader | read_only_udm.network.http.user_agent , read_only_udm.network.http.parsed_user_agent |
원시 로그의 'data' 객체에 있는 'properties' 객체의 'userAgentHeader' 필드에서 직접 매핑됩니다. |
data.properties.userId | read_only_udm.target.user.product_object_id |
원시 로그의 'data' 객체에 있는 'properties' 객체의 'userId' 필드에서 직접 매핑됩니다. |
data.ReleaseVersion | read_only_udm.metadata.product_version |
원시 로그의 'data' 객체 내 'ReleaseVersion' 필드에서 직접 매핑됩니다. |
data.resourceId | read_only_udm.target.resource.name |
원시 로그의 'data' 객체 내 'resourceId' 필드에서 직접 매핑됩니다. |
data.resourceType | read_only_udm.additional.fields.resourceType |
원시 로그의 'data' 객체 내 'resourceType' 필드에서 직접 매핑됩니다. |
data.resultDescription | read_only_udm.metadata.description |
원시 로그의 'data' 객체 내 'resultDescription' 필드에서 직접 매핑됩니다. |
data.resultSignature | read_only_udm.additional.fields.resultSignature |
원시 로그의 'data' 객체 내 'resultSignature' 필드에서 직접 매핑됩니다. |
data.resultType | read_only_udm.security_result.action_details , read_only_udm.additional.fields.resultType |
원시 로그의 'data' 객체 내 'resultType' 필드에서 직접 매핑됩니다. |
data.RoleLocation | read_only_udm.target.location.name |
원시 로그의 'data' 객체 내 'RoleLocation' 필드에서 직접 매핑됩니다. |
data.time | read_only_udm.metadata.event_timestamp |
원시 로그의 'data' 객체 내 'time' 필드가 파싱되어 타임스탬프가 추출되고, 이 타임스탬프는 event_timestamp 에 매핑됩니다. |
data.uri | read_only_udm.network.http.referral_url |
원시 로그의 'data' 객체 내 'uri' 필드에서 직접 매핑됩니다. |
read_only_udm.extensions.auth.mechanism |
INTERACTIVE |
원시 로그의 'data' 객체 내 'properties' 객체의 'isInteractive' 필드가 'true'인 경우 'INTERACTIVE'로 설정됩니다. 그렇지 않으면 'MECHANISM_OTHER'로 설정됩니다. |
read_only_udm.extensions.auth.type |
MACHINE |
원시 로그의 'category' 필드가 'NonInteractiveUserSignInLogs', 'ManagedIdentitySignInLogs' 또는 'ServicePrincipalSignInLogs'인 경우 'MACHINE'으로 설정됩니다. |
read_only_udm.metadata.log_type |
AZURE_ACTIVITY |
'AZURE_ACTIVITY'로 하드코딩됩니다. |
read_only_udm.metadata.vendor_name |
Microsoft |
'Microsoft'로 하드코딩됩니다. |
read_only_udm.principal.platform |
WINDOWS , MAC , LINUX , ANDROID |
'properties.test.deviceDetail.operatingSystem' 필드의 값을 기반으로 결정됩니다. 'Win'이 포함되어 있으면 platform 이 'WINDOWS'로 설정됩니다. 'Mac'이 포함된 경우 platform 이 'MAC'으로 설정됩니다. 'Lin'이 포함된 경우 platform 이 'LINUX'로 설정됩니다. 'Android'가 포함된 경우 platform 이 'ANDROID'로 설정됩니다. |
read_only_udm.principal.resource.type |
SERVICE_ACCOUNT , UNSPECIFIED |
'identity.authorization.evidence.principalType' 필드의 값을 기반으로 결정됩니다. 'ServicePrincipal'인 경우 type 이 'SERVICE_ACCOUNT'로 설정됩니다. 그렇지 않으면 'UNSPECIFIED'로 설정됩니다. |
read_only_udm.security_result.action |
ALLOW , BLOCK , UNKNOWN_ACTION |
'resultType', 'status_errorcode', 'statusText' 필드의 값을 기반으로 결정됩니다. 'resultType'이 'Success', 'success', 'Succeeded', 'Started', 'Resolved', 'Active', 'Updated', 'Start', 'Accept', 'Accepted', '0' 중 하나이거나 'status_errorcode'가 0이거나 'statusText'가 'Success'인 경우 action 이 'ALLOW'로 설정됩니다. 'resultType'이 'Failure' 또는 'Failed' 중 하나이거나 'status_errorcode'가 비어 있지 않거나 'resultType'이 비어 있지 않으면 action 이 'BLOCK'으로 설정됩니다. 그렇지 않으면 'UNKNOWN_ACTION'으로 설정됩니다. |
read_only_udm.target.cloud.environment |
MICROSOFT_AZURE |
'MICROSOFT_AZURE'로 하드코딩됩니다. |