이 자습서에서는 다음을 하는 방법을 알아볼 수 있습니다.
- Log Analytics 작업 영역 만들기
- Log Analytics 작업 영역과 로그인 로그를 통합하도록 진단 설정 구성
- KQL(Kusto 쿼리 언어)을 사용하여 쿼리 실행
필수 조건
Log Analytics를 사용하여 활동 로그를 분석하려면 다음 역할 및 요구 사항이 필요합니다.
Azure Monitor에 대한 적절한 역할:
- 모니터링 리더
- Log Analytics 뷰어
- 모니터링 기여자
- 로그 애널리틱스 기여자
Microsoft Entra ID에 대한 적절한 역할:
- 보고서 뷰어
- 보안 열람자
- 글로벌 독자
- 보안 관리자
Log Analytics 작업 영역 만들기
이 단계에서는 로그인 로그를 보내는 Log Analytics 작업 영역을 만듭니다. 작업 영역을 만들려면 Azure 리소스 그룹이 필요합니다.
Log Analytics 기여자 권한이 있는 보안 관리자 이상으로 Azure Portal에 로그인합니다.
Log Analytics 작업 영역으로 이동합니다.
만들기를 선택합니다.
Log Analytics 작업 영역 만들기 페이지에서 다음 단계를 수행합니다.
구독을 선택합니다.
리소스 그룹을 선택합니다.
작업 영역에 이름을 지정합니다.
지역을 선택합니다.
검토 + 만들기를 선택합니다.
만들기를 선택하고 배포를 기다립니다. 새 작업 영역을 보려면 페이지를 새로 고쳐야 할 수도 있습니다.
진단 설정 구성
ID 로그 정보를 새 작업 영역으로 보내려면 진단 설정을 구성해야 합니다. Azure 및 Microsoft Entra에 대한 다양한 진단 설정 옵션이 있으므로 다음 단계 집합에서는 Microsoft Entra 관리 센터로 전환하여 모든 항목이 ID와 관련된지 확인해 보겠습니다.
Microsoft Entra 관리 센터에 최소한 보안 관리자로 로그인합니다.
Entra ID>모니터링 및 상태>진단 설정으로 탐색합니다.
진단 설정 추가를 선택합니다.
진단 설정 페이지에서 다음 단계를 수행합니다.
진단 설정의 이름을 제공합니다.
로그 아래에서 AuditLogs 및 SigninLogs를 선택합니다.
대상 세부 정보에서 Log Analytics로 보내기를 선택한 다음, 새 로그 분석 작업 영역을 선택합니다.
저장을 선택합니다.
선택한 로그는 Log Analytics 작업 영역에서 로그를 채우는 데 최대 15분이 걸릴 수 있습니다.
Log Analytics의 쿼리 실행
Log Analytics 작업 영역으로 로그 스트리밍을 사용하면 KQL(Kusto Query Language)을 사용하여 쿼리를 실행할 수 있습니다. 쿼리를 실행할 권한이 가장 낮은 역할은 보고서 읽기 권한자 역할입니다.
Entra ID>모니터링 및 상태>Log Analytics로 이동합니다.
검색 텍스트 상자에 쿼리를 입력하고 실행을 선택합니다.
Kusto 쿼리 예제
입력 데이터에서 임의의 항목 10개 가져오기:
SigninLogs | take 10
조건부 액세스가 성공했던 로그인을 살펴봅니다.
SigninLogs | where ConditionalAccessStatus == "success" | project UserDisplayName, ConditionalAccessStatus
성공 횟수를 계산합니다.
SigninLogs | where ConditionalAccessStatus == "success" | project UserDisplayName, ConditionalAccessStatus | count
일별 사용자당 성공한 로그인 횟수 집계:
SigninLogs | where ConditionalAccessStatus == "success" | summarize SuccessfulSign-ins = count() by UserDisplayName, bin(TimeGenerated, 1d)
다음과 같이 사용자가 특정 기간에 특정 작업을 수행하는 횟수를 확인합니다.
AuditLogs | where TimeGenerated > ago(30d) | where OperationName contains "Add member to role" | summarize count() by OperationName, Identity
작업 이름에 따라 결과를 재구성합니다.
AuditLogs | where TimeGenerated > ago(30d) | where OperationName contains "Add member to role" | project OperationName, Identity | evaluate pivot(OperationName)
내부 조인을 사용하여 감사 및 로그인 로그 병합:
AuditLogs |where OperationName contains "Add User" |extend UserPrincipalName = tostring(TargetResources[0].userPrincipalName) | |project TimeGenerated, UserPrincipalName |join kind = inner (SigninLogs) on UserPrincipalName |summarize arg_min(TimeGenerated, *) by UserPrincipalName |extend SigninDate = TimeGenerated
클라이언트 앱 유형별 로그인 횟수 보기:
SigninLogs | summarize count() by ClientAppUsed
일별 로그인 횟수 계산:
SigninLogs | summarize NumberOfEntries=count() by bin(TimeGenerated, 1d)
임의의 항목 5개를 가져오고, 결과에 표시하려는 열을 결정합니다.
SigninLogs | take 5 | project ClientAppUsed, Identity, ConditionalAccessStatus, Status, TimeGenerated
상위 5개를 내림차순으로 가져오고, 원하는 열을 표시합니다.
SigninLogs | take 5 | project ClientAppUsed, Identity, ConditionalAccessStatus, Status, TimeGenerated
값을 다른 두 열로 결합하여 새 열 만들기:
SigninLogs | limit 10 | extend RiskUser = strcat(RiskDetail, "-", Identity) | project RiskUser, ClientAppUsed