EvolitBlogKontakt

Privileged Identity Management w Microsoft Entra ID — pułapki, opóźnienia i luki bezpieczeństwa

Domyślna konfiguracja PIM ma trzy poważne dziury: opcja 'Require MFA on activation' nie wymusza re-auth przy aktywnym tokenie, aktywacja przez PIM for Groups w SharePoint czeka nawet 24 godziny, a błędny workflow zatwierdzeń może zablokować dostęp do całego tenanta. Artykuł pokazuje jak naprawić każdy z tych problemów i jak audytować aktywacje przez PowerShell.

Privileged Identity Management w Microsoft Entra ID — pułapki, opóźnienia i luki bezpieczeństwa, które mogą cię zaskoczyć

TL;DR: PIM w Entra ID to standard dla zarządzania dostępem uprzywilejowanym, ale wdrożenie "na domyślnych ustawieniach" zostawia otwarte dziury — od ominięcia MFA przez skradzione tokeny AITM, po ryzyko całkowitego lockouta tenanta. W tym artykule znajdziesz konkretne konfiguracje, skrypty PowerShell do audytu oraz listę edge case'ów, które mogą cię boleśnie zaskoczyć w produkcji.


Problem

Każdy admin, który wdrożył PIM i uznał temat za zamknięty, prędzej czy później dostaje zgłoszenie: "Aktywowałem rolę, ale nadal nie mam dostępu do SharePoint". Albo gorszy scenariusz — dział bezpieczeństwa pyta, dlaczego ktoś aktywował Global Administratora o 3 w nocy z adresu IP w Rumunii, mimo że MFA było wymagane. PIM nie jest srebrną kulą — to narzędzie, które działa dokładnie tak, jak je skonfigurowano, a domyślna konfiguracja ma poważne luki.

Codzienne życie z PIM wygląda tak: użytkownicy dzwonią, że aktywowali rolę, czekają pół godziny i dalej nie mogą wejść do centrum administracyjnego Exchange. Helpdesk otwiera ticket, ktoś sprawdza w portalu — rola aktywna, wszystko zielone. Reset sesji, nowe logowanie — działa. Dlaczego? Token cacheowanie po stronie Exchange i SharePoint powoduje opóźnienie od 15 do 40 minut dla bezpośrednich przypisań ról PIM. Użytkownicy o tym nie wiedzą, dokumentacja Microsoftu to wspomina małym drukiem, a w każdej organizacji trzeba się na to natknąć samemu.

Drugi problem, który pojawia się po kilku miesiącach: chaos w przypisaniach eligible. Ktoś dostał rolę na projekt, projekt się skończył, rola została. Ktoś inny dostał rolę "tymczasowo" jako permanent active, bo "tak było szybciej". Po roku masz kilkadziesiąt przypisań, z czego połowa jest nieaktualna, a kilka osób ma permanent active na rolach Tier-0, co zupełnie wypacza sens PIM. Bez regularnego audytu skryptami przypisania puchną i nikt nie ma pełnego obrazu stanu.


Dlaczego tak się dzieje

Opóźnienia tokenów i replikacji są efektem architektury rozproszonych usług Microsoft 365. Gdy PIM aktywuje przypisanie roli, informacja trafia do Entra ID w czasie rzeczywistym — ale Exchange Online i SharePoint Online utrzymują własne cache uprawnień. Token dostępowy użytkownika, który był wystawiony przed aktywacją, nadal nie zawiera nowego claim z rolą. Exchange respektuje ten stan przez 15–40 minut zanim wymusi odświeżenie. SharePoint i OneDrive działają podobnie dla bezpośrednich przypisań ról, ale gdy korzystasz z PIM dla Grup (a nie bezpośrednich ról Entra), opóźnienie replikacji członkostwa w grupie do SharePoint wynosi nawet 24 godziny — Microsoft potwierdził to w artykule KB. To fundamentalna różnica: przypisujesz przez PIM for Groups i liczysz na natychmiastowy efekt w SharePoint? Nie tym razem.

Luka MFA w PIM wynika z tego, jak Entra ID weryfikuje spełnienie wymagania wieloskładnikowego. Ustawienie "On activation, require MFA" w polityce roli PIM sprawdza wyłącznie, czy w bieżącej sesji istnieje claim MFA — nie wymaga nowej weryfikacji. Jeśli użytkownik zalogował się rano z MFA, jego token sesyjny zawiera ten claim przez cały dzień. Atakujący z tokenem skradzionym przez adversary-in-the-middle (AITM) — np. przez phishing z frameworkiem Evilginx — ma aktywną sesję z ważnym claimem MFA i może aktywować rolę uprzywilejowaną bez żadnej dodatkowej weryfikacji. To nie jest teoretyczny scenariusz: AiTM phishing targeting M365 jest obecnie jednym z najczęściej używanych wektorów przejęcia kont administracyjnych.

