V pričakovanju začetka novega vpisa na tečaj
V prejšnjem članku v tej seriji (
Zamisel za šifriranje ovojnice je, da so ključi, ki se uporabljajo za šifriranje (ključi prostora tabel), šifrirani z drugim ključem (glavni ključ). Ključi tabele se dejansko uporabljajo za šifriranje podatkov. Grafično je to mogoče predstaviti na naslednji način:
Glavni ključ je v shrambi ključev, ključi prostora tabel pa so v šifriranih glavah prostora tabel (na strani 0 prostora tabel).
Na zgornji sliki:
-
Tabela A je šifrirana s ključem 1 (Key 1). Ključ 1 je šifriran z glavnim ključem in šifrirano shranjen v glavi tabele A.
-
Tabela B je šifrirana s ključem 2 (Key 2). Ključ 2 je šifriran z maskirnim ključem in šifrirano shranjen v glavi tabele B.
-
In tako naprej.
Ko mora strežnik dešifrirati tabelo A, dobi glavni ključ iz shrambe, prebere šifrirani ključ 1 iz glave tabele A in dešifrira ključ 1. Dešifrirani ključ 1 je predpomnjen v pomnilniku strežnika in se uporablja za dešifriranje tabele A .
InnoDB
V InnoDB se dejansko šifriranje in dešifriranje izvede na ravni I/O. To pomeni, da je stran šifrirana tik preden se splakne na disk in dešifrira takoj po branju z diska.
V InnoDB šifriranje deluje samo na ravni prostora tabel. In privzeto so vse tabele ustvarjene v ločenih prostorih tabel (
Če ste iz nekega razloga onemogočili datoteko na tabelo, so vse tabele ustvarjene znotraj sistemskega prostora tabel. IN
Preden nadaljujemo, moramo razmisliti o strukturi ID-ja glavnega ključa. Sestavljen je iz UUID, KEYID in predpona "INNODBKey". Videti je takole: INNODBKey-UUID-KEYID.
UUID je uuid strežnika s šifriranim prostorom tabel. ključID je le vedno večja vrednost. Ko prvič ustvarite glavni ključ KEYID je 1. Med rotacijo ključa, ko se ustvari nov glavni ključ, KEYID = 2 in tako naprej. Več o rotaciji glavnega ključa bomo govorili v naslednjih člankih te serije.
Zdaj, ko vemo, kako izgleda identifikator glavnega ključa, si poglejmo glavo šifriranega prostora tabel. Ko je prostor tabel šifriran, se informacije o šifriranju dodajo v glavo. Videti je takole:
KEYID je KEYID iz ID-ja glavnega ključa, o katerem smo že razpravljali. UUID je uuid strežnika in se uporablja tudi v identifikatorju glavnega ključa. TABLESPACE KEY - ključ prostora tabel, ki je sestavljen iz 256 bitov, naključno generiran s strani strežnika. Inicializacijski vektor (IV, initialization vector) je prav tako sestavljen iz 256 naključno generiranih bitov (čeprav bi moral biti 128 bitov). IV se uporablja za inicializacijo šifriranja in dešifriranja AES (od 256 bitov je uporabljenih le 128). Na koncu je kontrolna vsota CRC32 za TABLESPACE KEY in IV.
Ves ta čas sem nekoliko poenostavljal z besedami, da je v glavi šifriran ključ prostora tabel. Pravzaprav sta ključ prostora tabel in inicializacijski vektor shranjena in šifrirana skupaj z glavnim ključem. Ne pozabite, da preden sta ključ prostora tabel in inicializacijski vektor šifrirana, se zanju izračuna CRC32.
Zakaj je CRC32 potreben?
Na kratko, da se prepričate, da je glavni ključ veljaven. Po dešifriranju ključa prostora tabel in inicializacijskega vektorja se izračuna kontrolna vsota in primerja s CRC32, shranjenim v glavi. Če se kontrolni vsoti ujemata, potem imamo pravilen glavni ključ in ključ prostora tabel. V nasprotnem primeru je tabelni prostor označen kot manjkajoči (še vedno ga ne moremo dešifrirati).
Lahko se vprašate: na kateri točki se izvaja preverjanje ključev? Odgovor je, ko se strežnik zažene. Strežnik s šifriranimi tabelami / prostori tabel ob zagonu prebere UUID, KEYID iz glave in ustvari ID glavnega ključa. Nato pridobi zahtevani glavni ključ iz obeska ključev, dešifrira ključ prostora tabel in preveri kontrolno vsoto. Še enkrat, če se kontrolna vsota ujema, je vse v redu, ne - prostor tabel je označen kot manjkajoči.
Če ste prebrali zadnji članek v tej seriji (
Čas je, da se malo pogovorimo o prednostih in slabostih šifriranja z glavnim ključem. Največja prednost je, da potrebujete samo en šifrirni ključ (glavni ključ), ki bo ločen od vaših šifriranih podatkov. Zaradi tega je zagon strežnika hiter, prostor za shranjevanje pa majhen, kar olajša upravljanje. In tudi edini glavni ključ je enostavno regenerirati.
Vendar ima šifriranje z glavnim ključem eno veliko pomanjkljivost: ko je prostor tabel šifriran s ključem tablespace_key, vedno ostane šifriran z istim ključem. Vrtenje glavnega ključa tukaj ne pomaga. Zakaj je to pomanjkljivost? Vemo, da ima MySQL napake, zaradi katerih se lahko zruši in ustvari jedrno datoteko. Ker jedrna datoteka vsebuje izpis pomnilnika strežnika, se lahko zgodi, da izpis vsebuje dešifriran ključ prostora tabel. Še huje, dešifrirani ključi prostora tabel so shranjeni v pomnilniku, ki ga je mogoče zamenjati na disk. Lahko rečete, da to ni pomanjkljivost, saj potrebujete korenska dovoljenja za dostop do teh datotek in izmenjalne particije. ja Toda root je potreben le za nekaj časa. Ko ima nekdo dostop do dešifriranega ključa prostora tabel, ga lahko še naprej uporablja za dešifriranje podatkov, tudi brez korenskega dostopa. Poleg tega lahko disk ukradejo in datoteke swap / core lahko preberejo z orodji tretjih oseb. Cilj TDE je, da postane neberljiv, tudi če je disk ukraden. IN
Preberi več:
Vir: www.habr.com