M365 Security · Enterprise Field Notes

Top 5 M365 Misconfigurations
I've Seen in Enterprise Environments

Real patterns from years of M365 administration — with detection, remediation, and what to do if you're already compromised.

May 2026 ~12 min read Updated with latest Microsoft changes
📊

45% of large enterprises worldwide experienced a security or compliance incident in the last 12 months directly caused by an M365 misconfiguration — CoreView Research, March 2026

Microsoft 365 ships with enterprise-grade tooling. The breaches I've helped organizations recover from weren't caused by zero-days or sophisticated nation-state attacks. They were caused by settings nobody got around to fixing. Here are the five I see most — each one a quiet door left unlocked.

01
Identity & Authentication

Legacy Authentication Still Enabled

Legacy authentication refers to older protocols — POP3, IMAP, SMTP Auth, Exchange ActiveSync, and Basic Auth — that were designed before modern identity standards existed. These protocols authenticate with a username and password alone, with no support for MFA, Conditional Access, or token-based security.

As of May 1, 2026, Microsoft permanently retired IDCRL (the legacy SharePoint sign-in method) — making this a right-now issue for any tenant still running scripts, Power BI refreshes, or Power Automate flows with stored credentials.

Legacy auth is a backdoor past MFA. An attacker with a stolen password can authenticate via IMAP or SMTP and completely bypass every Conditional Access policy you've built. This is the most exploited initial access vector in M365 environments — password spray attacks specifically target these endpoints because they're invisible to modern detection.

🚨

Real-world impact: If legacy auth is enabled, your entire MFA investment provides zero protection for any account reachable via IMAP or POP3. Attackers don't need your Authenticator app — they just need your password.

Entra ID · KQL / Sign-in Logs
# In Entra ID → Monitoring → Sign-in logs
# Filter: Client app = "Exchange ActiveSync", "IMAP", "POP3", "SMTP"
# Or use KQL in Log Analytics:

SigninLogs
| where ClientAppUsed in ("Exchange ActiveSync", "IMAP4", "POP3", "SMTP", "Other clients")
| where ResultType == "0"  // successful sign-ins only
| summarize count() by UserPrincipalName, ClientAppUsed, AppDisplayName
| order by count_ desc

Run this for at least two weeks before enforcing a block to avoid breaking legitimate workflows.

Entra Admin Center · Conditional Access Policy
# Entra ID → Security → Conditional Access → New Policy

Policy Name: "Block Legacy Authentication"

Users:    All users
Exclude:  Break-glass accounts, Service accounts still needing it

Target Resources: All resources

Conditions → Client apps:
  ☑ Exchange ActiveSync clients
  ☑ Other clients

Grant: Block access

# Start in Report-only mode for 1–2 weeks first


02
External Collaboration

Unconstrained Guest Access

M365's default configuration allows virtually any user to invite external guests to Teams, SharePoint, and OneDrive. Once invited, guest accounts can persist indefinitely — even after the project or relationship ends. Many organizations have hundreds or thousands of stale guest accounts with lingering access to sensitive workspaces.

Separately, anonymous sharing links (the "Anyone with the link" default in SharePoint) allow files to be shared with zero authentication required and no expiration.

Guests are typically unmanaged identities. They bypass your employee lifecycle controls, device compliance policies, and often your DLP policies. With M365 Copilot now in most enterprise tenants, an overpermissioned guest can use AI-accelerated search to map and extract sensitive information far faster than a human attacker ever could.

⚠️

Note: Anonymous sharing links have no authentication, no audit trail for the recipient, and no automatic expiration unless you configure one. Every file shared this way is effectively public.