Refresh tokeny to osobny problem. Atakujący, który zdobył refresh token użytkownika z eligible assignment, może nie działać natychmiast. Refresh tokeny w M365 mogą być ważne nawet 90 dni. Wystarczy, że atakujący poczeka, aż ofiara sama aktywuje rolę w ramach normalnej pracy — w tym momencie może użyć skradzionego tokenu do uzyskania access tokenu z podwyższonymi uprawnieniami i działać równolegle ze swoją ofiarą. PIM nie wykryje podwójnego użycia tokenu samo z siebie.


Rozwiązanie krok po kroku

Krok 1: Audyt stanu obecnego — co masz w tenantcie

Zanim cokolwiek zmienisz, musisz wiedzieć co masz. Poniższy skrypt wyciąga wszystkie eligible assignments z instancji aktywnych i wyświetla je w tabeli:

# Lista wszystkich eligible assignments PIM
Connect-MgGraph -Scopes "RoleManagement.Read.Directory", "Directory.Read.All"
$eligibleAssignments = Get-MgRoleManagementDirectoryRoleEligibilityScheduleInstance -All -ExpandProperty 'principal,roleDefinition'
$eligibleAssignments | Select-Object `
    @{N="Użytkownik";E={$_.Principal.AdditionalProperties.displayName}},
    @{N="Rola";E={$_.RoleDefinition.DisplayName}},
    @{N="Koniec";E={$_.EndDateTime}},
    @{N="Typ";E={$_.MemberType}} |
  Format-Table -AutoSize

Szukaj: przypisań bez daty wygaśnięcia (pole Koniec puste), duplikatów tej samej roli dla jednej osoby, ról Tier-0 (Global Administrator, Privileged Role Administrator, Security Administrator) z przypisaniem Permanent. Każde permanent active przypisanie na roli Tier-0, które nie należy do konta break glass, jest błędem konfiguracyjnym.

Drugi skrypt — kto aktywował co i z jakiego adresu IP w ostatnich 30 dniach:

# Audyt aktywacji ról PIM z ostatnich 30 dni
Connect-MgGraph -Scopes "AuditLog.Read.All", "Directory.Read.All"
$startDate = (Get-Date).AddDays(-30).ToString("yyyy-MM-ddT00:00:00Z")
Get-MgAuditLogDirectoryAudit -Filter "activityDisplayName eq 'Add member to role completed (PIM activation)' and activityDateTime ge $startDate" |
  Select-Object ActivityDateTime,
    @{N="Użytkownik";E={$_.InitiatedBy.User.UserPrincipalName}},
    @{N="Rola";E={$_.TargetResources[0].DisplayName}},
    @{N="IP";E={$_.InitiatedBy.User.IpAddress}} |
  Export-Csv -Path "pim_aktywacje_$(Get-Date -Format 'yyyyMMdd').csv" -NoTypeInformation -Encoding UTF8

Eksportuj do CSV i przejrzyj pod kątem: aktywacji poza godzinami pracy, aktywacji z nieznanych adresów IP, aktywacji ról których dany użytkownik normalnie nie używa.

Żeby zobaczyć kto ma w tej chwili aktywną podwyższoną rolę:

# Sprawdź kto ma aktywne right now elevated role
Get-MgRoleManagementDirectoryRoleAssignmentScheduleInstance -All -ExpandProperty 'principal,roleDefinition' |
  Where-Object { $_.AssignmentType -eq "Activated" } |
  Select-Object `
    @{N="Użytkownik";E={$_.Principal.AdditionalProperties.userPrincipalName}},
    @{N="Rola";E={$_.RoleDefinition.DisplayName}},
    @{N="Od";E={$_.StartDateTime}},
    @{N="Do";E={$_.EndDateTime}} |
  Format-Table -AutoSize

Krok 2: Zablokuj lukę MFA przez Authentication Context

Samo "require MFA on activation" nie wystarczy. Musisz wymusić re-autentykację niezależnie od tego, czy sesja już ma claim MFA. Realizujesz to przez Authentication Context w Conditional Access.

W portalu Entra ID przejdź do: Protection → Conditional Access → Authentication context i utwórz nowy kontekst, np. c1 z nazwą "PIM Privileged Role Activation". Następnie stwórz politykę Conditional Access:

  • Assignments → Users: All users (lub dedykowana grupa adminów)
  • Target resources → Authentication context: wybierz c1
  • Access controls → Grant: Require MFA (lub Require authentication strength → Phishing-resistant MFA)
  • Session → Sign-in frequency: Every time

