
Office 365 및 Azure 로그 수집을 위한 PowerShell 모듈

DFIR-O365RC는 SSTIC 2021(정보통신기술 보안 심포지엄)에서 발표되었습니다. 프랑스어로 된 발표 슬라이드와 녹화 영상은 여기에서 확인할 수 있습니다.
⚠️ 2024년 3월 31일, Microsoft는 DFIR-O365RC에서 사용하던 인증 방법을 더 이상 사용하지 않기로 했습니다. 이에 따라 2024년 8월 버전 2.0.0이 출시되었으며, 인증 방식과 코드 전반의 **주요 변경 사항(breaking changes)**이 포함되었습니다. ⚠️
DFIR-O365RC PowerShell 모듈은 포렌식 분석가가 Microsoft 365 침해와 관련된 로그를 수집하고 Entra ID 조사를 수행할 수 있는 함수 집합입니다.
로그는 JSON 형식으로 생성되며 두 가지 주요 데이터 원본에서 가져옵니다:
이 두 데이터 원본은 다양한 엔드포인트에서 쿼리할 수 있습니다:
* Office 365 Management API는 SIEM으로 실시간 데이터를 분석하기 위한 것입니다. DFIR-O365RC는 포렌식 도구로서 Microsoft 365 환경을 실시간으로 모니터링하는 것이 목적이 아닙니다.
DFIR-O365RC는 다음에서 데이터를 가져옵니다:
Microsoft 365 악성 활동을 조사하는 경우 Search-O365(Exchange Online PowerShell)는 사서함 감사 로그(Mailbox Audit Log)도 가져옵니다. 단, Search-MailboxAuditLog cmdlet은 더 이상 사용되지 않습니다(deprecated).
DFIR-O365RC를 사용하여 다른 Azure 리소스를 조사하는 경우:
DFIR-O365RC 사용을 권장하는 방법입니다
다음을 입력하세요:```bash sudo docker pull anssi/dfir-o365rc:latest sudo docker run --rm -v .:/mnt/host -it anssi/dfir-o365rc:latest
DFIR-O365RC 사용할 준비가 되었습니다:```bash
PowerShell 7.4.2
DFIR-O365RC: PowerShell module for Microsoft 365 and Entra ID log collection
https://github.com/ANSSI-FR/DFIR-O365RC
PS /mnt/host/output>
Docker 이미지를 수동으로 빌드하려면, 리포지토리를 클론하고 docker compose (또는 레거시 docker-compose)를 사용하여 이미지를 빌드하고, 컨테이너를 실행하고 볼륨을 마운트하십시오 (output/ 폴더에):```bash
sudo docker compose build dfir-o365rc
sudo docker compose run dfir-o365rc
sudo docker-compose run dfir-o365rc
### PowerShell 사용
*PowerShell Desktop*과 *PowerShell Core*에서 모듈을 설치할 수 있습니다.
`Connect-ExchangeOnline` cmdlet은 [Microsoft .NET Framework 4.7.2 이상이 필요](https://learn.microsoft.com/en-us/powershell/exchange/exchange-online-powershell-v2?view=exchange-ps#windows)합니다.
PowerShell 갤러리에서 모듈을 설치하려면:```powershell
Install-Module -Name DFIR-O365RC
모듈을 수동으로 설치하려면 DFIR-O365RC 리포지토리를 클론하고, 필요한 종속성을 설치한 후(DFIR-O365RC.psd1 확인) DFIR-O365RC 디렉토리를 PowerShell 모듈 경로 중 하나에 추가하면 됩니다.
모듈을 가져온 후에는 로그 수집 프로세스를 처리할 Entra 애플리케이션을 생성해야 합니다.
이를 위해:
자체 서명된 인증서를 생성하고 base64로 인코딩된 공개 부분을 가져옵니다:
Linux에서 PowerShell Core 또는 Docker 컨테이너를 사용하는 경우: ```bash openssl req -new -x509 -newkey rsa:2048 -sha256 -days 365 -nodes -out exampleDFIRO365RC.crt -keyout exampleDFIRO365RC.key -batch openssl pkcs12 -inkey exampleDFIRO365RC.key -in exampleDFIRO365RC.crt -export -out exampleDFIRO365RC.pfx # Enter a password for the certificate openssl x509 -in exampleDFIRO365RC.crt -outform DER -out - | base64 | tr -d "\n"
Windows에서 PowerShell을 사용하는 경우: ```powershell $certificate = New-SelfSignedCertificate -Subject "CN=exampleDFIRO365RC" -KeySpec KeyExchange -NotBefore (Get-Date) -NotAfter (Get-Date).AddDays(365) $certificatePassword = Read-Host -MaskInput "Please enter a password for the certificate" $certificateSecurePassword = ConvertTo-SecureString -String $certificatePassword -AsPlainText -Force Export-PfxCertificate -Cert $certificate -FilePath exampleDFIRO365RC.pfx -Password $certificateSecurePassword Write-Host ([System.Convert]::ToBase64String($certificate.GetRawCertData()))
2) DFIR-O365RC 모듈의 `New-Application` cmdlet 사용: ```powershell
$certificateb64="<base64-encoded public part from step 1>"
New-Application -certificateb64 $certificateb64
선택적으로, 테넌트의 구독에서 로그를 수집할 수 있도록 하려면 (Get-AzRMActivityLogs를 사용할 계획이 없는 경우 필요하지 않음): ```powershell
New-Application -certificateb64 $certificateb64 -subscriptions
선택적으로, 테넌트의 Azure DevOps 조직에서 로그를 수집할 수 있도록 하려면(이는 오랜 시간이 걸릴 수 있으며 `Get-AzDevOpsActivityLogs`를 사용할 계획이 없다면 필요하지 않습니다): ```powershell
New-Application -certificateb64 $certificateb64 -organizations
애플리케이션을 만들려면 권한이 높은 계정을 사용하여 Azure에 여러 번 로그인해야 합니다.
애플리케이션이 생성되면 다음과 유사한 출력이 나타납니다: ```powershell Done creating the application with the required permissions Please use the following identifiers: WARNING: AppID: xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx WARNING: Tenant: example.onmicrosoft.com
### 애플리케이션 업데이트
애플리케이션이 생성된 후에도 모듈의 `Update-Application` cmdlet을 사용하여 자격 증명 및 권한을 업데이트할 수 있습니다.
- 애플리케이션에 새 인증서를 추가할 수 있습니다.
`Update-Application -certificateb64 <base64-encoded public part>`
- 로그를 수집할 새 구독을 지정할 수 있습니다.
`Update-Application -subscriptions`
- 로그를 수집할 새 Azure DevOps 조직을 지정할 수 있습니다.
`Update-Application -organizations`
- 애플리케이션의 권한을 업데이트할 수 있습니다. 이는 이전 애플리케이션이 있고 생성 이후 권한이 업데이트된 경우 특히 유용합니다.
`Update-Application -permissions`
### 애플리케이션 제거
로그 수집이 완료되면 모듈의 `Remove-Application` cmdlet을 사용하여 애플리케이션을 삭제할 수 있습니다.
애플리케이션을 제거하려면 **고권한** 계정을 사용하여 Azure에 여러 번 로그인해야 합니다.
애플리케이션이 구독 또는 Azure DevOps 조직의 로그를 수집한 경우 `-organizations` 및/또는 `-subscriptions` 스위치를 추가해야 합니다.
---
## 권한 및 라이선스 요구 사항
⚠️
버전 2.0.0부터 이 도구는 [앱 전용 액세스 / 애플리케이션 권한](https://learn.microsoft.com/en-us/entra/identity-platform/permissions-consent-overview#app-only-access-access-without-a-user)이 있는 서비스 주체의 컨텍스트에서 실행됩니다.
버전 2.0.0 이상을 사용하려면 [애플리케이션을 생성](#creating-the-application)해야 합니다.
애플리케이션이 생성되면 스크립트는 애플리케이션의 자격 증명과 권한을 사용하여 실행됩니다.
⚠️
애플리케이션은 가능한 최소한의 필요한 권한 집합으로 생성됩니다.
- `Office 365 Exchange Online` API에 대한 `Exchange.ManageAsApp` (Exchange Online PowerShell cmdlet을 실행하는 데 필요)
- `Microsoft Graph` API에 대한 `AuditLog.Read.All` (Microsoft Entra 로그 수집에 필요)
- `Microsoft Graph` API에 대한 `AuditLogsQuery.Read.All` (Purview를 사용한 통합 감사 로그 수집에 필요)
- `Microsoft Graph` API에 대한 `Application.Read.All` 및 `DelegatedPermissionGrant.Read.All` (애플리케이션 및 서비스 주체와 관련된 Microsoft Entra 로그 강화에 필요)
- `Microsoft Graph` API에 대한 `Device.Read.All` (장치와 관련된 Microsoft Entra 로그 강화에 필요)
- `Microsoft Graph` API에 대한 `User.Read.All` (사용자 정보 획득에 필요)
- `Microsoft Graph` API에 대한 `UserAuthenticationMethod.Read.All` (사용자 인증 방법 정보 획득에 필요)
- `Microsoft Graph` API에 대한 `Organization.Read.All` (테넌트 일반 정보 획득에 필요)
- `Exchange Online`의 `View-only audit logs` (`Search-UnifiedAuditLog` cmdlet을 사용하는 데 필요)
선택 사항(`-subscriptions` 스위치 사용 시):
- 선택한 구독 하위 집합의 경우: `Microsoft.Insights/eventtypes/*`에 대한 `Reader` 역할 (Azure Monitor 활동 로그를 가져오는 데 필요)
선택 사항(`-organizations` 스위치 사용 시):
- 선택한 Azure DevOps 구독 하위 집합의 경우: `View audit log` (Azure DevOps 감사 로그를 가져오는 데 필요)
Microsoft Graph API로 Microsoft Entra 로그를 검색하려면 [Microsoft Entra ID P1](https://www.microsoft.com/en-us/security/business/microsoft-entra-pricing) 라이선스가 있는 사용자가 한 명 이상 있어야 합니다. 이 라이선스는 단일 사용자에 대해 구매하거나 *Microsoft 365 Business Premium* 플랜과 같은 일부 라이선스 플랜에 포함될 수 있습니다.
## 모듈에 포함된 함수
모듈에는 10개의 함수가 있습니다.
| **함수** | **데이터 원본** | 보존 기간 | **성능** | **완전성** | **세부 사항** |
|---|---|---|---|---|---|
| `Get-O365Full` | 통합 감사 로그 | 90 days / 180 days* | 낮음 | 모든 통합 감사 로그 | 기본적으로 전체 통합 감사 로그를 검색합니다. 이는 소규모 테넌트 또는 짧은 기간에만 사용해야 합니다.<br />또한 이 cmdlet을 사용하여 특정 [레코드 유형](https://learn.microsoft.com/en-us/office/office-365-management-api/office-365-management-activity-api-schema#enum-auditlogrecordtype---type-edmint32)에 대한 이벤트를 수집할 수 있습니다. |
| `Get-O365Light` | 통합 감사 로그 | 90 days / 180 days* | 양호 | 통합 감사 로그의 하위 집합만 | 관심 있는 것으로 간주되는 *작업*의 하위 집합만 검색됩니다. |
| `Get-O365Defender` | 통합 감사 로그 | 90 days / 180 days* | 양호 | 통합 감사 로그의 하위 집합만 | Microsoft Defender for Microsoft 365 관련 이벤트를 검색합니다. [Office 365 E5](https://www.microsoft.com/en-us/microsoft-365/enterprise/office-365-e5?activetab=pivot:overviewtab) 라이선스 또는 Microsoft Defender for Office 365를 포함하는 라이선스 플랜이 하나 이상 필요합니다. |
| `Get-AADLogs` | Microsoft Entra 로그 | 30 days | 양호 | 모든 Microsoft Entra 로그 | 테넌트 정보 및 모든 Microsoft Entra 로그(로그인 로그 및 감사 로그)를 가져옵니다. |
| `Get-AADApps` | N/A | N/A | 양호 | 완전 | Microsoft Entra ID 서비스 주체 및 해당 애플리케이션, oauth2PermissionGrants 및 appRoleAssignments |
| `Get-AADDevices` | N/A | N/A | 양호 | 완전 | Microsoft Entra ID 장치 및 해당 소유자/사용자 |
| `Get-AADUsers` | N/A | N/A | 양호 | 완전 | Microsoft Entra ID 사용자 및 해당 인증 방법 |
| `Search-O365` | 통합 감사 로그 / 사서함 감사 로그** | 90 days / 180 days* | 낮음 | 통합 감사 로그의 하위 집합만 | 특정 사용자, IP 주소 또는 자유 텍스트와 관련된 활동을 검색합니다. |
| `Get-AzRMActivityLogs` | Azure Monitor 활동 로그 | 90 days | 양호 | 모든 Azure Monitor 활동 로그 | 선택한 구독 하위 집합에 대한 모든 Azure Monitor 활동 로그를 가져옵니다. |
| `Get-AzDevOpsActivityLogs` | Azure DevOps 감사 로그 | 90 days | 양호 | 모든 Azure DevOps 감사 로그 | 선택한 Azure DevOps 조직 하위 집합에 대한 모든 Azure DevOps 감사 로그를 가져옵니다. |
\* Purview를 사용하면 기본 Exchange Online의 90일 보존 기간에 비해 180일의 보존 기간을 얻을 수 있습니다.
** 사용자를 검색할 때 `Search-O365` cmdlet은 사서함 감사 로그도 검색합니다.
각 함수에는 *Get-Help* cmdlet으로 호출할 수 있는 주석 기반 도움말이 있습니다.```powershell
# Display comment-based help
PS> Get-Help Get-O365Full
# Display comment-based help with examples
PS> Get-Help Get-O365Full -Examples
각 함수는 다음 매개변수를 사용합니다:
-startDate) ;-endDate) ;-appId). 이 식별자는 애플리케이션 생성 시 얻습니다 ;-tenant) ;-certificatePath). 이 경로는 애플리케이션 생성 시 얻습니다.예제:
가독성을 위해 다음과 같이 가정합니다:```powershell $appId = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" $tenant = "example.onmicrosoft.com" $certificatePath = "./example.pfx"
실제 사례에서는 이러한 매개변수가 [애플리케이션 생성](#creating-the-application) 시 수집됩니다.
과거 30일 동안의 Microsoft Entra 로그 및 테넌트에 대한 일반 정보를 검색하려면:```powershell
$endDate = Get-Date
$startDate = $endDate.AddDays(-30)
Get-AADLogs -startDate $startDate -endDate $endDate -appId $appId -tenant $tenant -certificatePath $certificatePath
Microsoft Entra 서비스 주체와 해당 애플리케이션, oauth2PermissionGrant 및 appRoleAssignment 가져오기:```powershell $endDate = Get-Date $startDate = $endDate.AddDays(-30) Get-AADApps --appId $appId -tenant $tenant -certificatePath $certificatePath
Microsoft Entra 장치 및 해당 소유자와 사용자 가져오기:```powershell
$endDate = Get-Date
$startDate = $endDate.AddDays(-30)
Get-AADDevices -appId $appId -tenant $tenant -certificatePath $certificatePath
Microsoft Entra 사용자 및 해당 인증 방법 설정 가져오기:```powershell Get-AADUsers -appId $appId -tenant $tenant -certificatePath $certificatePath -authenticationMethods
관심 있는 통합 감사 로그 이벤트를 지난 30일 동안 검색하되, Entra ID와 관련된 이벤트는 첫 번째 명령으로 이미 검색되었으므로 제외합니다:```powershell
$endDate = Get-Date
$startDate = $endDate.AddDays(-30)
Get-O365Light -startDate $startDate -endDate $endDate -appId $appId -tenant $tenant -certificatePath $certificatePath -operationsSet "allButAzureAD"
지금부터 -90일에서 -30일 사이의 시간 창에서 관심 있는 통합 감사 로그 이벤트 검색:```powershell $endDate = (Get-Date).AddDays(-30) $startDate = (Get-Date).AddDays(-90) Get-O365Light -startDate $startDate -endDate $endDate -appId $appId -tenant $tenant -certificatePath $certificatePath
사서함 감사가 활성화되어 있으면 전용 스위치를 사용하여 `MailboxLogin` 작업을 검색할 수도 있습니다:
_검색당 50.000개 이벤트의 전역 제한에 유의하세요_```powershell
Get-O365Light -startDate $startDate -endDate $endDate -appId $appId -tenant $tenant -certificatePath $certificatePath -mailboxLogin
Office 365 E5 라이선스를 보유한 사용자가 있거나 테넌트에 Microsoft Defender for Office 365 플랜이 있는 경우, 지난 90일 동안의 Microsoft Defender 관련 로그를 검색할 수 있습니다:```powershell $endDate = Get-Date $startDate = $endDate.AddDays(-90) Get-O365Defender -startDate $startDate -endDate $endDate -appId $appId -tenant $tenant -certificatePath $certificatePath
2020년 크리스마스 이브부터 2020년 박싱 데이까지 모든 Unified Audit Log 이벤트를 검색하려면:
_해당 cmdlet을 사용한 성능은 좋지 않다는 점에 유의하십시오_```powershell
$endDate = Get-Date "12/26/2020"
$startdate = Get-Date "12/24/2020"
Get-O365Full -startDate $startDate -endDate $endDate -appId $appId -tenant $tenant -certificatePath $certificatePath
검색 기능을 사용하여 IP 주소, 특정 사용자와 관련된 활동을 조회하거나 Unified Audit Log에서 자유 텍스트 검색을 수행할 수 있습니다:```powershell $endDate = Get-Date $startDate = $endDate.AddDays(-90)
Search-O365 -startDate $startDate -endDate $endDate -appId $appId -tenant $tenant -certificatePath $certificatePath -freeTexts "Python","Python3"
Search-O365 -startDate $startDate -endDate $endDate -appId $appId -tenant $tenant -certificatePath $certificatePath -IPAddresses "8.8.8.8","4.4.4.4"
Search-O365 -startDate $startDate -endDate $endDate -appId $appId -tenant $tenant -certificatePath $certificatePath -userIds "[email protected]","[email protected]"
특정 **사용자**를 검색할 때, `Search-O365`는 사서함 감사 로그(Mailbox Audit Log)에서도 검색합니다. 이는 사용자의 라이선스 수준과 설정에 따라 일부 사서함 로그가 통합 감사 로그(Unified Audit Log)에 포함되지 않을 수 있기 때문입니다.
애플리케이션이 액세스 권한이 있는 구독에서 모든 Azure Resource Manager 활동 로그를 검색하려면:```powershell
$endDate = Get-Date
$startDate = $endDate.AddDays(-90)
Get-AzRMActivityLogs -startDate $startDate -endDate $endDate -appId $appId -tenant $tenant -certificatePath $certificatePath
애플리케이션이 액세스할 수 있는 조직에서 모든 Azure DevOps 활동 로그를 검색하려면:```powershell $endDate = Get-Date $startDate = $endDate.AddDays(-90) Get-AzDevOpsActivityLogs -startDate $startDate -endDate $endDate -appId $appId -tenant $tenant -certificatePath $certificatePath
## 생성된 파일
생성된 모든 파일은 JSON 형식입니다.
_Purview를 사용하여 동일한 출력 파일에 쓰는 여러 cmdlet을 실행하면 "단순한" 연결로 인해 잘못된 JSON이 발생할 수 있습니다._
- `Get-AADApps`는 `azure_ad_apps` 폴더에 다음을 생성합니다:
- 기존 및 삭제된 애플리케이션이 포함된 JSON 파일: `AADApps_example.onmicrosoft.com_applications_raw.json`;
- 기존 및 삭제된 서비스 주체가 포함된 JSON 파일: `AADApps_example.onmicrosoft.com_service_principals_raw.json`;
- 보강된 서비스 주체가 포함된 JSON 파일: `AADApps_example.onmicrosoft.com.json`.
- `Get-AADDevices`는 `azure_ad_devices` 폴더에 다음을 생성합니다:
- 기존 및 삭제된 디바이스가 포함된 JSON 파일: `AADDevices_example.onmicrosoft.com_devices_raw.json`;
- 보강된 디바이스가 포함된 JSON 파일: `AADDevices_example.onmicrosoft.com.json`.
- `Get-AADUsers`는 `azure_ad_users` 폴더에 다음을 생성합니다:
- 기존 및 삭제된 사용자가 포함된 JSON 파일: `AADUsers_example.onmicrosoft.com_users_raw.json`;
- 사용자 인증 설정이 포함된 JSON 파일: `AADUsers_example.onmicrosoft.com_users_settings_raw.json`;
- 보강된 사용자가 포함된 JSON 파일: `AADUsers_example.onmicrosoft.com.json`.
- `Get-AADLogs`는 다음을 생성합니다:
- `azure_ad_tenant` 폴더에:
- 테넌트에 대한 일반 정보가 포함된 JSON 파일: `AADTenant_example.onmicrosoft.com.json`.
- `azure_ad_audit` 폴더에:
- Microsoft Entra 감사 로그가 포함된 JSON 파일: `AADAuditLog_example.onmicrosoft.com_YYYY-MM-DD.json`.
- `azure_ad_signin` 폴더에:
- Microsoft Entra 로그인 로그가 포함된 JSON 파일: `YYYY-MM-DD/AADSigninLog_example.onmicrosoft.com_YYYY-MM-DD_HH-00-00.json`.
- `Get-AzRMActivityLogs`는 다음을 생성합니다:
- `azure_rm_subscriptions` 폴더에:
- 구독에 대한 일반 정보가 포함된 JSON 파일: `AzRMsubscriptions_example.onmicrosoft.com.json`.
- `azure_rm_activity` 폴더에:
- Azure Monitor 활동 로그가 포함된 JSON 파일: `YYYY-MM-DD/AzRM_example.onmicrosoft.com_%SubscriptionID%_YYYY-MM-DD_HH-00-00.json`.
- `Get-AzDevOpsActivityLogs`는 다음을 생성합니다:
- `azure_DevOps_orgs` 폴더에:
- Azure DevOps 조직에 대한 일반 정보가 포함된 JSON 파일: `AzdevopsOrgs_example.onmicrosoft.com.json`.
- `azure_DevOps_activity` 폴더에:
- Azure DevOps 감사 로그가 포함된 JSON 파일: `YYYY-MM-DD/AzDevOps_example.onmicrosoft.com_%AzureDevOpsOrg%_YYYY-MM-DD_HH-00-00.json`.
- `Get-O365Full`은 `O365_unified_audit_logs` 폴더(Purview 사용 시 각각 `O365_unified_audit_logs_purview` 폴더)에 다음을 생성합니다:
- 통합 감사 로그가 포함된 JSON 파일: `YYYY-MM-DD/UnifiedAuditLog_example.onmicrosoft.com_YYYY-MM-DD_HH-00-00.json` (Purview 사용 시 각각 `*/UnifiedAuditLogPurview_*`);
- 지정된 [RecordTypes](https://learn.microsoft.com/en-us/office/office-365-management-api/office-365-management-activity-api-schema#enum-auditlogrecordtype---type-edmint32)에 대한 통합 감사 로그가 포함된 JSON 파일: `YYYY-MM-DD/UnifiedAuditLog_example.onmicrosoft.com_YYYY-MM-DD_HH-00-00_%RecordType%.json` (Purview 사용 시 각각 `*/UnifiedAuditLogPurview_*`).
- `Get-O365Light`는 `O365_unified_audit_logs` 폴더(Purview 사용 시 각각 `O365_unified_audit_logs_purview` 폴더)에 다음을 생성합니다:
- 관심 대상으로 간주되는 *작업*의 하위 집합에 대한 통합 감사 로그가 포함된 JSON 파일: `YYYY-MM-DD/UnifiedAuditLog_example.onmicrosoft.com_YYYY-MM-DD_HH-00-00.json` (Purview 사용 시 각각 `*/UnifiedAuditLogPurview_*`).
- `Get-O365Defender`는 `O365_unified_audit_logs` 폴더(Purview 사용 시 각각 `O365_unified_audit_logs_purview` 폴더)에 다음을 생성합니다:
- Defender와 연결된 [RecordTypes](https://learn.microsoft.com/en-us/office/office-365-management-api/office-365-management-activity-api-schema#enum-auditlogrecordtype---type-edmint32)에 대한 통합 감사 로그가 포함된 JSON 파일: `YYYY-MM-DD/UnifiedAuditLog_example.onmicrosoft.com_YYYY-MM-DD_HH-00-00_%RecordType%.json` (Purview 사용 시 각각 `*/UnifiedAuditLogPurview_*`).
- `Search-O365`는 다음을 생성합니다:
- `O365_unified_audit_logs` 폴더(Purview 사용 시 각각 `O365_unified_audit_logs_purview` 폴더)에:
- 지정된 `RequestType`(`FreeText`, `IPAddresses` 또는 `UserIds`)에 대한 통합 감사 로그가 포함된 JSON 파일: `YYYY-MM-DD/UnifiedAuditLog_example.onmicrosoft.com_YYYY-MM-DD_HH-00-00_%RequestType%_YYYY-MM-DD-HH-MM-SS.json` (Purview 사용 시 각각 `*/UnifiedAuditLogPurview_*`). `YYYY-MM-DD-HH-MM-SS`는 수집이 수행된 시간을 나타냅니다. `FreeText`를 검색할 때는 끝에 추가 `_%i`가 추가되며, 이는 `%i`번째 자유 텍스트 검색 결과임을 나타냅니다.
- `Exchange_mailbox_audit_logs` 폴더에:
- 사서함 감사 로그가 포함된 JSON 파일(UserIDs 검색 시에만): `YYYY-MM-DD/MailboxAuditLog_example.onmicrosoft.com_YYYY-MM-DD_HH-00-00_UserIds_YYYY-MM-DD-HH-MM-SS_%UserID%.json`. `YYYY-MM-DD-HH-MM-SS`는 수집이 수행된 시간을 나타냅니다. `%UserID%`는 이 UserID에 대한 검색 결과임을 나타냅니다.
다양한 함수를 실행하면 다음과 유사한 디렉터리 구조가 생성됩니다:```
output
│ Get-AADApps.log
│ Get-AADDevices.log
│ Get-AADLogs.log
│ Get-AzDevOpsActivityLogs.log
│ Get-AzRMActivityLogs.log
│ Get-O365Defender.log
│ Get-O365Full.log
│ Get-O365Light.log
│ Search-O365.log
│
├───azure_ad_apps
│ AADApps_example.onmicrosoft.com.json
│ AADApps_example.onmicrosoft.com_applications_raw.json
│ AADApps_example.onmicrosoft.com_service_principals_raw.json
│
├───azure_ad_audit
│ AADAuditLog_example.onmicrosoft.com_YYYY-MM-DD.json
│ [...]
│
├───azure_ad_devices
│ AADDevices_example.onmicrosoft.com.json
│ AADDevices_example.onmicrosoft.com_devices_raw.json
│
├───azure_ad_signin
│ ├───YYYY-MM-DD
│ │ AADSigninLog_example.onmicrosoft.com_YYYY-MM-DD_HH-00-00.json
│ │ [...]
│ │
│ ├───[...]
│
├───azure_ad_tenant
│ AADTenant_example.onmicrosoft.com.json
│
├───azure_ad_users
│ AADUsers_divreponse.onmicrosoft.com.json
│ AADUsers_divreponse.onmicrosoft.com_users_raw.json
│ AADUsers_divreponse.onmicrosoft.com_users_settings_raw.json
|
├───azure_DevOps_activity
│ ├───YYYY-MM-DD
│ │ AzDevOps_example.onmicrosoft.com_%AzureDevOpsOrg%_YYYY-MM-DD_HH-00-00.json
│ │ [...]
│ │
│ ├───[...]
│
├───azure_DevOps_orgs
│ AzdevopsOrgs_example.onmicrosoft.com.json
├───azure_rm_activity
│ ├───YYYY-MM-DD
│ │ AzRM_example.onmicrosoft.com_%SubscriptionID%_YYYY-MM-DD_HH-00-00.json
│ │ [...]
│ │
│ ├───[...]
│
├───azure_rm_subscriptions
│ AzRMsubscriptions_example.onmicrosoft.com.json
│
├───Exchange_mailbox_audit_logs
│ └───YYYY-MM-DD
│ │ MailboxAuditLog_example.onmicrosoft.com_YYYY-MM-DD_HH-00-00_UserIds_YYYY-MM-DD-HH-MM-SS_%UserID%.json
│ │ [...]
│ │
│ ├───[...]
│
├───O365_unified_audit_logs
│ ├───YYYY-MM-DD
│ │ UnifiedAuditLog_example.onmicrosoft.com_YYYY-MM-DD_HH-00-00.json
│ │ UnifiedAuditLog_example.onmicrosoft.com_YYYY-MM-DD_HH-00-00_%RecordType%.json
│ │ UnifiedAuditLog_example.onmicrosoft.com_YYYY-MM-DD_HH-00-00_UserIds_YYYY-MM-DD-HH-MM-SS.json
│ │ UnifiedAuditLog_example.onmicrosoft.com_YYYY-MM-DD_HH-00-00_IPAddresses_YYYY-MM-DD-HH-MM-SS.json
│ │ UnifiedAuditLog_example.onmicrosoft.com_YYYY-MM-DD_HH-00-00_FreeText_YYYY-MM-DD-HH-MM-SS_%i.json
│ │ [...]
│ │
│ ├───[...]
│
└───O365_unified_audit_logs_purview
│ ├───YYYY-MM-DD
│ │ UnifiedAuditLogPurview_example.onmicrosoft.com_YYYY-MM-DD_HH-00-00.json
│ │ UnifiedAuditLogPurview_example.onmicrosoft.com_YYYY-MM-DD_HH-00-00_%RecordType%.json
│ │ UnifiedAuditLogPurview_example.onmicrosoft.com_YYYY-MM-DD_HH-00-00_UserIds_YYYY-MM-DD-HH-MM-SS.json
│ │ UnifiedAuditLogPurview_example.onmicrosoft.com_YYYY-MM-DD_HH-00-00_IPAddresses_YYYY-MM-DD-HH-MM-SS.json
│ │ UnifiedAuditLogPurview_example.onmicrosoft.com_YYYY-MM-DD_HH-00-00_FreeText_YYYY-MM-DD-HH-MM-SS_%i.json
│ │ [...]
│ │
│ ├───[...]
| 데이터 원본 / 엔드포인트 | 보존 기간 | 성능 | 범위 |
|---|
| 통합 감사 로그 / Exchange Online PowerShell | 90일 | 낮음 | 모든 Microsoft 365 로그(Entra 포함) |
| 통합 감사 로그 / Purview | 180일 | 좋음 | 모든 Microsoft 365 로그(Entra 포함) |
| 통합 감사 로그 / Office 365 Management API * | 7일 | 좋음 | 모든 Microsoft 365 로그(Entra 포함) |
| Microsoft Entra 로그 / Microsoft Graph PowerShell | 30일 | 좋음 | Entra 로그인 및 감사 로그만 |
| Microsoft Entra 로그 / Microsoft Graph REST API | 30일 | 좋음 | Entra 로그인 및 감사 로그만 |