Microsoft Entra ID 로그인 로그 수집
이 문서에서는 Google Security Operations 피드를 설정하여 Microsoft Entra ID (이전의 Azure Active Directory) 로그인 로그를 수집하는 방법을 설명합니다. Azure Event Hub (권장) 또는 서드 파티 API의 두 가지 방법을 사용하여 수집을 구성할 수 있습니다.
시작하기 전에
다음 기본 요건이 충족되었는지 확인합니다.
- Google SecOps 인스턴스
- Microsoft Azure 포털에 대한 액세스 권한 관리
- Microsoft Entra ID의 보안 관리자 또는 전역 관리자 역할 (진단 설정에 필요)
- 서드 파티 API 메서드의 경우 관리자 동의를 부여하는 다음 역할 중 하나:
- 전체 관리자 - 모든 API의 모든 권한에 대해 동의를 부여할 수 있습니다.
- 독점 역할 관리자 - 모든 API의 모든 권한에 동의를 부여할 수 있습니다.
- 클라우드 애플리케이션 관리자 - Microsoft Graph 앱 역할 (애플리케이션 권한)을 제외한 모든 API의 모든 권한에 동의를 부여할 수 있습니다.
방법 1: Azure Event Hub (권장)
이 메서드는 캡처가 사용 설정된 Azure Event Hub를 통해 Entra ID 로그인 로그를 스트리밍하여 데이터를 Azure Blob Storage에 씁니다. 그러면 Google SecOps가 Azure Blob Storage V2 피드 유형을 사용하여 Blob Storage에서 로그를 수집합니다.
Azure 스토리지 계정 구성
스토리지 계정 만들기
- Azure 포털에서 스토리지 계정을 검색합니다.
- + 만들기를 클릭합니다.
다음 구성 세부정보를 제공합니다.
설정 값 구독 Azure 구독 선택 리소스 그룹 기존 항목 선택 또는 새로 만들기 스토리지 계정 이름 고유한 이름 (예: secopsaadsignin)을 입력합니다.리전 Event Hub 네임스페이스와 가장 가까운 리전을 선택합니다. 성능 표준 (권장) 중복성 LRS (로컬 중복 스토리지) 또는 GRS (지리적 중복 스토리지) 검토 + 만들기를 클릭합니다.
개요를 검토하고 만들기를 클릭합니다.
배포가 완료될 때까지 기다립니다.
스토리지 계정 사용자 인증 정보 가져오기
- 생성한 스토리지 계정으로 이동합니다.
- 왼쪽 탐색 메뉴의 보안 + 네트워킹에서 액세스 키를 선택합니다.
- 키 표시를 클릭합니다.
- 다음을 복사하여 저장합니다.
- 스토리지 계정 이름
- 키 1 또는 키 2: 공유 액세스 키입니다.
Event Hub 네임스페이스 및 Event Hub 만들기
Event Hub 네임스페이스 만들기
- Azure 포털에서 Event Hubs를 검색합니다.
- + 만들기를 클릭합니다.
다음 구성 세부정보를 제공합니다.
설정 값 구독 Azure 구독 선택 리소스 그룹 스토리지 계정과 동일한 리소스 그룹을 선택합니다. 네임스페이스 이름 고유한 이름 (예: secops-entraid-signin)을 입력합니다.위치 스토리지 계정과 동일한 리전을 선택합니다. 가격 책정 등급 표준 (Event Hub Capture에 필요) 검토 + 만들기를 클릭한 다음 만들기를 클릭합니다.
배포가 완료될 때까지 기다립니다.
Event Hub 만들기
- 만든 Event Hub 네임스페이스로 이동합니다.
- 상단에서 + Event Hub를 클릭합니다.
- 다음 구성 세부정보를 제공합니다.
- 이름: 이름을 입력합니다 (예:
entraid-signin-logs). - 파티션 수: 2 (기본값, 처리량을 높이려면 늘리세요).
- 삭제 정책: 삭제
- 보관 시간 (시간): 24 (최소, 복원력을 위해 필요한 경우 증가).
- 이름: 이름을 입력합니다 (예:
- 검토 + 만들기를 클릭한 다음 만들기를 클릭합니다.
Event Hub Capture 사용 설정
- 만든 Event Hub (네임스페이스 내)로 이동합니다.
- 왼쪽 탐색 메뉴에서 캡처를 선택합니다.
- 캡처를 사용으로 설정합니다.
다음 구성 세부정보를 제공합니다.
설정 값 기간 (분) 5 (거의 실시간의 경우 더 낮음) 크기 창 (MB) 300 캡처 제공자 Azure Blob Storage Azure 구독 구독 선택 스토리지 계정 생성한 스토리지 계정을 선택합니다. Blob 컨테이너 컨테이너 만들기 또는 선택 (예: entraid-signin-capture)저장을 클릭합니다.
Entra ID 진단 설정 구성
- Azure 포털에서 Microsoft Entra ID를 검색합니다.
- 왼쪽 탐색 메뉴에서 모니터링 및 상태 > 진단 설정으로 이동합니다.
- 진단 설정 추가를 클릭합니다.
- 다음 구성 세부정보를 제공합니다.
- 진단 설정 이름: 설명이 포함된 이름 (예:
signin-logs-to-eventhub)을 입력합니다. - 로그 섹션에서 내보낼 로그인 로그 카테고리를 선택합니다.
- SignInLogs - 대화형 사용자 로그인입니다.
- NonInteractiveUserSignInLogs - 비대화형 사용자 로그인 (선택사항, 권장).
- ServicePrincipalSignInLogs - 서비스 주 구성원 로그인 (선택사항).
- ManagedIdentitySignInLogs - 관리형 ID 로그인 (선택사항).
- 대상 세부정보 섹션에서 이벤트 허브로 스트리밍을 선택합니다.
- 구독: Event Hub 네임스페이스가 포함된 구독을 선택합니다.
- Event Hub 네임스페이스: 만든 네임스페이스를 선택합니다 (예:
secops-entraid-signin). - 이벤트 허브 이름: 생성한 이벤트 허브를 선택합니다 (예:
entraid-signin-logs). - 이벤트 허브 정책 이름: RootManageSharedAccessKey를 선택합니다.
- 진단 설정 이름: 설명이 포함된 이름 (예:
저장을 클릭합니다.
피드 설정
Google SecOps 플랫폼에서 피드를 설정하는 방법은 두 가지입니다.
- SIEM 설정 > 피드 > 새 피드 추가
- 콘텐츠 허브 > 콘텐츠 팩 > 시작하기
Entra ID 로그인 로그를 수집하도록 Google SecOps에서 피드 구성
- Azure 플랫폼 팩을 클릭합니다.
- Azure AD 로그 유형을 찾습니다.
다음 필드의 값을 지정합니다.
- 소스 유형: Microsoft Azure Blob Storage V2
Azure URI: 캡처 컨테이너 경로와 함께 Blob 서비스 엔드포인트 URL을 입력합니다.
https://<storage-account>.blob.core.windows.net/entraid-signin-capture/<storage-account>을 Azure 스토리지 계정 이름으로 바꿉니다.소스 삭제 옵션: 환경설정에 따라 삭제 옵션을 선택합니다.
- 삭제 안함: 전송 후 파일을 삭제하지 않습니다.
- 전송된 파일 삭제: 전송이 완료되면 파일을 삭제합니다.
- 전송된 파일 및 빈 디렉터리 삭제: 전송이 완료되면 파일과 빈 디렉터리를 삭제합니다.
최대 파일 기간: 지난 일수 동안 수정된 파일을 포함합니다. 기본값은 180일입니다.
공유 키: 스토리지 계정의 공유 액세스 키 값을 입력합니다.
애셋 네임스페이스: 애셋 네임스페이스입니다.
수집 라벨: 이 피드의 이벤트에 적용할 라벨입니다.
피드 만들기를 클릭합니다.
피드를 만든 후 로그가 Google SecOps에 표시되기까지 5~10분 정도 걸릴 수 있습니다.
이 제품군 내에서 다양한 로그 유형에 대해 여러 피드를 구성하는 방법에 관한 자세한 내용은 제품별 피드 구성을 참고하세요.
Google Security Operations 피드에 대한 자세한 내용은 Google Security Operations 피드 문서를 참조하세요. 각 피드 유형의 요구사항은 유형별 피드 구성을 참조하세요.
Azure Storage 방화벽 구성 (사용 설정된 경우)
Azure 스토리지 계정에서 방화벽을 사용하는 경우 Google SecOps IP 범위를 추가해야 합니다.
- Azure 포털에서 스토리지 계정으로 이동합니다.
- 보안 + 네트워킹에서 네트워킹을 선택합니다.
- 방화벽 및 가상 네트워크에서 선택한 가상 네트워크 및 IP 주소에서 사용 설정됨을 선택합니다.
- 방화벽 섹션의 주소 범위에서 + IP 범위 추가를 클릭합니다.
- 각 Google SecOps IP 범위를 CIDR 표기법으로 추가합니다.
- IP 허용 목록 문서를 참고하세요.
- 또는 피드 관리 API를 사용하여 프로그래매틱 방식으로 검색할 수 있습니다.
- 저장을 클릭합니다.
방법 2: 서드 파티 API
이 메서드는 Microsoft Graph API를 사용하여 Microsoft 테넌트에서 직접 Entra ID 로그인 로그를 가져옵니다.
IP 허용 목록 구성
피드를 만들기 전에 Microsoft Azure 네트워크 설정 또는 조건부 액세스 정책에서 Google SecOps IP 범위를 허용 목록에 추가해야 합니다.
Google SecOps IP 범위 가져오기
- SIEM 설정> 피드로 이동합니다.
- 새 피드 추가를 클릭합니다.
- 피드 생성 인터페이스에 표시된 IP 범위를 확인합니다.
- 또는 피드 관리 API를 사용하여 IP 범위를 프로그래매틱 방식으로 가져옵니다.
워크로드 아이덴티티에 대한 조건부 액세스 구성 (필요한 경우)
조직에서 위치별 액세스를 제한하는 조건부 액세스 정책을 사용하는 경우 다음 단계를 따르세요.
- Microsoft Entra 관리 센터에서 보호 > 조건부 액세스 > 명명된 위치로 이동합니다.
- + 새 위치를 클릭합니다.
- 다음 구성 세부정보를 제공합니다.
- 이름:
Google SecOps IP Ranges를 입력합니다. - 신뢰할 수 있는 위치로 표시: 선택사항이며 보안 정책에 따라 다릅니다.
- IP 범위: CIDR 표기법으로 각 Google SecOps IP 범위를 추가합니다.
- 이름:
- 만들기를 클릭합니다.
- 조건부 액세스 > 정책으로 이동합니다.
- 워크로드 아이덴티티에 적용되는 정책의 경우
Google SecOps IP Ranges이름이 지정된 위치 또는 특정 서비스 주체에 대한 제외를 구성합니다.
Microsoft Azure AD API 액세스 구성
앱 등록 만들기
- Microsoft Entra 관리 센터 또는 Azure 포털에 로그인합니다.
- ID > 애플리케이션 > 앱 등록으로 이동합니다.
- 신규 등록을 클릭합니다.
다음 구성 세부정보를 제공합니다.
- 이름: 설명이 포함된 이름을 입력합니다 (예:
Google SecOps Sign-In Logs Integration). - 지원되는 계정 유형: 이 조직 디렉터리의 계정만 (단일 테넌트)을 선택합니다.
- 리디렉션 URI: 비워 둡니다 (서비스 주 구성원 인증에는 필요하지 않음).
- 이름: 설명이 포함된 이름을 입력합니다 (예:
등록을 클릭합니다.
등록 후 다음 값을 복사하여 저장합니다.
- 애플리케이션 (클라이언트) ID
- 디렉터리 (테넌트) ID
API 권한 구성
통합에는 다음 Microsoft Graph 애플리케이션 권한이 필요합니다.
- 앱 등록에서 API 권한으로 이동합니다.
- 권한 추가를 클릭합니다.
- Microsoft Graph > 애플리케이션 권한을 선택합니다.
- 다음 권한을 선택합니다.
- AuditLog.Read.All - 로그인 로그를 읽는 데 필요합니다.
- Directory.Read.All - 로그인 로그 액세스를 위해 Microsoft Graph API에서 필요합니다 (알려진 문제).
- SecurityEvents.Read.All - Google Security Operations에 필요합니다.
- 권한 추가를 클릭합니다.
- [조직 이름]에 대한 관리자 동의 허용을 클릭합니다.
- 상태 열에 세 가지 권한 모두에 대해 [조직]에 부여됨이 표시되는지 확인합니다.
| 권한 | 유형 | 설명 |
|---|---|---|
| AuditLog.Read.All | 애플리케이션 | 모든 로그인 및 감사 로그 데이터 읽기 |
| Directory.Read.All | 애플리케이션 | 디렉터리 데이터 읽기 (API 액세스에 필요) |
| SecurityEvents.Read.All | 애플리케이션 | 보안 이벤트 읽기 |
클라이언트 보안 비밀번호 만들기
- 인증서 및 보안 비밀로 이동합니다.
- '새 클라이언트 보안 비밀번호'를 클릭합니다.
다음 구성 세부정보를 제공합니다.
- 설명: 설명이 포함된 이름 (예:
Google SecOps Feed)을 입력합니다. - 만료: 만료 기간을 선택합니다.
- 설명: 설명이 포함된 이름 (예:
추가를 클릭합니다.
중요: 클라이언트 보안 비밀번호 값을 즉시 복사하세요. 이 값은 한 번만 표시되며 나중에 검색할 수 없습니다.
피드를 만들기 전에 API 액세스 확인
Google SecOps 피드를 만들기 전에 서비스 주체가 Microsoft Graph API를 성공적으로 인증하고 액세스할 수 있는지 확인합니다.
PowerShell을 사용하여 인증 테스트
# Replace with your actual values $tenantId = "your-tenant-id" $clientId = "your-client-id" $clientSecret = "your-client-secret" # Token request parameters (must be lowercase) $tokenBody = @{ grant_type = "client_credentials" client_id = $clientId client_secret = $clientSecret scope = "https://graph.microsoft.com/.default" } # Request access token $tokenEndpoint = "https://login.microsoftonline.com/$tenantId/oauth2/v2.0/token" $tokenResponse = Invoke-RestMethod -Method Post -Uri $tokenEndpoint -Body $tokenBody -ContentType "application/x-www-form-urlencoded" if ($tokenResponse.access_token) { Write-Host "✓ Successfully obtained access token" -ForegroundColor Green # Test API call to sign-ins endpoint $apiUrl = "https://graph.microsoft.com/v1.0/auditLogs/signIns?`$top=1" $headers = @{ Authorization = "Bearer $($tokenResponse.access_token)" } try { $signInResponse = Invoke-RestMethod -Method Get -Uri $apiUrl -Headers $headers Write-Host "✓ Successfully accessed sign-ins API" -ForegroundColor Green Write-Host "Sample sign-in log retrieved successfully" -ForegroundColor Green } catch { Write-Host "✗ Failed to access sign-ins API" -ForegroundColor Red Write-Host "Error: $($_.Exception.Message)" -ForegroundColor Red } } else { Write-Host "✗ Failed to obtain access token" -ForegroundColor Red }예상 출력:
✓ Successfully obtained access token ✓ Successfully accessed sign-ins API Sample sign-in log retrieved successfullycurl을 사용하여 인증 테스트
# Replace with your actual values TENANT_ID="your-tenant-id" CLIENT_ID="your-client-id" CLIENT_SECRET="your-client-secret" # Request access token curl -X POST "https://login.microsoftonline.com/$TENANT_ID/oauth2/v2.0/token" \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "grant_type=client_credentials" \ -d "client_id=$CLIENT_ID" \ -d "client_secret=$CLIENT_SECRET" \ -d "scope=https://graph.microsoft.com/.default" # Test API access curl -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ "https://graph.microsoft.com/v1.0/auditLogs/signIns?\$top=1"
피드 설정
Google SecOps 플랫폼에서 피드를 설정하는 방법은 두 가지입니다.
- SIEM 설정 > 피드 > 새 피드 추가
- 콘텐츠 허브 > 콘텐츠 팩 > 시작하기
Microsoft Azure AD 로그인 로그를 수집하도록 Google SecOps에서 피드 구성
- Azure 플랫폼 팩을 클릭합니다.
- Azure AD 로그 유형을 찾습니다.
다음 필드의 값을 지정합니다.
- 소스 유형: 서드 파티 API (권장)
- OAuth 클라이언트 ID: 앱 등록에서 가져온 애플리케이션 (클라이언트) ID입니다.
- OAuth 클라이언트 보안 비밀번호: 이전에 복사한 클라이언트 보안 비밀번호 값입니다.
- 테넌트 ID: 앱 등록에서 가져온 Microsoft 테넌트 ID입니다 (UUID 형식, 예:
0fc279f9-fe30-41be-97d3-abe1d7681418). API 전체 경로: Microsoft Graph REST API 엔드포인트 URL:
graph.microsoft.com/v1.0/auditLogs/signInsAPI 인증 엔드포인트: Microsoft Active Directory 인증 엔드포인트:
login.microsoftonline.com
고급 옵션:
- 피드 이름: 피드를 식별하는 미리 채워진 값입니다.
- 애셋 네임스페이스: 피드가 연결될 애셋 네임스페이스입니다.
- 수집 라벨: 이 피드의 모든 이벤트에 라벨이 추가됩니다.
피드 만들기를 클릭합니다.
피드를 만든 후에는 컨텍스트 데이터가 주기적으로 검색됩니다. 초기 디렉터리 스냅샷이 Google SecOps에 표시되는 데 최대 24시간이 걸릴 수 있습니다.
이 제품군 내에서 다양한 로그 유형에 대해 여러 피드를 구성하는 방법에 관한 자세한 내용은 제품별 피드 구성을 참고하세요.
Google Security Operations 피드에 대한 자세한 내용은 Google Security Operations 피드 문서를 참조하세요. 각 피드 유형의 요구사항은 유형별 피드 구성을 참조하세요. 피드를 만들 때 문제가 발생하면 Google Security Operations 지원팀에 문의하세요.
리전 엔드포인트
소버린 클라우드의 Microsoft Azure AD 배포의 경우 적절한 리전 엔드포인트를 사용하세요.
| 클라우드 환경 | API 전체 경로 | API 인증 엔드포인트 |
|---|---|---|
| 글로벌 | graph.microsoft.com/v1.0/auditLogs/signIns |
login.microsoftonline.com |
| 미국 정부 L4 | graph.microsoft.us/v1.0/auditLogs/signIns |
login.microsoftonline.us |
| 미국 정부 L5 (DOD) | dod-graph.microsoft.us/v1.0/auditLogs/signIns |
login.microsoftonline.us |
| 중국 (21Vianet) | microsoftgraph.chinacloudapi.cn/v1.0/auditLogs/signIns |
login.chinacloudapi.cn |
UDM 매핑 테이블
| 로그 필드 | UDM 매핑 | 논리 |
|---|---|---|
activityDateTime |
principal.event_timestamp |
activityDateTime 필드에서 파싱됩니다. 필드가 예상되는 'yyyy-MM-ddTHH:mm:ss.SSSZ' 형식 또는 'ISO8601' 형식이 아닌 경우 파서는 'MM/dd/yyyy HH:mm:ss A' 또는 'MM/d/yyyy HH:mm:ss A'와 같은 다른 형식을 시도합니다. |
activityDisplayName |
security_result.summary |
activityDisplayName에서 직접 매핑됩니다. |
additionalDetails.0.value |
network.http.user_agent |
additionalDetails.0.value에서 직접 매핑됩니다. |
additionalDetails.1.key |
target.resource.attribute.labels.key |
additionalDetails.1.key에서 직접 매핑됩니다. |
additionalDetails.1.value |
target.resource.attribute.labels.value |
additionalDetails.1.value에서 직접 매핑됩니다. |
additionalInfo.[].Key |
network.http.user_agent, target.url |
Key이 userAgent이면 Value을 network.http.user_agent 및 network.http.parsed_user_agent에 매핑합니다. Key이 alertUrl이면 Value를 target.url에 매핑합니다. |
additionalInfo.[].Value |
network.http.user_agent, target.url |
Key이 userAgent이면 Value을 network.http.user_agent 및 network.http.parsed_user_agent에 매핑합니다. Key이 alertUrl이면 Value를 target.url에 매핑합니다. |
am_category |
metadata.description |
am_category에서 직접 매핑됩니다. |
am_tenantId |
metadata.product_deployment_id |
am_tenantId에서 직접 매핑됩니다. |
appId |
target.resource.attribute.labels.value |
라벨 키가 '앱 ID'인 appId에서 직접 매핑됩니다. |
appDisplayName |
target.application |
appDisplayName에서 직접 매핑됩니다. |
appliedConditionalAccessPolicies.[].displayName |
security_result.[].rule_name, about.[].user.user_display_name |
appliedConditionalAccessPolicies.[].displayName에서 직접 매핑됩니다. |
appliedConditionalAccessPolicies.[].enforcedGrantControls |
security_result.[].rule_labels.value |
라벨 키가 'applied_conditional_access_policies_enforced_grant_controls'인 appliedConditionalAccessPolicies.[].enforcedGrantControls에서 직접 매핑됩니다. |
appliedConditionalAccessPolicies.[].enforcedSessionControls |
security_result.[].rule_labels.value |
라벨 키가 'applied_conditional_access_policies_enforced_session_controls'인 appliedConditionalAccessPolicies.[].enforcedSessionControls에서 직접 매핑됩니다. |
appliedConditionalAccessPolicies.[].id |
security_result.[].rule_id, about.[].user.userid |
appliedConditionalAccessPolicies.[].id에서 직접 매핑됩니다. |
appliedConditionalAccessPolicies.[].result |
security_result.[].detection_fields.value, about.[].labels.value |
라벨 키가 '결과'인 appliedConditionalAccessPolicies.[].result에서 직접 매핑됩니다. |
authenticationDetails.[].authenticationMethod |
security_result.[].detection_fields.value |
라벨 키가 'authenticationMethod'인 authenticationDetails.[].authenticationMethod에서 직접 매핑됩니다. |
authenticationDetails.[].authenticationMethodDetail |
security_result.[].detection_fields.value |
라벨 키가 'authenticationMethodDetail'인 authenticationDetails.[].authenticationMethodDetail에서 직접 매핑됩니다. |
authenticationDetails.[].authenticationStepDateTime |
security_result.[].detection_fields.value |
라벨 키가 'authenticationStepDateTime'인 authenticationDetails.[].authenticationStepDateTime에서 직접 매핑됩니다. |
authenticationDetails.[].authenticationStepRequirement |
security_result.[].detection_fields.value |
라벨 키가 'authenticationStepRequirement'인 authenticationDetails.[].authenticationStepRequirement에서 직접 매핑됩니다. |
authenticationDetails.[].authenticationStepResultDetail |
security_result.[].detection_fields.value |
라벨 키가 'authenticationStepResultDetail'인 authenticationDetails.[].authenticationStepResultDetail에서 직접 매핑됩니다. |
authenticationDetails.[].succeeded |
security_result.action |
값이 'true'이면 ALLOW, 그렇지 않으면 BLOCK |
authenticationRequirement |
additional.fields.value.string_value |
라벨 키가 'AuthenticationRequirement'인 authenticationRequirement에서 직접 매핑됩니다. |
authenticationRequirementPolicies.[].detail |
security_result.detection_fields.value |
라벨 키가 'detail'인 authenticationRequirementPolicies.[].detail에서 직접 매핑됩니다. |
authenticationRequirementPolicies.[].requirementProvider |
security_result.detection_fields.value |
라벨 키가 'requirementProvider'인 authenticationRequirementPolicies.[].requirementProvider에서 직접 매핑됩니다. |
callerIpAddress |
principal.ip, principal.asset.ip |
callerIpAddress에서 직접 매핑됩니다. |
category |
metadata.description |
category에서 직접 매핑됩니다. |
clientAppUsed |
principal.application |
clientAppUsed에서 직접 매핑됩니다. |
conditionalAccessStatus |
additional.fields.value.string_value |
라벨 키가 'conditionalAccessStatus'인 conditionalAccessStatus에서 직접 매핑됩니다. |
correlationId |
network.session_id, security_result.detection_fields.value |
correlationId에서 직접 매핑됩니다. 라벨 키가 'CorrelationId'인 security_result.detection_fields.value로도 사용됩니다. |
createdDateTime |
when |
when 필드는 createdDateTime 필드에서 파생됩니다. grok을 사용하여 createdDateTime 필드에서 날짜와 시간이 추출된 후 결합되어 when 필드를 형성합니다. |
deviceDetail.browser |
network.http.user_agent |
deviceDetail.browser에서 직접 매핑됩니다. |
deviceDetail.deviceId |
principal.asset.asset_id, principal.asset_id |
deviceDetail.deviceId에서 직접 매핑되며 '기기 ID:'가 접두사로 붙습니다. |
deviceDetail.displayName |
principal.asset.hostname |
deviceDetail.displayName에서 직접 매핑됩니다. |
deviceDetail.isCompliant |
principal.asset.attribute.labels.value |
라벨 키가 'isCompliant'인 deviceDetail.isCompliant에서 직접 매핑됩니다. |
deviceDetail.isManaged |
principal.asset.attribute.labels.value |
라벨 키가 'isManaged'인 deviceDetail.isManaged에서 직접 매핑됩니다. |
deviceDetail.operatingSystem |
principal.platform_version |
deviceDetail.operatingSystem에서 직접 매핑됩니다. |
deviceDetail.trustType |
principal.asset.attribute.labels.value |
라벨 키가 'trustType'인 deviceDetail.trustType에서 직접 매핑됩니다. |
durationMs |
additional.fields.value.string_value |
라벨 키가 'durationMs'인 durationMs에서 직접 매핑됩니다. |
event.id |
- | 안내 (3번 항목)에 따라 매핑되지 않았습니다. |
id |
metadata.product_log_id |
id에서 직접 매핑됩니다. |
identity |
target.user.user_display_name |
userId과 다르고 이메일 주소가 아닌 경우 identity에서 직접 매핑됩니다. |
initiatedBy.user.displayName |
principal.user.user_display_name |
initiatedBy.user.displayName에서 직접 매핑됩니다. |
initiatedBy.user.id |
principal.user.userid, principal.user.windows_sid |
initiatedBy.user.id에서 직접 매핑됩니다. |
initiatedBy.user.ipAddress |
principal.ip, principal.asset.ip |
initiatedBy.user.ipAddress에서 직접 매핑됩니다. |
initiatedBy.user.userPrincipalName |
principal.user.email_addresses, principal.user.userid |
initiatedBy.user.userPrincipalName에서 직접 매핑됩니다. 이메일 주소인 경우 email_addresses에 매핑되고, 그렇지 않으면 userid에 매핑됩니다. |
Level |
security_result.severity_details, level |
Level에서 직접 매핑됩니다. |
level |
security_result.severity_details, security_result.severity |
level에서 직접 매핑됩니다. 대문자로 변환한 후 security_result.severity에도 매핑됩니다. 'Information', 'Informational', '0', '4', 'Warning', '1', '3', 'Error', '2', 'Critical' 값의 특별 처리 |
location.city |
principal.location.city |
location.city에서 직접 매핑됩니다. |
location.countryOrRegion |
principal.location.country_or_region |
location.countryOrRegion에서 직접 매핑됩니다. |
location.geoCoordinates.altitude |
additional.fields.value.string_value |
라벨 키가 'location_geoCoordinates_altitude'인 location.geoCoordinates.altitude에서 직접 매핑됩니다. |
location.geoCoordinates.latitude |
principal.location.region_latitude, principal.location.region_coordinates.latitude |
location.geoCoordinates.latitude에서 직접 매핑됩니다. |
location.geoCoordinates.longitude |
principal.location.region_longitude, principal.location.region_coordinates.longitude |
location.geoCoordinates.longitude에서 직접 매핑됩니다. |
location.state |
principal.location.state |
location.state에서 직접 매핑됩니다. |
location |
principal.location.name |
location에서 직접 매핑됩니다. |
log_type |
metadata.log_type |
log_type에서 직접 매핑됩니다. |
networkLocationDetails.[].networkNames |
additional.fields.value.string_value |
라벨 키가 'networkName {index}'인 networkLocationDetails.[].networkNames의 연결된 값입니다. |
networkLocationDetails.[].networkType |
security_result.detection_fields.value, additional.fields.value.string_value |
라벨 키가 'networkType'인 networkLocationDetails.[].networkType에서 직접 매핑됩니다. 라벨 키가 'networkType {index}'인 additional.fields.value.string_value로도 사용됩니다. |
operationName |
event_type |
operationName이 '로그인 활동'이면 USER_LOGIN입니다. operationName이 '그룹에 구성원 추가'인 경우 USER_CHANGE_PERMISSIONS |
operationType |
security_result.action_details |
operationType에서 직접 매핑됩니다. |
properties.activity |
security_result.summary |
properties.activity에서 직접 매핑됩니다. |
properties.activityDateTime |
when |
properties.activityDateTime 필드에서 파싱됩니다. 필드가 예상되는 'yyyy-MM-ddTHH:mm:ss.SSSZ' 형식 또는 'ISO8601' 형식이 아닌 경우 파서는 'MM/dd/yyyy HH:mm:ss A' 또는 'MM/d/yyyy HH:mm:ss A'와 같은 다른 형식을 시도합니다. |
properties.activityDisplayName |
security_result.summary |
properties.activityDisplayName에서 직접 매핑됩니다. |
properties.additionalInfo |
network.http.user_agent, target.url |
JSON으로 파싱되고 키가 userAgent인 경우 값을 network.http.user_agent 및 network.http.parsed_user_agent에 매핑합니다. 키가 alertUrl인 경우 값을 target.url에 매핑합니다. |
properties.appliedConditionalAccessPolicies.[].displayName |
security_result.[].rule_name |
properties.appliedConditionalAccessPolicies.[].displayName에서 직접 매핑됩니다. |
properties.appliedConditionalAccessPolicies.[].enforcedGrantControls |
security_result.[].rule_labels.value |
라벨 키가 'applied_conditional_access_policies_enforced_grant_controls'인 properties.appliedConditionalAccessPolicies.[].enforcedGrantControls에서 직접 매핑됩니다. |
properties.appliedConditionalAccessPolicies.[].enforcedSessionControls |
security_result.[].rule_labels.value |
라벨 키가 'applied_conditional_access_policies_enforced_session_controls'인 properties.appliedConditionalAccessPolicies.[].enforcedSessionControls에서 직접 매핑됩니다. |
properties.appliedConditionalAccessPolicies.[].id |
security_result.[].rule_id |
properties.appliedConditionalAccessPolicies.[].id에서 직접 매핑됩니다. |
properties.appliedConditionalAccessPolicies.[].result |
security_result.[].detection_fields.value |
라벨 키가 '결과'인 properties.appliedConditionalAccessPolicies.[].result에서 직접 매핑됩니다. |
properties.appId |
appId |
properties.appId에서 직접 매핑됩니다. |
properties.appDisplayName |
target.application |
properties.appDisplayName에서 직접 매핑됩니다. |
properties.authenticationDetails.[].authenticationMethod |
security_result.detection_fields.value |
라벨 키가 'authenticationMethod'인 properties.authenticationDetails.[].authenticationMethod에서 직접 매핑됩니다. |
properties.authenticationDetails.[].authenticationMethodDetail |
security_result.detection_fields.value |
라벨 키가 'authenticationMethodDetail'인 properties.authenticationDetails.[].authenticationMethodDetail에서 직접 매핑됩니다. |
properties.authenticationDetails.[].authenticationStepDateTime |
security_result.detection_fields.value |
라벨 키가 'authenticationStepDateTime'인 properties.authenticationDetails.[].authenticationStepDateTime에서 직접 매핑됩니다. |
properties.authenticationDetails.[].authenticationStepRequirement |
security_result.detection_fields.value |
라벨 키가 'authenticationStepRequirement'인 properties.authenticationDetails.[].authenticationStepRequirement에서 직접 매핑됩니다. |
properties.authenticationDetails.[].authenticationStepResultDetail |
security_result.detection_fields.value |
라벨 키가 'authenticationStepResultDetail'인 properties.authenticationDetails.[].authenticationStepResultDetail에서 직접 매핑됩니다. |
properties.authenticationRequirement |
additional.fields.value.string_value |
라벨 키가 'AuthenticationRequirement'인 properties.authenticationRequirement에서 직접 매핑됩니다. |
properties.authenticationRequirementPolicies.[].detail |
security_result.detection_fields.value |
라벨 키가 'detail'인 properties.authenticationRequirementPolicies.[].detail에서 직접 매핑됩니다. |
properties.authenticationRequirementPolicies.[].requirementProvider |
security_result.detection_fields.value |
라벨 키가 'requirementProvider'인 properties.authenticationRequirementPolicies.[].requirementProvider에서 직접 매핑됩니다. |
properties.clientAppUsed |
principal.application |
properties.clientAppUsed에서 직접 매핑됩니다. |
properties.conditionalAccessStatus |
additional.fields.value.string_value |
라벨 키가 'conditionalAccessStatus'인 properties.conditionalAccessStatus에서 직접 매핑됩니다. |
properties.crossTenantAccessType |
additional.fields.value.string_value |
라벨 키가 'crossTenantAccessType'인 properties.crossTenantAccessType에서 직접 매핑됩니다. |
properties.detectedDateTime |
additional.fields.value.string_value |
라벨 키가 'detectedDateTime'인 properties.detectedDateTime에서 직접 매핑됩니다. |
properties.detectionTimingType |
additional.fields.value.string_value |
라벨 키가 'detectionTimingType'인 properties.detectionTimingType에서 직접 매핑됩니다. |
properties.homeTenantId |
additional.fields.value.string_value |
라벨 키가 'homeTenantId'인 properties.homeTenantId에서 직접 매핑됩니다. |
properties.id |
metadata.product_log_id |
properties.id에서 직접 매핑됩니다. |
properties.initiatedBy.user.displayName |
principal.user.user_display_name |
properties.initiatedBy.user.displayName에서 직접 매핑됩니다. |
properties.initiatedBy.user.id |
principal.user.windows_sid |
properties.initiatedBy.user.id에서 직접 매핑됩니다. |
properties.initiatedBy.user.ipAddress |
principal.ip, principal.asset.ip |
properties.initiatedBy.user.ipAddress에서 직접 매핑됩니다. |
properties.initiatedBy.user.userPrincipalName |
principal.user.email_addresses, principal.user.userid |
properties.initiatedBy.user.userPrincipalName에서 직접 매핑됩니다. 이메일 주소인 경우 email_addresses에 매핑되고, 그렇지 않으면 userid에 매핑됩니다. |
properties.ipAddress |
principal.ip, principal.asset.ip |
properties.ipAddress에서 직접 매핑됩니다. |
properties.isGuest |
additional.fields.value.string_value |
라벨 키가 'isGuest'인 properties.isGuest에서 직접 매핑됩니다. |
properties.isDeleted |
additional.fields.value.string_value |
라벨 키가 'isDeleted'인 properties.isDeleted에서 직접 매핑됩니다. |
properties.isProcessing |
additional.fields.value.string_value |
라벨 키가 'isProcessing'인 properties.isProcessing에서 직접 매핑됩니다. |
properties.lastUpdatedDateTime |
additional.fields.value.string_value |
라벨 키가 'lastUpdatedDateTime'인 properties.lastUpdatedDateTime에서 직접 매핑됩니다. |
properties.location.city |
principal.location.city |
properties.location.city에서 직접 매핑됩니다. |
properties.location.countryOrRegion |
principal.location.country_or_region |
properties.location.countryOrRegion에서 직접 매핑됩니다. |
properties.location.geoCoordinates.latitude |
principal.location.region_latitude, principal.location.region_coordinates.latitude |
properties.location.geoCoordinates.latitude에서 직접 매핑됩니다. |
properties.location.geoCoordinates.longitude |
principal.location.region_longitude, principal.location.region_coordinates.longitude |
properties.location.geoCoordinates.longitude에서 직접 매핑됩니다. |
properties.location.state |
principal.location.state |
properties.location.state에서 직접 매핑됩니다. |
properties.networkLocationDetails.[].networkNames |
additional.fields.value.string_value |
라벨 키가 'properties networkName {index}'인 properties.networkLocationDetails.[].networkNames의 연결된 값입니다. |
properties.networkLocationDetails.[].networkType |
additional.fields.value.string_value |
라벨 키가 'properties networkType {index}'인 properties.networkLocationDetails.[].networkType에서 직접 매핑됩니다. |
properties.riskEventType |
additional.fields.value.string_value |
라벨 키가 'riskEventType'인 properties.riskEventType에서 직접 매핑됩니다. |
properties.riskLastUpdatedDateTime |
additional.fields.value.string_value |
라벨 키가 'riskLastUpdatedDateTime'인 properties.riskLastUpdatedDateTime에서 직접 매핑됩니다. |
properties.riskLevel |
additional.fields.value.string_value |
라벨 키가 'riskLevel'인 properties.riskLevel에서 직접 매핑됩니다. |
properties.riskLevelDuringSignIn |
additional.fields.value.string_value |
라벨 키가 'riskLevelDuringSignIn'인 properties.riskLevelDuringSignIn에서 직접 매핑됩니다. |
properties.riskState |
additional.fields.value.string_value |
라벨 키가 'riskState'인 properties.riskState에서 직접 매핑됩니다. |
properties.riskDetail |
additional.fields.value.string_value |
라벨 키가 'riskDetail'인 properties.riskDetail에서 직접 매핑됩니다. |
properties.riskType |
additional.fields.value.string_value |
라벨 키가 'riskType'인 properties.riskType에서 직접 매핑됩니다. |
properties.source |
additional.fields.value.string_value |
라벨 키가 'source'인 properties.source에서 직접 매핑됩니다. |
properties.targetResources.0.id |
target.user.product_object_id |
properties.targetResources.0.id에서 직접 매핑됩니다. |
properties.targetResources.modifiedProperties.0.newValue |
target.group.product_object_id |
properties.targetResources.modifiedProperties.0.newValue에서 직접 매핑됩니다. |
properties.tokenIssuerType |
additional.fields.value.string_value |
라벨 키가 'tokenIssuerType'인 properties.tokenIssuerType에서 직접 매핑됩니다. |
properties.userAgent |
network.http.user_agent, network.http.parsed_user_agent |
properties.userAgent에서 직접 매핑됩니다. |
properties.userDisplayName |
target.user.user_display_name |
properties.userDisplayName에서 직접 매핑됩니다. |
properties.userId |
target.user.product_object_id |
properties.userId에서 직접 매핑됩니다. |
properties.userPrincipalName |
target.user.userid, target.user.email_addresses |
properties.userPrincipalName에서 직접 매핑됩니다. 이메일 주소인 경우 email_addresses에 매핑되고, 그렇지 않으면 userid에 매핑됩니다. |
result |
security_result.action, security_result.action_details |
result이 'success'이면 ALLOW입니다. |
resultDescription |
security_result.description |
resultDescription에서 직접 매핑됩니다. |
resultSignature |
additional.fields.value.string_value |
라벨 키가 'resultSignature'인 resultSignature에서 직접 매핑됩니다. |
resultType |
security_result.rule_id, action, security_result.summary |
resultType이 '0'이면 ALLOW 및 '로그인이 완료되었습니다'. 그렇지 않으면 BLOCK 및 '로그인 실패가 발생했습니다'가 표시됩니다. |
resourceId |
target.resource.id, target.resource.product_object_id |
resourceId에서 직접 매핑됩니다. |
resourceDisplayName |
target.resource.name, appDisplayName |
resourceDisplayName에서 직접 매핑됩니다. |
riskDetail |
additional.fields.value.string_value |
라벨 키가 'riskDetail'인 riskDetail에서 직접 매핑됩니다. |
riskEventTypes.[]. |
additional.fields.value.string_value, additional.fields.value.list_value.values.string_value |
값은 additional.fields에서 키가 'riskEventTypes'인 목록에 추가됩니다. 또한 각 값은 additional.fields에서 키가 'riskEventType'인 별도의 필드로 추가됩니다. |
riskEventTypes_v2.[]. |
additional.fields.value.list_value.values.string_value |
값이 additional.fields에서 키가 'riskEventTypes_v2'인 목록에 추가됩니다. |
riskLevelAggregated |
additional.fields.value.string_value |
라벨 키가 'riskLevelAggregated'인 riskLevelAggregated에서 직접 매핑됩니다. |
riskLevelDuringSignIn |
additional.fields.value.string_value |
라벨 키가 'riskLevelDuringSignIn'인 riskLevelDuringSignIn에서 직접 매핑됩니다. |
riskState |
additional.fields.value.string_value |
라벨 키가 'riskState'인 riskState에서 직접 매핑됩니다. |
status.additionalDetails |
security_result.description |
status.additionalDetails에서 직접 매핑됩니다. |
status.errorCode |
security_result.rule_id, errorCode |
status.errorCode에서 직접 매핑됩니다. |
target.displayName |
resourceDisplayName |
target.displayName에서 직접 매핑됩니다. |
target.id |
resourceId |
target.id에서 직접 매핑됩니다. |
target.modifiedProperties.[].displayName |
target.resource.attribute.labels.key |
target.modifiedProperties.[].displayName에서 직접 매핑됩니다. |
target.modifiedProperties.[].newValue |
target.resource.attribute.labels.value, target.resource.product_object_id |
target.modifiedProperties.[].newValue에서 직접 매핑됩니다. |
target.modifiedProperties.[].oldValue |
target.resource.attribute.labels.value |
target.modifiedProperties.[].oldValue에서 직접 매핑됩니다. |
target.type |
target.resource.type |
target.type에서 직접 매핑됩니다. |
tenantId |
metadata.product_deployment_id |
tenantId에서 직접 매핑됩니다. |
time |
when |
when 필드는 time 필드에서 파생됩니다. grok을 사용하여 time 필드에서 날짜와 시간이 추출된 후 결합되어 when 필드를 형성합니다. |
userAgent |
network.http.user_agent, network.http.parsed_user_agent |
userAgent에서 직접 매핑됩니다. |
userDisplayName |
target.user.user_display_name |
userDisplayName에서 직접 매핑됩니다. |
userId |
target.user.product_object_id |
userId에서 직접 매핑됩니다. |
userPrincipalName |
target.user.userid, principal.administrative_domain, target.user.email_addresses |
userPrincipalName에서 직접 매핑됩니다. 이메일 주소인 경우 email_addresses에 매핑되고 도메인 부분이 추출되어 principal.administrative_domain에 매핑됩니다. 그렇지 않으면 userid로 매핑됩니다. |
| (파서 로직) | event.idm.is_alert, event.idm.is_significant |
심각도 수준이 '심각'인 경우 true로 설정합니다. |
| (파서 로직) | event.idm.read_only_udm.metadata.event_type |
has_target_user이 'true'인 경우 'USER_LOGIN'으로 설정됩니다. has_principal_user이 'true'인 경우 'USER_UNCATEGORIZED'로 설정됩니다. has_principal이 'true'인 경우 'STATUS_UPDATE'로 설정됩니다. 그렇지 않으면 'GENERIC_EVENT'로 설정됩니다. |
| (파서 로직) | event.idm.read_only_udm.metadata.vendor_name |
'Microsoft'로 설정합니다. |
| (파서 로직) | event.idm.read_only_udm.metadata.product_name |
'Azure AD'로 설정합니다. |
| (파서 로직) | event.idm.read_only_udm.extensions.auth.type |
'SSO'로 설정합니다. |
| (파서 로직) | event.idm.read_only_udm.extensions.auth.mechanism |
isInteractive가 'true'인 경우 'INTERACTIVE'로 설정합니다. 그렇지 않으면 'MECHANISM_OTHER'로 설정합니다. |
| (파서 로직) | security_result.action |
결과가 성공이면 ALLOW로 설정합니다. |
| (파서 로직) | security_result.action |
resultType이 0이면 ALLOW로 설정합니다. |
| (파서 로직) | security_result.action |
resultType이 0이 아니고 ''이 아닌 경우 BLOCK으로 설정됩니다. |
| (파서 로직) | security_result.category |
resultType이 0이 아니고 ''이 아닌 경우 'AUTH_VIOLATION'으로 설정됩니다. |
| (파서 로직) | security_result.description |
operationName이 '그룹에 구성원 추가'이고 결과가 '성공'인 경우 'Group membership modified'로 설정됩니다. |
| (파서 로직) | security_result.priority |
properties.riskLevelDuringSignIn이 'medium'인 경우 'MEDIUM_PRIORITY'로 설정됩니다. |
| (파서 로직) | security_result.summary |
resultType이 0인 경우 'Successful login occurred'로 설정됩니다. |
| (파서 로직) | security_result.summary |
resultType이 0이 아니고 ''이 아닌 경우 '로그인 실패 발생'으로 설정됩니다. |
| (파서 로직) | security_result.summary |
있는 경우 properties.activityDisplayName으로 설정합니다. |
| (파서 로직) | security_result.severity |
수준이 'Information', 'Informational', '0' 또는 '4'인 경우 INFORMATIONAL로 설정됩니다. 수준이 '경고', '1' 또는 '3'인 경우 MEDIUM으로 설정합니다. 수준이 'Error' 또는 '2'인 경우 ERROR로 설정됩니다. 수준이 'Critical'인 경우 CRITICAL로 설정됩니다. |
| (파서 로직) | security_result.severity |
resultType이 0이 아니고 ''이 아닌 경우 ERROR로 설정됩니다. |
도움이 더 필요하신가요? 커뮤니티 회원 및 Google SecOps 전문가에게 문의하여 답변을 받으세요.