Ištirkite kritinį entropijos vaidmenį skaitmeniniame saugume. Šiame išsamiame vadove aptariami atsitiktinumo šaltiniai, entropijos telkinys ir geriausios kūrėjų bei sistemos administratorių praktikos.
Nematomas saugumo variklis: gilus nardymas į sistemos entropijos rinkimą
Mūsų skaitmeniniame pasaulyje mes pasikliaujame paslaptimis. El. pašto slaptažodis, raktas, šifruojantis jūsų finansines operacijas, seanso prieigos raktas, kuris leidžia jums būti prisijungusiam prie paslaugos – visa tai vertinga tik tol, kol išlieka nenuspėjama. Jei priešininkas gali atspėti jūsų kitą „paslaptį“, ji nustoja būti paslaptimi. Šios nenuspėjamumo esmė yra pagrindinė informacijos teorijos ir fizikos koncepcija, pritaikyta kompiuterijai: entropija.
Kompiuterių mokslininkui ar saugumo specialistui entropija yra atsitiktinumo, nuostabos matas. Tai yra kriptografijos gyvybė ir tylus mūsų skaitmeninių tapatybių sargas. Bet kur mūsų deterministiniai, logika pagrįsti įrenginiai randa šią esminę chaosą? Kaip kompiuteris, pastatytas ant nuspėjamų vienetų ir nulių pagrindo, generuoja tikrą nenuspėjamumą?
Šis gilus nardymas nušvies žavų, dažnai nematomas, entropijos rinkimo procesą. Mes išnagrinėsime išradingus būdus, kuriais operacinės sistemos renka atsitiktinumą iš fizinio pasaulio, kaip jos jį valdo ir kodėl šio proceso supratimas yra labai svarbus kiekvienam, kuriančiam, valdančiam ar saugančiam šiuolaikines kompiuterių sistemas.
Kas yra entropija ir kodėl ji svarbi?
Prieš tyrinėdami šaltinius, aiškiai supraskime, ką turime omenyje sakydami „entropija“ kompiuteriniame kontekste. Tai nėra netvarka kambaryje; tai yra informacijos nenuspėjamumas. Duomenų eilutę su didele entropija sunku atspėti ar suspausti. Pavyzdžiui, eilutė „aaaaaaaa“ turi labai mažą entropiją, o eilutė, tokia kaip „8jK(t^@L“, turi didelę entropiją.
Atsitiktinumo kompiuterijoje apibrėžimas
Atsitiktinių skaičių generavimo pasaulyje susiduriame su dviem pagrindinėmis kategorijomis:
- Pseudoatsitiktinių skaičių generatoriai (PRNG): Tai yra algoritmai, generuojantys skaičių seką, kuri atrodo atsitiktinė, bet iš tikrųjų yra visiškai nulemta pradinės vertės, vadinamos „pradiniu skaičiumi“. Esant tam pačiam pradiniam skaičiui, PRNG visada generuos tą pačią skaičių seką. Nors puikūs modeliavimui, kur reikalingas atkuriamumas, jie yra pavojingai nuspėjami saugumo programoms, jei galima atspėti pradinį skaičių.
- Tikrieji atsitiktinių skaičių generatoriai (TRNG): Šie generatoriai nesiremia matematine formule. Vietoj to, jie gauna atsitiktinumą iš nenuspėjamų fizinių reiškinių. TRNG išvestis yra nedeterministinė; negalite nuspėti kito skaičiaus, net jei žinote visą ankstesnių skaičių istoriją. Tai yra atsitiktinumo kokybė, reikalinga stipriai kriptografijai.
Sistemos entropijos rinkimo tikslas yra rinkti duomenis iš TRNG šaltinių, kad jie būtų tiesiogiai teikiami programoms arba, dažniau, saugiai užpildyti aukštos kokybės, kriptografiškai saugų PRNG (CSPRNG).
Kritinis entropijos vaidmuo saugumui
Aukštos kokybės entropijos trūkumas gali sukelti katastrofiškų saugumo gedimų. Jei sistema generuoja nuspėjamus „atsitiktinius“ skaičius, visa saugumo architektūra, pastatyta ant jų, žlunga. Štai tik kelios sritys, kuriose entropija yra būtina:
- Kriptografinių raktų generavimas: Kai generuojate SSH raktą, PGP raktą arba SSL/TLS sertifikatą, sistemai reikia didelio tikro atsitiktinumo kiekio. Jei dvi sistemos generuoja raktus su tais pačiais nuspėjamais atsitiktiniais duomenimis, jos sukurs identiškus raktus, o tai yra pražūtingas trūkumas.
- Seanso valdymas: Kai prisijungiate prie svetainės, ji generuoja unikalų seanso ID, kad atpažintų jūsų naršyklę. Šis ID turi būti neatspėjamas, kad užpuolikai negalėtų perimti jūsų seanso.
- Nonces ir Salts: Kriptografijoje „nonce“ (vieną kartą panaudotas skaičius) naudojamas siekiant išvengti pakartojimo atakų. Slaptažodžių maišoje „druskos“ yra atsitiktinės reikšmės, pridedamos prie slaptažodžių prieš maišos operaciją, siekiant išvengti vaivorykštės lentelių atakų. Abu jie turi būti nenuspėjami.
- Šifravimo protokolai: Tokie protokolai kaip TLS pasikliauja atsitiktiniais skaičiais rankos paspaudimo metu, kad nustatytų bendrą slaptąjį raktą seansui. Nuspėjami skaičiai čia gali leisti pasiklausytojui iššifruoti visą pokalbį.
Atsitiktinumo paieška: sistemos entropijos šaltiniai
Operacinės sistemos yra stebėjimo meistrės, nuolat stebinčios nenuspėjamą fizinio pasaulio triukšmą. Šis triukšmas, kartą suskaitmenintas ir apdorotas, tampa žaliava sistemos entropijos telkiniui. Šaltiniai yra įvairūs ir išradingi, paverčiantys kasdienius įvykius vertingo atsitiktinumo srautu.
Aparatinės įrangos šaltiniai: pasinaudojimas fiziniu pasauliu
Patikimiausi entropijos šaltiniai yra subtilūs, chaotiški aparatinės įrangos komponentų ir naudotojo sąveikos svyravimai. Svarbiausia yra išmatuoti tikslų šių įvykių laiką, nes šiam laikui dažnai įtakoja daugybė nenuspėjamų fizinių veiksnių.
Naudotojo įvesties laikai
Net kai vartotojas atlieka pasikartojantį veiksmą, tikslus jo veiksmų laikas niekada nebūna visiškai identiškas. Operacinės sistemos branduolys gali išmatuoti šiuos svyravimus iki mikrosekundės ar nanosekundės.
- Klaviatūros laikai: Sistemai nerūpi, kokius klavišus spaudžiate, bet kada juos spaudžiate. Tarpklaviatūrinis vėlavimas – laikas tarp vieno klavišo paspaudimo ir kito – yra turtingas entropijos šaltinis, kuriam įtakos turi žmogaus minties procesai, nedideli raumenų trūkčiojimai ir sistemos apkrova.
- Pelės judesiai: Kelias, kurį jūsų pelės žymeklis eina per ekraną, yra bet kas, bet ne tiesi linija. Branduolys užfiksuoja X/Y koordinates ir kiekvieno judesio įvykio laiką. Chaotiška rankos judėjimo prigimtis suteikia nuolatinį atsitiktinių duomenų srautą.
Aparatinės įrangos pertraukimai ir įrenginių laikai
Šiuolaikinis kompiuteris yra asinchroninių įvykių simfonija. Įrenginiai nuolat pertraukia procesorių, kad praneštų, jog jie baigė užduotį. Šių pertraukimų laikas yra fantastiškas entropijos šaltinis.
- Tinklo paketų atvykimo laikai: Laikui, per kurį tinklo paketas nukeliauja iš serverio į jūsų kompiuterį, įtakos turi daugybė nenuspėjamų veiksnių: tinklo perkrova, maršrutizatoriaus eilės vėlavimai, atmosferos trukdžiai „Wi-Fi“ signalams ir saulės pliūpsniai, darantys įtaką palydoviniams ryšiams. Branduolys matuoja tikslų kiekvieno paketo atvykimo laiką, derliaus nuėmimas drebėjimą kaip entropiją.
- Disko įvesties/išvesties laikai: Laikui, per kurį standžiojo disko skaitymo/rašymo galvutė juda į tam tikrą takelį ir plokštelei pasisukti į reikiamą sektorių, įtakos turi nedideli fiziniai svyravimai ir oro turbulencija disko korpuse. Kietojo kūno diskų (SSD) atveju blykstės atminties operacijų laikas taip pat gali turėti nedeterministinių elementų. Šių įvesties/išvesties užklausų užbaigimo laikas yra dar vienas atsitiktinumo šaltinis.
Specializuoti aparatinės įrangos atsitiktinių skaičių generatoriai (HRNG)
Aukšto saugumo programoms pasikliauti aplinkos triukšmu ne visada pakanka. Čia atsiranda speciali aparatinė įranga. Daugelis šiuolaikinių procesorių ir mikroschemų rinkinių apima specializuotą HRNG pačiame silicione.
- Kaip jie veikia: Šios mikroschemos sukurtos taip, kad panaudotų tikrai nenuspėjamus fizinius reiškinius. Dažni metodai apima terminio triukšmo (atsitiktinio elektronų judėjimo rezistoriuje), kvantinio tuneliavimo efektų puslaidininkiuose arba radioaktyvaus šaltinio skilimo matavimą. Kadangi šiuos procesus reguliuoja kvantinės mechanikos dėsniai, jų rezultatai iš esmės yra nenuspėjami.
- Pavyzdžiai: Ryškus pavyzdys yra „Intel Secure Key“ technologija, apimanti `RDRAND` ir `RDSEED` instrukcijas. Jie leidžia programinei įrangai tiesiogiai prašyti aukštos kokybės atsitiktinių bitų iš mikroschemoje esančio HRNG. AMD procesoriai turi panašią funkciją. Jie laikomi aukso standartu entropijai ir yra plačiai naudojami šiuolaikinėse operacinėse sistemose, kai yra prieinami.
Aplinkos triukšmas
Kai kurios sistemos taip pat gali pasinaudoti triukšmu iš savo artimiausios aplinkos, nors tai mažiau paplitęs bendrosios paskirties serveriams ir staliniams kompiuteriams.
- Garso įvestis: Mažiausiai reikšmingi bitai iš mikrofono įvesties, fiksuojančios aplinkos triukšmą arba net terminį triukšmą iš paties mikrofono grandinės, gali būti naudojami kaip entropijos šaltinis.
- Vaizdo įvestis: Panašiai, triukšmas iš nekalibruoto kameros jutiklio (nedideli, atsitiktiniai pikselių ryškumo svyravimai, net kai nukreipti į vienodą paviršių) gali būti suskaitmenintas ir įtrauktas į entropijos telkinį.
Entropijos telkinys: sistemos atsitiktinumo rezervuaras
Žalių duomenų rinkimas iš šių įvairių šaltinių yra tik pirmas žingsnis. Šie žali duomenys gali būti netolygiai paskirstyti, o užpuolikas gali paveikti vieną iš šaltinių. Norėdamos tai išspręsti, operacinės sistemos naudoja mechanizmą, vadinamą entropijos telkiniu.
Įsivaizduokite entropijos telkinį kaip didelį katilą. Operacinė sistema įmeta atsitiktinius bitus, surinktus iš klaviatūros laikų, pelės judesių, disko įvesties/išvesties ir kitų šaltinių, kaip ingredientus. Tačiau ji ne tik juos sumaišo; ji naudoja kriptografinę „maišymo“ funkciją.
Kaip tai veikia: puodo maišymas
Kai atsiranda naujų atsitiktinių duomenų (tarkime, iš tinklo paketo atvykimo laiko), jis tiesiog nepridedamas prie telkinio. Vietoj to, jis derinamas su dabartine telkinio būsena naudojant stiprią kriptografinę maišos funkciją, tokią kaip SHA-1 arba SHA-256. Šis procesas turi keletą svarbių privalumų:
- Balinimas/maišymas: Kriptografinė maišos funkcija kruopščiai sumaišo naują įvestį su esamu telkiniu. Tai užtikrina, kad telkinio išvestis būtų statistiškai vienoda, net jei žaliavinės įvestys nėra. Ji išlygina bet kokius įvesties šaltinių šališkumus.
- Atsparumas atgaliniam sekimui: Dėl vienpusės maišos funkcijų prigimties užpuolikas, stebintis entropijos telkinio išvestį, negali atšaukti proceso, kad išsiaiškintų ankstesnę telkinio būseną arba pridėtas žaliavines įvestis.
- Šaltinių nepriklausomumas: Nuolat maišant įvestis iš daugybės šaltinių, sistema užtikrina, kad net jei užpuolikas galėtų valdyti vieną šaltinį (pvz., siųsdamas tinklo paketus nuspėjamu greičiu), jo įtaka būtų susilpninta ir užmaskuota visų kitų šaltinių, kurie yra maišomi.
Dvi prieigos rūšys: blokuojanti ir neblokuojanti
Unix tipo sistemose, tokiose kaip Linux, branduolio entropijos telkinys paprastai pasiekiamas programoms per du specialius įrenginių failus: `/dev/random` ir `/dev/urandom`. Suprasti skirtumą tarp jų yra labai svarbu ir tai dažnas painiavos taškas.
/dev/random: didelio patikimumo šaltinis
Kai prašote duomenų iš `/dev/random`, branduolys pirmiausia įvertina, kiek „tikros“ entropijos šiuo metu yra telkinyje. Jei prašote 32 baitų atsitiktinumo, bet branduolys mano, kad jis turi tik 10 baitų vertės entropijos, `/dev/random` jums duos tuos 10 baitų ir tada blokuos. Jis pristabdys jūsų programą ir lauks, kol surinks pakankamai naujos entropijos iš savo šaltinių, kad įvykdytų likusią jūsų užklausą.
Kada jį naudoti: Istoriškai tai buvo rekomenduojama generuoti labai vertingus, ilgalaikius kriptografinius raktus (pvz., GPG pagrindinį raktą). Blokuojanti prigimtis buvo laikoma saugos garantija. Tačiau tai gali sukelti programų užstrigimą neribotam laikui sistemose, kuriose yra mažai entropijos, todėl tai nepraktiška daugeliui naudojimo būdų.
/dev/urandom: didelio našumo šaltinis
`/dev/urandom` (neribotas/neblokuojantis atsitiktinis) taiko kitokį požiūrį. Jis naudoja entropijos telkinį, kad užpildytų aukštos kokybės, kriptografiškai saugų PRNG (CSPRNG). Kai šis CSPRNG užpildomas pakankamai tikra entropija, jis gali generuoti praktiškai neribotą kiekį kompiuteriškai nenuspėjamų duomenų labai dideliu greičiu. `/dev/urandom` niekada neblokuos.
Kada jį naudoti: 99,9 % visų programų. Ilgą laiką gyvuoja mitas, kad `/dev/urandom` kažkaip nesaugus. Tai yra pasenę. Šiuolaikinėse operacinėse sistemose (pvz., bet kuriame Linux branduolyje po 2.6), kai telkinys bus inicijuotas (tai įvyksta labai anksti įkrovos procese), `/dev/urandom` išvestis laikoma kriptografiškai saugia visiems tikslams. Šiuolaikiniai kriptografijos ir saugumo ekspertai visuotinai rekomenduoja naudoti `/dev/urandom` arba jo atitinkamus sistemos iškvietimus (`getrandom()` Linux, `CryptGenRandom()` Windows).
Iššūkiai ir svarstymai renkant entropiją
Nors šiuolaikinės operacinės sistemos nepaprastai gerai renka entropiją, tam tikri scenarijai kelia didelių iššūkių.
„Šalto paleidimo“ problema
Kas atsitinka, kai įrenginys įsijungia pirmą kartą? Jo entropijos telkinys yra tuščias. Stalinyje kompiuteryje naudotojas greitai pradės judinti pelę ir rašyti, greitai užpildydamas telkinį. Tačiau apsvarstykite šiuos sudėtingus atvejus:
- Serveriai be galvos: Serveryje duomenų centre nėra prijungtos klaviatūros ar pelės. Jis pasikliauja tik tinklo ir disko pertraukimais, kurie gali būti reti ankstyvos įkrovos metu, kol nebus paleistos paslaugos.
- IoT ir įterptiniai įrenginiai: Išmanusis termostatas ar jutiklis gali turėti labai mažai entropijos šaltinių – jokio disko, minimalų tinklo srautą ir jokios naudotojo sąveikos.
Šis „šaltas paleidimas“ yra pavojingas, nes jei paslauga paleidžiama anksti įkrovos procese ir prašo atsitiktinių skaičių prieš tinkamai užpildant entropijos telkinį, ji gali gauti nuspėjamą išvestį. Siekiant to išvengti, šiuolaikinės sistemos dažnai išsaugo „pradinį failą“ išjungimo metu, kuriame yra atsitiktiniai duomenys iš ankstesnio seanso entropijos telkinio, ir naudoja jį telkiniui inicijuoti kito įkrovos metu.
Virtualizuotos aplinkos ir klonuotos sistemos
Virtualizacija kelia didelį entropijos iššūkį. Virtuali mašina (VM) yra atskirta nuo fizinės aparatinės įrangos, todėl ji negali tiesiogiai stebėti disko laikų ar kitų aparatinės įrangos pertraukimų iš pagrindinio kompiuterio. Tai badauja ją gerų entropijos šaltinių.
Problema sustiprėja klonavus. Jei sukuriate VM šabloną ir tada įdiegiate 100 naujų VM iš jo, visos 100 gali potencialiai paleisti tiksliai toje pačioje būsenoje, įskaitant jų entropijos telkinio pradinį skaičių. Jei jie visi generuoja SSH pagrindinio kompiuterio raktą pirmą kartą paleidžiant, jie visi gali generuoti tą patį raktą. Tai yra didžiulė saugumo spraga.
Sprendimas yra paravirtualizuotas atsitiktinių skaičių generatorius, pvz., `virtio-rng`. Tai sukuria tiesioginį, saugų kanalą svečio VM, kad jis galėtų prašyti entropijos iš savo pagrindinio kompiuterio. Pagrindinis kompiuteris, turėdamas prieigą prie visos fizinės aparatinės įrangos, turi didelį entropijos tiekimą ir gali saugiai ją teikti savo svečiams.
Entropijos badas
Entropijos badas atsiranda, kai sistemos atsitiktinių skaičių poreikis viršija jos gebėjimą rinkti naują entropiją. Užimtas žiniatinklio serveris, apdorojantis tūkstančius TLS rankos paspaudimų per sekundę, gali labai greitai sunaudoti atsitiktinumą. Jei programos šiame serveryje sukonfigūruotos naudoti `/dev/random`, jos gali pradėti blokuoti, o tai lemia didelį našumo pablogėjimą ir ryšio atjungimą. Tai yra pagrindinė priežastis, kodėl `/dev/urandom` yra pageidaujama sąsaja beveik visoms programoms.
Geriausios praktikos ir šiuolaikiniai sprendimai
Sistemos entropijos valdymas yra bendra sistemos administratorių, DevOps inžinierių ir programinės įrangos kūrėjų atsakomybė.
Sistemos administratoriams ir DevOps
- Pasinaudokite aparatinės įrangos RNG: Jei jūsų aparatinė įranga turi įmontuotą HRNG (pvz., Intel RDRAND), įsitikinkite, kad sistema sukonfigūruota ją naudoti. Tokie įrankiai kaip `rng-tools` Linux sistemoje gali būti sukonfigūruoti taip, kad tiektų duomenis iš aparatinės įrangos generatoriaus tiesiai į branduolio `/dev/random` telkinį.
- Išspręskite virtualizaciją: Diegdami VM, visada įsitikinkite, kad `virtio-rng` įrenginys yra sukonfigūruotas ir įjungtas. Tai yra labai svarbus saugumo žingsnis bet kurioje virtualizuotoje infrastruktūroje.
- Apsvarstykite entropijos demonus ribotuose įrenginiuose: Serveriuose be galvos arba įterptiniuose įrenginiuose, turinčiuose mažai natūralių entropijos šaltinių, gali būti naudingas entropiją renkantis demonas, pvz., `haveged`. Jis naudoja procesoriaus instrukcijos laiko svyravimus (paties procesoriaus vykdymo trukdžius), kad generuotų papildomą entropiją.
- Stebėkite entropijos lygius: Linux sistemoje galite patikrinti dabartinę apskaičiuotą entropiją telkinyje paleisdami `cat /proc/sys/kernel/random/entropy_avail`. Jei šis skaičius nuolat mažas (pvz., mažesnis nei 1000), tai ženklas, kad jūsų sistema badauja ir jai gali prireikti vieno iš aukščiau pateiktų sprendimų.
Kūrėjams
- Naudokite teisingą sistemos iškvietimą: Auksinė taisyklė yra niekada nekurti savo atsitiktinių skaičių generatoriaus saugumo tikslais. Visada naudokite sąsają, kurią teikia jūsų operacinės sistemos kriptografinė biblioteka. Tai reiškia, kad reikia naudoti `getrandom()` Linux/C, `os.urandom()` Python, `crypto.randomBytes()` Node.js arba `SecureRandom` Java. Šios sąsajos yra profesionaliai sukurtos taip, kad teiktų kriptografiškai saugius atsitiktinius skaičius neblokuojant.
- Supraskite `urandom` ir `random` skirtumą: Beveik kiekvienai programai – generuojant seanso raktus, nonces, druskas ar net laikinus šifravimo raktus – tinkamas ir saugus pasirinkimas yra neblokuojanti `/dev/urandom` sąsaja. Apsvarstykite blokuojančią sąsają tik norėdami generuoti nedidelį skaičių ypač vertingų, neprisijungusių pagrindinių raktų ir net tada žinokite apie našumo pasekmes.
- Tinkamai užpildykite programos lygio PRNG: Jei jūsų programai reikia savo PRNG ne kriptografiniais tikslais (pvz., žaidime ar modeliavime), vis tiek turite ją užpildyti aukštos kokybės reikšme. Geriausia praktika yra paimti pradinį skaičių iš operacinės sistemos saugaus šaltinio (pvz., `/dev/urandom`).
Išvada: tylus skaitmeninio pasitikėjimo sargas
Entropijos rinkimas yra viena elegantiškiausių ir svarbiausių šiuolaikinės operacinės sistemos funkcijų. Tai yra procesas, jungiantis fizinį ir skaitmeninį pasaulius, paverčiantis chaotišką realybės triukšmą – tinklo paketo drebėjimą, dvejones klavišo paspaudime – į matematinį stiprios kriptografijos tikrumą.
Šis nematomas saugumo variklis nenuilstamai dirba fone, teikdamas esminį nenuspėjamumo elementą, kuris paremia beveik kiekvieną saugų mūsų sąveiką internete. Nuo paprasto naršymo internete seanso apsaugos iki valstybės paslapčių apsaugos, sistemos entropijos kokybė ir prieinamumas yra svarbiausi. Suprasdami, iš kur kyla šis atsitiktinumas, kaip jis valdomas ir kokie iššūkiai kyla, galime sukurti tvirtesnes, atsparesnes ir patikimesnes sistemas pasaulinei skaitmeninei visuomenei.