MFA a w szczególności EAM

  MFA Overhaul

EntraID przechodzi obecnie duże zmiany w kwestii MFA – w końcu, po ~15 latach zniknął ostatni bastion Azure v1 – czyli konfiguracja per-user MFA. Teraz został zintegrowany z nowym interfejsem. ale największe zmiany dzieją się pod spodem – w końcu starają się uporządkować ten bałagan, w którym niewiele osób mogło się połapać – MFA Server, SSPR, per-user MFA i Authentication Methods – 4 różne twarze, trzeba sporo się naczytać i przetestować, żeby zrozumieć gdzie te mechanizmy się przecinają a gdzie są oddzielnymi bytami.

W KOŃCU! kiedyś trzeba było ten bałagan posprzątać.

Authentication Methods daje dużo bogatsze możliwości konfiguracji i zarządzania MFA, które jak nie trzeba nikogo przekonywać, stało się kluczowym elementem zabezpieczenia uwierzytelnienia użytkowników.

Pojawiła się również obsługa EAM – Extended Authentication Method, w maju 2o24, która pozwala na prawidłową integrację zewnętrznych providerów MFA z EntraID. Do tej pory trzeba było korzystać z obejść, tzw. Custom Controls, które powodowały, że informacja o dostarczeniu drugiego czynnika uwierzytelnienia nie była prawidłowo rejestrowana i przekazywana do tokena. powoduje to błędne workflow uwierzytelnienia – w sumie to osobiście nie obserwowałem problemów i wszystko prawidłowo było wykrywane, ale na obrazkach ładnie to wyjaśniają, to im wierzę. nie miałem cierpliwości samemu testować i szukać scenariuszy gdzie to przestaje działać. Z praktyki, moje odczucia są zgoła odwrotne…

Extended Authentication Methods

EAM jest w preview – co jest w Chmurze nową normą – i warto wiedzieć, że póki co więcej psuje niż naprawia. Może dodam, że moje testy były tylko z Duo Mobile, które chwali się tym wsparciem jako jedni z pierwszych i ścisłą współpracą z Microsoft, choć zachowania, które opiszę wydają mi się związane z wewnętrzną obsługą EAM w ramach EntraID a nie z jakimś konkretnym dostawcą.

  • EAM jest niewidzialny. w zasadzie ten problem jest kluczowy i chyba z niego wynika reszta problemów. co znaczy, że niewidzialny? konto skonfigurowane wyłącznie z EAM jest raportowane jako pozbawione MFA.
  • nie da się go w związku z tym ustawić jako 'default’ – bo jest niewidzialny

  • to rozbija workflow uwierzytelnienia i teraz nie da się pozbyć niektórych ekranów MFA,
  • nie działa opcja 'exclude guest and other external accounts’ w Conditional Access. jeśli włączy się tą opcję, konto zewnętrzne dostanie prompt – właśnie z żądaniem podania 2FA EAM. obejściem problemu jest dodanie danego konta gościa bezpośrednio do listy wyjątków – wtedy prompt faktycznie znika. ja szczęśliwie miałem tylko kilka takich kont i statyczną listę, więc dodałem je z ręki – ale dla większych środowisk z dynamicznie zmieniającymi się dostępami to dodatkowy problem. skreślam bo to jednak nie prawda – po ponownej weryfikacji znalazłem błąd w konfiguracji to powodował taki efekt.

 

 

EAM, pomimo że opisywany jako zwiększający integrację, de facto jest 'obok’, drugi w kolejce – niby jest, ale go nie ma, więc za wszelki wypadek wrzućmy go zawsze na końcu. rozbija workflow uwierzytelnienia i ogólnie sprawia problemy. powiedziałbym, że to nie preview a wczesna beta.

Dodatkowo, w zasadzie uniemożliwia tworzenie bardziej złożonych workflow warunkowych – np. 'jeśli dostajesz się do tej aplikacji to użyj EAM a jak do innej to MS MFA’, ponieważ CA nie posiada takiej opcji. Można to było zrobić kiedy używało się starej metody – Custom Controls – ponieważ wtedy Conditional Access widzi ją:

Czyli decydując się na EAM, to trochę decyzja wszystko-albo-nic. Cała logika Conditional Access powinna zostać przeniesiona do zewnętrznego dostawcy – co w moim przypadku nie wchodzi w rachubę, ale to temat na inną rozmową.

Mam nadzieję, że Microsoft zajmie się sprawą i naprawi…

Wsparcie wymaga wsparcia

