Sigurnija verzija skripte za izvoz ključeva za oporavak Bitlocker

31/03/2026

Prije dvije godine, jednostavno pitanje i odgovor navelo me je da kreiram skriptu „dokaz koncepta“. izvezite sve BitLocker ključeve napravljene sigurnosnom kopijom u Entra ID. Skripta je zasnovana na Graph SDK-u za PowerShell i takođe se može pokrenuti za generisanje izveštaja fokusiranog na uređaj, sa bilo kojim povezanim BitLocker ključem za oporavak naveden pored objekta uređaja.

Jedna od stvari koja me je oduvijek mučila u vezi ovog uzorka skripte i mnogih sličnih primjera koda pronađenih na Internetu je činjenica da su BitLocker ključevi prikazani u običnom tekstu. Nije baš siguran pristup. Tako da sam konačno morao da ažuriram skriptu kako bih se bolje nosio sa njom, koristeći SecureString objekte. I napravio nekoliko drugih poboljšanja u međuvremenu. Hajde da ukopamo.

Prije svega, uzmite svoju kopiju “V2” verzije skripte iz mog GitHub repo-a. Pošto skripta koristi delegatske dozvole, morate je pokrenuti sa administratorskim korisnikom, pogledajte zvaničnu dokumentaciju za listu podržanih uloga. Također će vam trebati Graph API dozvole, kako slijedi:

  • BitLockerKey.Read.All – potrebno za čitanje BitLocker ključeva za oporavak
  • Device.Read.All – opciono, potrebno za čitanje informacija o uređaju, ako želite da se izlazu dodaju dodatna svojstva
  • User.ReadBasic.All – potrebno za “razrješavanje” vlasnika uređaja, ako želite da se doda na izlaz

Skripta će pokušati otkriti da li radi sa potrebnim dozvolama, ali provjera nije dovoljno pametna da otkrije scenarije u kojima već imate dodane “šire” opsege, tj. Directory.Read.All. Slobodno ažurirajte relevantni kod kako vam odgovara (redovi 178-191). Slično, ako želite da pokrenete skriptu bez nadzora, preko dozvola aplikacije, ažurirajte red 195 da koristi relevantne parametre.

Jedan scenario koji prethodna verzija skripte nije obradila bio je kada je objekt uređaja dodan u administrativnu jedinicu ograničenog upravljanja (RMAU). Za takve uređaje, BitLocker ključ za oporavak je izložen samo korisnicima s ograničenim dozvolama za dotični RMAU, bez obzira na dodjelu uloga na nivou stanara. Iako skripta još uvijek ne može dohvatiti takav ključ, ona će gracioznije rukovati RMAU-ograničenim objektima.

Kada se pristupni token sa potrebnim dozvolama uspešno dobije, skripta će preuzeti sve BitLocker ključeve pronađene u vašem Entra ID zakupcu. Da bi dohvatio stvarnu vrijednost ključa za oporavak, tada će se ponavljati kroz svaki pronađeni unos ključa. Dok bi u teoriji Graph SDK za PowerShell trebao upravljati prigušivanjem, mogli biste naići na probleme u tom trenutku ako imate na hiljade ključeva napravljenih rezervnih kopija. Da bi se ublažili neki od problema povezanih sa prigušivanjem, uvodi se malo kašnjenje (red 297). Slobodno ga ažurirajte na prikladniju vrijednost ili bolju kontrolu prigušivanja.

Jedini drugi poziv API-ja za Graph koji skripta upućuje je da dohvati sve objekte uređaja, što se događa samo kada ga pokrenete s jednim od odgovarajućih parametara. Kad smo kod toga, evo punog skupa parametara koje podržava ova verzija skripte:

  • IncludeDeviceInfo – opciono, koristite ga za preuzimanje detalja o uređaju. To zahtijeva Device.Read.All dozvole.
  • IncludeDeviceOwner – opcionalno, koristite ga za preuzimanje UPN-a vlasnika uređaja. To zahtijeva User.ReadBasic.All dozvole.
  • DeviceReport – opciono, prebacuje formatiranje izlaza na izvještaj specifičan za uređaj. Zahtijeva sve gore navedene dozvole.
  • AllowInsecureOutput – opciono, generirajte izlaz običnog teksta sa sigurnim XML-om (pogledajte dolje).
  • Ulazni fajl – koristi se za „dešifrovanje“ bezbednog prikaza BitLocker niza ključeva za oporavak u prethodno generisanoj izlaznoj datoteci (pogledajte dole).

