Security & trust

Built to look, never to touch

You're trusting us with a view into your customers' Microsoft 365 tenants. Here is exactly what we can access, how we protect it, and how to switch it off.

Our principles

Six commitments behind every assessment

Read-only modules by default

Each assessment area is a separate module app with read-only permissions: it can't create, change or delete users, policies, devices or data. Two opt-in modules need broader access because Microsoft offers nothing narrower; they're off unless you switch them on, clearly labelled, and only ever used to read.

No secrets, no certificates

Our engine signs in to each module app with workload identity federation: its Azure managed identity is the credential. There's no client secret or certificate to leak or rotate, tokens are short-lived, and they're never logged or written to disk.

Per-tenant isolated storage

Each assessed tenant's results live in their own storage container. Access to report files uses short-lived links scoped to that one container.

Row-level security for every organization

Our database enforces row-level security by organization. Even if application code asked for the wrong rows, the database would return only the signed-in organization's data.

TLS everywhere

All traffic to our site, app and APIs is encrypted in transit with TLS, with HSTS and a strict content security policy. Data is encrypted at rest by Azure Storage and Azure SQL.

Microsoft Entra sign-in, no passwords

You sign in to M365Assessments with your Microsoft work account. We never see or store your password, and your organization's MFA and Conditional Access policies apply.

Exact permissions

Every permission we request, and why

Each module is its own Microsoft Entra application, and the tenant's Global Administrator approves each one separately. Microsoft grants a module exactly the permissions below. Read-only modules use application permissions that only read; the Exchange & Security and Teams modules also get Microsoft's built-in, view-only Global Reader role, assigned during onboarding.

No write access in read-only modules

No *.ReadWrite.* permission and no write role. The only write-capable access, SharePoint Sites.FullControl.All and a Power Platform management-app registration, belongs to the two opt-in modules, which you enable explicitly.

No content access

We don't request permissions to read email, files, Teams chats, calendars or documents. We read configuration and metadata.

Reads only

Every request the engine sends reads data, in every module, including the opt-in ones. The one POST it uses is a Microsoft Graph $batch call that bundles read requests together.

Core module: Microsoft Graph application permissions (always required)
#PermissionWhat we use it for
Core module (always required): identity & tenant core (Microsoft Entra ID)
1Directory.Read.AllUsers, groups, roles, applications and other directory objects that most checks build on.
2Organization.Read.AllTenant profile, verified domains and subscriptions.
3AuditLog.Read.AllSign-in activity: legacy-authentication usage, stale accounts and last sign-in dates.
4SecurityEvents.Read.AllMicrosoft Secure Score and its control profiles.
5Policy.Read.AllConditional Access, authentication methods, authorization and cross-tenant access policies.
6RoleManagement.Read.DirectoryAdmin role assignments and Privileged Identity Management (PIM) eligibility.
7IdentityRiskyUser.Read.AllUsers flagged as risky by Microsoft Entra ID Protection.
8IdentityRiskEvent.Read.AllRisk detections, including risky sign-ins.
9IdentityRiskyServicePrincipal.Read.AllRisky workload identities (service principals) and their detections.
10Agreement.Read.AllTerms of use agreements.
11AccessReview.Read.AllAccess review definitions.
12DirectoryRecommendations.Read.AllMicrosoft Entra recommendations for the tenant.
13OnPremDirectorySynchronization.Read.AllMicrosoft Entra Connect (directory sync) configuration.
14CrossTenantInformation.ReadBasic.AllResolving partner tenant names in cross-tenant access settings.
15Synchronization.Read.AllProvisioning (SCIM) jobs on enterprise applications.
Devices (Microsoft Intune)
16DeviceManagementManagedDevices.Read.AllManaged device inventory, compliance state and device clean-up rules.
17DeviceManagementConfiguration.Read.AllCompliance and configuration profiles, settings catalog, endpoint security and update rings.
18DeviceManagementApps.Read.AllManaged apps and iOS/Android app protection policies.
19DeviceManagementServiceConfig.Read.AllWindows Autopilot devices and profiles, enrollment and connector configuration.
20DeviceManagementRBAC.Read.AllIntune role settings, including multi-admin approval.
21DeviceManagementScripts.Read.AllPlatform scripts and remediations.
Licensing & usage
22Reports.Read.AllMicrosoft 365 active-user and usage reports, including Microsoft 365 Copilot usage.
23ReportSettings.Read.AllWhether the tenant conceals user names in usage reports.
Optional modules and the access each one requests
#PermissionWhat we use it for
Exchange & Security module: Exchange Online, Defender for Office 365, Defender for Identity, Purview (read-only)
1Exchange.ManageAsAppSigning in to Exchange Online and Security & Compliance PowerShell as an app. It grants no rights on its own: the Global Reader role below limits it to view-only cmdlets.
2SecurityEvents.Read.AllSecure Score and its control profiles.
3SecurityIdentitiesSensors.Read.AllDefender for Identity sensor deployment and health.
4Organization.Read.AllSubscriptions, to know which Defender features are licensed.
5Domain.Read.AllYour domains, to check DKIM, SPF and DMARC.
6RoleManagement.Read.DirectoryAdmin role members, so admin mailboxes are checked first for risky inbox rules.
7Global Reader (directory role)Microsoft's built-in view-only role. It lets Exchange, Purview and Teams PowerShell read settings and can't change anything.
SharePoint & OneDrive module (read-only)
1SharePointTenantSettings.Read.AllTenant sharing settings.
2Sites.Read.AllSite inventory and templates. We don't open documents.
3Reports.Read.AllSite and OneDrive storage and activity reports.
4ReportSettings.Read.AllWhether usage reports conceal user names.
5GroupMember.Read.AllOwners of group-connected sites.
Microsoft Teams module (read-only)
1Organization.Read.AllTenant lookup when Teams PowerShell signs in as the app.
2TeamSettings.Read.AllTeam settings for the team inventory.
3TeamworkDevice.Read.AllTeams Rooms and phones, and their health.
4GroupMember.Read.AllMember, owner and guest counts per team.
5Channel.ReadBasic.AllChannel counts per team (names only, never messages).
6Global Reader (directory role)View-only role for Teams policy and voice settings.
Power Platform module: opt-in, NOT read-only
1Organization.Read.AllTenant identity check before Power Platform collection.
2Power Platform management application (registration)Your admin registers the module app during onboarding. Microsoft gives management applications the same API access as a Power Platform administrator and offers no read-only option. We only read environments, DLP policies, apps, flows and connectors.
SharePoint Advanced module: opt-in, NOT read-only
1Sites.FullControl.All (SharePoint)The only permission Microsoft accepts for the SharePoint tenant admin settings we use for the full sharing and access audit. It would allow changes to any site; we only read tenant settings with it.

