This preview uses sample data so you can see how your branding lands before running a report against a real tenant.
" + }, + { + "type": "infobox", + "title": "Why this matters", + "content": "Identity is the perimeter: **every** control in this report starts with who can sign in, and from where.", + "static": true + }, + { + "type": "richbullets", + "title": "Key points", + "items": [ + { + "label": "MFA is enforced.", + "text": "All 128 licensed users are covered by a Conditional Access policy." + }, + { + "label": "Legacy authentication is blocked.", + "text": "No sign-ins over IMAP, POP or SMTP AUTH in the last 30 days." + } + ], + "static": true + }, + { + "type": "note", + "content": "Figures are taken from the last completed sync, not read live.", + "static": true + }, + { + "type": "page", + "title": "Findings in detail", + "subtitle": "What we found, and what to do about it", + "static": true + }, + { + "id": "sample-2", + "type": "scorecard", + "title": "Environment Overview", + "static": true, + "stats": [ + { + "label": "Licensed Users", + "value": "128" + }, + { + "label": "Devices", + "value": "96" + }, + { + "label": "Global Admins", + "value": "3", + "caption": "Target: 2–4" + }, + { + "label": "Guests", + "value": "9" + } + ] + }, + { + "id": "sample-3", + "type": "chart", + "title": "Device Compliance", + "static": true, + "chartKind": "donut", + "chartCentreLabel": "Devices", + "chartData": [ + { + "label": "Compliant", + "value": 78 + }, + { + "label": "Non-compliant", + "value": 14 + }, + { + "label": "Not evaluated", + "value": 4 + } + ] + }, + { + "id": "sample-4", + "type": "chart", + "title": "Secure Score Trend", + "static": true, + "chartKind": "trend", + "chartMax": 100, + "chartCaption": "Current: 61 / 100 (61%)", + "chartData": [ + { + "label": "Jul 29", + "value": 50 + }, + { + "label": "Jul 31", + "value": 55 + }, + { + "label": "Aug 2", + "value": 58 + }, + { + "label": "Aug 4", + "value": 61 + } + ] + }, + { + "id": "sample-5", + "type": "progress", + "title": "Control Coverage", + "static": true, + "items": [ + { + "label": "MFA enforced", + "value": 92, + "max": 100 + }, + { + "label": "Disk encryption", + "value": 78, + "max": 100 + }, + { + "label": "Defender onboarded", + "value": 64, + "max": 100 + } + ] + }, + { + "type": "richtable", + "title": "Top findings", + "columns": [ + { + "header": "Finding", + "key": "c1" + }, + { + "header": "Impact", + "key": "c2" + }, + { + "header": "Owner", + "key": "c3" + } + ], + "rows": [ + { + "c1": "3 stale guest accounts", + "c2": "Medium", + "c3": "IT" + }, + { + "c1": "2 devices out of compliance", + "c2": "Low", + "c3": "Service desk" + } + ], + "static": true + }, + { + "type": "infoboxcolumns", + "columns": 2, + "items": [ + { + "title": "Done this quarter", + "content": "Passwordless sign-in rolled out to 40% of staff." + }, + { + "title": "Next quarter", + "content": "Extend it to the remaining sites and the shared mailboxes." + } + ], + "static": true + }, + { + "id": "sample-6", + "type": "pagebreak", + "title": "", + "static": true + }, + { + "id": "sample-7", + "type": "hero", + "title": "seconds", + "static": true, + "heroHighlight": "39", + "heroSubText": "a business falls victim to ransomware", + "heroFooterText": "Proactive defense beats reactive recovery", + "heroImage": "/reportImages/working.jpg" + }, + { + "id": "sample-8", + "type": "test", + "title": "Multi-factor authentication", + "status": "Failed", + "static": false, + "content": "14 of 128 accounts can still sign in without a second factor.\n\n## Results\n\n| Account | Method | Last sign-in |\n| --- | --- | --- |\n| sample.one@example.com | None | 2 days ago |\n| sample.two@example.com | None | 9 days ago |\n" + }, + { + "id": "sample-9", + "type": "chart", + "title": "Devices by Platform", + "static": true, + "chartKind": "bar", + "chartData": [ + { + "label": "Windows", + "value": 62 + }, + { + "label": "macOS", + "value": 18 + }, + { + "label": "iOS", + "value": 12 + }, + { + "label": "Android", + "value": 4 + } + ] + }, + { + "id": "sample-10", + "type": "database", + "title": "Query Results", + "static": true, + "format": "text", + "content": "| Policy | Identifier | State |\n| --- | --- | --- |\n| Baseline | 8f2a1c4e-6b3d-4f5a-9e7c-1d2b3a4c5e6f | Enabled |\n| Hardened | Microsoft_Defender_for_Business_Servers | Report only |\n" + }, + { + "id": "sample-11", + "type": "database", + "title": "Raw Response", + "static": true, + "format": "json", + "content": "{\n \"tenant\": \"contoso.com\",\n \"policies\": 191,\n \"enabled\": 5\n}" + } + ] +} diff --git a/Config/ReportSamples/shadowAI.json b/Config/ReportSamples/shadowAI.json new file mode 100644 index 0000000000000..c5a4f9f6fcede --- /dev/null +++ b/Config/ReportSamples/shadowAI.json @@ -0,0 +1,103 @@ +{ + "summary": { + "aiToolsDetected": 18, + "deviceInstalls": 36, + "consentedAiApps": 5, + "highRiskTools": 3, + "sanctionedTools": 2 + }, + "byRisk": [ + { + "risk": "High", + "tools": 3 + }, + { + "risk": "Medium", + "tools": 7 + }, + { + "risk": "Low", + "tools": 6 + }, + { + "risk": "Informational", + "tools": 2 + } + ], + "topTools": [ + { + "tool": "Sample AI Assistant", + "category": "Chat", + "status": "Unsanctioned", + "devices": 22, + "users": 18 + }, + { + "tool": "Sample Code Helper", + "category": "Development", + "status": "Unsanctioned", + "devices": 14, + "users": 9 + }, + { + "tool": "Sample Notetaker", + "category": "Meetings", + "status": "Sanctioned", + "devices": 11, + "users": 24 + } + ], + "detectedApps": [ + { + "application": "Sample AI Assistant Desktop", + "aiTool": "Sample AI Assistant", + "vendor": "Example Corp", + "category": "Chat", + "risk": "High", + "status": "Unsanctioned", + "deviceCount": 22 + }, + { + "application": "Sample Code Helper", + "aiTool": "Sample Code Helper", + "vendor": "Example Labs", + "category": "Development", + "risk": "Medium", + "status": "Unsanctioned", + "deviceCount": 14 + }, + { + "application": "Sample Notetaker", + "aiTool": "Sample Notetaker", + "vendor": "Example Corp", + "category": "Meetings", + "risk": "Informational", + "status": "Sanctioned", + "deviceCount": 11 + } + ], + "consentedApps": [ + { + "applicationId": "00000000-0000-0000-0000-000000000001", + "application": "Sample AI Connector", + "aiTool": "Sample AI Assistant", + "vendor": "Example Corp", + "category": "Chat", + "risk": "High", + "status": "Unsanctioned", + "activeUsersLast7Days": 18, + "firstConsentedDateTime": "2026-06-11T10:22:00Z" + }, + { + "applicationId": "00000000-0000-0000-0000-000000000002", + "application": "Sample Meeting Notes", + "aiTool": "Sample Notetaker", + "vendor": "Example Corp", + "category": "Meetings", + "risk": "Informational", + "status": "Sanctioned", + "activeUsersLast7Days": 24, + "firstConsentedDateTime": "2026-03-02T14:05:00Z" + } + ] +} diff --git a/Config/ReportSamples/sharing.json b/Config/ReportSamples/sharing.json new file mode 100644 index 0000000000000..d7f89977f75d3 --- /dev/null +++ b/Config/ReportSamples/sharing.json @@ -0,0 +1,53 @@ +{ + "summary": { + "totalLinks": 24, + "itemsShared": 18, + "externalRecipients": 6, + "anonymousLinks": 4, + "anonymousEditLinks": 1, + "neverExpiringAnonymous": 2, + "folderShares": 3, + "externalLinks": 6, + "sharePointSites": 5, + "teamsSites": 3, + "oneDriveAccounts": 12 + }, + "links": [ + { + "itemName": "Sample Proposal.docx", + "siteName": "Sample Marketing", + "linkType": "Anonymous", + "scope": "Edit", + "expires": "Never", + "recipients": "Anyone with the link" + }, + { + "itemName": "Sample Budget.xlsx", + "siteName": "Sample Finance", + "linkType": "External", + "scope": "View", + "expires": "2026-12-31", + "recipients": "partner@example.com" + } + ], + "topRecipients": [ + { + "recipient": "partner@example.com", + "links": 5 + }, + { + "recipient": "supplier@example.net", + "links": 3 + } + ], + "topLibraries": [ + { + "library": "Sample Marketing / Documents", + "links": 9 + }, + { + "library": "Sample Finance / Documents", + "links": 6 + } + ] +} diff --git a/Config/SAMManifest.json b/Config/SAMManifest.json index b4f29624ddd64..1ebb413e38985 100644 --- a/Config/SAMManifest.json +++ b/Config/SAMManifest.json @@ -743,6 +743,15 @@ "type": "Scope" } ] + }, + { + "resourceAppId": "09abbdfd-ed23-44ee-a2d9-a627aa1c90f3", + "resourceAccess": [ + { + "id": "68067c9d-a1be-4603-b095-3eaf54a42510", + "type": "Role" + } + ] } ], "servicePrincipalLockConfiguration": { diff --git a/Config/SecuritySimulations/CAAnalysis/AppDescriptions.json b/Config/SecuritySimulations/CAAnalysis/AppDescriptions.json new file mode 100644 index 0000000000000..fdd07d236aa58 --- /dev/null +++ b/Config/SecuritySimulations/CAAnalysis/AppDescriptions.json @@ -0,0 +1,33 @@ +[ + { "appId": "00000002-0000-0000-c000-000000000000", "displayName": "Windows Azure Active Directory", "purpose": "The older directory service interface, used by legacy applications to read and write users, groups and applications.", "commonExclusionReason": "Sometimes exempted so older applications that have not moved to Microsoft Graph keep working. Exempting it also lets every user read basic profile details without meeting the policy.", "exclusionRisk": "critical" }, + { "appId": "00000003-0000-0000-c000-000000000000", "displayName": "Microsoft Graph", "purpose": "The main interface to all Microsoft 365 services. Almost every Microsoft and third-party application uses it to reach mail, files, users, groups and Teams.", "commonExclusionReason": "Rarely has a valid reason to be exempt. Exempting it lets every application read basic profile and directory details without meeting the policy.", "exclusionRisk": "critical" }, + { "appId": "0000000c-0000-0000-c000-000000000000", "displayName": "Microsoft App Access Panel", "purpose": "The My Apps portal where people discover and launch the applications assigned to them.", "commonExclusionReason": "Exempted so people can browse their application list without a multifactor prompt. Low risk, because opening an application still triggers that application's own policy.", "exclusionRisk": "low" }, + { "appId": "2793995e-0a7d-40d7-bd35-6968ba142197", "displayName": "My Apps", "purpose": "The newer My Apps experience for finding and launching assigned applications.", "commonExclusionReason": "Exempted for the same reason as the App Access Panel. Launching an application still triggers that application's own policy.", "exclusionRisk": "low" }, + { "appId": "8c59ead7-d703-4a27-9e55-c96a0054c8d2", "displayName": "My Profile", "purpose": "The My Account portal where people manage their profile, sign-in methods, devices and privacy settings.", "commonExclusionReason": "Exempted so people can update their sign-in methods without being blocked. Without the exemption some people cannot register multifactor methods at all.", "exclusionRisk": "medium" }, + { "appId": "797f4846-ba00-4fd7-ba43-dac1f8f63013", "displayName": "Azure Resource Manager", "purpose": "The management layer for all Azure resources. Every portal, command-line and automation operation in Azure goes through it.", "commonExclusionReason": "Exempted so automation and service accounts can manage Azure resources. High risk, because a stolen credential then gives control of the entire Azure estate.", "exclusionRisk": "critical" }, + { "appId": "c44b4083-3bb0-49c1-b47d-974e53cbdf3c", "displayName": "Azure Portal", "purpose": "The Azure management website that gives visual access to every Azure service.", "commonExclusionReason": "Rarely exempted. Because the portal works through Azure Resource Manager, a policy on that service already covers the portal.", "exclusionRisk": "critical" }, + { "appId": "372140e0-b3b7-4226-8ef9-d57986796201", "displayName": "Azure Windows VM Sign-In", "purpose": "Lets people sign in to Azure Windows virtual machines with their Microsoft Entra account over remote desktop instead of local credentials.", "commonExclusionReason": "Exempted from multifactor policies because remote desktop sign-in to a virtual machine cannot show an interactive prompt. Microsoft documents this as a known limitation; protect the machines with network controls instead.", "exclusionRisk": "medium" }, + { "appId": "00000002-0000-0ff1-ce00-000000000000", "displayName": "Office 365 Exchange Online", "purpose": "Email, calendars and contacts, used by Outlook, mobile mail apps and third-party mail clients.", "commonExclusionReason": "Exempted to keep older mail protocols working. Blocking the older sign-in methods is the better answer than exempting mail.", "exclusionRisk": "high" }, + { "appId": "00000003-0000-0ff1-ce00-000000000000", "displayName": "Office 365 SharePoint Online", "purpose": "SharePoint and OneDrive, which hold all Microsoft 365 files, team sites and document libraries.", "commonExclusionReason": "Exempted to keep file-sync clients or third-party integrations working. High risk, because it exposes every corporate document.", "exclusionRisk": "high" }, + { "appId": "cc15fd57-2c6c-4117-a88c-83b1d56b4bbe", "displayName": "Microsoft Teams Services", "purpose": "Chat, meetings, calling and collaboration in Microsoft Teams.", "commonExclusionReason": "Exempted to avoid prompts during meetings or to keep meeting-room devices working. A managed-device requirement is usually the better answer.", "exclusionRisk": "high" }, + { "appId": "0000000a-0000-0000-c000-000000000000", "displayName": "Microsoft Intune", "purpose": "Device and app management, covering device compliance, app deployment and configuration.", "commonExclusionReason": "Exempted so devices can enroll before their compliance can be judged; without it, a device cannot enroll because it is not yet compliant.", "exclusionRisk": "medium" }, + { "appId": "d4ebce55-015a-49b5-a083-c84d1797ae8c", "displayName": "Microsoft Intune Enrollment", "purpose": "Handles device enrollment into Intune during Autopilot, personal-device enrollment and device registration.", "commonExclusionReason": "Exempted so devices can complete their first enrollment before compliance rules apply. A common and generally accepted exemption.", "exclusionRisk": "low" }, + { "appId": "0000000f-0000-0000-c000-000000000000", "displayName": "Microsoft Intune API", "purpose": "The management interface for Intune, used by admin tools, scripts and automation.", "commonExclusionReason": "Exempted so scripts and management tools can work with Intune. A dedicated automation identity with limited permissions is usually the better answer.", "exclusionRisk": "medium" }, + { "appId": "fc780465-2017-40d4-a0c5-307022471b92", "displayName": "WindowsDefenderATP", "purpose": "Microsoft Defender for Endpoint, which provides threat detection, investigation and vulnerability management.", "commonExclusionReason": "Exempted so Defender agents can report without a multifactor prompt. Generally low risk as machine-to-service traffic, but confirm it is the agent and not portal access.", "exclusionRisk": "medium" }, + { "appId": "ea890292-c8c8-4433-b5ea-b09d0668e1a6", "displayName": "Azure Credential Configuration Endpoint Service", "purpose": "Manages the federated credentials and certificates that automation identities such as build pipelines use to sign in without a secret.", "commonExclusionReason": "Exempted so that keyless sign-in from build and deployment pipelines keeps working.", "exclusionRisk": "low" }, + { "appId": "00000012-0000-0000-c000-000000000000", "displayName": "Microsoft Rights Management Services", "purpose": "Encrypts and protects documents and email through sensitivity labels in Office, Outlook and SharePoint.", "commonExclusionReason": "Exempted to avoid a multifactor prompt every time a protected document or email is opened, which otherwise breaks the reading experience.", "exclusionRisk": "low" }, + { "appId": "65d91a3d-ab74-42e6-8a2f-0add61688c74", "displayName": "Microsoft Approval Management", "purpose": "Runs approval workflows across Microsoft 365, including Teams, Power Automate and SharePoint approvals.", "commonExclusionReason": "Exempted so approval requests and responses flow without interruption. Blocking it can stop approval workflows from completing.", "exclusionRisk": "low" }, + { "appId": "1b912ec3-a9dd-4c4d-a53e-76aa7adb28d7", "displayName": "AADReporting", "purpose": "The reporting service behind sign-in logs, audit logs and usage reports.", "commonExclusionReason": "Exempted so monitoring tools and log collectors can pull reports without triggering a policy.", "exclusionRisk": "low" }, + { "appId": "00000007-0000-0000-c000-000000000000", "displayName": "Dataverse", "purpose": "The data platform behind Power Apps, Power Automate and Dynamics 365.", "commonExclusionReason": "Exempted so Power Platform apps and flows can reach their data. Dedicated automation identities are usually the better answer.", "exclusionRisk": "medium" }, + { "appId": "7df0a125-d3be-4c96-aa54-591f83ff541c", "displayName": "Microsoft Flow Service", "purpose": "Power Automate, which runs automated workflows across hundreds of services.", "commonExclusionReason": "Exempted so cloud flows can run on behalf of people without an interactive prompt. Flows that use personal connections fail if it is blocked.", "exclusionRisk": "medium" }, + { "appId": "04b07795-8ddb-461a-bbee-02f9e1bf7b46", "displayName": "Microsoft Azure CLI", "purpose": "The Azure command-line tool used by engineers and administrators for scripting and automation.", "commonExclusionReason": "Exempted so scripts can sign in. It can reach a very wide range of services; automation should use a dedicated identity instead of an exemption.", "exclusionRisk": "high" }, + { "appId": "1950a258-227b-4e31-a9cf-717495945fc2", "displayName": "Microsoft Azure PowerShell", "purpose": "The Azure PowerShell tooling used for administration and automation, with the widest reach of any standard Microsoft client.", "commonExclusionReason": "Exempted so PowerShell automation can sign in. Very high risk given its reach; automation should use a dedicated identity instead.", "exclusionRisk": "critical" }, + { "appId": "1b730954-1685-4b74-9bfd-dac224a7b894", "displayName": "Azure Active Directory PowerShell", "purpose": "The older directory PowerShell tooling for managing users and groups, being replaced by Microsoft Graph PowerShell.", "commonExclusionReason": "Exempted for older automation scripts. Those scripts should move to Microsoft Graph PowerShell with a dedicated identity.", "exclusionRisk": "high" }, + { "appId": "aebc6443-996d-45c2-90f0-388ff96faa56", "displayName": "Visual Studio Code", "purpose": "The VS Code editor, whose Azure extensions use this identity to reach Azure resources, repositories and Copilot.", "commonExclusionReason": "Exempted so developers can use the Azure extensions. It supports multifactor authentication, so requiring it is preferable to an exemption.", "exclusionRisk": "medium" }, + { "appId": "cb1056e2-e479-49de-ae31-7812af012ed8", "displayName": "Microsoft Azure Active Directory Connect", "purpose": "Entra Connect, which synchronizes on-premises Active Directory with Microsoft Entra ID.", "commonExclusionReason": "Exempted so the synchronization service can run without an interactive prompt. Keep the exemption limited to the dedicated synchronization account.", "exclusionRisk": "medium" }, + { "appId": "dd762716-544d-4aeb-a526-687b73838a22", "displayName": "Microsoft Device Registration Client", "purpose": "Handles device registration and joining, needed for workplace join, hybrid join and Autopilot.", "commonExclusionReason": "Exempted so devices can register. Only a multifactor requirement applies to this service anyway; network and managed-device conditions are ignored by design.", "exclusionRisk": "medium" }, + { "appId": "de50c81f-5f80-4771-b66b-cebd28ccdfc1", "displayName": "Device Management Client", "purpose": "An internal Windows component for device management, with access to more services than any other application in a tenant.", "commonExclusionReason": "Exempted for device management flows. Extremely high risk because of its reach.", "exclusionRisk": "critical" }, + { "appId": "1b3c667f-cde3-4090-b60b-3d2abd0117f0", "displayName": "Windows Spotlight", "purpose": "Delivers lock-screen images, tips and suggestions on Windows devices.", "commonExclusionReason": "Exempted because the lock screen makes background calls that fail with a multifactor prompt. Low sensitivity, as it only fetches display content.", "exclusionRisk": "low" }, + { "appId": "826870f9-9fbb-4f23-81b8-3a957080dfa2", "displayName": "Security Copilot", "purpose": "Microsoft's security assistant for threat investigation, incident response and query writing.", "commonExclusionReason": "Exempted so analysts are not interrupted during incident response. A managed-device requirement is usually the better answer.", "exclusionRisk": "high" }, + { "appId": "01cb2876-7ebd-4aa4-9cc9-d28bd4d359a9", "displayName": "Device Registration Service", "purpose": "The backend service for device registration, join and Autopilot.", "commonExclusionReason": "Exempted because only a multifactor requirement applies to this service; network and managed-device conditions are ignored by design.", "exclusionRisk": "medium" } +] diff --git a/Config/SecuritySimulations/CAAnalysis/BypassApps.json b/Config/SecuritySimulations/CAAnalysis/BypassApps.json new file mode 100644 index 0000000000000..190013e333515 --- /dev/null +++ b/Config/SecuritySimulations/CAAnalysis/BypassApps.json @@ -0,0 +1,50 @@ +{ + "immuneResources": [ + { "resourceId": "26a4ae64-5862-427f-a9b0-044e62572a4f", "displayName": "Microsoft Intune Checkin" }, + { "resourceId": "04436913-cf0d-4d2a-9cc6-2ffe7f1d3d1c", "displayName": "Windows Notification Service" }, + { "resourceId": "0a5f63c0-b750-4f38-a71c-4fc0d58b89e2", "displayName": "Microsoft Mobile Application Management" }, + { "resourceId": "1f5530b3-261a-47a9-b357-ded261e17918", "displayName": "Azure Multi-Factor Auth Connector" }, + { "resourceId": "c2ada927-a9e2-4564-aae2-70775a2fa0af", "displayName": "OCaaS Client Interaction Service" }, + { "resourceId": "ff9ebd75-fe62-434a-a6ce-b3f0a8592eaf", "displayName": "Authenticator App" } + ], + "bypassApps": [ + { "appId": "04b07795-8ddb-461a-bbee-02f9e1bf7b46", "displayName": "Microsoft Azure CLI", "description": "The Azure command-line tool, with access to a very wide range of services. A public client that can sidestep Conditional Access." }, + { "appId": "1950a258-227b-4e31-a9cf-717495945fc2", "displayName": "Microsoft Azure PowerShell", "description": "The Azure PowerShell tooling, with the widest service reach of any standard Microsoft client." }, + { "appId": "1b730954-1685-4b74-9bfd-dac224a7b894", "displayName": "Azure Active Directory PowerShell", "description": "The older directory PowerShell tooling, with broad directory access." }, + { "appId": "cb1056e2-e479-49de-ae31-7812af012ed8", "displayName": "Microsoft Azure Active Directory Connect", "description": "Hybrid identity synchronization, with broad access." }, + { "appId": "aebc6443-996d-45c2-90f0-388ff96faa56", "displayName": "Visual Studio Code", "description": "The VS Code editor, whose Azure extensions reach Azure resources." }, + { "appId": "fc0f3af4-6835-4174-b806-f7db311fd2f3", "displayName": "Microsoft Intune Windows Agent", "description": "The Intune agent; device enrollment sidesteps a managed-device requirement." }, + { "appId": "dd762716-544d-4aeb-a526-687b73838a22", "displayName": "Microsoft Device Registration Client", "description": "Device registration; network conditions do not apply to it and only a multifactor requirement protects it." }, + { "appId": "de50c81f-5f80-4771-b66b-cebd28ccdfc1", "displayName": "Device Management Client", "description": "A device management component with access to more services than any other application." }, + { "appId": "a672d62c-fc7b-4e81-a576-e60dc46e951d", "displayName": "Microsoft Power Query for Excel", "description": "Data connection tooling for Excel, with broad access." }, + { "appId": "cf710c6e-dfcc-4fa8-a093-d47294e44c66", "displayName": "Azure Analysis Services Client", "description": "Client tooling for Azure Analysis Services." }, + { "appId": "c58637bb-e2e1-4312-8a00-04b5ffcd3403", "displayName": "SharePoint Online Client Extensibility", "description": "Extensibility client for SharePoint Online." }, + { "appId": "268761a2-03f3-40df-8a8b-c3db24145b6b", "displayName": "Universal Store Native Client", "description": "The Windows Store client." }, + { "appId": "1b3c667f-cde3-4090-b60b-3d2abd0117f0", "displayName": "Windows Spotlight", "description": "The Windows lock-screen content client." } + ], + "deviceRegistrationResource": { "resourceId": "01cb2876-7ebd-4aa4-9cc9-d28bd4d359a9", "displayName": "Device Registration Service" }, + "wellKnownApps": [ + { "appId": "00000003-0000-0000-c000-000000000000", "displayName": "Microsoft Graph" }, + { "appId": "00000002-0000-0000-c000-000000000000", "displayName": "Azure AD Graph (Legacy)" }, + { "appId": "797f4846-ba00-4fd7-ba43-dac1f8f63013", "displayName": "Azure Resource Manager" }, + { "appId": "0000000a-0000-0000-c000-000000000000", "displayName": "Microsoft Intune" }, + { "appId": "00000002-0000-0ff1-ce00-000000000000", "displayName": "Office 365 Exchange Online" }, + { "appId": "00000003-0000-0ff1-ce00-000000000000", "displayName": "Office 365 SharePoint Online" }, + { "appId": "cc15fd57-2c6c-4117-a88c-83b1d56b4bbe", "displayName": "Microsoft Teams Services" }, + { "appId": "fc780465-2017-40d4-a0c5-307022471b92", "displayName": "WindowsDefenderATP" }, + { "appId": "826870f9-9fbb-4f23-81b8-3a957080dfa2", "displayName": "Security Copilot" }, + { "appId": "00000007-0000-0000-c000-000000000000", "displayName": "Dataverse" }, + { "appId": "7df0a125-d3be-4c96-aa54-591f83ff541c", "displayName": "Microsoft Flow Service" } + ], + "highValueApps": [ + { "appId": "797f4846-ba00-4fd7-ba43-dac1f8f63013", "name": "Azure Management", "description": "the Azure portal, command line and automation tooling", "risk": "critical" }, + { "appId": "00000002-0000-0ff1-ce00-000000000000", "name": "Office 365 Exchange Online", "description": "email, calendars and contacts", "risk": "high" }, + { "appId": "00000003-0000-0ff1-ce00-000000000000", "name": "Office 365 SharePoint Online", "description": "SharePoint and OneDrive files", "risk": "high" }, + { "appId": "00000003-0000-0000-c000-000000000000", "name": "Microsoft Graph", "description": "programmatic access to all Microsoft 365 data", "risk": "critical" }, + { "appId": "c44b4083-3bb0-49c1-b47d-974e53cbdf3c", "name": "Azure Portal", "description": "web-based Azure management", "risk": "critical" } + ], + "appGroupAliases": { + "office365": { "displayName": "Office 365 (app group)", "purpose": "Built-in Conditional Access application group covering the core Office 365 services (Exchange Online, SharePoint Online, Teams, and related apps)." }, + "microsoftadminportals": { "displayName": "Microsoft Admin Portals (app group)", "purpose": "Built-in Conditional Access application group covering the Microsoft admin portals (Microsoft Entra admin center, Microsoft 365 admin center, Azure portal, and others)." } + } +} diff --git a/Config/SecuritySimulations/CAAnalysis/CoverageControls.json b/Config/SecuritySimulations/CAAnalysis/CoverageControls.json new file mode 100644 index 0000000000000..6d254a70e6653 --- /dev/null +++ b/Config/SecuritySimulations/CAAnalysis/CoverageControls.json @@ -0,0 +1,10 @@ +{ + "RequireMfa": { "label": "Multifactor authentication", "description": "Without it, a stolen or guessed password is enough to sign in as one of them." }, + "PhishingResistantMfa": { "label": "Phishing-resistant authentication", "description": "Without it, their multifactor prompt can be captured by a convincing phishing page." }, + "RequireCompliantDevice": { "label": "Managed device", "description": "Without it, they can sign in from any device, including unmanaged or infected ones." }, + "BlockLegacyAuth": { "label": "Legacy authentication blocked", "description": "Without it, older sign-in methods that cannot use multifactor authentication remain available to them." }, + "SignInRisk": { "label": "Sign-in risk response", "description": "Without it, a sign-in that Microsoft rates as suspicious goes through without any extra check." }, + "UserRisk": { "label": "User risk response", "description": "Without it, an account that Microsoft rates as likely compromised keeps working until someone notices." }, + "SessionControls": { "label": "Session limits", "description": "Without it, a session on a shared or lost device stays valid indefinitely." }, + "BlockCountries": { "label": "Location restrictions", "description": "Without it, sign-ins are accepted from any country or network." } +} diff --git a/Config/SecuritySimulations/CAAnalysis/FociFamilies.json b/Config/SecuritySimulations/CAAnalysis/FociFamilies.json new file mode 100644 index 0000000000000..a5f15b4f1d271 --- /dev/null +++ b/Config/SecuritySimulations/CAAnalysis/FociFamilies.json @@ -0,0 +1,47 @@ +[ + { "appId": "1fec8e78-bce4-4aaf-ab1b-5451cc387264", "displayName": "Microsoft Teams" }, + { "appId": "d3590ed6-52b3-4102-aeff-aad2292ab01c", "displayName": "Microsoft Office" }, + { "appId": "27922004-5251-4030-b22d-91ecd9a37ea4", "displayName": "Outlook Mobile" }, + { "appId": "4e291c71-d680-4d0e-9640-0a3358e31177", "displayName": "PowerApps" }, + { "appId": "d326c1ce-6cc6-4de2-bebc-4591e5e13ef0", "displayName": "SharePoint" }, + { "appId": "ab9b8c07-8f02-4f72-87fa-80105867a763", "displayName": "OneDrive SyncEngine" }, + { "appId": "af124e86-4e96-495a-b70a-90f90ab96707", "displayName": "OneDrive iOS App" }, + { "appId": "b26aadf8-566f-4478-926f-589f601d9c74", "displayName": "OneDrive" }, + { "appId": "c0d2a505-13b8-4ae0-aa9e-cddd5eab0b12", "displayName": "Microsoft Power BI" }, + { "appId": "4813382a-8fa7-425e-ab75-3b753aab3abb", "displayName": "Microsoft Authenticator App" }, + { "appId": "0ec893e0-5785-4de6-99da-4ed124e5296c", "displayName": "Microsoft 365 Copilot" }, + { "appId": "57fcbcfa-7cee-4eb1-8b25-12d2030b4ee0", "displayName": "Microsoft Flow Mobile" }, + { "appId": "66375f6b-983f-4c2c-9701-d680650f588f", "displayName": "Microsoft Planner" }, + { "appId": "9ba1a5c7-f17a-4de9-a1f1-6178c8d51223", "displayName": "Microsoft Intune Company Portal" }, + { "appId": "22098786-6e16-43cc-a27d-191a01a1e3b5", "displayName": "Microsoft To-Do client" }, + { "appId": "0922ef46-e1b9-4f7e-9134-9ad00547eb41", "displayName": "Loop" }, + { "appId": "26a7ee05-5602-4d76-a7ba-eae8b7b67941", "displayName": "Windows Search" }, + { "appId": "f44b1140-bc5e-48c6-8dc0-5cf5a53c0e34", "displayName": "Microsoft Edge" }, + { "appId": "e9c51622-460d-4d3d-952d-966a5b1da34c", "displayName": "Microsoft Edge" }, + { "appId": "872cd9fa-d31f-45e0-9eab-6e460a02d1f1", "displayName": "Visual Studio - Legacy" }, + { "appId": "cf36b471-5b44-428c-9ce7-313bf84528de", "displayName": "Microsoft Bing Search" }, + { "appId": "844cca35-0656-46ce-b636-13f48b0eecbd", "displayName": "Microsoft Stream Mobile Native" }, + { "appId": "87749df4-7ccf-48f8-aa87-704bad0e0e16", "displayName": "Microsoft Teams - Device Admin Agent" }, + { "appId": "a569458c-7f2b-45cb-bab9-b7dee514d112", "displayName": "Yammer iPhone" }, + { "appId": "e9cee14e-f26a-4349-886f-10048e3ef4b8", "displayName": "Yammer Android" }, + { "appId": "b87b6fc6-536c-411d-9005-110ee6db77dc", "displayName": "Yammer iPad" }, + { "appId": "c1c74fed-04c9-4704-80dc-9f79a2e515cb", "displayName": "Yammer Web" }, + { "appId": "a40d7d7d-59aa-447e-a655-679a4107e548", "displayName": "Accounts Control UI" }, + { "appId": "a670efe7-64b6-454f-9ae9-4f1cf27aba58", "displayName": "Microsoft Lists App on Android" }, + { "appId": "540d4ff4-b4c0-44c1-bd06-cab1782d582a", "displayName": "ODSP Mobile Lists App" }, + { "appId": "dd47d17a-3194-4d86-bfd5-c6ae6f5651e3", "displayName": "Microsoft Defender for Mobile" }, + { "appId": "f05ff7c9-f75a-4acd-a3b5-f4b6a870245d", "displayName": "SharePoint Android" }, + { "appId": "d7b530a4-7680-4c23-a8bf-c52c121d2e87", "displayName": "Microsoft Edge Enterprise New Tab Page" }, + { "appId": "e9b154d0-7658-433b-bb25-6b8e0a8a7c59", "displayName": "Outlook Lite" }, + { "appId": "cab96880-db5b-4e15-90a7-f3f1d62ffe39", "displayName": "Microsoft Defender Platform" }, + { "appId": "be1918be-3fe3-4be9-b32b-b542fc27f02e", "displayName": "M365 Compliance Drive Client" }, + { "appId": "8ec6bc83-69c8-4392-8f08-b3c986009232", "displayName": "Microsoft Teams-T4L" }, + { "appId": "eb20f3e3-3dce-4d2c-b721-ebb8d4414067", "displayName": "Managed Meeting Rooms" }, + { "appId": "14638111-3389-403d-b206-a6a71d9f8f16", "displayName": "Copilot App" }, + { "appId": "038ddad9-5bbe-4f64-b0cd-12434d1e633b", "displayName": "ZTNA Network Access Client" }, + { "appId": "760282b4-0cfc-4952-b467-c8e0298fee16", "displayName": "ZTNA Network Access Client -- Private" }, + { "appId": "d5e23a82-d7e1-4886-af25-27037a0fdc2a", "displayName": "ZTNA Network Access Client -- M365" }, + { "appId": "ca01d00c-bfd6-46d6-ae7d-be5b5267d037", "displayName": "ZTNA Policy Service Client" }, + { "appId": "cde6adac-58fd-4b78-8d6d-9beaf1b0d668", "displayName": "Global Secure Access Client" }, + { "appId": "00b41c95-dab0-4487-9791-b9d2c32c80f2", "displayName": "Office 365 Management" } +] diff --git a/Config/SecuritySimulations/CAAnalysis/MicrosoftGuidance.json b/Config/SecuritySimulations/CAAnalysis/MicrosoftGuidance.json new file mode 100644 index 0000000000000..14890ed7a57d5 --- /dev/null +++ b/Config/SecuritySimulations/CAAnalysis/MicrosoftGuidance.json @@ -0,0 +1,173 @@ +[ + { + "id": "TokenProtectionApps", + "title": "Token protection is applied to applications that do not support it", + "appliesWhen": "A policy turns on token protection.", + "requirement": "Token protection only works for Exchange Online, SharePoint Online, Teams, Azure Virtual Desktop, Windows 365 and Windows Cloud Login. Applying it more widely, including through the Office 365 application group, locks people out of tools that cannot support it.", + "severity": "high", + "docUrl": "https://learn.microsoft.com/entra/identity/conditional-access/concept-token-protection#deployment", + "remediation": "Limit the token-protection policy to the individual services that support it rather than a broad selection or the Office 365 application group." + }, + { + "id": "TokenProtectionPlatforms", + "title": "Token protection is applied beyond Windows desktop apps", + "appliesWhen": "A policy turns on token protection.", + "requirement": "Token protection works only on Windows devices and only for desktop and mobile apps. Applying it to other platforms or to web browsers locks out people who cannot meet it.", + "severity": "high", + "docUrl": "https://learn.microsoft.com/entra/identity/conditional-access/concept-token-protection#deployment", + "remediation": "Limit the token-protection policy to Windows devices and to desktop and mobile apps, and leave web browsers out of scope." + }, + { + "id": "TokenProtectionDevices", + "title": "Token protection does not exempt devices that cannot support it", + "appliesWhen": "A policy turns on token protection.", + "requirement": "Several device types cannot support token protection, including Surface Hub, Teams Rooms, Cloud PCs, virtual desktop hosts, self-deploying and bulk-enrolled devices and Azure virtual machines. Unless they are exempt, they are locked out.", + "severity": "high", + "docUrl": "https://learn.microsoft.com/entra/identity/conditional-access/concept-token-protection#known-limitations", + "remediation": "Exempt the unsupported device types from the token-protection policy through a device filter so they keep working." + }, + { + "id": "BreakGlassMissing", + "title": "Tenant-wide policy has no emergency-access exemption", + "appliesWhen": "A policy that applies to every user requires multifactor authentication, blocks access, or requires a managed device.", + "requirement": "A policy that applies to every user should always exempt at least two emergency-access accounts, so that a mistake in the policy or a service outage cannot lock the whole organization out.", + "severity": "critical", + "docUrl": "https://learn.microsoft.com/entra/identity/role-based-access-control/security-emergency-access", + "remediation": "Exempt two dedicated emergency-access accounts from this policy and alert on any sign-in by them." + }, + { + "id": "SurfaceHubMfa", + "title": "Surface Hub meeting rooms cannot meet this policy", + "appliesWhen": "A policy that applies to every user and every application asks for multifactor authentication, a managed device, an approved app or app protection.", + "requirement": "Surface Hub room accounts cannot complete multifactor authentication or meet device, app or password-change requirements. When a policy that applies to every user asks for any of these, the rooms stop signing in.", + "severity": "medium", + "docUrl": "https://learn.microsoft.com/surface-hub/conditional-access-for-surface-hub", + "remediation": "Exempt the Surface Hub room accounts, or a group containing them, from this policy." + }, + { + "id": "TeamsRoomsMfa", + "title": "Teams Rooms devices cannot meet this policy", + "appliesWhen": "A policy that applies to every user and every application requires multifactor authentication or an authentication strength.", + "requirement": "Teams Rooms on Windows cannot complete multifactor authentication and Android room devices cannot meet an authentication strength. When a policy that applies to every user asks for these, the rooms stop signing in.", + "severity": "medium", + "docUrl": "https://learn.microsoft.com/microsoftteams/rooms/supported-ca-and-compliance-policies", + "remediation": "Exempt the Teams Rooms accounts from multifactor requirements and protect them with a managed-device requirement instead." + }, + { + "id": "DeviceCodeTeamsDevices", + "title": "Blocking device-code sign-in breaks Teams device setup", + "appliesWhen": "A policy blocks the device-code sign-in flow.", + "requirement": "Teams phones, panels and Android room devices are signed in remotely through the device-code flow. Blocking that flow for everyone prevents these devices from being set up.", + "severity": "medium", + "docUrl": "https://learn.microsoft.com/microsoftteams/rooms/supported-ca-and-compliance-policies", + "remediation": "Exempt the Teams device accounts from the device-code block, or limit the block so it does not apply to Teams devices." + }, + { + "id": "SignInFrequencyTeamsRooms", + "title": "Sign-in frequency signs Teams Rooms devices out", + "appliesWhen": "A policy that applies to every user and every application sets a sign-in frequency.", + "requirement": "Teams Rooms, phones and panels cannot handle a sign-in frequency. Applying one to every user makes these devices sign out periodically and disrupts meetings.", + "severity": "medium", + "docUrl": "https://learn.microsoft.com/microsoftteams/rooms/supported-ca-and-compliance-policies", + "remediation": "Exempt the Teams Rooms and shared-device accounts from the sign-in frequency, or apply it to administrator roles only." + }, + { + "id": "DefenderMobileApps", + "title": "Defender mobile apps are caught by a blocking policy", + "appliesWhen": "A blocking policy covers every user and every application without exempting the Microsoft Defender mobile apps.", + "requirement": "The Microsoft Defender mobile app reports device health in the background. A blocking policy that covers every application can stop those reports, and devices then appear non-compliant for no real reason.", + "severity": "medium", + "docUrl": "https://learn.microsoft.com/defender-endpoint/mobile-resources-defender-endpoint#microsoft-defender-mobile-app-exclusion-from-conditional-access-ca-policies", + "remediation": "Exempt the two Microsoft Defender mobile applications from this policy so device health reporting keeps working." + }, + { + "id": "AzureVmSignInMfa", + "title": "Remote desktop to Azure virtual machines may not meet this policy", + "appliesWhen": "A policy that applies to every user and every application requires multifactor authentication or a managed device without exempting virtual machine sign-in.", + "requirement": "Remote desktop sign-ins to Azure virtual machines can only satisfy a multifactor requirement from a device that supports Windows Hello for Business or a security key, and Windows Server devices can never count as compliant. Without an exemption, administrators may be unable to connect.", + "severity": "medium", + "docUrl": "https://learn.microsoft.com/entra/identity/devices/howto-vm-sign-in-azure-ad-windows#missing-application", + "remediation": "Exempt the Azure virtual machine sign-in application from multifactor and device requirements unless every administrator connects with Windows Hello for Business or a security key." + }, + { + "id": "ContinuousAccessEvaluationDisabled", + "title": "Continuous access evaluation is switched off", + "appliesWhen": "A policy switches continuous access evaluation off.", + "requirement": "Continuous access evaluation ends a session the moment an account is disabled, its password changes or its location changes. With it switched off, sessions stay valid for up to an hour after such an event.", + "severity": "high", + "docUrl": "https://learn.microsoft.com/entra/identity/conditional-access/concept-continuous-access-evaluation", + "remediation": "Keep continuous access evaluation switched on unless a specific problem with it has been confirmed." + }, + { + "id": "SignInFrequencyIndividualServices", + "title": "Sign-in frequency on individual services breaks Teams devices", + "appliesWhen": "A policy sets a sign-in frequency on individual Microsoft 365 services rather than on all applications.", + "requirement": "A sign-in frequency applied to individual Microsoft 365 services rather than all applications can interrupt or stop the Teams device sign-in flow and is not supported by Microsoft.", + "severity": "medium", + "docUrl": "https://learn.microsoft.com/microsoftteams/rooms/supported-ca-and-compliance-policies", + "remediation": "Apply the sign-in frequency to all applications or to the Microsoft admin portals rather than to individual services." + }, + { + "id": "ResilienceDefaultsDisabled", + "title": "Users lose access during a Microsoft outage", + "appliesWhen": "A policy switches resilience defaults off.", + "requirement": "With resilience defaults switched off, anyone whose session expires during a Microsoft sign-in service outage is denied access until the service recovers.", + "severity": "medium", + "docUrl": "https://learn.microsoft.com/entra/identity/conditional-access/resilience-defaults", + "remediation": "Keep resilience defaults switched on unless strict real-time evaluation is a firm requirement." + }, + { + "id": "AllResourcesAppExclusion", + "title": "Basic directory permissions need their own coverage", + "appliesWhen": "A policy covers every application but exempts some.", + "requirement": "Microsoft used to exempt basic profile and directory permissions from a tenant-wide policy that had any application exemption. That exemption has been removed and those permissions are now enforced through the directory service itself, so a policy should cover that service to keep the baseline intact.", + "severity": "high", + "docUrl": "https://learn.microsoft.com/entra/identity/conditional-access/concept-conditional-access-cloud-apps#conditional-access-behavior-when-an-all-resources-policy-has-an-app-exclusion", + "remediation": "Cover the directory service with a policy that requires multifactor authentication from all users, so basic permissions stay protected even where other applications are exempt." + }, + { + "id": "DirectorySyncAccountMfa", + "title": "Directory synchronization exemption may no longer be needed", + "appliesWhen": "A multifactor policy for every user exempts the directory synchronization role.", + "requirement": "The synchronization account used to be exempt from multifactor requirements because it could not perform them. Recent versions of Entra Connect let the synchronization service sign in as an application instead, which removes the need for the exemption.", + "severity": "medium", + "docUrl": "https://learn.microsoft.com/entra/identity/hybrid/connect/reference-connect-version-history", + "remediation": "Upgrade Entra Connect to a version that supports application-based sign-in, switch to it, and remove the synchronization role exemption from multifactor policies." + }, + { + "id": "ExternalAuthMethodGuests", + "title": "External authentication provider may block guests and partners", + "appliesWhen": "A policy for every user or for administrators relies on an external authentication provider.", + "requirement": "When a policy requires an external authentication provider such as Duo or RSA, guests, partners and service providers cannot meet it because they are not enrolled with that provider. They are locked out even though Microsoft's own multifactor authentication would have been enough.", + "severity": "high", + "docUrl": "https://learn.microsoft.com/entra/identity/authentication/how-to-authentication-external-method-manage", + "remediation": "Limit the external-provider requirement to internal users enrolled with it, and let guests and partners meet the policy with Microsoft's own multifactor authentication." + }, + { + "id": "ApprovedClientAppRetirement", + "title": "Approved-client-app requirement is being retired", + "appliesWhen": "A policy relies on the approved-client-app requirement.", + "requirement": "Microsoft is retiring the approved-client-app requirement. Policies that rely on it must move to the app protection policy requirement, or accept either of the two, to keep protecting data in mobile apps.", + "severity": "critical", + "docUrl": "https://learn.microsoft.com/entra/identity/conditional-access/migrate-approved-client-app", + "remediation": "Replace the approved-client-app requirement with the app protection policy requirement, accepting either during the transition if needed." + }, + { + "id": "UserRiskPasswordChangeRetired", + "title": "Risky users are asked for a password change that not everyone can complete", + "appliesWhen": "A user risk policy relies on the password-change requirement.", + "requirement": "The password-change requirement for risky users has been retired. People who sign in without a password cannot complete it and stay locked out once flagged. The newer risk-remediation requirement chooses the right recovery path for each person.", + "severity": "high", + "docUrl": "https://learn.microsoft.com/entra/id-protection/concept-identity-protection-policies", + "remediation": "Replace the password-change requirement with the risk-remediation requirement." + }, + { + "id": "UserRiskRemediationExternalProvider", + "title": "Risk remediation cannot be completed by users of an external provider", + "appliesWhen": "A user risk policy pairs risk remediation with an authentication strength.", + "requirement": "When risk remediation is paired with an authentication strength, people who use an external provider such as Duo, Okta or Ping cannot complete it, because authentication strengths do not accept external providers. Without a companion policy that accepts plain multifactor authentication for them, they stay locked out.", + "severity": "high", + "docUrl": "https://learn.microsoft.com/entra/id-protection/concept-identity-protection-policies", + "remediation": "Add a companion risk policy for the users of the external provider that requires plain multifactor authentication together with risk remediation, and keep the stronger requirement for everyone else." + } +] diff --git a/Config/SecuritySimulations/CAAnalysis/Reference.json b/Config/SecuritySimulations/CAAnalysis/Reference.json new file mode 100644 index 0000000000000..a57fda0a8dfe1 --- /dev/null +++ b/Config/SecuritySimulations/CAAnalysis/Reference.json @@ -0,0 +1,93 @@ +{ + "registerDeviceAction": "urn:user:registerdevice", + "registerSecurityInfoAction": "urn:user:registersecurityinfo", + "windowsAzureAdResource": "00000002-0000-0000-c000-000000000000", + "legacyMfaTrustedIpsLocation": "00000000-0000-0000-0000-000000000000", + "directorySyncRoleTemplateId": "d29b2b05-8046-44ba-8758-1e26182fcf32", + "equivalentStrengthGroups": { + "compliantDevice": "DeviceTrust", + "domainJoinedDevice": "DeviceTrust", + "approvedApplication": "AppProtection", + "compliantApplication": "AppProtection" + }, + "grantControlLabels": { + "mfa": "multifactor authentication", + "compliantDevice": "a compliant device", + "domainJoinedDevice": "a Microsoft Entra hybrid joined device", + "approvedApplication": "an approved client app", + "compliantApplication": "an app protection policy", + "passwordChange": "a password change" + }, + "guestTypeLabels": { + "internalGuest": "Internal guest users", + "b2bCollaborationGuest": "Collaboration guests", + "b2bCollaborationMember": "Collaboration members", + "b2bDirectConnectUser": "Direct connect users", + "otherExternalUser": "Other external users", + "serviceProvider": "Service provider users" + }, + "guestTypeOrder": ["internalGuest", "b2bCollaborationGuest", "b2bCollaborationMember", "b2bDirectConnectUser", "otherExternalUser", "serviceProvider"], + "managedPolicyPatterns": [ + { "keyword": "block legacy authentication" }, + { "keyword": "block device code flow" }, + { "keyword": "multifactor authentication for admins" }, + { "keyword": "multifactor authentication for all users" }, + { "keyword": "multifactor authentication for per-user" }, + { "keyword": "reauthentication for risky sign-ins" }, + { "keyword": "block access for high-risk users" }, + { "keyword": "block all high risk agents" } + ], + "phishingResistant": { + "builtInStrengthId": "00000000-0000-0000-0000-000000000004", + "methodTokens": ["fido2", "windowshelloforbusiness", "x509certificatemultifactor", "x509certificatesinglefactor", "deviceboundpasskey", "hardwareoath"], + "nameRegex": "phishing.?resistant|fido2|windows hello|certificate.?based", + "policyNameRegex": "phishing.?resistant" + }, + "servicePlanIds": { + "entraIdP1": "41781fb2-bc02-4b7c-bd55-b576c07bb09d", + "entraIdP2": "eec0eb4f-6444-4f95-aba0-50c24d67f998", + "intunePlan1": "c1ec4a95-1f05-45b3-a911-aa3fa01094f5", + "workloadIdPremiumP1": "84c289f0-efcb-486f-8581-07f44fc9efad", + "workloadIdPremiumP2": "7dc0e92d-bf15-401d-907e-0884efe7c760" + }, + "guidanceAppIds": { + "exchangeOnline": "00000002-0000-0ff1-ce00-000000000000", + "sharePointOnline": "00000003-0000-0ff1-ce00-000000000000", + "teamsService": "cc15fd57-2c6c-4117-a88c-83b1d56b4bbe", + "office365Group": "Office365", + "azureVirtualDesktop": "9cdead84-a844-4324-93f2-b2e6bb768d07", + "windows365": "0af06dc6-e4b5-4f28-818e-e78e62d137a5", + "defenderAtpXplat": "a0e84e36-b067-4d5c-ab4a-3db38e598ae2", + "defenderTvm": "e724aa31-0f56-4018-b8be-f8cb82ca1196", + "windowsCloudLogin": "372140e0-b3b7-4226-8ef9-d57986796201" + }, + "tokenProtectionDeviceFilterPatterns": [ + { "pattern": "cloudpc", "label": "Cloud PCs" }, + { "pattern": "azurevirtualdesktop", "label": "Azure Virtual Desktop" }, + { "pattern": "powerapautomate", "label": "Power Automate hosted machines" }, + { "pattern": "autopilot", "label": "Autopilot self-deploying devices" }, + { "pattern": "securevm", "label": "Azure virtual machines" } + ], + "templates": { + "mfaAllUsers": "Require multifactor authentication for all users", + "mfaAllAdmins": "Require multifactor authentication for administrators", + "mfaGuests": "Require multifactor authentication for guest access", + "mfaB2BGuest": "Require multifactor authentication for guest access", + "mfaMixedGuests": "Require multifactor authentication for guest access", + "phishingResistantAdmins": "Require phishing-resistant multifactor authentication for administrators", + "registerSecurityInfo": "Secure security information registration", + "signInRisk": "Require multifactor authentication for medium and high sign-in risk", + "userRisk": "Require a secure password change for high user risk", + "blockCountries": "Block sign-ins from countries outside the allowed list", + "blockLegacyAuth": "Block legacy authentication", + "blockUnsupportedPlatforms": "Block unsupported device platforms", + "blockDeviceCode": "Block device code flow sign-ins", + "blockHighRiskUsers": "Block high-risk users", + "blockHighRiskSignIns": "Block high-risk sign-ins", + "windowsAzureAdBaselineScopes": "Require multifactor authentication for basic directory access", + "riskRemediationHigh": "Require risk remediation for high user risk", + "riskRemediationEam": "Require risk remediation for external authentication method users", + "appProtectionMobile": "Require an approved client app or app protection policy on mobile", + "requireCompliantDevice": "Require a compliant or Microsoft Entra hybrid joined device" + } +} diff --git a/Config/SecuritySimulations/CASituations.json b/Config/SecuritySimulations/CASituations.json new file mode 100644 index 0000000000000..0808686edaace --- /dev/null +++ b/Config/SecuritySimulations/CASituations.json @@ -0,0 +1,265 @@ +[ + { + "id": "AdminUnmanagedDevice", + "group": "Admin accounts", + "persona": "admin", + "title": "Global Admin · unmanaged device · known location", + "conditions": { "clientAppType": "browser", "devicePlatform": "windows", "deviceInfo": { "isCompliant": false } }, + "attackerCanSatisfy": ["mfa"], + "expected": "blocked", + "missingControl": { "text": "No compliant-device requirement for administrators", "fix": { "caTemplate": "Require a compliant device for administrators" } } + }, + { + "id": "AdminForeignCountry", + "group": "Admin accounts", + "persona": "admin", + "title": "Global Admin · sign-in from a foreign country", + "countryFromSelection": true, + "conditions": { "clientAppType": "browser", "devicePlatform": "windows", "country": "RU", "ipAddress": "45.132.1.20" }, + "attackerCanSatisfy": ["mfa"], + "expected": "blocked", + "missingControl": { "text": "No location policy for administrators", "fix": { "caTemplate": "Block sign-ins from countries outside the allowed list" } } + }, + { + "id": "AdminHostingIp", + "group": "Admin accounts", + "persona": "admin", + "title": "Global Admin · sign-in from a hosting-provider address", + "conditions": { "clientAppType": "browser", "devicePlatform": "windows", "country": "US", "ipAddress": "104.244.72.115" }, + "attackerCanSatisfy": ["mfa"], + "expected": "blocked", + "missingControl": { "text": "Admin sign-ins from hosting-provider addresses are not blocked", "fix": { "caTemplate": "Block sign-ins from hosting-provider IP ranges" } } + }, + { + "id": "AdminDeviceCode", + "group": "Admin accounts", + "persona": "admin", + "title": "Global Admin · device-code flow", + "conditions": { "clientAppType": "browser", "devicePlatform": "windows", "authenticationFlow": { "transferMethod": "deviceCodeFlow" } }, + "attackerCanSatisfy": ["mfa"], + "expected": "blocked", + "missingControl": { "text": "Device code flow is not blocked for administrators", "fix": { "caTemplate": "Block device code flow sign-ins" } } + }, + { + "id": "AdminLegacyAuth", + "group": "Admin accounts", + "persona": "admin", + "title": "Global Admin · legacy authentication client", + "conditions": { "clientAppType": "other", "devicePlatform": "windows" }, + "attackerCanSatisfy": [], + "expected": "blocked", + "missingControl": { "text": "Legacy authentication is not blocked", "fix": { "caTemplate": "Block legacy authentication" } } + }, + { + "id": "AdminHighSignInRisk", + "group": "Admin accounts", + "persona": "admin", + "title": "Global Admin · high sign-in risk", + "conditions": { "clientAppType": "browser", "devicePlatform": "windows", "signInRiskLevel": "high" }, + "attackerCanSatisfy": ["mfa"], + "expected": "blocked", + "missingControl": { "text": "No sign-in risk policy for administrators", "fix": { "caTemplate": "Require multifactor authentication for medium and high sign-in risk" } } + }, + { + "id": "AdminMacOsUnmanaged", + "group": "Admin accounts", + "persona": "admin", + "title": "Global Admin · unmanaged macOS device", + "conditions": { "clientAppType": "browser", "devicePlatform": "macOS", "deviceInfo": { "isCompliant": false } }, + "attackerCanSatisfy": ["mfa"], + "expected": "blocked", + "missingControl": { "text": "No compliant-device requirement for administrators", "fix": { "caTemplate": "Require a compliant device for administrators" } } + }, + { + "id": "AdminDesktopClientUnmanaged", + "group": "Admin accounts", + "persona": "admin", + "title": "Global Admin · desktop client · unmanaged device", + "conditions": { "clientAppType": "mobileAppsAndDesktopClients", "devicePlatform": "windows", "deviceInfo": { "isCompliant": false } }, + "attackerCanSatisfy": ["mfa"], + "expected": "blocked", + "missingControl": { "text": "No compliant-device requirement for administrators", "fix": { "caTemplate": "Require a compliant device for administrators" } } + }, + { + "id": "UserUnmanagedDevice", + "group": "Standard users", + "persona": "user", + "title": "Standard user · unmanaged device · browser", + "conditions": { "clientAppType": "browser", "devicePlatform": "windows", "deviceInfo": { "isCompliant": false } }, + "attackerCanSatisfy": ["mfa"], + "expected": "mfa", + "missingControl": { "text": "No compliant-device requirement for standard users", "fix": { "caTemplate": "Require a compliant or Microsoft Entra hybrid joined device" } } + }, + { + "id": "UserForeignCountry", + "group": "Standard users", + "persona": "user", + "title": "Standard user · sign-in from a foreign country", + "countryFromSelection": true, + "conditions": { "clientAppType": "browser", "devicePlatform": "windows", "country": "CN", "ipAddress": "223.5.5.5" }, + "attackerCanSatisfy": ["mfa"], + "expected": "blocked", + "missingControl": { "text": "No location policy for standard users", "fix": { "caTemplate": "Block sign-ins from countries outside the allowed list" } } + }, + { + "id": "UserDeviceCode", + "group": "Standard users", + "persona": "user", + "title": "Standard user · device-code flow", + "conditions": { "clientAppType": "browser", "devicePlatform": "windows", "authenticationFlow": { "transferMethod": "deviceCodeFlow" } }, + "attackerCanSatisfy": ["mfa"], + "expected": "blocked", + "missingControl": { "text": "Device code flow is not blocked", "fix": { "caTemplate": "Block device code flow sign-ins" } } + }, + { + "id": "UserLegacyActiveSync", + "group": "Standard users", + "persona": "user", + "title": "Standard user · legacy Exchange ActiveSync", + "conditions": { "clientAppType": "exchangeActiveSync", "devicePlatform": "android" }, + "attackerCanSatisfy": [], + "expected": "blocked", + "missingControl": { "text": "Legacy authentication is not blocked", "fix": { "caTemplate": "Block legacy authentication" } } + }, + { + "id": "UserLegacyOther", + "group": "Standard users", + "persona": "user", + "title": "Standard user · other legacy client", + "conditions": { "clientAppType": "other", "devicePlatform": "windows" }, + "attackerCanSatisfy": [], + "expected": "blocked", + "missingControl": { "text": "Legacy authentication is not blocked", "fix": { "caTemplate": "Block legacy authentication" } } + }, + { + "id": "UserHighSignInRisk", + "group": "Standard users", + "persona": "user", + "title": "Standard user · high sign-in risk", + "conditions": { "clientAppType": "browser", "devicePlatform": "windows", "signInRiskLevel": "high" }, + "attackerCanSatisfy": [], + "expected": "blocked", + "missingControl": { "text": "No sign-in risk policy", "fix": { "caTemplate": "Require multifactor authentication for medium and high sign-in risk" } } + }, + { + "id": "UserHighUserRisk", + "group": "Standard users", + "persona": "user", + "title": "Standard user · high user risk", + "conditions": { "clientAppType": "browser", "devicePlatform": "windows", "userRiskLevel": "high" }, + "attackerCanSatisfy": [], + "expected": "blocked", + "missingControl": { "text": "No user risk policy", "fix": { "caTemplate": "Require a secure password change for high user risk" } } + }, + { + "id": "UserElevatedInsiderRisk", + "group": "Standard users", + "persona": "user", + "title": "Standard user · elevated insider risk", + "conditions": { "clientAppType": "browser", "devicePlatform": "windows", "insiderRiskLevel": "elevated" }, + "attackerCanSatisfy": ["mfa"], + "expected": "blocked", + "missingControl": { "text": "No insider-risk policy", "fix": { "caTemplate": "Limit access for elevated insider risk" } } + }, + { + "id": "UserAndroidUnmanaged", + "group": "Standard users", + "persona": "user", + "title": "Standard user · unmanaged Android device", + "conditions": { "clientAppType": "browser", "devicePlatform": "android", "deviceInfo": { "isCompliant": false } }, + "attackerCanSatisfy": ["mfa"], + "expected": "mfa", + "missingControl": { "text": "No app protection or compliant-device requirement on mobile", "fix": { "caTemplate": "Require an approved client app or app protection policy on mobile" } } + }, + { + "id": "UserIosUnmanaged", + "group": "Standard users", + "persona": "user", + "title": "Standard user · unmanaged iOS device", + "conditions": { "clientAppType": "browser", "devicePlatform": "iOS", "deviceInfo": { "isCompliant": false } }, + "attackerCanSatisfy": ["mfa"], + "expected": "mfa", + "missingControl": { "text": "No app protection or compliant-device requirement on mobile", "fix": { "caTemplate": "Require an approved client app or app protection policy on mobile" } } + }, + { + "id": "UserDesktopClientUnmanaged", + "group": "Standard users", + "persona": "user", + "title": "Standard user · desktop client · unmanaged device", + "conditions": { "clientAppType": "mobileAppsAndDesktopClients", "devicePlatform": "windows", "deviceInfo": { "isCompliant": false } }, + "attackerCanSatisfy": ["mfa"], + "expected": "mfa", + "missingControl": { "text": "No compliant-device requirement for standard users", "fix": { "caTemplate": "Require a compliant or Microsoft Entra hybrid joined device" } } + }, + { + "id": "GuestBrowserAccess", + "group": "Guests", + "persona": "guest", + "title": "Guest · browser access · known location", + "conditions": { "clientAppType": "browser", "devicePlatform": "windows" }, + "attackerCanSatisfy": [], + "expected": "mfa", + "missingControl": { "text": "Guest access does not require MFA", "fix": { "caTemplate": "Require multifactor authentication for guest access" } } + }, + { + "id": "GuestForeignCountry", + "group": "Guests", + "persona": "guest", + "title": "Guest · sign-in from a foreign country", + "countryFromSelection": true, + "conditions": { "clientAppType": "browser", "devicePlatform": "windows", "country": "RU", "ipAddress": "45.132.1.20" }, + "attackerCanSatisfy": ["mfa"], + "expected": "blocked", + "missingControl": { "text": "No location policy for guests", "fix": { "caTemplate": "Block sign-ins from countries outside the allowed list" } } + }, + { + "id": "GuestLegacyAuth", + "group": "Guests", + "persona": "guest", + "title": "Guest · legacy authentication client", + "conditions": { "clientAppType": "other", "devicePlatform": "windows" }, + "attackerCanSatisfy": [], + "expected": "blocked", + "missingControl": { "text": "Legacy authentication is not blocked", "fix": { "caTemplate": "Block legacy authentication" } } + }, + { + "id": "GuestUnmanagedDevice", + "group": "Guests", + "persona": "guest", + "title": "Guest · unmanaged device · browser", + "conditions": { "clientAppType": "browser", "devicePlatform": "windows", "deviceInfo": { "isCompliant": false } }, + "attackerCanSatisfy": [], + "expected": "mfa", + "missingControl": { "text": "Guest access does not require MFA or a compliant device", "fix": { "caTemplate": "Require multifactor authentication for guest access" } } + }, + { + "id": "GuestDeviceCode", + "group": "Guests", + "persona": "guest", + "title": "Guest · device-code flow", + "conditions": { "clientAppType": "browser", "devicePlatform": "windows", "authenticationFlow": { "transferMethod": "deviceCodeFlow" } }, + "attackerCanSatisfy": ["mfa"], + "expected": "blocked", + "missingControl": { "text": "Device code flow is not blocked", "fix": { "caTemplate": "Block device code flow sign-ins" } } + }, + { + "id": "GuestHighSignInRisk", + "group": "Guests", + "persona": "guest", + "title": "Guest · high sign-in risk", + "conditions": { "clientAppType": "browser", "devicePlatform": "windows", "signInRiskLevel": "high" }, + "attackerCanSatisfy": [], + "expected": "blocked", + "missingControl": { "text": "No sign-in risk policy for guests", "fix": { "caTemplate": "Require multifactor authentication for medium and high sign-in risk" } } + }, + { + "id": "GuestAuthTransfer", + "group": "Guests", + "persona": "guest", + "title": "Guest · authentication transfer", + "conditions": { "clientAppType": "browser", "devicePlatform": "windows", "authenticationFlow": { "transferMethod": "authenticationTransfer" } }, + "attackerCanSatisfy": ["mfa"], + "expected": "blocked", + "missingControl": { "text": "Authentication transfer is not blocked", "fix": { "caTemplate": "Block authentication transfer" } } + } +] diff --git a/Config/SharePoint.BPATemplate.json b/Config/SharePoint.BPATemplate.json deleted file mode 100644 index fd279d368fdac..0000000000000 --- a/Config/SharePoint.BPATemplate.json +++ /dev/null @@ -1,70 +0,0 @@ -{ - "name": "CIPP SharePoint Report v1.0 - Table view", - "style": "Table", - "Fields": [ - { - "name": "SharepointSettings", - "API": "Graph", - "URL": "https://graph.microsoft.com/beta/admin/sharepoint/settings", - "Parameters": { - "asApp": "True" - }, - "ExtractFields": [ - "sharingCapability", - "isMacSyncAppEnabled", - "isResharingByExternalUsersEnabled", - "isUnmanagedSyncAppForTenantRestricted", - "isSiteCreationEnabled", - "deletedUserPersonalSiteRetentionPeriodInDays" - ], - "StoreAs": "JSON", - "FrontendFields": [ - { - "name": "Sharing capability", - "value": "SharepointSettings.sharingCapability", - "formatter": "string" - }, - { - "name": "Mac Sync Enabled", - "value": "SharepointSettings.isMacSyncAppEnabled", - "formatter": "warnBool" - }, - { - "name": "Resharing by external users", - "value": "SharepointSettings.isResharingByExternalUsersEnabled", - "formatter": "bool" - }, - { - "name": "Allow users to sync from unmanaged devices", - "value": "SharepointSettings.isUnmanagedSyncAppForTenantRestricted", - "formatter": "reverseBool" - }, - { - "name": "Site creation by standard users enabled", - "value": "SharepointSettings.isSiteCreationEnabled", - "formatter": "bool" - }, - { - "name": "Deleted user data rention(days)", - "value": "SharepointSettings.deletedUserPersonalSiteRetentionPeriodInDays", - "formatter": "string" - } - ] - }, - { - "name": "WebtimeOut", - "API": "Graph", - "URL": "https://graph.microsoft.com/beta/policies/activityBasedTimeoutPolicies", - "ExtractFields": ["definition"], - "StoreAs": "bool", - "where": "$_.definition -like '*WebSessionIdleTimeout*'", - "FrontendFields": [ - { - "name": "Web Time-Out enabled", - "value": "WebtimeOut", - "formatter": "bool" - } - ] - } - ] -} diff --git a/Config/StandardsTable.BPATemplate.json b/Config/StandardsTable.BPATemplate.json deleted file mode 100644 index 858b1b462fca1..0000000000000 --- a/Config/StandardsTable.BPATemplate.json +++ /dev/null @@ -1,534 +0,0 @@ -{ - "name": "CIPP Standards v1.0 - Table view", - "style": "Table", - "Fields": [ - { - "name": "ActivityBasedTimeout", - "StoreAs": "bool", - "UseExistingInfo": true, - "FrontendFields": [ - { - "formatter": "bool", - "name": "ActivityBasedTimeout", - "value": "ActivityBasedTimeout" - } - ] - }, - { - "name": "softwareOath", - "StoreAs": "bool", - "UseExistingInfo": true, - "FrontendFields": [ - { - "formatter": "bool", - "name": "softwareOath", - "value": "softwareOath" - } - ] - }, - { - "name": "MSAuthenticator", - "StoreAs": "bool", - "UseExistingInfo": true, - "FrontendFields": [ - { - "formatter": "bool", - "name": "MSAuthenticator", - "value": "MSAuthenticator" - } - ] - }, - { - "name": "AnonReport", - "StoreAs": "bool", - "UseExistingInfo": true, - "FrontendFields": [ - { - "formatter": "bool", - "name": "AnonReport", - "value": "AnonReport" - } - ] - }, - { - "name": "AuditLog", - "StoreAs": "bool", - "UseExistingInfo": true, - "FrontendFields": [ - { - "formatter": "bool", - "name": "AuditLog", - "value": "AuditLog" - } - ] - }, - { - "name": "AutoExpandingArchive", - "StoreAs": "bool", - "UseExistingInfo": true, - "FrontendFields": [ - { - "formatter": "bool", - "name": "AutoExpandingArchive", - "value": "AutoExpandingArchive" - } - ] - }, - { - "name": "DelegateSentItems", - "StoreAs": "json", - "UseExistingInfo": true, - "FrontendFields": [ - { - "formatter": "table", - "name": "DelegateSentItems", - "value": "DelegateSentItems" - } - ] - }, - { - "name": "DeletedUserRentention", - "StoreAs": "bool", - "UseExistingInfo": true, - "FrontendFields": [ - { - "formatter": "bool", - "name": "DeletedUserRentention", - "value": "DeletedUserRentention" - } - ] - }, - { - "name": "DisableBasicAuthSMTP", - "StoreAs": "bool", - "UseExistingInfo": true, - "FrontendFields": [ - { - "formatter": "bool", - "name": "DisableBasicAuthSMTP", - "value": "DisableBasicAuthSMTP" - } - ] - }, - { - "name": "DisableGuestDirectory", - "StoreAs": "bool", - "UseExistingInfo": true, - "FrontendFields": [ - { - "formatter": "bool", - "name": "DisableGuestDirectory", - "value": "DisableGuestDirectory" - } - ] - }, - { - "name": "DisableGuests", - "StoreAs": "json", - "UseExistingInfo": true, - "FrontendFields": [ - { - "formatter": "table", - "name": "DisableGuests", - "value": "DisableGuests" - } - ] - }, - { - "name": "DisableM365GroupUsers", - "StoreAs": "bool", - "UseExistingInfo": true, - "FrontendFields": [ - { - "formatter": "bool", - "name": "DisableM365GroupUsers", - "value": "DisableM365GroupUsers" - } - ] - }, - { - "name": "MacSync", - "StoreAs": "bool", - "UseExistingInfo": true, - "FrontendFields": [ - { - "formatter": "bool", - "name": "MacSync", - "value": "MacSync" - } - ] - }, - { - "name": "DisableReshare", - "StoreAs": "bool", - "UseExistingInfo": true, - "FrontendFields": [ - { - "formatter": "bool", - "name": "DisableReshare", - "value": "DisableReshare" - } - ] - }, - { - "name": "DisableSecurityGroupUsers", - "StoreAs": "bool", - "UseExistingInfo": true, - "FrontendFields": [ - { - "formatter": "bool", - "name": "DisableSecurityGroupUsers", - "value": "DisableSecurityGroupUsers" - } - ] - }, - { - "name": "DisableSharedMailbox", - "StoreAs": "json", - "UseExistingInfo": true, - "FrontendFields": [ - { - "formatter": "table", - "name": "DisableSharedMailbox", - "value": "DisableSharedMailbox" - } - ] - }, - { - "name": "DisableTenantCreation", - "StoreAs": "bool", - "UseExistingInfo": true, - "FrontendFields": [ - { - "formatter": "bool", - "name": "DisableTenantCreation", - "value": "DisableTenantCreation" - } - ] - }, - { - "name": "DisableUserSiteCreate", - "StoreAs": "bool", - "UseExistingInfo": true, - "FrontendFields": [ - { - "formatter": "bool", - "name": "DisableUserSiteCreate", - "value": "DisableUserSiteCreate" - } - ] - }, - { - "name": "DisableViva", - "StoreAs": "bool", - "UseExistingInfo": true, - "FrontendFields": [ - { - "formatter": "bool", - "name": "DisableViva", - "value": "DisableViva" - } - ] - }, - { - "name": "EnableAppConsentAdminRequests", - "StoreAs": "bool", - "UseExistingInfo": true, - "FrontendFields": [ - { - "formatter": "bool", - "name": "EnableAppConsentAdminRequests", - "value": "EnableAppConsentAdminRequests" - } - ] - }, - { - "name": "EnableFIDO2", - "StoreAs": "bool", - "UseExistingInfo": true, - "FrontendFields": [ - { - "formatter": "bool", - "name": "EnableFIDO2", - "value": "EnableFIDO2" - } - ] - }, - { - "name": "EnableOnlineArchiving", - "StoreAs": "json", - "UseExistingInfo": true, - "FrontendFields": [ - { - "formatter": "table", - "name": "EnableOnlineArchiving", - "value": "EnableOnlineArchiving" - } - ] - }, - { - "name": "ExcludedfileExt", - "StoreAs": "json", - "UseExistingInfo": true, - "FrontendFields": [ - { - "formatter": "table", - "name": "ExcludedfileExt", - "value": "ExcludedfileExt" - } - ] - }, - { - "name": "intuneDeviceReg", - "StoreAs": "bool", - "UseExistingInfo": true, - "FrontendFields": [ - { - "formatter": "bool", - "name": "intuneDeviceReg", - "value": "intuneDeviceReg" - } - ] - }, - { - "name": "intuneDeviceRetirementDays", - "StoreAs": "bool", - "UseExistingInfo": true, - "FrontendFields": [ - { - "formatter": "bool", - "name": "intuneDeviceRetirementDays", - "value": "intuneDeviceRetirementDays" - } - ] - }, - { - "name": "intuneRequireMFA", - "StoreAs": "bool", - "UseExistingInfo": true, - "FrontendFields": [ - { - "formatter": "bool", - "name": "intuneRequireMFA", - "value": "intuneRequireMFA" - } - ] - }, - { - "name": "laps", - "StoreAs": "bool", - "UseExistingInfo": true, - "FrontendFields": [ - { - "formatter": "bool", - "name": "laps", - "value": "laps" - } - ] - }, - { - "name": "MailContacts", - "StoreAs": "json", - "UseExistingInfo": true, - "FrontendFields": [ - { - "formatter": "table", - "name": "MailContacts", - "value": "MailContacts" - } - ] - }, - { - "name": "NudgeMFA", - "StoreAs": "bool", - "UseExistingInfo": true, - "FrontendFields": [ - { - "formatter": "bool", - "name": "NudgeMFA", - "value": "NudgeMFA" - } - ] - }, - { - "name": "OauthConsent", - "StoreAs": "bool", - "UseExistingInfo": true, - "FrontendFields": [ - { - "formatter": "bool", - "name": "OauthConsent", - "value": "OauthConsent" - } - ] - }, - { - "name": "OauthConsentLowSec", - "StoreAs": "bool", - "UseExistingInfo": true, - "FrontendFields": [ - { - "formatter": "bool", - "name": "OauthConsentLowSec", - "value": "OauthConsentLowSec" - } - ] - }, - { - "name": "OutboundSpamAlert", - "StoreAs": "bool", - "UseExistingInfo": true, - "FrontendFields": [ - { - "formatter": "bool", - "name": "OutboundSpamAlert", - "value": "OutboundSpamAlert" - } - ] - }, - { - "name": "PasswordExpireDisabled", - "StoreAs": "json", - "UseExistingInfo": true, - "FrontendFields": [ - { - "formatter": "table", - "name": "PasswordExpireDisabled", - "value": "PasswordExpireDisabled" - } - ] - }, - { - "name": "companionAppAllowedState", - "StoreAs": "bool", - "UseExistingInfo": true, - "FrontendFields": [ - { - "formatter": "bool", - "name": "companionAppAllowedState", - "value": "companionAppAllowedState" - } - ] - }, - { - "name": "PWdisplayAppInformationRequiredState", - "StoreAs": "bool", - "UseExistingInfo": true, - "FrontendFields": [ - { - "formatter": "bool", - "name": "PWdisplayAppInformationRequiredState", - "value": "PWdisplayAppInformationRequiredState" - } - ] - }, - { - "name": "DKIM", - "StoreAs": "json", - "UseExistingInfo": true, - "FrontendFields": [ - { - "formatter": "table", - "name": "DKIM", - "value": "DKIM" - } - ] - }, - { - "name": "SecurityDefaults", - "StoreAs": "bool", - "UseExistingInfo": true, - "FrontendFields": [ - { - "formatter": "warnBool", - "name": "SecurityDefaults", - "value": "SecurityDefaults" - } - ] - }, - { - "name": "SendFromAlias", - "StoreAs": "bool", - "UseExistingInfo": true, - "FrontendFields": [ - { - "formatter": "bool", - "name": "SendFromAlias", - "value": "SendFromAlias" - } - ] - }, - { - "name": "SendReceiveLimit", - "StoreAs": "json", - "UseExistingInfo": true, - "FrontendFields": [ - { - "formatter": "table", - "name": "SendReceiveLimit", - "value": "SendReceiveLimit" - } - ] - }, - { - "name": "sharingCapability", - "StoreAs": "string", - "UseExistingInfo": true, - "FrontendFields": [ - { - "formatter": "string", - "name": "sharingCapability", - "value": "sharingCapability" - } - ] - }, - { - "name": "SpoofingWarnings", - "StoreAs": "bool", - "UseExistingInfo": true, - "FrontendFields": [ - { - "formatter": "warnBool", - "name": "SpoofingWarnings", - "value": "SpoofingWarnings" - } - ] - }, - { - "name": "TemporaryAccessPass", - "StoreAs": "bool", - "UseExistingInfo": true, - "FrontendFields": [ - { - "formatter": "warnBool", - "name": "TemporaryAccessPass", - "value": "TemporaryAccessPass" - } - ] - }, - { - "name": "unmanagedSync", - "StoreAs": "bool", - "UseExistingInfo": true, - "FrontendFields": [ - { - "formatter": "warnBool", - "name": "unmanagedSync", - "value": "unmanagedSync" - } - ] - }, - { - "name": "UserSubmissionPolicy", - "StoreAs": "bool", - "UseExistingInfo": true, - "FrontendFields": [ - { - "formatter": "warnBool", - "name": "UserSubmissionPolicy", - "value": "UserSubmissionPolicy" - } - ] - } - ] -} diff --git a/Config/openapi.json b/Config/openapi.json index 7a37660c66dad..ce905e786a5c4 100644 --- a/Config/openapi.json +++ b/Config/openapi.json @@ -123,6 +123,9 @@ { "name": "Tenant > Administration > Tenant" }, + { + "name": "Tenant > AI" + }, { "name": "Tenant > Conditional" }, @@ -132,6 +135,9 @@ { "name": "Tenant > Reports" }, + { + "name": "Tenant > SecuritySimulations" + }, { "name": "Tenant > Standards" }, @@ -251,6 +257,13 @@ "AlertComment": { "type": "string" }, + "becActions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/LabelValue" + }, + "description": "Which containment actions the 'becremediate' action runs (ListBECRemediationActions ids); empty = the default six." + }, "conditions": { "type": "array", "items": { @@ -701,6 +714,10 @@ "description": { "type": "string" }, + "disableAlerts": { + "type": "boolean", + "description": "'Disable Alerts': deviations are still detected and shown, but no email, webhook or PSA notification fires for this baseline. Negative flag on purpose: rows saved before the column existed keep alerting, exactly right." + }, "disableScheduledRuns": { "type": "boolean", "description": "'Disable Scheduled Runs': the baseline only executes when an operator runs it. Negative flag on purpose: rows saved before the column existed default to scheduled, exactly right." @@ -712,6 +729,18 @@ }, "description": "The editor round-trips the tenant selector's own option objects ({label, value, type}) verbatim via assignedTo/excludedTo; the flat excludedTenants values keep the exclusion logic simple. Raw string values are accepted everywhere too." }, + "GitHub": { + "type": "object", + "properties": { + "FullName": { + "type": "string" + }, + "Message": { + "type": "string" + } + }, + "description": "Optional. Pushes the saved baseline to a GitHub template repository after the save: FullName is the repository (owner/repo), Message is the commit message. Not stored on the baseline." + }, "GUID": { "type": "string" }, @@ -754,13 +783,78 @@ "application/json": { "schema": { "type": "object", - "description": "Derived from the fields the endpoint selects onto each record. The response may carry more; these are the ones known to exist.", + "description": "Derived from the fields written into the storage table it reads, and the fields the endpoint selects onto each record. Fields taken from the storage writers may be omitted by this endpoint, and the response may carry computed fields not listed here.", "properties": { + "alertEmails": { + "x-cipp-field-source": "storage" + }, + "alertWebhookUrl": { + "x-cipp-field-source": "storage" + }, + "assignedTo": { + "x-cipp-field-source": "storage" + }, + "description": { + "x-cipp-field-source": "storage" + }, + "disableAlerts": { + "type": "boolean", + "x-cipp-field-source": "storage" + }, + "disableScheduledRuns": { + "type": "boolean", + "x-cipp-field-source": "storage" + }, + "ETag": { + "type": "string", + "x-cipp-field-source": "storage" + }, + "excludedTenants": { + "x-cipp-field-source": "storage" + }, + "excludedTo": { + "x-cipp-field-source": "storage" + }, + "LocalChanges": { + "type": "boolean", + "x-cipp-field-source": "storage" + }, "Metadata": { "x-cipp-field-source": "backend" }, + "PartitionKey": { + "x-cipp-field-source": "storage" + }, "Results": { "x-cipp-field-source": "backend" + }, + "RowKey": { + "x-cipp-field-source": "storage" + }, + "SHA": { + "x-cipp-field-source": "storage" + }, + "Source": { + "x-cipp-field-source": "storage" + }, + "SourcePath": { + "x-cipp-field-source": "storage" + }, + "Stages": { + "x-cipp-field-source": "storage" + }, + "templateName": { + "x-cipp-field-source": "storage" + }, + "Timestamp": { + "type": "string", + "x-cipp-field-source": "storage" + }, + "updatedAt": { + "x-cipp-field-source": "storage" + }, + "updatedBy": { + "x-cipp-field-source": "storage" } } } @@ -788,60 +882,6 @@ ] } }, - "/api/AddBPATemplate": { - "post": { - "summary": "AddBPATemplate", - "operationId": "AddBPATemplate", - "tags": [ - "Tenant > Standards" - ], - "requestBody": { - "required": false, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "name": { - "type": "string" - } - } - } - } - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "type": "object", - "description": "Derived from the fields the endpoint selects onto each record. The response may carry more; these are the ones known to exist.", - "properties": { - "Results": { - "x-cipp-field-source": "backend" - } - } - } - } - } - }, - "401": { - "description": "Unauthorized - invalid or missing bearer token" - }, - "403": { - "description": "Forbidden - caller lacks the required RBAC role" - } - }, - "security": [ - { - "bearerAuth": [] - } - ], - "x-cipp-role": "Tenant.BestPracticeAnalyser.ReadWrite" - } - }, "/api/AddCAPolicy": { "post": { "summary": "AddCAPolicy", @@ -1074,6 +1114,13 @@ "excludeGroup": { "type": "string" }, + "ExcludeGroupIds": { + "type": "string" + }, + "GroupIds": { + "type": "string", + "description": "Group ids from the deploy drawer's single-tenant picker. CustomGroup/excludeGroup still carry the display names for logging and as a fallback if the ids are ever dropped." + }, "InstallAsSystem": { "type": "string" }, @@ -2215,6 +2262,13 @@ "excludeGroup": { "type": "string" }, + "ExcludeGroupIds": { + "type": "string" + }, + "GroupIds": { + "type": "string", + "description": "Group ids from the deploy drawer's single-tenant picker. CustomGroup/excludeGroup still carry the display names for logging and as a fallback if the ids are ever dropped." + }, "IntuneBody": { "type": "string" }, @@ -4429,6 +4483,15 @@ "defaultUseRoles": { "type": "boolean" }, + "defaultVacationCAPolicy": { + "type": "string" + }, + "defaultVacationExcludeAuditAlerts": { + "type": "boolean" + }, + "defaultVacationMode": { + "type": "boolean" + }, "generateTAPByDefault": { "type": "boolean" }, @@ -4564,6 +4627,13 @@ "excludeGroup": { "type": "string" }, + "ExcludeGroupIds": { + "type": "string" + }, + "GroupIds": { + "type": "string", + "description": "Group ids from the deploy drawer's single-tenant picker. CustomGroup/excludeGroup still carry the display names for logging and as a fallback if the ids are ever dropped." + }, "PackageName": { "type": "string", "description": "Build the install/uninstall command lines for this tenant. Get-CIPPMSPAppInstallCommand resolves each param whether it is a per-tenant keyed value (interactive deploy) or a flat value / %CIPP variable% (Application Template deploy)." @@ -4770,6 +4840,13 @@ "excludeGroup": { "type": "string" }, + "ExcludeGroupIds": { + "type": "string" + }, + "GroupIds": { + "type": "string", + "description": "Group ids from the deploy drawer's single-tenant picker. CustomGroup/excludeGroup still carry the display names for logging and as a fallback if the ids are ever dropped." + }, "IntuneBody": { "type": "string", "description": "A template saved from an existing app carries the full body: reuse it, minus the read-only properties Graph rejects on create." @@ -4971,6 +5048,13 @@ "excludeGroup": { "type": "string" }, + "ExcludeGroupIds": { + "type": "string" + }, + "GroupIds": { + "type": "string", + "description": "Sent by the deploy drawer when a single tenant is selected and groups were picked by id. customGroup/excludeGroup still carry the display names for logging and as a fallback." + }, "RAWJson": { "type": "string" }, @@ -5850,7 +5934,7 @@ "Security > Compliance-SensitivityLabel" ], "requestBody": { - "required": false, + "required": true, "content": { "application/json": { "schema": { @@ -5858,8 +5942,15 @@ "properties": { "PowerShellCommand": { "type": "string" + }, + "tenantFilter": { + "type": "string", + "description": "Encryption rights granted to the source tenant's own domain would follow the template into every other tenant. Swap them for %defaultdomain% so each deploy resolves to the target tenant instead." } }, + "required": [ + "tenantFilter" + ], "additionalProperties": true, "x-cipp-passthrough": true, "description": "This endpoint forwards the request body onward rather than reading a fixed set of fields. The properties listed here are the ones it is known to read; others may be accepted." @@ -5970,6 +6061,9 @@ "schema": { "type": "object", "properties": { + "isPublic": { + "type": "boolean" + }, "sensitivityLabel": { "type": "string" }, @@ -5977,7 +6071,12 @@ "type": "string" }, "siteDesign": { - "$ref": "#/components/schemas/LabelValue" + "allOf": [ + { + "$ref": "#/components/schemas/LabelValue" + } + ], + "description": "Optional. Only applies to the Team and Communication templates; omitted for TeamGroup." }, "siteName": { "type": "string" @@ -6048,6 +6147,9 @@ "items": { "type": "object", "properties": { + "isPublic": { + "type": "string" + }, "sensitivityLabel": { "type": "string" }, @@ -6055,7 +6157,8 @@ "type": "string" }, "siteDesign": { - "type": "string" + "type": "string", + "description": "Optional. Only applies to the Team and Communication templates; leave blank for TeamGroup." }, "siteName": { "type": "string" @@ -6289,9 +6392,25 @@ "createdAt": { "type": "string" }, + "GitHub": { + "type": "object", + "properties": { + "FullName": { + "type": "string" + }, + "Message": { + "type": "string" + } + }, + "description": "Optional. Pushes the saved template to a GitHub template repository after the save: FullName is the repository (owner/repo), Message is the commit message. Not stored on the template." + }, "GUID": { "type": "string" }, + "standards": { + "type": "string", + "description": "Drop standards toggled on but left with no instances (empty array) - e.g. a template standard whose last selection was removed in the editor, which leaves 'standards.