dodam na koniec, że wsparcie Microsoft z roku na rok coraz bardziej sięga dna. założyłem ticket, żeby to zgłosić i przekazać informacje: już ponad 2 miesiące, 4 różnych konsultantów, przekazywany z teamu to teamu, z każdym po kolei omawiane to samo, zadawane te same pytania, dwie zdalne sesje na których pokazywałem pełne step-by-step, tylko po to, żeby następny mnie zapytał na czym polega błąd. i nie chodzi tylko o to zgłoszenie – tak wyglądają wszystkie zgłoszenia w ciągu ostatnich kilku miesięcy. osoby ze wsparcia nie czytają historii, nie rozumieją co się do nich mówi.

rekordem był ziom, który się ocknął po miesiącu zwlekania i durnych maili w stylu 'sprawa jest analizowana’. W końcu wysłał mi 4 maile w ciągu 2o min, z linkami do różnych artykułów, po czym przysłał piątego maila… w którym zapytał na czym polega błąd, który zgłaszam O_o’ . nic dodać nic ująć: dno, żenada i muł. umiejętności komunikacji i czytania ze zrozumieniem to okazuje się zbyt wielkie oczekiwania co do obecnego poziomu wsparcia.

myślę wtedy, że powinni jeszcze szybciej i więcej inwestować w AI, bo na prawdę wolałbym być obsługiwany przez chatGPT….

eN.

raportowanie kont hybrydowych

Raportowanie kont (hybrydowych)

raporty dotyczące kont i skrzynek są niezbędne podczas wielu różnych sytuacji – czy to codzienna administracja, porządki czy przygotowania do migracji. problem polega na tym, że sposób w jaki prezentowane są dane przez portale jest nieznośny – informacje rozbite pomiędzy usługami, ograniczone filtry i widoki, niektóre informacje ukryte gdzieś i niedostępne przez GUI. dla tego skrypty raportujące pojawiały się tutaj nie raz i teraz pracuję nad kolejnym 'mini-projektem’ który ma proces usprawnić. ponieważ dojrzał już do jakiejś sensownie działającej wersji, trochę informacji i ciekawostek.

scenariuszy jest zaiste wiele:

  • aktywność i nieużywane konta
  • informacje na temat licencji użytkowników
  • status MFA
  • informacje o skrzykach exchange – zajętość, status, aktywność
  • przygotowanie do synchronizacji
  • wszelkiego rodzaju migracje – pomiędzy tenantami, onprem-to-Cloud etc.

o ile zadanie dotyczy pojedynczego systemu, można sobie poradzić standardowymi narzędziami… zazwyczaj. ale kiedy trzeba popatrzeć holistycznie na 'konto’ jako całość – zaczyna się robić trudniej.

Skrypty raportujące

same skrypty dostępne są na github ale warto wiedzieć jaka jest ogólna logika.

najwygodniejszym formatem do obróbki danych jest CSV z dwóch powodów.. czy też raczej sumy dwóch powodów – PowerShell świetnie sobie z tym formatem radzi oraz to, że Microsoft Excel jest najbardziej rozpowszechnionym narzędziem do prezentowania danych tabelarycznych – a w końcu o to nam chodzi, żeby zbudować zestawienie danych, czyli tablę. dość złożoną, ale nadal tylko tabelę.

o ile przygotowanie eksportu z poszczególnych systemów jest stosunkowo proste, o tyle największym problemem jest ich połączenie. to, czego PowerShell nie posiada, to zmienna typu 'tabela’. oh, nie chodzi o zwykłą tablicę, hashtable czy podobną zmienną, chodzi mi bardziej o coś bliższego tabeli w rozumieniu bazy danych – tak, żeby można było wyszukać informację/rekord, zrobić aktualizację, powiązać ze sobą rekordy. pisałem już kilkukrotnie różne synchronizatory i to, ile problemów jest z takim systemem wie tylko ten, kto kiedyś spróbował coś takiego napisać – wyjątki, duplikaty, łączenie rekordów… o ile połączenie dwóch źródeł jest trywialne – przy trzech i więcej zaczyna się prawdziwe wyzwanie. dla tego wzorem dla mnie była lekcja z MIIS (Microsoft Identity Integration Server) na którym zbudowany został AD Sync. nie żeby moje skrypty były choćby blisko, ale zrozumienie metaverse (tego z MIIS, nie w tym dzisiejszym rozumieniu) jest kluczowe do napisania sensownej synchronizacji.