PowerShell · Audit Guest Accounts
# Find all guest users and their last sign-in
Get-MgUser -Filter "userType eq 'Guest'" -All | Select-Object `
    DisplayName, Mail, SignInActivity, CreatedDateTime

# Flag stale guests: no sign-in in 90+ days
# Entra ID → Users → Filter: Guest accounts → Sort by Last sign-in

# Check SharePoint anonymous links
# SharePoint Admin Center → Reports → Sharing → filter by "Anyone"

Restrict who can invite guests: Entra ID → External Identities → External collaboration settings → set to "Only users assigned to specific admin roles."

SharePoint Online PowerShell
# Restrict to authenticated guests only
Set-SPOTenant -SharingCapability ExternalUserSharingOnly

# Set anonymous link expiration (14 days)
Set-SPOTenant -RequireAnonymousLinksExpireInDays 14

# Require guests to authenticate
Set-SPOTenant -RequireAcceptingAccountMatchInvitedAccount $true

Enable quarterly access reviews in Entra ID for all guest accounts (requires Entra ID P2).



03
Data Protection

Missing or Under-Configured DLP

Data Loss Prevention (DLP) in Microsoft Purview detects and blocks the movement of sensitive data — credit cards, SSNs, health records, IP — across Exchange, SharePoint, OneDrive, Teams, and endpoints. The misconfiguration isn't that DLP doesn't exist; it's that it's configured for Exchange only while Teams and SharePoint are left unwatched.

Without DLP, a compromised account — or a malicious insider — can exfiltrate your most sensitive files through Teams chat or OneDrive sync with no detection and no friction. In regulated industries, this isn't just a security issue — it's a compliance violation with fines attached.

💡

New in 2026: Microsoft Purview's Just-in-Time DLP protection for SharePoint (preview) can automatically apply DLP restrictions to unclassified files when they're first accessed or shared externally.

Microsoft Purview · Compliance Portal
# Purview → Data loss prevention → Policies
# For each policy, check "Locations" — you want ALL of:

✓ Exchange email
✓ SharePoint sites
✓ OneDrive accounts
✓ Teams chat and channel messages   ← most commonly missing
✓ Endpoint devices (requires Defender for Endpoint)

# If DLP alerts are zero → policy is misconfigured,
# not evidence of a clean environment.


04
Privileged Access

Over-Privileged Global Admins

The Global Administrator role has unrestricted access to everything in your tenant. The misconfiguration I see constantly: too many permanent GA accounts, teams sharing a single GA login, and admins doing day-to-day work from their admin account. Best practice is 2–4 Global Admins maximum, with access granted only through Privileged Identity Management (PIM) on a time-limited, just-in-time basis.

Every Global Admin account is a crown jewel target. Phish one, and the attacker can disable security policies, create backdoor accounts, exfiltrate your entire directory, and lock out your security team. The risk compounds with "daily driving" — admins checking email and clicking links from an account that can reconfigure your entire tenant.

🚨

October 2025 update: Microsoft's Azure MFA Phase 2 enforcement now mandates MFA for all Azure resource management actions. Tenants relying on password-only GA access for automation pipelines are non-compliant and exposed.

PowerShell · Audit Global Admins
# List all Global Administrators
Get-MgDirectoryRoleMember -DirectoryRoleId (
  Get-MgDirectoryRole | Where-Object {$_.DisplayName -eq "Global Administrator"}
).Id | Select-Object DisplayName, UserPrincipalName

# More than 4 results = first action item.
# Check if any GA accounts have recent interactive sign-ins
# (they should only be used for admin tasks, never daily email)


05
Email Security

No Email Authentication (SPF / DKIM / DMARC)

SPF, DKIM, and DMARC are DNS-based email authentication standards that together prove your domain is the legitimate sender of your outbound email — and tell receiving servers what to do when something claims to be from your domain but isn't.

Without DMARC set to p=reject, attackers can send email that appears to come from your domain to anyone in the world. This is the foundation of Business Email Compromise (BEC). DMARC with p=none is monitoring mode, not protection — most organizations stay here indefinitely and never enforce.

DNS · Check SPF / DKIM / DMARC
# Check SPF
nslookup -type=TXT yourdomain.com
# Look for: v=spf1 include:spf.protection.outlook.com -all

# Check DMARC
nslookup -type=TXT _dmarc.yourdomain.com
# p=none  → monitoring only, NOT protected
# no record → fully exposed to spoofing

# Check DKIM
nslookup -type=TXT selector1._domainkey.yourdomain.com
DNS TXT Records · Phase-in Approach
# SPF (add to DNS)
v=spf1 include:spf.protection.outlook.com -all

# DKIM — enable in Defender portal → Email & Collaboration
# → Policies & Rules → Threat Policies → DKIM → Enable

# DMARC — Phase 1: Monitor
v=DMARC1; p=none; rua=mailto:dmarc-reports@yourdomain.com

# DMARC — Phase 2: Quarantine (after 4–6 weeks of reports)
v=DMARC1; p=quarantine; pct=25; rua=mailto:dmarc-reports@yourdomain.com

# DMARC — Phase 3: Reject (target state)
v=DMARC1; p=reject; rua=mailto:dmarc-reports@yourdomain.com
Last verified: May 2026

The Bottom Line

None of these are exotic vulnerabilities. They're the same handful of unlocked doors I find in nearly every tenant I review — often in organizations that have already invested heavily in E5 licenses and security tooling. The tools are there. The configurations aren't.

If you can close these five gaps this quarter, you will be meaningfully ahead of the average enterprise tenant. Start with legacy auth — it's the one attackers exploit most, and it's the easiest to fix. Then work down the list.

The risk in 2026 isn't that attackers will discover something new. It's that AI-assisted reconnaissance will find everything already misconfigured across thousands of tenants simultaneously, faster than your team can patch it. "We'll get to it" is not a strategy. It's a vulnerability.