Opcja "Every time" w Sign-in frequency to kluczowy element — wymusza pełne uwierzytelnienie przy każdej aktywacji roli, nie respektuje istniejącego tokenu sesyjnego. Atakujący ze skradzionym tokenem AITM nie przejdzie przez tę weryfikację, bo token nie zawiera świeżego claimu autentykacji.

Następnie w ustawieniach roli PIM (Role Settings → Activation) wybierz ten Authentication Context jako wymaganie zamiast standardowego "Require MFA".

Ważne ograniczenie: po aktywacji roli na jednym urządzeniu (np. zgodnym z Intune), ta sama aktywowana sesja jest dostępna z innego urządzenia — Entra ID nie wiąże sesji aktywowanej roli do konkretnego urządzenia. Żeby zamknąć tę lukę, potrzebujesz drugiej polityki CA targetującej bezpośrednio aplikacje zarządzane przez te role (Azure Portal, M365 Admin Center) z wymaganiem zgodności urządzenia.

Krok 3: Ustaw rozsądne limity czasu aktywacji

Dla ról Tier-0 — Global Administrator i Privileged Role Administrator — maksymalny czas aktywacji ustaw na 2–4 godziny. PIM pozwala na zakres 1–24 godzin, ale 8 czy 24 godziny dla Global Admina to proszenie się o kłopoty: skradziony token aktywowanej sesji jest użytkowalny przez cały ten czas.

Rekomendowane maksymalne czasy aktywacji:

  • Global Administrator: 2 godziny
  • Privileged Role Administrator: 2 godziny
  • Security Administrator: 4 godziny
  • Exchange Administrator: 4 godziny
  • SharePoint Administrator: 4 godziny

Krok 4: Konfiguracja break glass i zabezpieczenie przed lockoutem

Scenariusz lockouta: wszystkie konta z rolą Privileged Role Administrator i Global Administrator mają assignment eligible (nie active), do aktywacji wymagane jest zatwierdzenie przez approverów, ale lista approverów jest pusta lub wszyscy approverzy są niedostępni. Wynik: nikt nie może aktywować roli, nikt nie może zatwierdzić wniosku, tenant zablokowany.

Zapobieganie:

  1. Minimum dwa konta break glass z permanent active przypisaniem Global Administratora. Konta break glass powinny być cloud-only, bez MFA (dostęp przez fizycznie zabezpieczone hasło), monitorowane alertami na każde logowanie.
  2. W politykach PIM ról Tier-0, jeśli wymagasz zatwierdzenia — zawsze wskaż konkretnych approverów, a konta break glass dodaj jako domyślnych approverów.
  3. Regularnie testuj procedurę break glass — raz na kwartał zweryfikuj, że hasło działa i konto nie zostało zablokowane.
  4. Konta break glass muszą być wykluczone ze wszystkich polityk Conditional Access, włącznie z tą nową dla Authentication Context.

Krok 5: Rozwiąż problem opóźnień SharePoint i Exchange

Dla Exchange: po aktywacji roli użytkownicy muszą odczekać 15–40 minut i otworzyć nową sesję przeglądarki. Skrócenie czasu oczekiwania jest możliwe przez odświeżenie tokenu sesji — użytkownik może otworzyć https://aka.ms/pim/tokenrefresh bezpośrednio po aktywacji, co wymusza wymianę tokenu sesyjnego i skraca oczekiwanie do kilku minut.

Dla SharePoint z PIM dla Grup: opóźnienie do 24 godzin to standard, nie wyjątek. Masz dwie ścieżki:

  • Opcja A (zalecana): Nie używaj PIM dla Grup do zarządzania dostępem do SharePoint. Przypisuj uprawnienia bezpośrednio przez PIM for Microsoft Entra roles. Opóźnienie spada do 15–40 minut.
  • Opcja B: Jeśli musisz używać grup — dodaj użytkownika do grupy jako stały członek, a następnie zrób grupę eligible przez PIM for Groups wyłącznie dla uprawnień directory role. SharePoint widzi statyczne członkostwo, PIM kontroluje uprawnienia katalogowe.

Krok 6: Monitoruj ciągle, nie jednorazowo

PIM bez alertowania to połowiczne rozwiązanie. Minimalne alerty, które musisz mieć w Microsoft Sentinel lub Defender XDR:

  • Aktywacja roli Global Administrator lub Privileged Role Administrator — alert natychmiastowy, każdorazowo
  • Aktywacja roli z adresu IP z innego kraju niż zwykła lokalizacja użytkownika
  • Więcej niż dwie aktywacje ról przez jednego użytkownika w ciągu 30 minut
  • Logowanie kontem break glass — alert krytyczny z eskalacją do osoby odpowiedzialnej za bezpieczeństwo

Typowe pułapki i edge cases

Pułapka 1: Okno 10-minutowe przy wielu aktywacjach

