Conditional Access w Microsoft 365 — 5 błędów konfiguracji które blokują użytkowników (i jak je naprawić)
Conditional Access ocenia polityki równolegle — jeden błąd może zablokować cały tenant. Opisuję 5 konkretnych pułapek: blokadę rejestracji Intune przez All cloud apps, niezablokowane legacy auth, problem IPv6 w Named Locations, niewidoczne service dependencies i brak testowania przez What-If.
Conditional Access w Microsoft 365 — 5 błędów konfiguracji które blokują użytkowników (i jak je naprawić)
TL;DR: Conditional Access ocenia wszystkie polityki równolegle — jeden błąd może zablokować cały tenant. Opisuję 5 konkretnych pułapek: blokadę rejestracji Intune przez "All cloud apps", niezablokowane legacy auth, problem z IPv6 w Named Locations, niewidoczne zależności między aplikacjami i brak testowania przez What-If. Każda z nich ma konkretne rozwiązanie, kody błędów i przykłady PowerShell.
Problem
Conditional Access to mechanizm który wygląda prosto — tworzysz politykę, określasz warunki, definiujesz co się dzieje przy niespełnieniu. W praktyce administratorzy M365 regularnie wpadają w pułapki których nie widać na etapie konfiguracji, a które wychodzą dopiero gdy użytkownicy zaczynają dzwonić z pytaniem "dlaczego nie mogę się zalogować."
Typowy scenariusz: nowy admin dostaje zadanie "zabezpiecz tenant, wdróż MFA i zgodność urządzeń". Tworzy politykę CA: wszyscy użytkownicy, wszystkie aplikacje chmurowe, wymagana zgodność urządzenia z Intune. Polityka ląduje w trybie enforced. Następnego ranka 30% pracowników nie może się zalogować — bo ich urządzenia nie są jeszcze zarejestrowane w Intune. Co gorsza, nie mogą ich zarejestrować, bo CA blokuje dostęp do portalu rejestracji. Klasyczne jajko i kura.
To nie jest wymyślony przykład. Powtarza się w różnych wariantach na forach Microsoft TechCommunity kilka razy w tygodniu. Problemem jest to, że CA nie jest systemem reguł sekwencyjnych — wszystkie aktywne polityki są oceniane jednocześnie, a dostęp jest przyznawany tylko gdy żadna z nich nie blokuje i wszystkie wymagania są spełnione.
Dodatkowy problem: wiele organizacji wdraża CA bez żadnej fazy testowej. Polityka przechodzi bezpośrednio z "Disabled" do "Enabled" bez tygodnia w Report-Only. Efekt: dopiero po fakcie, z logów, admin dowiaduje się kogo i dlaczego zablokował.
Dlaczego tak się dzieje
Conditional Access działa według modelu "zero domyślnego dostępu" — jeśli jakikolwiek aktywny CA policy mówi "zablokuj" albo wymaga spełnienia warunku którego nie można spełnić w danym kontekście, dostęp jest odmawiany. Nie ma tutaj priorytetu ani kolejności przetwarzania polityk. Wszystkie oceniane są równolegle, a wynik "Failed" z jednej polityki wystarczy do odmowy dostępu.
Drugi mechanizm który bije adminów z zaskoczenia to service dependencies. Gdy użytkownik otwiera Microsoft Teams, Teams żąda tokenów do: Exchange Online (kalendarz, mail), SharePoint Online (pliki i kanały), Office 365 (licencje). Jeśli CA policy blokuje dostęp do SharePoint Online, Teams przestaje działać — nawet jeśli polityka nie jest skierowana bezpośrednio na Teams. W logach logowania zobaczysz aplikację "Microsoft Teams", ale zasób zablokowany to "SharePoint Online" — co bez wiedzy o service dependencies wygląda jak anomalia.
Trzecia przyczyna problemów to IPv6. Entra ID nie potrafi geolokalizować adresów IPv6 — traktuje je jako "unknown location." Jeśli masz politykę blokującą dostęp z krajów spoza whitelist, użytkownik łączący się przez IPv6 (co jest coraz powszechniejsze przy ISP-ach w Polsce przechodzących na dual-stack) zostanie zablokowany, bo jego adres nie pasuje do żadnego dozwolonego kraju. To cicha pułapka — użytkownik siedzi w Warszawie, a CA widzi go jako "unknown location."
Rozwiązanie krok po kroku
Błąd #1 — "Wszystkie aplikacje chmurowe" blokuje rejestrację w Intune
To najczęstszy błąd przy wdrożeniu polityki wymagającej zgodności urządzenia. Konfiguracja problematyczna:
- Użytkownicy: Wszyscy
- Zasoby: Wszystkie aplikacje chmurowe
- Kontrola dostępu: Wymagaj zgodnego urządzenia z Intune
Problem: urządzenie może być "zgodne" dopiero po zarejestrowaniu w Intune. Rejestracja wymaga dostępu do portalu Microsoft Intune i Microsoft Intune Enrollment. Polityka "wszystkie aplikacje + wymagaj zgodności" blokuje właśnie te portale — urządzenie nie może się zarejestrować, więc nie jest zgodne, więc dostęp jest zablokowany. W logach zobaczysz błąd AADSTS53000 (DeviceNotCompliant).
Rozwiązanie: Wyłącz z polityki aplikacje Microsoft Intune (AppId: 0000000a-0000-0000-c000-000000000000) i Microsoft Intune Enrollment (AppId: d4ebce55-015a-49b5-a083-c84d1797ae8c). Znajdź polityki które mogą mieć ten problem:
# Sprawdź polityki CA które mogą blokować enrollment Intune
Connect-MgGraph -Scopes "Policy.Read.All"
$policies = Get-MgIdentityConditionalAccessPolicy -All
foreach ($policy in $policies) {
$apps = $policy.Conditions.Applications
# Sprawdź polityki celujące w All lub bez wykluczeń Intune
$allApps = $apps.IncludeApplications -contains "All"
$intuneExcluded = $apps.ExcludeApplications -contains "0000000a-0000-0000-c000-000000000000"
$enrollExcluded = $apps.ExcludeApplications -contains "d4ebce55-015a-49b5-a083-c84d1797ae8c"
$grantControls = $policy.GrantControls.BuiltInControls
if ($allApps -and ($grantControls -contains "compliantDevice") -and (-not $intuneExcluded -or -not $enrollExcluded)) {
Write-Warning "Polityka '$($policy.DisplayName)' wymaga zgodności i może blokować rejestrację Intune"
Write-Host " - Microsoft Intune wykluczone: $intuneExcluded"
Write-Host " - Microsoft Intune Enrollment wykluczone: $enrollExcluded"
}
}
Błąd #2 — Niezablokowane legacy authentication
Legacy authentication (IMAP, POP3, SMTP AUTH, Basic Auth, MAPI over HTTP, Exchange ActiveSync z Basic) nie obsługuje Conditional Access ani nowoczesnego MFA. Jeśli masz politykę "wszyscy użytkownicy muszą używać MFA" ale nie blokujesz legacy auth, atakujący może użyć IMAP albo POP3 do zalogowania się hasłem — bez żadnego challengu MFA. Polityki CA są wtedy zupełnie bezużyteczne dla tego wektora ataku.
Sprawdź ile aktywnych sesji legacy auth masz w ostatnich 30 dniach:
Connect-MgGraph -Scopes "AuditLog.Read.All"
$startDate = (Get-Date).AddDays(-30).ToString("yyyy-MM-ddTHH:mm:ssZ")
$legacyClients = @("IMAP4", "POP3", "MAPI", "Exchange ActiveSync", "Other clients", "Authenticated SMTP")
$signIns = Get-MgAuditLogSignIn -Filter "createdDateTime ge $startDate and status/errorCode eq 0" -All -PageSize 500 |
Where-Object { $legacyClients -contains $_.ClientAppUsed }
Write-Host "Aktywne sesje legacy auth w ostatnich 30 dniach: $($signIns.Count)"
$signIns | Group-Object UserPrincipalName, ClientAppUsed |
Sort-Object Count -Descending |
Select-Object -First 20 Name, Count |
Format-Table -AutoSize
Przed zablokowaniem uruchom politykę w trybie Report-Only przez minimum 2 tygodnie i sprawdź wyniki. Typowe ofiary blokady: drukarki z mailem SMTP AUTH, legacy aplikacje CRM, skanery do maila, automation scripts z hardcoded hasłami. Dla urządzeń wielofunkcyjnych użyj SMTP relay Microsoft 365 (nie wymaga per-user auth) zamiast SMTP AUTH.
Błąd #3 — IPv6 w Named Locations
Jeśli tworzysz politykę opartą na lokalizacji (np. "zablokuj dostęp z krajów spoza EU"), Named Locations działają poprawnie dla IPv4. Przy IPv6 — Entra ID nie przypisuje adresów IPv6 do lokalizacji geograficznej i klasyfikuje je jako "Unknown location."
Efekt: polityka blokująca "wszystkie kraje z wyjątkiem PL/DE/CZ" zablokuje użytkownika który łączy się przez IPv6 od polskiego ISP. Ich adres IPv6 trafia do kategorii "Unknown" — i jeśli "Unknown" nie jest na whiteliście, dostęp jest odmówiony.
Trzy podejścia (od najlepszego):
- Zmień warunek z lokalizacji na "Compliant Device" — urządzenie enrolled w Intune ma certyfikat; compliance nie zależy od IP. To właściwe rozwiązanie docelowe.
- Dodaj zakresy IPv6 swojego ISP do Named Location — tymczasowe, wymaga aktualizacji przy zmianie dostawcy.
- Włącz "Include unknown countries/regions" — ryzykowne, bo faktycznie nieznane lokalizacje też przejdą.
Błąd #4 — Niewidoczne zależności między aplikacjami
CA nie widzi "intencji użytkownika" — widzi jakie zasoby są żądane podczas sign-in. Teams, Outlook, SharePoint, OneDrive żądają tokenów do wielu zasobów backend.
Przykład: admin ustawia politykę "tylko użytkownicy z urządzeń zarządzanych mają dostęp do SharePoint." Użytkownik otwiera Teams z niezarządzanego urządzenia i Teams przestaje działać — nie może załadować plików z kanałów. W logach widzi błąd dla "SharePoint Online", nie dla "Teams." Użytkownik mówi "Teams się zepsuł."
Zawsze sprawdzaj Audience reporting w logach sign-in — dla każdego logowania Entra ID pokazuje wszystkie zasoby (audiences) które były żądane. Inne kluczowe pary:
- Exchange Online blokuje: Outlook, Teams (mail/kalendarz), Power Automate connectors
- Office 365 (grupa) blokuje: Teams, Word, Excel, OneDrive, tokeny licencji
- Azure Resource Manager blokuje: Azure Portal, Azure CLI, Terraform, PowerShell Az
Błąd #5 — Brak What-If przed wdrożeniem
What-If (Entra admin center → Conditional Access → Policies → What If) symuluje jak wszystkie aktywne polityki zostaną zastosowane dla konkretnego scenariusza. Możesz podać: użytkownika, aplikację, lokalizację, platformę, protokół — i zobaczyć które polityki by zadziałały.
Ważna różnica: What-If to snapshot dla jednego scenariusza. Report-Only to monitorowanie rzeczywistych logowań. Oba są potrzebne. Co ważne — What-If nie uwzględnia service dependencies. Symulacja logowania do Teams nie sprawdza polityk dla Exchange Online i SharePoint. Symuluj każdy zasób z osobna.
Workflow przed każdym wdrożeniem:
- Tryb Report-Only minimum 5 dni roboczych
- Codziennie przeglądaj Conditional Access Insights Workbook w Entra admin center
- What-If dla kont serwisowych, break-glass i użytkowników z niestandardowymi rolami
- Pilot na grupę 5-10% użytkowników przez 48h
- Pełne wdrożenie
Typowe pułapki i edge cases
Token caching — zmiany nie działają natychmiast. Gdy zmienisz politykę CA, użytkownicy z aktywnymi tokenami nie odczują zmiany do wygaśnięcia tokenu (access token: ~1h, refresh token w ciągłej sesji: do 90 dni). Jeśli usuniesz blokującą politykę w czasie incydentu, niektórzy użytkownicy mogą być blokowani jeszcze przez kilka godzin. Nie wnioskuj z braku natychmiastowego efektu że coś nie działa — poczekaj na wygaśnięcie tokenów.
Break-glass musi być wyłączony ze WSZYSTKICH polityk CA. Admini często wyłączają konto awaryjne z polityk MFA, ale zapominają o politykach lokalizacyjnych, compliance, czy device platform. Jedna polityka która obejmuje break-glass i konto przestaje działać w kryzysie. Sprawdź regularnie:
$breakGlassUPN = "breakglass@twojadomena.pl"
$bgUser = Get-MgUser -Filter "userPrincipalName eq '$breakGlassUPN'"
$activePolicies = Get-MgIdentityConditionalAccessPolicy -All | Where-Object { $_.State -eq "enabled" }
$bgExposedPolicies = $activePolicies | Where-Object {
$_.Conditions.Users.ExcludeUsers -notcontains $bgUser.Id -and
($_.Conditions.Users.IncludeUsers -contains "All" -or $_.Conditions.Users.IncludeGroups.Count -gt 0)
}
if ($bgExposedPolicies) {
Write-Warning "Break-glass NIE jest wyłączony z $($bgExposedPolicies.Count) aktywnych polityk!"
$bgExposedPolicies | Select-Object DisplayName, State | Format-Table
}
Workload identities (service principals) nie podlegają standardowym CA. Polityki CA dotyczą użytkowników. Service principale, Managed Identity, aplikacje — wymagają osobnych "Workload identity policies" w Entra (dostępnych od Entra P2). Wiele organizacji zostawia service principale bez żadnych ograniczeń lokalizacyjnych czy IP.
Office 2013 i nieaktualne Office 2016 (poniżej build 16.0.7167) korzystają z legacy auth bez możliwości przełączenia na nowoczesne uwierzytelnianie. Przed blokowaniem legacy auth sprawdź wersje Office w parku maszynowym przez telemetrię M365 Apps lub Configuration Manager.
Propagacja zmian CA zajmuje ~5 minut do wszystkich datacenter Microsoft. Jeśli zmiana jest błędna, masz ~5 minut zanim problem dotrze do wszystkich użytkowników. Zawsze wprowadzaj zmiany CA poza godzinami pracy, najlepiej z osobą gotową do cofnięcia w razie problemów.
Jak my to rozwiązujemy w Evolit
W Evolit Conditional Access wdrażamy zawsze razem z zarządzaniem urządzeniami przez Intune. Używamy Nexmy do automatyzacji onboardingu nowych pracowników — gdy dział HR zatwierdza wniosek o dostęp, system automatycznie tworzy konto, przypisuje profil Autopilot i inicjuje enrollment urządzenia w Intune. Dzięki temu urządzenie trafia do stanu "compliant" zanim użytkownik wykona pierwsze logowanie, co eliminuje klasyczny problem jajka i kury przy politykach wymagających zgodności.
Nexma obsługuje też wnioski o dostęp do zasobów M365 — zamiast ręcznie zarządzać wykluczeniami z polityk CA dla poszczególnych użytkowników, dostęp warunkowy jest obsługiwany przez członkostwo w grupach, które Nexma zarządza automatycznie na podstawie zatwierdzonych wniosków. Alternatywnie można to samo osiągnąć przez Privileged Identity Management (PIM) w Entra, ale wymaga to licencji Entra ID P2 i ręcznej konfiguracji każdej roli. Więcej o automatyzacji onboardingu urządzeń na nexma.app.
Podsumowanie
- Conditional Access ocenia wszystkie polityki równolegle — nie ma priorytetu ani kolejności; jeden niespełniony warunek blokuje dostęp
- Polityka "All cloud apps + require compliant device" musi wyłączać AppId Intune enrollment — inaczej nowe urządzenia wpadają w pętlę niemożliwą do przerwania
- Legacy authentication nie obsługuje CA ani MFA — blokuj go osobną polityką, poprzedzoną minimum 2 tygodniami w Report-Only
- IPv6 jest niewidoczne dla Named Locations i trafia do "unknown location" — przejście na warunek "compliant device" zamiast geolokalizacji IP rozwiązuje problem trwale
- What-If nie zastępuje Report-Only i nie uwzględnia service dependencies — zawsze testuj logowanie do każdego zasobu z osobna