Opt-in modules are off by default. Your service provider has to select one and confirm that it isn't read-only, and the consent screen shows exactly what's requested. Assigning Global Reader happens in your administrator's own browser during onboarding: our M365 Assessment – Onboarding app has only delegated permissions (RoleManagement.ReadWrite.Directory, Application.Read.All, and PowerApps User for Power Platform), which act only as the signed-in admin while they're signed in. The admin's token is never sent to us, and the app keeps no access afterwards. Sign-in to the M365Assessments portal itself asks only for your basic profile (openid, profile, email, User.Read). Tenants connected before modules were introduced use our original read-only Collector app until their admin re-onboards.

Your data

What we store, and what we don't

What we store

  • Your workspace: organization name, team members (name, email, role) from Microsoft sign-in, and your plan.
  • Connected tenants: tenant ID, domain, consent status and run history.
  • Assessment results: the configuration data collected during a run and the generated report, stored in that tenant's own isolated container.

Reports name users, admins, devices and apps where that's relevant to a finding (for example, "these 12 users aren't registered for MFA").

What we don't

  • Your password or your customers' passwords
  • Email, files, chats, calendars or document contents
  • Client secrets or certificates for customer tenants (module apps use workload identity federation)
  • Customer tenant data in logs, URLs or query strings. Our logs record run and organization IDs, not tenant contents.

Data residency: M365Assessments runs on Microsoft Azure, and assessment data is stored in Azure data centers in the United States. Regional hosting outside the US isn't offered yet. Tell us if you need it.

Infrastructure

Built entirely on Microsoft Azure

Managed Azure services, protected at the edge, with managed identities between components.

Azure Front Door with WAF

Global entry point with a web application firewall in front of the app and API.

Azure Container Apps

The portal API and assessment engine run as containers. Each assessment runs as its own job.

Azure SQL

Workspace, tenant and run metadata, with row-level security by organization.

Azure Key Vault

Holds our signing key (and, for tenants still on the original Collector app, its certificate). Module apps need no key material at all. Access is by managed identity and role-based access control.

Azure Blob Storage

One container per assessed tenant for collected data and reports.

Microsoft Entra ID

Sign-in for every user. Tokens are validated on every API request.

Revoking access

You can switch us off in under a minute

Consent is granted by the tenant's own administrator, and it can be withdrawn by that administrator at any time, with no ticket and no waiting on us.

Once the enterprise app is deleted, our app can no longer get tokens for that tenant, so no further assessments can run. Want stored reports for that tenant deleted too? Email hello@m365assessments.com from an admin address in that tenant and we'll delete them.

Remove M365Assessments from a tenant

  1. Open the Microsoft Entra admin center

    Sign in at entra.microsoft.com as a Global Administrator, Cloud Application Administrator or Application Administrator.

  2. Go to Enterprise applications

    Browse to Enterprise applications (under Applications) and search for M365 Assessment. Each module you approved is listed separately; older connections show M365Assessments Collector.

  3. Delete the applications

    Open each one, select Properties, then Delete. This removes the service principal, its permissions and its role assignments. For Power Platform, also remove it from the management applications (Remove-PowerAppManagementApp).

Compliance

Honest about where we are

We don't hold SOC 2 or ISO 27001 certification today. M365Assessments is in early access. We're working toward independent third-party assessment and will publish our status here as it progresses.

In the meantime, we're happy to answer your security questionnaire and walk your team through our architecture. Contact us.

Responsible disclosure

Found a vulnerability? Please tell us.

We welcome reports from security researchers and will work with you to understand and fix any issue quickly.

How to report

  • Email security@m365assessments.com with a description, steps to reproduce and the potential impact.
  • We'll acknowledge your report within 3 business days and keep you updated as we investigate.
  • Please don't access or modify other customers' data, degrade the service, or disclose the issue publicly before we've had a reasonable chance to fix it.
  • We won't pursue legal action against good-faith research that follows these guidelines.

Our security contact is also published at /.well-known/security.txt.

Have a question your security team needs answered?

We'll walk through our architecture, permissions and data handling with you, or fill in your questionnaire.