Jeśli użytkownik aktywuje pierwszą rolę przez Authentication Context (przechodząc pełną re-autentykację), a następnie w ciągu 10 minut aktywuje drugą eligible rolę — Entra ID nie wymaga ponownej weryfikacji dla drugiej aktywacji. System traktuje to jako tę samą sesję uwierzytelnienia. Okno 10 minut dotyczy wszystkich typów ról: Microsoft Entra roles, Azure resource roles i PIM for Groups. Atakujący z dostępem do sesji w tym oknie może aktywować kolejne role bez przeszkód. Mitygacja: skróć listę eligible assignments do absolutnego minimum i monitoruj aktywacje wielu ról w krótkim czasie.

Pułapka 2: PIM dla Grup i niezamierzone uprawnienia Global Admina

PIM dla Grup pozwala nadać eligible membership do grupy. Jeśli ta grupa — bezpośrednio lub przez zagnieżdżone grupy — jest przypisana do roli Global Administrator, aktywacja membershipu daje efektywnie Global Admina. Problem: łatwo przeoczyć, do czego przypisana jest dana grupa, szczególnie w tenantach z długą historią i setkami grup. Każda zmiana przypisania grupy do ról Entra ID powinna być procesem zatwierdzanym. Regularnie uruchamiaj skrypt audytowy z Kroku 1 i dla każdej grupy z eligible assignment sprawdzaj jej role w portalu Entra ID.

Pułapka 3: Refresh token jako wektor ataku czasowego

Użytkownik z eligible assignment aktywuje rolę w piątek. Atakujący ze skradzionym refresh tokenem (ważnym przez 90 dni) czeka właśnie na taki moment. W momencie aktywacji może użyć refresh tokenu, wymienić go na access token z uprawnieniami aktywnej roli i działać w ramach okna aktywacji — 2, 4 lub 8 godzin. PIM log aktywacji nie rozróżni dwóch urządzeń korzystających z tego samego tokenu. Mitygacja: wymuszaj Continuous Access Evaluation (CAE), monitoruj logowania z nowych urządzeń/lokalizacji dla kont z eligible assignments.

Pułapka 4: Permanent active "na chwilę"

"Dałem mu permanent active bo było pilne, potem cofniemy" — to zdanie padło w każdej organizacji. Bez procesu regularnego audytu te "tymczasowe" przypisania zostają miesiącami. Permanent active assignment omija cały mechanizm PIM: brak justyfikacji, brak zatwierdzenia, brak ograniczenia czasowego, brak wymogu re-auth. Dla ról Tier-0 ustaw w polityce PIM zakaz permanent active assignments (Role Settings → Assignment → Allow permanent active assignment → No). Konta break glass dodaj ręcznie jako wyjątek przed zmianą polityki.

Pułapka 5: Brak alertów = brak bezpieczeństwa

PIM bez zintegrowanego monitoringu daje fałszywe poczucie bezpieczeństwa. Dane o aktywacjach są dostępne przez 30 dni w logach Entra ID, ale nikt ich aktywnie nie przegląda. Zautomatyzuj eksport logów do CSV (skrypt z Kroku 1) jako zaplanowane zadanie, i zintegruj z SIEM jeśli masz. Bez alertowania w czasie rzeczywistym na aktywację Global Admina o 3 w nocy z nieznanego IP — nie masz bezpieczeństwa, tylko jego pozory.


Podsumowanie

  • PIM "require MFA" to za mało — bez Authentication Context z "Sign-in frequency: Every time" atakujący z tokenem AITM aktywuje privileged role bez żadnej weryfikacji. To luka architektoniczna, nie błąd konfiguracyjny.
  • Opóźnienia są dokumentowane: 15–40 minut dla bezpośrednich ról (token caching Exchange/SharePoint), do 24 godzin dla PIM for Groups → SharePoint/OneDrive. Wybór metody przypisania ma realny wpływ operacyjny. Użyj https://aka.ms/pim/tokenrefresh by przyspieszyć odświeżenie sesji.
  • Lockout tenanta jest możliwy gdy wszystkie konta Tier-0 mają eligible assignments z wymaganym zatwierdzeniem bez skonfigurowanych approverów. Konta break glass z permanent active Global Admin to zabezpieczenie krytyczne, nie opcjonalne.
  • Audyt PowerShell to podstawa higieny: lista eligible assignments, logi aktywacji z 30 dni, aktualnie aktywne elevated sessions — trzy skrypty do regularnego uruchamiania.
  • PIM for Groups niesie ryzyko eskalacji uprawnień: każda zmiana przypisania grupy do ról Entra ID musi być auditowana — inadvertent Global Admin przez zagnieżdżone grupy to realny scenariusz w tenantach z długą historią.