
Microsoft 365 환경의 보안 평가를 자동화하는 PowerShell 스크립트입니다.

PowerShell 스크립트를 작성하여 Microsoft 365 환경의 보안 평가를 자동화함으로써 Microsoft 365 보안 상태를 한 단계 더 발전시킵니다.
Soteria Inspect는 365Inspect 프로젝트에서 탄생했으며, Microsoft 365 서비스 전반에 걸쳐 200개 이상의 검사 지점을 통해 Microsoft 365 테넌트의 보안을 평가하는 Soteria의 SaaS 솔루션입니다.
Microsoft 365용 Soteria Inspect를 사용하면 고객이 시간 경과에 따른 각 검사 결과의 영향을 받는 개체와 수정 노력의 변경 사항을 추적할 수 있으며, 이제 MSP 및 상위 조직이 하위 테넌트의 상태를 파악할 수 있는 멀티 테넌시 기능도 포함됩니다.
Microsoft 365용 Soteria Inspect는 Soteria 또는 Azure Marketplace를 통해 직접 이용 가능합니다.
모든 Soteria Inspect for Microsoft 365 제품을 확인하세요.

365Inspect Community Edition을 사용하려면 Exchange 관리, Microsoft Graph, Microsoft Teams 및 SharePoint 관리 모듈에 대한 관리 PowerShell 모듈이 필요합니다.
365Inspect는 이제 PowerShell Core(6+)와 호환되며, 필요한 모듈 종속성으로 인해 Microsoft Windows 운영 체제가 필요합니다.
365Inspect.ps1 PowerShell 스크립트는 검사기가 작동하는 데 필요한 설치된 모듈과 최소 버전을 확인합니다.
이러한 모듈이 설치되어 있지 않으면 설치하라는 메시지가 표시되며, 승인 시 스크립트가 설치를 시도합니다. 그렇지 않으면 관리 PowerShell 프롬프트에서 다음 명령을 사용하거나 아래 참조의 지침에 따라 설치할 수 있습니다.
Install-Module -Name ExchangeOnlineManagement -AllowClobber -Force
Install-Module -Name PnP.PowerShell -AllowClobber -Force
Install-Module -Name Microsoft.Graph -AllowClobber -Force
Install-Module -Name MicrosoftTeams -AllowClobber -Force
SharePoint PnP PowerShell 모듈 설치
위 항목이 설치되면 브라우저를 사용하거나 git clone을 사용하여 Github에서 365Inspect 소스 코드 폴더를 다운로드합니다.
2024년 9월 9일부터 PnP.PowerShell은 테넌트 관리자가 SharePoint/PnP 서비스에 사용할 자체 애플리케이션을 등록해야 합니다. 필요한 단계는 다음 PnP.PowerShell 문서를 참조하세요. PnP PowerShell과 함께 사용할 Entra ID 애플리케이션 등록 권한 확인 인증
참고: PowerShell 5.1을 사용하는 경우 PnP PowerShell은 더 이상 호환되지 않으며 실행 시 모든 SharePoint 검사기가 제외됩니다.
이 단계를 자동화하는 명령이 있습니다.```powershell Register-PnPEntraIDAppForInteractiveLogin -ApplicationName "PnP Rocks" -Tenant [yourtenant].onmicrosoft.com -Interactive
__생성된 애플리케이션의 이름 또는 애플리케이션/클라이언트 ID를 기억하십시오. 인증 시 필요하며, AppID를 입력하라는 메시지가 표시됩니다!__
## 모듈 호환성
현재 Microsoft.Graph 및 Microsoft.Graph.Beta 모듈 버전 2.23.0은 ExchangeOnlineManagement 버전 3.5.1과 호환되지 않습니다.
다음 버전이 호환됩니다:
- Microsoft.Graph 버전 2.21.1
- Microsoft.Graph.Beta 버전 2.21.1
- ExchangeOnlineManagement 버전 3.5.0
호환 가능한 버전을 설치하려면 다음 명령을 사용할 수 있습니다:
```powershell
Install-Module -Name Microsoft.Graph -RequiredVersion 2.21.1
Install-Module -Name Microsoft.Graph.Beta -RequiredVersion 2.21.1
Install-Module -Name ExchangeOnlineManagement -RequiredVersion 3.5.0
``````powershell
Install-Module -Name Microsoft.Graph -Scope CurrentUser -RequiredVersion 2.21.1 -AllowClobber -Force
Install-Module -Name Microsoft.Graph.Beta -Scope CurrentUser -RequiredVersion 2.21.1 -AllowClobber -Force
Install-Module -Name ExchangeOnlineManagement -Scope CurrentUser -RequiredVersion 3.5.0 -AllowClobber -Force
365Inspect를 관리자 권한으로 실행할 예정이므로, 논리적인 위치에 배치하고 폴더의 내용이 관리 사용자만 읽고 쓸 수 있도록 해야 합니다. 이는 365Inspect를 자주 실행하거나 자동화 프로세스의 일부로 사용할 계획이 있는 경우 특히 중요합니다. 참고: 365Inspect가 기능하기 위해 관리자 PowerShell 창에서 실행할 필요는 없습니다.
365Inspect를 실행하려면 PowerShell 콘솔을 열고 365Inspect를 다운로드한 폴더로 이동합니다:
cd 365Inspect
PowerShell 명령 프롬프트에서 기본 스크립트 파일인 365Inspect.ps1을 실행하여 365Inspect와 상호 작용합니다.
365Inspect가 M365 테넌트를 검사하는 데 필요한 모든 것은 적절한 권한이 있는 M365 계정을 통한 액세스뿐이므로, 대부분의 명령줄 매개 변수는 평가 대상 조직 및 인증 방법과 관련됩니다.
365Inspect의 실행은 다음과 같습니다:
.\365Inspect.ps1 -OutPath <값> -UserPrincipalName [email protected] -Auth <MFA|DEVICE|ALREADY_AUTHED|APP> -pnpPowerShellApplicationId <Pnp PowerShell 애플리케이션/클라이언트 ID>
예를 들어, MFA를 지원하는 브라우저에서 자격 증명을 입력하여 로그인하려면:
.\365Inspect.ps1 -OutPath ..\365_report -UserPrincipalName [email protected] -Auth MFA
정부 또는 기타 국가 클라우드 배포(중국, 독일 등)에 로그인하려면 -Environment 매개 변수를 다음과 같이 지정해야 합니다:
.\365Inspect.ps1 -OutPath ..\365_report -UserPrincipalName [email protected] -Auth MFA -Environment USGovGCCHigh
-Environment에 유효한 인수는 다음과 같습니다:
애플리케이션 인증은 다음 매개 변수로 스크립트를 실행하여 수행할 수 있습니다:
.\365Inspect.ps1 -OutPath ..\365_report -UserPrincipalName [email protected] -Auth APP
정부 또는 기타 국가 클라우드 배포(중국, 독일 등)에 로그인하려면 -Environment 매개 변수를 다음과 같이 지정해야 합니다:
.\365Inspect.ps1 -OutPath ..\365_report -UserPrincipalName [email protected] -Auth APP -Environment USGovGCCHigh
365Inspect가 실행되면 어떤 검사 작업이 실행 중인지 상태 업데이트를 꾸준히 출력합니다.
365Inspect는 실행하는 데 시간이 걸릴 수 있습니다. 이 시간은 테스트 중인 환경의 크기와 복잡성에 비례합니다. 예를 들어, 일부 검사 작업은 모든 사용자의 계정 구성을 스캔하는 것을 포함합니다. 이는 50명의 사용자가 있는 조직에서는 거의 즉시 발생하거나 10,000명의 사용자가 있는 조직에서는 전체 몇 분(!)이 걸릴 수 있습니다.
365Inspect는 out_path 매개 변수에 지정된 디렉터리를 생성합니다. 이 디렉터리는 전체 365Inspect 검사의 결과입니다. 여기에는 주목할 만한 네 가지 항목이 포함됩니다:
반환된 일부 항목의 특성상 CSV 보고서는 캐럿(^) 문자로 구분됩니다. CSV 보고서는 Excel에서 열지 말고 텍스트 편집기에서 여는 것이 좋습니다. Excel은 기본적으로 쉼표(,) 구분 기호를 사용하여 보고서를 잘못 렌더링하기 때문입니다. 텍스트 편집기에서 연 후 데이터를 Excel에 붙여넣을 수 있습니다.
디바이스 인증 지원
국가 클라우드 배포 지원
365Inspect가 이제 애플리케이션 인증 지원
365Inspect의 HTML 보고서 형식 변경