Evo nekoliko primjera kako pokrenuti skriptu. Po defaultu (kada ga pokrenete bez ikakvih parametara), bit će vraćen samo minimalni izlaz. Da biste uključili detalje uređaja u izlaz, koristite –IncludeDeviceInfo prekidač. Da biste uključili UPN vlasnika uređaja, koristite –IncludeDeviceOwner prekidač (koji se automatski prebacuje –IncludeDeviceInfo kao). A ako želite ispisati (uglavnom) sve detalje o uređaju i kreirati izvještaj usmjeren na uređaj, koristite –DeviceReport prekidač.

#Get list of BitLocker recovery keys and their values
.\GraphSDK_Bitlocker_reportV2.ps1

#Include data about the device
.\GraphSDK_Bitlocker_reportV2.ps1 -IncludeDeviceInfo

#Also include data about the device's owner
.\GraphSDK_Bitlocker_reportV2.ps1 -IncludeDeviceInfo -IncludeDeviceOwner

#Generate a report of all devices, with any associated BitLocker recovery keys included
.\GraphSDK_Bitlocker_reportV2.ps1 -DeviceReport

Uključena su dva nova parametra za rukovanje izlazom. Podrazumevano, skripta će generisati XML datoteku, što je izvorni način za pohranjivanje sigurnih stringova. Pregled BitLocker ključa za oporavak pohranjenog na takav način bit će dostupan samo trenutnom korisniku i trenutnom uređaju. Ali ovaj pristup stvara neke probleme kada zapravo želite da dobijete nešifrovanu vrijednost ključa. Da biste pomogli u tome, pokrenite skriptu sa -Ulazni fajl parametar i pokažite na lokaciju XML datoteke:

#Generate the report (keys are scrambled)
.\GraphSDK_Bitlocker_reportV2.ps1 -DeviceReport

#Unscramble the keys from an existing output file
.\GraphSDK_Bitlocker_reportV2.ps1 -InputFile .\2026-03-13_12-28-55_BitLockerKeys.xml

Skripta će uzeti sadržaj XML datoteke kao ulaz i generisati CSV i HTML datoteke sa svim relevantnim detaljima i nešifrovanim BitLocker ključevima za oporavak. Nema poziva Graph API-ja kada pokrenete skriptu na ovaj način, jer jednostavno koristimo postojeće podatke i ConvertFrom-SecureString cmdlet. Alternativno, možete dot-source skriptu da iskoristite odgovarajuću Generate-HTMLReport funkcija.

Na kraju, ako vjerujete da je sve ovo jednostavno nepotrebno, možete koristiti -AllowInsecureOutput promijenite izlaz skripte u “nekodirani” format, sa svim generiranim artefaktima koji prikazuju BitLocker ključeve za oporavak u običnom tekstu. Ovaj pristup je dobar za scenarije u kojima planirate da se odmah riješite izlaznih datoteka ili ih osigurate na neki drugi način. Ali nemojte reći da vas nisam upozorio na čuvanje BitLocker ključeva u običnom tekstu!

Evo nekoliko primjera kako izgleda izlaz skripte. Počinjemo sa XML datotekom, koja uvijek ima ključeve u njihovom kodiranom obliku. Ispod je primjer izlaza “izvještaja o uređaju” s označenim šifriranim BitLocker ključem za oporavak i većinom dostupnih atributa skraćeno radi sažetosti:

Evo kako izgleda HTML izvještaj generiran na osnovu iste XML datoteke. Obratite pažnju na Maskirajte BitLocker ključeve potvrdni okvir, prema zadanim postavkama da biste sakrili ključne vrijednosti od znatiželjnih očiju. Drugi snimak ekrana prikazuje iste podatke sa isključenim potvrdnim okvirom i vidljivim ključnim vrijednostima.

BitLockerReportV2 1BitLockerReportV2 2

HTML izvještaj nudi neke osnovne opcije sortiranja, ali ako želite na bilo koji način manipulirati sirovim podacima, najbolje je koristiti generiranu CSV datoteku i obraditi je u Excel-u ili slično.

Svi izlazni fajlovi će biti generisani u radnom direktorijumu. Ako trebate dodati dodatna svojstva izlazu, možete ih umetnuti između redova 253-257. Za izvještaj uređaja sva polja su već prikupljena, ali neka od njih sakrivamo u izlazu. Ako želite ovo prilagoditi, uredite listu izuzetih svojstava u redu 310.

I time možemo zatvoriti ovaj članak. Recite mi šta mislite o novoj skripti, da li mislite da je novi pristup fokusiran na sigurnost prikladan? Trebate li njegovu “sirovu” verziju API-ja?

www.oblakznanja.com