logika skryptów jest w założeniu prosta:

  • zrobić zrzut danych z EntraID do csv
  • zrobić zrzut danych z Active Directory do csv
  • zrobić zrzut danych z Exchange Online do csv
  • połączyć dane i skonwertować do xlsx gdzie już ręcznie można zacząć bawić się wynikami

jak już wspomniałem, to ten ostatni krok jest największym wyzwaniem – żeby pisać kod tak, aby mógł potem być użyty przy innych podobnych zadaniach, gdzie jest potrzeba połączenia danych z kilku źródeł. stąd w skrypcie join-eNReportHybridUsersInfo pojawiają się trzy funkcje:

  • search-MetaverseData
  • add-MetaverseData
  • update-MetaverseData

kiedy mamy już zrzut z poszczególnych systemów w postaci CSV (nie muszą być wszystkie trzy, wystarczą dowolne dwa – EID/EXO/AD), 'join’ sprawdza czy da się dane jakoś powiązać.

ostatnio mam sporo sytuacji gdzie nie ma wdrożonej synchronizacji (Cloud Sync) albo jeszcze gorzej – jest częściowa. środowiska w których część kont jest synchronizowana, część z jakiegoś powodu nie, ale mają … lub nie mają swojego bliźniaka w EID. niestety ale z mojego doświadczenia to bałagan jest normą a porządek wyjątkiem – więc znalezienie par nie jest trywialne i często wymaga poszukiwania na podstawie różnych atrybutów – czasem to, co jest w stanie powiązać dane to UPN, email, a czasem displayname. nie można liczyć na żaden konkretny atrybut? skrypt pozwala spróbować powiązać na dowolnym istniejącym. i chociaż funkcja nadal jest dość prymitywna to działa świetnie i pomaga mi szybko odpowiedzieć na bardzo wiele pytań… :

  • wyłapać konta, które dawno powinny być zablokowane
  • dziwne skrzynki pocztowe o których nawet diabeł zapomniał
  • konta bez skonfigurowanego MFA, żeby nie zabić firmy po konfiguracji Conditional Access
  • wszystkie panie, które pomiędzy kontem AD a EID zdążyły zmienić nazwiska
  • … i masę innych dziwnych sytuacji, literówek i wszelakiego innego bałaganu, z którego da się wyłowić obraz, jeśli się na niego spojrzy z odpowiedniej perspektywy

co do samych operacji na CSV, funkcje do ich obsługi to najczęściej wykorzystywane funkcje z biblioteki eNLib:

load-CSV

  • automatyczne wykrywanie znaku – ratuje jak się pracuje w środowiskach z różnymi ustawieniami regionalnymi
  • możliwość wymuszenia nagłówka w skrypcie, żeby nie zassać jakiegoś przypadkowego śmietnika
  • możliwość dodawania prefiksów, suffiksów czy podania tabeli transformacji nazw kolumn podczas importu

convert-CSV2XLS

  • konwersja do xlsx
  • utworzenie tabeli
  • automatyczne uruchomienie

..i kilka innych przydatnych zabiegów, które czynią pracę z csv prostą i przyjemną.

eN.

 

 

 

MS Tech summit 2o24

MS Tech Summit to jedna z niewielu w Polsce konferencji poświęconych w pełni na technologiom Microsoft. Już 6.06 Online oraz 7.06 fizycznie, w Warszawie w ADN Centrum Konferencyjne (Browary Warszawskie) zapraszam na kolejną edycję MS Tech Summit. Organizatorzy oraz Członkowie Rady Programowej przygotowali dla Was ponad 50 wystąpień z obszaru technologii Microsoft, 5 ścieżek tematycznych, networking, afterparty i wiele więcej…

Niestety nie mogę pojawić fizycznie, czego żałuję, ale dokładam swoją prezentację dotyczącą nieaktywnych kont w AD i Entra ID. W założeniu prezentacja będzie miała część teoretyczną i praktyczną tak, żeby przedstawić temat całościowo.

Do 06.06.2024, ze specjalnym kodem rabatowym od Rady Programowej: MSTS24SP20 możecie kupić bilet Standard lub PRO 20% taniej. Więcej informacji i rejestracja na: https://mstechsummit.pl/

eN.

KB5034441 0x80070643 fix

Microsoft zapowiedział, że nie wyda poprawki do poprawki KB5034441, która w większości wypadków wysypuje się błędem 0x80070643. w takim razie pół-automatyczne rozwiązanie do zassania tutaj, a poniżej informacje o co chodzi i jak to działa.

czemu to się sypie