인증하는 M365 계정에 적절한 권한이 없으면 365Inspect가 제대로 실행될 수 없습니다. 365Inspect는 최소한 다음이 필요합니다:
이러한 역할이 매우 허용적이라는 점을 알고 있습니다. 불행히도 Microsoft Graph를 사용하기 때문에 Microsoft에 의해 더 낮은 권한을 사용하는 것이 제한됩니다. 애플리케이션 관리자 및 클라우드 애플리케이션 관리자 역할(위임 및 애플리케이션 권한을 부여하는 데 사용됨)은 Microsoft Graph 또는 Azure AD PowerShell 모듈에 대한 권한을 부여하는 데 제한이 있습니다. Microsoft Docs - 애플리케이션 관리자
애플리케이션 인증 매개 변수를 사용하여 365Inspect를 실행하는 경우 애플리케이션이 모든 실행 작업을 수행할 수 있도록 추가 역할을 부여해야 합니다. 애플리케이션 인증 요구 사항을 참조하십시오.
365Inspect를 사용하려면 먼저 다른 모든 필수 구성 요소가 준비되어 있어야 합니다.
가장 효율적인 시간 사용을 위해 필요한 기능을 다음 순서로 수행하는 것이 좋습니다:
다음 참조를 확인하십시오:
365Inspect는 확장하기 쉽도록 설계되었으며, 개인과 조직이 자체 365Inspect 모듈을 내부적으로 활용하거나 M365 커뮤니티를 위해 해당 모듈을 게시할 수 있기를 바랍니다.
365Inspect의 모든 검사기 모듈은 .\inspectors 폴더에 저장됩니다.
검사기 모듈을 만드는 것은 간단합니다. 검사기에는 두 개의 파일이 있습니다:
템플릿은 Templates 폴더에 포함되어 있습니다. 해당 위치에 코드와 값을 추가하기만 하면 됩니다. PowerShell 및 JSON 파일 이름은 365Inspect가 두 파일이 함께 속한다는 것을 인식할 수 있도록 동일해야 합니다. 365Inspect의 내장 모듈 제품군에는 수많은 예제가 있지만, 여기에도 예제를 제공하겠습니다.
# If some of the parsed M365 objects were found to have the security flaw this module is inspecting for,
# return a list of strings representing those objects. This is what will end up as the "Affected Objects"
# field in the report.
If ($safe_attachment_bypass_rules.Count -ne 0) {
return $safe_attachment_bypass_rules
}
# If none of the parsed M365 objects were found to have the security flaw this module is inspecting for,
# returning $null indicates to 365Inspect that there were no findings for this module.
return $null
}
return Inspect-BypassingSafeAttachments
</details>
<details>
<summary>예시 .json 파일, BypassingSafeAttachments.json:</summary>```json
{
"FindingName": "Do Not Bypass the Safe Attachments Filter",
"Description": "In Exchange, it is possible to create mail transport rules that bypass the Safe Attachments detection capability. The rules listed above bypass the Safe Attachments capability. Consider reviewing these rules, as bypassing the Safe Attachments capability even for a subset of senders could be considered insecure depending on the context or may be an indicator of compromise.",
"Remediation": "Navigate to the Mail Flow → Rules screen in the Exchange Admin Center. Look for the offending rules and begin the process of assessing who created them and whether they are necessary to the continued function of the organization. If they are not, remove the rules.",
"DefaultValue": "None",
"ExpectedValue": "None",
"Impact": "Critical",
"AffectedObjects": "",
"Service": "Exchange", // Valid values are Exchange, SharePoint, Teams, Intune, AzureAD, SecurityandCompliance, Tenant //
"PowerShell": "", // Any PowerShell remediation command examples should be placed here //
"References": [
{
"Url": "https://docs.microsoft.com/en-us/exchange/security-and-compliance/mail-flow-rules/manage-mail-flow-rules",
"Text": "Manage Mail Flow Rules in Exchange Online"
},
{
"Url": "https://www.undocumented-features.com/2018/05/10/atp-safe-attachments-safe-links-and-anti-phishing-policies-or-all-the-policies-you-can-shake-a-stick-at/#Bypass_Safe_Attachments_Processing",
"Text": "Undocumented Features: Safe Attachments, Safe Links, and Anti-Phishing Policies"
}
]
}
이 두 파일을 .\inspectors 폴더에 넣으면 365Inspect의 모듈 인벤토리에 포함되며, 다음에 365Inspect를 실행할 때 실행됩니다.
방금 BypassingSafeAttachments 인스펙터 모듈을 만드셨습니다. 그게 전부입니다!
모듈이 작동하지 않거나 365Inspect 규칙을 따르지 않으면 365Inspect에서 꽤 크고 보기 흉한 오류를 표시하므로 명령줄 출력을 모니터링하세요.
커뮤니티의 참여와 기여를 환영합니다! 기여 지침을 확인해 주세요.
365Inspect는 .\inspectors 폴더에 저장된 다른 인스펙터 스크립트 모듈을 실행하는 스크립트 래퍼입니다. 상승된 권한으로 실행할 수 있는 다른 스크립트와 마찬가지로, 다음과 같은 보안 위생 관행을 준수해야 합니다.
Soteria는 침해 사고 대응, 관리형 탐지 및 대응, 보안 평가, 침투 테스트 등 다양한 보안 및 자문 솔루션을 제공합니다. 모든 요구 사항에 대해 문의하세요!
-Environment에 유효한 인수는 다음과 같습니다:
참고: 애플리케이션 인증으로 365Inspect를 실행하기 위한 전제 조건이 있습니다. 애플리케이션 인증 요구 사항으로 이동
365Inspect는 이제 HTML(기본값), CSV 및 XML 형식으로 보고서 출력을 지원합니다.
예를 들어, -ReportType 매개 변수를 호출하여 CSV 보고서를 생성할 수 있습니다:
.\365Inspect.ps1 -OutPath ..\365_report -UserPrincipalName [email protected] -Auth MFA -ReportType CSV
365Inspect는 선택한 검사기 모듈만 실행하거나 반대로 선택한 모듈을 제외하여 실행할 수 있습니다.
예를 들어, MFA를 지원하는 브라우저에서 자격 증명을 입력하여 로그인하려면:
.\365Inspect.ps1 -OutPath ..\365_report -UserPrincipalName [email protected] -Auth MFA -SelectedInspectors inspector1, inspector2
또는
.\365Inspect.ps1 -OutPath ..\365_report -Auth MFA -ExcludedInspectors inspector1, inspector2, inspector3
매개 변수를 더 자세히 설명하면:
OutPath는 365Inspect가 생성한 보고서가 배치될 폴더의 경로입니다.
Auth는 리터럴 값 "MFA" 또는 "ALREADY_AUTHED" 중 하나여야 하는 선택기입니다.
SelectedInspectors는 365Inspect로 실행하려는 검사기(하나 이상)의 이름입니다. 여러 검사기를 선택하는 경우 쉼표로 구분해야 합니다. 이름이 지정된 검사기만 실행됩니다.
ExcludedInspectors는 365Inspect로 실행하지 않으려는 검사기(하나 이상)의 이름입니다. 여러 검사기를 선택하는 경우 쉼표로 구분해야 합니다. 포함된 모듈을 제외한 모든 모듈이 실행됩니다.
UserPrincipalName - 평가자의 사용자 계정 이름(UserPrincipalName)으로, 지원되는 모듈에서 자격 증명을 입력해야 하는 횟수를 줄이기 위해 포함됩니다.
ReportType - 생성된 보고서의 출력 형식. 현재 지원되는 값은 HTML(기본값), CSV 및 XML입니다.
Environment - 비표준/소비자 Microsoft 365 테넌트에 연결할 Azure 클라우드 인스턴스를 지정합니다.
-Auth MFA와 함께 365Inspect를 실행하면 순차적으로 로그인해야 하는 여러 그래픽 로그인 프롬프트가 나타날 수 있습니다. 이는 Exchange, SharePoint 등이 별도의 관리 모듈을 가지고 있고 각각 다른 로그인 세션이 필요하기 때문에 정상적인 동작입니다. 요청된 횟수만큼 로그인하면 365Inspect가 실행되기 시작합니다. 이는 재미와는 거리가 멀며 해결 방법을 찾고 있지만, 결과가 MFA 코드를 보는 데 소비하는 1분의 가치가 있다고 생각합니다.