Perimeter-Sicherheit ist tot. Das Modell „alles hinter der Firewall ist sicher” funktioniert in einer Welt mit Remote Work, Cloud-Apps und BYOD nicht mehr. Zero Trust ist der Ersatz – und Microsofts Conditional Access ist das zentrale Werkzeug, um es in M365-Umgebungen umzusetzen.
Dieser Post zeigt, wie du Conditional Access strukturiert aufbaust: von der ersten Richtlinie bis zum lückenlosen Monitoring.
Was ist Conditional Access?
Conditional Access (CA) ist eine Policy-Engine in Microsoft Entra ID (ehemals Azure AD). Sie trifft Zugangsentscheidungen nach dem Prinzip:
Signal → Entscheidung → Durchsetzung
Jede Anmeldung wird anhand von Signalen bewertet:
- Wer meldet sich an? (Benutzer, Gruppe, Rolle)
- Von wo? (IP, Named Location, Land)
- Mit welchem Gerät? (Compliant, Hybrid Joined, unbekannt)
- Auf welche App? (Exchange, Teams, custom App)
- Wie riskant ist die Anmeldung? (Sign-in Risk, User Risk)
Das Ergebnis: Zugriff gewähren, blockieren oder Bedingung erzwingen (z. B. MFA, Passwortänderung).
Voraussetzungen & Lizenzen
Conditional Access erfordert mindestens Entra ID P1 – in M365 Business Premium, E3 oder E5 enthalten. Risikobasierte Policies (Sign-in Risk, User Risk) brauchen Entra ID P2 bzw. M365 E5.
# Lizenzübersicht für alle User prüfen
Connect-MgGraph -Scopes "User.Read.All", "Directory.Read.All"
Get-MgUser -All -Property DisplayName, UserPrincipalName, AssignedLicenses |
Select-Object DisplayName, UserPrincipalName,
@{N="Lizenzen"; E={ $_.AssignedLicenses.Count }} |
Where-Object { $_.Lizenzen -gt 0 }
Wichtig: Notfallkonten („Break Glass Accounts”) müssen immer von CA-Richtlinien ausgenommen sein. Sonst sperrst du dich im Fehlerfall selbst aus.
Die Basis-Richtlinien
Hier die sechs Policies, die ich in jeder Umgebung als Minimum konfiguriere – in der Reihenfolge, wie ich sie einführe:
CA001 – MFA für alle Benutzer
Die wichtigste Richtlinie überhaupt. Kein Benutzer sollte sich ohne zweiten Faktor anmelden können.
Einstellungen:
- Benutzer: Alle Benutzer
- Cloud-Apps: Alle Cloud-Apps
- Bedingungen: –
- Gewähren: MFA erforderlich
# Bestehende CA-Richtlinien auflesen
Get-MgIdentityConditionalAccessPolicy |
Select-Object DisplayName, State, CreatedDateTime |
Sort-Object CreatedDateTime
CA002 – Legacy-Authentifizierung blockieren
Legacy-Protokolle wie SMTP AUTH, IMAP, POP3 und ältere Exchange ActiveSync-Versionen unterstützen kein MFA. Angreifer nutzen das gezielt aus.
Einstellungen:
- Benutzer: Alle Benutzer
- Cloud-Apps: Alle Cloud-Apps
- Bedingungen → Client-Apps: Exchange ActiveSync, andere Clients
- Gewähren: Blockieren
Dieser eine Policy-Block eliminiert einen der häufigsten Angriffsvektoren in M365-Umgebungen.
CA003 – Admin-MFA immer erzwingen
Privilegierte Rollen brauchen besondere Behandlung – unabhängig davon, ob sie von CA001 erfasst werden.
Einstellungen:
- Benutzer: Verzeichnisrollen (Global Admin, Exchange Admin, Security Admin, etc.)
- Cloud-Apps: Alle
- Gewähren: MFA + Konformes Gerät (wenn möglich)
CA004 – Compliant Device für produktive Apps
Gerätecompliance über Intune ist der nächste Zero-Trust-Schritt: Nur verwaltete Geräte dürfen auf sensible Apps zugreifen.
Einstellungen:
- Benutzer: Alle (außer Break-Glass)
- Cloud-Apps: Exchange Online, SharePoint Online, Teams
- Gewähren: Konformes Gerät oder Hybrid Joined oder MFA (je nach Reifegrad)
Starte hier mit Report-Only (dazu weiter unten). Ein zu aggressiver Roll-out blockiert reale Nutzer.
CA005 – Hochrisiko-Anmeldungen blockieren (P2)
Entra ID Identity Protection bewertet jede Anmeldung auf Anomalien: unbekannte Standorte, Credential Leaks, Tor-Browser, etc.
Einstellungen:
- Bedingungen → Anmelderisiko: Hoch
- Gewähren: Blockieren (oder MFA + Passwortänderung bei mittlerem Risiko)
CA006 – Named Locations filtern
Nicht jede Umgebung braucht globalen Zugriff. Wenn deine Nutzer ausschließlich aus Deutschland arbeiten, kannst du alle anderen Länder blockieren.
Einstellungen:
- Bedingungen → Standorte: Alle außer „Deutschland” (benannte Location)
- Gewähren: Blockieren
Named Locations konfigurieren
Named Locations sind IP-Bereiche oder Länderlisten, auf die du in Policies referenzieren kannst.
Im Portal: Entra Admin Center → Sicherheit → Conditional Access → Named Locations
# Named Locations per Graph API anlegen
$body = @{
"@odata.type" = "#microsoft.graph.countryNamedLocation"
displayName = "Deutschland"
countriesAndRegions = @("DE")
includeUnknownCountriesAndRegions = $false
} | ConvertTo-Json
Invoke-MgGraphRequest -Method POST `
-Uri "https://graph.microsoft.com/v1.0/identity/conditionalAccess/namedLocations" `
-Body $body `
-ContentType "application/json"
Report-Only Modus – immer zuerst
Bevor du eine neue Richtlinie aktivierst, schalte sie auf Report-Only. Die Policy wird ausgewertet, aber nicht durchgesetzt. Du siehst im Anmeldeprotokoll, welche Anmeldungen betroffen wären – ohne Produktionsauswirkungen.
Mindestens 3–5 Tage im Report-Only-Modus, bevor du auf enabled wechselst.
Anmeldeprotokolle auswerten:
Connect-MgGraph -Scopes "AuditLog.Read.All"
# Anmeldungen der letzten 24h mit CA-Auswertung
$since = (Get-Date).AddHours(-24).ToString("yyyy-MM-ddTHH:mm:ssZ")
Get-MgAuditLogSignIn -Filter "createdDateTime ge $since" -Top 100 |
Select-Object UserDisplayName, AppDisplayName, CreatedDateTime,
@{N="CA-Ergebnis"; E={
$_.AppliedConditionalAccessPolicies |
ForEach-Object { "$($_.DisplayName): $($_.Result)" }
}}
Monitoring: Sign-in Logs richtig lesen
Das Entra-Anmeldeprotokoll zeigt für jede Anmeldung:
| Spalte | Bedeutung |
|---|---|
| CA-Richtlinienname | Welche Policy wurde angewendet? |
| Ergebnis | success, failure, notApplied, reportOnlySuccess |
| MFA-Ergebnis | Ob MFA angefordert / abgeschlossen wurde |
| Gerätecompliance | compliant, notCompliant, unknown |
| Risikostufe | none, low, medium, high |
Für einen strukturierten Export:
$since = (Get-Date).AddDays(-7).ToString("yyyy-MM-ddTHH:mm:ssZ")
Get-MgAuditLogSignIn -Filter "createdDateTime ge $since" -Top 500 |
Where-Object { $_.Status.ErrorCode -ne 0 } |
Select-Object UserDisplayName, UserPrincipalName,
AppDisplayName, CreatedDateTime,
@{N="Fehlercode"; E={ $_.Status.ErrorCode }},
@{N="Fehlertext"; E={ $_.Status.FailureReason }} |
Export-Csv "C:\Reports\ca_failures_$(Get-Date -Format 'yyyyMMdd').csv" `
-NoTypeInformation -Encoding UTF8
Häufige Fehler und wie du sie vermeidest
1. Break-Glass-Konto nicht ausgenommen Das passiert öfter als man denkt. Jedes Break-Glass-Konto muss in einer eigenen Gruppe sein, die von allen CA-Policies ausgenommen ist.
2. Alle Policies auf einmal aktiviert Roll-out Policy für Policy. Immer erst Report-Only, dann einzeln scharf schalten.
3. Service Accounts vergessen Service Accounts für automatisierte Prozesse (z. B. Sync, Monitoring) schlagen bei MFA-Policies fehl. Entweder ausschließen oder auf Managed Identities / Workload Identities umstellen – diese haben eigene CA-Policies.
4. Keine Notfall-Benachrichtigung Richte Entra ID Alerts ein, damit du sofort informiert wirst, wenn sich ein Break-Glass-Konto anmeldet. Das signalisiert, dass irgendetwas schiefgelaufen ist.
# Alert-Regel per Graph (vereinfacht)
# Empfehlung: Im Entra Portal unter Monitoring → Alerts konfigurieren
5. „Alle Cloud-Apps” vs. gezielte Apps „Alle Cloud-Apps” ist mächtig, kann aber Office-Add-ins oder Legacy-Integrationen brechen. Starte mit den kritischen Apps (Exchange, SharePoint, Teams) und erweitere dann.
Best Practices Checkliste
Bevor du eine CA-Konfiguration für produktiv erklärst:
- Break-Glass-Konto existiert, ist dokumentiert und von allen Policies ausgenommen
- Legacy-Auth ist blockiert
- MFA für alle Benutzer aktiv (nicht nur Admins)
- Admin-Konten sind Privileged Identity Management (PIM) zugewiesen
- Alle neuen Policies liefen mindestens 3 Tage im Report-Only-Modus
- Anmeldeprotokolle werden regelmäßig ausgewertet (oder an SIEM weitergeleitet)
- Service Accounts sind explizit gehandhabt (ausgenommen oder auf Managed Identity migriert)
- Named Locations sind gepflegt und aktuell
Fazit
Conditional Access ist kein Einmal-Klick-Feature. Es ist eine Architektur. Wer es sauber aufbaut – mit Struktur, Report-Only-Tests und regelmäßigem Monitoring – hat eine der effektivsten Sicherheitsmaßnahmen, die M365 zu bieten hat.
Der häufigste Fehler ist, es entweder gar nicht einzusetzen oder mit einer einzigen übermächtigen Policy alles auf einmal zu blockieren. Der richtige Weg liegt dazwischen: schrittweise, dokumentiert, und immer mit einem Auge auf den Logs.
Einstieg heute:
# Ersten Überblick verschaffen – was läuft aktuell in deiner Umgebung?
Connect-MgGraph -Scopes "Policy.Read.All", "AuditLog.Read.All"
Get-MgIdentityConditionalAccessPolicy | Select-Object DisplayName, State | Format-Table -AutoSize
Schau was dir zurückkommt. Dann weißt du, wo du anfangen musst.
Fragen oder eigene CA-Setups? Schreib mir: info@westmeier.cloud