niby opis naprawy można znaleźć na stronie Microsoft. ale po pierwsze, nie każdy jest na tyle odważny, żeby grzebać na żywych partycjach. po drugie w całym tym opisie brakuje bardzo ważnej informacji: potrzebny jest plik w winRE. teoretycznie wykonanie komendy 'reagentc /disable’ powinno skopiować plik winRE, ale tego nie robi. a więc po zmianie wielkości partycji, próbujemy włączyć… i nie działa.

w związku z tym ogólne kroki do wykonania to:

  1. przygotowanie pliku winRM.wim i umieszczenie go w katalogu 'recovery’.
  2. wyłaczenie winRM
  3. znalezienie partycji recovery
  4. zmniejszenie partycji systemowej, żeby zrobić miejsce na winRM
  5. zwiększenie partycji recovery
  6. właczenie winRM

Skrypt

na github

skrypt wymaga uruchomienia jako administrator. co robi:

  • pobiera plik winRM.wim do katalogu 'recovery’
  • próbuje znaleźć partycję recovery i jak mu się uda:
  • przygotowuje plik wsadowy dla diskpart
  • wypluwa instrukcje do robić dalej

jeśli skrypt się nie wysypał – to prawie na pewno wszystko jest ok. jeśli się wysypał przed końcem – cóż, może masz pecha i Twoja konfiguracja jest niestandardowa.

nie działa w 1oo% oczywiście – dla tego nie jest w pełni automatyczny. są różne dziwne scenariusze, ale w większości, na komputerach firmowych sytuacja jest dość prosta. skrypt odpaliłem na wielu serwerach i stacjach roboczych i skuteczność jest na poziomie 95%, oszczędzając mojemu zespołowi godzin pracy i dziargania w diskpart.

Przypadki, które sprawiały problemy to:

  • kilka przypadków z bitlocker, dziwnym układem partycji
  • trudne do wyjaśnienia przypadki w których winRE nie było włączone a patch i tak chciał się instalować. partycja recovery była w 'dziwnym’ stanie [chyba ktoś przy niej wcześniej grzebał (; ]
  • w kilku przypadkach, kiedy zabrało miejsca na dysku systemowym, chociaż było go dużo – pomogła defragmentacja.

w sumie nie dziwię się, że Microsoft nie wydaje automatu, bo nie chce potem odpowiadać za utracone dane. i ja również dodam: USE ON YOUR OWN RISK.

powodzenia

eN.

Locked Shield 2o24

Po raz trzeci miałem zaszczyt uczestniczyć w największych ćwiczeniach (zawodach?) niebezpieczeństwa, organizowanych przez CCDCOE (NATO Cooperative Cyber Defence Centre of Excellence) i po raz kolejny skończyliśmy na podium. przez zamieszanie z punktami ciężko powiedzieć czy na 1 czy na 2 miejscu ale jedno jest pewne – co roku Polska drużyna jest wśród najlepszych!

od zeszłego roku dodatkowym celem ćwiczenia jest wymiana wiedzy i nauka koordynacji zadań między krajami, występuje się w parach – w tym roku walczyliśmy ramię-w-ramię z Finami.

i choć ćwiczenia odbywały się w strefie czasowej CET, co oznaczało dla mnie przestawienie dnia i olbrzymi wysiłek – nie żałuję. to świetne doświadczenie i jestem dumny z naszego wyniku. „dywizja AD” (; trzymała się świetnie przez cały czas pozostając all-green w zasadzie od początku do końca. trochę nas postraszyli w ostatniej fazie, ale daliśmy radę i to rozwiązać szybko i sprawnie.

szczególne podziękowania dla naszego leadera – Grześka i pozostałych członków teamu AD – Roberta, Tomka i Marka.

eN.

nieaktywni użytkownicy EntraID

w AD sprawa była prosta… no może nie tak bardzo prosta, bo historia atrybutów lastLogon i lastLogonTimeStamp też ma swoje drugie dno, ale od wielu lat wiadomo jak aktywność użytkownika zbadać… i pojawiła się Chmura i hybryda, która całość skomplikowała…

przez wiele lat nie było prostego sposobu na zapytanie 'wyszukaj nieużywane konta’, ponieważ nie było w EntraID odpowiednika lastLogonTimeStamp i trzeba było każdy system badać na dziwne sposoby. wedle Microsoft, należało odpytać logu audytu, który miał standardowo 3o dni.. wielce przydatne. nie drążąc dalej historii, od kwietnia 2o2o GraphAPI produkcyjnie obsługuje ’signInActivity’ – w końcu atrybut/zasób, który jest automatycznie aktualizowany ostatnią datą uwierzytelnienia.

uwaga. atrybut może mieć do 6h opóźnienia w aktualizacji

jak odpytać

kilka przykładów jak przygotować sobie raport, korzystając z commandletów Microsoft.Graph

wyświetlenie wszystkich użytkowników, wraz z ich mailem oraz datą ostatniej aktywności:

Get-MgUser -Property displayname,mail,signInActivity -all|
    select displayname,mail,@{L='signin';E={$_.SignInActivity.LastSignInDateTime}}

korzystanie z commandletów graphowych nie jest przyjemne i wymaga cierpliwości. większość operacji, ze względu na optymalizację, nie wyświetla prawie żadnych atrybutów – dla tego trzeba wyraźnie zaznaczyć w 'property’ czego będzie się potrzebowało.

trochę bardziej złożony raport, wyrzucany na csv, zawierający dodatkowo informacje o licencjach:

Get-MgUser -Property id,displayname,givenname,surname,accountenabled,userprincipalname,mail,signInActivity,userType -all|
    select id,displayname,givenname,surname,accountenabled,userprincipalname,userType,mail,`
    @{L='signin';E={$_.SignInActivity.LastSignInDateTime}},`
    @{L='licenses';E={(Get-MgUserLicenseDetail -UserId $_.id).SkuPartNumber -join ','}}|
        export-csv -nti c:\temp\EntraUsers.csv -Encoding utf8

co mnie denerwuje w tych commandletach, to że nie są przyjmują w prosty sposób obiektów, np to nie zadziała:

get-mgUser -all|get-mgUserLicenseDetail

to było abecadło PS, ale wzięli się za to developerzy webowi i taki efekt… trzeba też zawsze pamiętać o dodaniu 'all’ bo standardowo jest paging na 1oo obiektów.

i jeszcze drobny przykład na użycie filtra. nie jest co prawda widoczne w helpie od get-mgUser ale to jest filtr OData – z którego ogólnie korzysta cały Graph. tutaj prosty filtr, żeby wyświetlić tylko konta typu guest. nie podjąłem się filtrowania po dacie w OData bo to by kosztowało mnie za dużo czasu na rozkminkę – operacje na datach nie są oczywiste, a PowerShell sobie świetnie z tym radzi:

Get-MgUser -Filter "userType eq 'guest'" -Property displayname,usertype,signinactivity|
    ?{$_.SignInActivity.LastSignInDateTime -lt (get-date).AddMonths(-2)}|
    select displayname,usertype,@{L='activity';E={($_|select -ExpandProperty SignInActivity).LastSignInDateTime}}

connect

oczywiście żeby korzystać z commandletów graph trzeba się połaczyć z odpowiednim zakresem (scope). jeśli to jest dla ciebie nadal problemem to koniecznie wrzuć do bookmarków ten link, który opisuje jak użyć Find-MgGraphCommand żeby sprawdzić niezbędne zakresy.

jak Microsoft potrafi strzelić klientom w kolano

ciekawostką jest, że żeby być w stanie odczytać ten atrybut, trzeba mieć minimum EntraID P1 – inaczej wyskoczy błąd:

Get-MgUser_List: Neither tenant is B2C or tenant doesn't have premium license

Status: 403 (Forbidden)
ErrorCode: Authentication_RequestFromNonPremiumTenantOrB2CTenant

…dlaczego? nie chodzi mi o techniczne wyjaśnienie, ale to krzyk w stronę MS – dla czego tak podstawowa funkcjonalność, jak wyszukiwanie nieaktywnych kont, wymaga dodatkowej licencji?

eN.

’touch me’ – nieoczywista oczywistość

czemu tokeny FIDO chcą żeby je dotknąć?

ktoś zadał mi takie pytanie i w sumie ja też sobie je kiedyś zadawałem…

kiedyś

jako dinozaur, bardziej naturalnym [czy też tradycyjnym] sposobem uwierzytelnienia są dla mnie karty karty inteligentne. nie do końca rozumiem, czemu nigdy nie zdobyły popularności na rynku małych i średnich firm oraz prywatnie:

  • są super tanie!! pojedyncza karta to koszt ok. $1-2
  • łatwo dostępna technologia – przez długi czas dużo laptopów wychodziło z wbudowanymi czytnikami
  • fajnie integrowały się z systemami bezpieczeństwa dostępu fizycznego – ta sama karta do bramki przy wejściu i potem odpowiednie poziomy dostępu do pomieszczeń.
  • ta sama karta do logowania do systemu co do drzwi

taki klasyczny 'żarcik edukacyjny’ w niektórych firmach w jakich pracowałem, to szybka podmiana pulpitu na jakieś złośliwe zdjęcie, albo wysłanie maila do całego teamu 'stawiam wszystkim pączki!’, kiedy ktoś odszedł od kompa nie blokując pulpitu… dodatkowa zaleta smartcard jest taka, że kiedy osoba odchodzi od komputera – np. do toalety – musi użyć tej samej karty, a wyjmując ją z kompa automatycznie blokowana jest stacja.

a jednak to tokeny FIDO2, ze wszystkimi swoimi wadami, od ceny zaczynając, rozpychają się na obecnym rynku…

dodatkowo przez jakiś czas zastanawiałem się po co trzeba je dotknąć? spodziewałem się że to małe coś na tokenach, to czytnik linii papilarnych – to by miało sens. ale nie – to zwykłe zwarcie jest. niektóre 'nowoczesne’ modele są tak zaprojektowane, żeby były malutkie i 'nie przeszkadzały’ podobnie do nadajników radiowych, i żeby nie trzeba było ich w ogóle wyciągać – a więc co to za zabezpieczenie? to tak jakby zostawiać klucz w zamku – wystarczy przyjść i przekręcić.

odpowiedź

odpowiedź jest prosta – te klucze nie mają chronić przed próbą dostępu fizycznego. konieczność dotyku powoduje, że przy próbie uwierzytelnienia zdalnego, kiedy wymagany jest 2FA, potencjalny atakujący nie będzie w stanie go użyć… bo jest zdalnie, czyli nie może dotknąć tokenu. statystycznie patrząc, nie bronimy się raczej przed kolegami z pracy, dość rzadkim scenariuszem są również sytuacje, w których atakujący ma fizyczny dostęp do naszego komputera.

dodatkowo, bardziej prawidłową odpowiedzią będzie – „wygoda”. bo przecież konieczność wpisania PINu daje ten sam poziom [ba! wyższy! bo ktoś musi go znać], tylko jest bardziej upierdliwa. zresztą do tokenów też trzeba często podać PIN.

no to czemu nie smart card?

Pozostaje pytanie – czemu jednak nie karty inteligentne, skoro mają tyle zalet? w końcu to, że tokeny są tak ładnie obsługiwane przez przeglądarki i urządzenia to kwestia tego, że powstały standardy, które zostały zaimplementowane przez dostawców. są takie, ale mogły być inne. czego zatem brakuje kartom inteligentnym i czemu nie dostosowano tej technologii do protokołów Chmurowych WebAuthn/CTAP? co przełamało prawo konwergencji, forkując technologię, która wydawała się wygodniejsza [i tańsza] – pozostawiając karty inteligentne w niszy dostępu fizycznego, a stworzono Fast IDentity Online [FIDO]?

podstawowym powodem jest cały model uwierzytelnienia, tzw. authentication workflow. obsługa certyfikatu zorientowana jest na zcentralizowanym modelu. FIDO z założenia jest zdecentralizowane, oparte na szybkiej weryfikacji, bez konieczności dodatkowego sięgania do jakiegoś centralnego serwera. niepotrzebna jest Infrastruktura Klucza Publicznego [PKI] – która ma swoją własną złożoność, problemy, podatności etc…

można z tym wszystkim niby polemizować – że certyfikaty nie muszą być drogie, że wdrożenia PKI to wcale nie musi być nie-wiadomo-jak-skomplikowane… ale jak to wszystko zebrać razem, to po prostu nie tędy droga. tak na prawdę FIDO powinno być ewolucyjnie porównywane z tokenami OTP – np. RSA SecureID – a nie z kartami inteligentnymi. elektronika, która jest w tokenach pozwala na wiele więcej, niż pasywne przechowywanie certyfikatów:

  • generowanie tokenów jednorazowych TOTP/HOTP
  • izolację procesu generacji klucza publicznego bezpośrednio na urządzeniu, dodanie TPM, a więc nie ma praktycznie możliwości przechwycenia części prywatnej. przy klasycznym PKI mamy architekturę serwer-klient, a więc dodatkowy punkt potencjalnej słabości
  • proces uwierzytelniania WebAuthN nie jest trywialny… dodatkowa komplikacja w postaci weryfikacji certyfikatów na serwerach CA zabiła by Internet. kto przepalił godziny na rozwiązywaniu problemów uwierzytelnienia ten wie, że w
  • i w końcu wszystkie te bajery, które nie są bez znaczenia typu możliwość dodania biometrii – np. czytnika odcisków palców [jasne… cena jest kosmiczna, ale są],
  • self-service … [well… można polemizować z tym self-service. nie wszystkie scenariusze pozwalają na self-service…]

w skrócie – wymagana była aktywna elektronika.

pisząc ten art zadałem sobie pytanie – czemu nie połączy się tych dwóch technologii tworząc FIDO2 smart card… i jak to zwykle bywa – ktoś już odpowiedział na to pytanie – a czemu by nie? mam nadzieję kiedyś pracować przy wdrożeniu takiego cuda, jako część Integrated Security System, bo wygląda smacznie.

Exit

jednym z drażniących ograniczeń FIDO jest brak jego natywnej obsługi przez Windows logon. do tego celu można oczywiście wykorzystać system innych firm – jak np. Duo. problemem są koszty rozwiązania – same tokeny FIDO do najtańszych nie należą, a i subskrypcja Duo kosztuje… dochodzi dodatkowy poziom integracji, wybór IdP i tak dalej…

…nie podejmuję się odpowiedzi na pytanie 'dlaczego?’… a w każdym razie nie dzisiaj…

eN.

wyszukiwanie aktywności konta

ostatnimi czasy wróciłem do podstaw… i tak się stało, że duża część moich obowiązków związana jest z bezpieczeństwem. bezpieczeństwo zawsze było istotnym elementem mojej pracy zawodowej, ale zawsze jako dopełniający element, a nie przewodni – czy się zarządza, czy projektuje, zawsze trzeba mieć na uwadze czy środowisko/konfiguracja spełnia odpowiednie normy. wbrew niektórym poglądom środowiska on-premises prędko nie odejdą do lamusa, choć coraz bardziej się odchudzają. a ponieważ klienci, z którymi mam ostatnio do czynienia, nie mają wyszukanych rozwiązań, wszystko trzeba robić 'po staremu’.

podrzucam zatem przydatne komendy, które pomogą w manualnej inwestygacji. przyda się zarówno przy ogólnym audycie ale i w momencie jeśli próbujemy znaleźć gdzie jakieś konto 'żyje’, gdzie jest używane.

Event Log

można przeglądać live i offline. ponieważ jednym z pierwszych kroków jest zabezpieczenie logów i powinno się ograniczać pracę w zagrożonym środowisku, poniższy przykład pokazuje jak przeglądać wyeksportowane logi w poszukiwaniu aktywności użytkownika:

  • logi z DC nie są synchronizowane, każdy DC ma własne, w związku z tym trzeba wyeksportować z każdego oddzielnie. okazało się, że nie każdy to wie, więc tak na wszelki wypadek przypominam…
  • okazuje, nie jest również oczywiste, że logowanie nieudanych prób logowania jest co najmniej tak samo ważne, jak logowanie udanych. nieudane próby mogą świadczyć o próbie bruteforce na kontach albo po prostu próbach nieautoryzowanego dostępu
  • następnie można przeszukać korzystając z Get-WinEvent. problem z obróbka polega na tym, że zwrócony hashtable nie ma ustalonego formatu – zależnie od typu zdarzenia będzie inna ilość pól
  • poniższy przykład obrazuje wyszukiwanie udanych (4624) i nieudanych (4625) zdarzeń logowania dla kont 'account01′ oraz 'account02′
  • nazwy kont są bez domeny, match korzysta z regex więc dowolnie rozbudowywać i wyszukuję po atrybucie 'message’ ponieważ nazwa użytkownika przy tych zdarzeniach jest *zazwyczaj* na 6 pozycji w tablicy.. ale nie zawsze. dzięki przeszukaniu zawartości 'message’ wyłapuje się więcej
$events = Get-WinEvent -Path "C:\incident01\DC01_security.evtx" | Where-Object { ($_.ID -eq 4624 -or $_.ID -eq 4625) -and $_.message -match 'account01|account02'}
$events += Get-WinEvent -Path "C:\incident01\DC02_security.evtx" | Where-Object { ($_.ID -eq 4624 -or $_.ID -eq 4625) -and $_.message -match 'account01|account02'}
$events += Get-WinEvent -Path "C:\incident\DC03_security.evtx" | Where-Object { ($_.ID -eq 4624 -or $_.ID -eq 4625) -and $_.message -match 'account01|account02'}
$events|%{"{0},{1}" -f $($_.Properties.value -join ','),$_.TimeCreated}|Out-File C:\incident01\events_aggregated.csv

a jak ktoś korzysta z eNLib to jeszcze można sobie ułatwić życie i obejrzeć sformatowane w Excel:

&(convert-CSV2XLS c:\incident01\events_aggregated.csv)

smutną informacją będzie, że klasyczne logi Windows pokazują gdzie nastąpiło uwierzytelnienie… ale nie pokazują skąd – co w przypadku logowania sieciowego jest dużym brakiem, bo znalezienie gdzie takie konto w zasadzie jest używane bywa trudne. przydatna będzie również wiedza dotycząca właśnie typu logowania, a najważniejsze to:

  • Type 2 – klasyczne logowanie lokalne
  • Type 3 – non-interactive, network logon
  • Type 5 – non-interactive, service logon (chyba najtrudniejszy w interpretacji)

żywe elementy systemu

jak na szybko sprawdzić czy coś nie działa w kontekście danego użytkownika?

task scheduler:

Get-ScheduledTask | select TaskName,@{L='context';E={$_.Principal.ID}}|sort context

usługi systemowe:

gcim win32_service|select name,startname|sort startname
oraz procesy:
Get-Process | ForEach-Object {
    $process = $_
    $cimProcess = Get-CimInstance -ClassName Win32_Process -Filter "ProcessId = $($process.Id)"
    $owner = Invoke-CimMethod -InputObject $cimProcess -MethodName GetOwner
    [PSCustomObject]@{
        Name = $process.Name
        Id = $process.Id
        Owner = $owner.User
    }
}
warto zwrócić uwagę na get-CimInstanstance zamiast get-WmiObject – i to trochę będzie zależało od wersji systemu. na bardzo starych Windowsach może być problem z CIM, a na nowych nie działa już gwmi.

Exit

chmury, SIEM, EDR, XDR, MFA, całe to AI i przełomy technologiczne… łatwo zapomnieć że to tylko fragment świata – tego lepiej dofinansowanego, rozwiniętego, technologicznego… ale jest też druga strona. środowiska on-premises, skonfigurowane… mówiąc delikatnie, odbiegając od jakichkolwiek norm i standardów, gdzie klienci nie rozumieją tego co jest potrzebne lub niepotrzebne w środowisku – widzą tylko czy działa aplikacja na ich komputerze i tylko tyle są w stanie ocenić. cała reszta to jakiś techniczny bełkot, którego nie chcą słyszeć… a zazwyczaj również nie bardzo za to płacić.

często zastanawiam się nad tym dysonansem – z jednej strony wydaje się, że technologiczna osobliwość jest tuż tuż i czytam artykuły straszące AI, które przejmie władzę nad światem i kolonizacji Marsa, a z drugiej ta część świata, w której pracują systemy z przed dekad czy te odległe miejsca, w których szczytem technologii jest żarówka i kuchenka gazowa…

eN.

App Registrations vs Enterprise Apps

różnica pomiędzy App Registrations a Enterprise Apps w EntraID niby jest oczywista.. ale po chwili zastanowienia robi się dość niejasna i sprawia problemy. zgodnie z zasadą Feynmana, która mówi, że naprawdę rozumie się tylko to, co potrafi się w przystępny sposób wytłumaczyć, długo miałem z tym problem. niby wiedziałem… ale nie byłem w stanie odpowiedzieć na to pytanie przekonywająco.

normalnie poleciłbym opis mojego ulubionego 'nauczyciela Azure’ – John Savill, ale o ile uważam, że bardzo warto obejrzeć ten wykład, nie do końca dobrze tłumaczy to, co najważniejsze. bardzo fajnie rozkłada na czynniki pierwsze model uwierzytelnienia i autoryzacji i pokazuje workflow podczas uzyskiwania dostępu – a więc arcyważny i ciekawy element… ale prezentacja urywa się tam, gdzie tak na prawdę powinna się zacząć. i kiedy dochodzi już do pokazania praktycznej różnicy pomiędzy App Registrations i Enterprise Apps – czegoś mi zabrakło – zbyt dogłębnie, za mało praktycznie.

to coś, czyli bardziej praktyczne wyjaśnienie tych elementów, znalazłem natomiast tu:

tłumaczy 'po mojemu’ – trochę teorii, trochę praktyki, jak to 'dotknąć’ PowerShell’em i po co to wszystko. to pierwsza z kilku części dotyczących tego tematu (SIC!), co pokazuje, że wcale nie jest taki trywialny i oczywisty – i tak patrząc na inne ich spotkania, jeszcze trochę czasu poświęcę na ich nagrania.

eN.