Inför starten av det nya kursutbudet  Vi fortsÀtter att publicera en serie artiklar om kryptering i MySQL.

I den föregĂ„ende artikeln i denna serie () diskuterade vi nyckel förvar. I denna artikel kommer vi att titta pĂ„ hur huvudnyckeln (master key) anvĂ€nds samt diskutera fördelar och nackdelar med konvolutkryptering (envelope encryption).Â
Idén med konvolutkryptering Àr att de nycklar som anvÀnds för att kryptera datan (tablespace-nycklar) krypteras med en annan nyckel (huvudnyckel, master key). För att kryptera data anvÀnds i sjÀlva verket tablespace-nycklar. Grafiskt kan detta framstÀllas som:

Huvudnyckeln (master key) finns i nyckelförvaringen (keyring), medan tablespace-nycklarna finns i rubrikerna för de krypterade tablespaces (pĂ„ sida 0 av tablespace).Â
I bilden ovan:
Tabell A Àr krypterad med nyckel 1 (Key 1). Nyckel 1 krypteras med huvudnyckeln (master key) och lagras krypterad i rubriken för tabell A.
Tabell B Àr krypterad med nyckel 2 (Key 2). Nyckel 2 krypteras med huvudnyckeln (master key) och lagras krypterad i rubriken för tabell B.
Och sÄ vidare.
NÀr servern behöver avkryptera tabell A fÄr den huvudnyckeln frÄn förvaringen, lÀser den krypterade nyckel 1 frÄn rubriken för tabell A och avkrypterar nyckel 1. Den avkrypterade nyckel 1 cachas i serverns minne och anvÀnds för att avkryptera tabell A.
InnoDB
I InnoDB utförs den faktiska krypteringen och avkrypteringen pÄ in- och utmatningsnivÄ. Det vill sÀga att sidan krypteras precis innan den skrivs till disk och avkrypteras direkt efter att den lÀsts frÄn disk.
I InnoDB fungerar kryptering endast pĂ„ nivĂ„ av tabeller. Som standard skapas alla tabeller i separata tabellerum (). Med andra ord skapas ett tabellerum som endast kan innehĂ„lla en tabell. Ăven om du ocksĂ„ kan skapa tabeller i det primĂ€ra tabellerummet (). Men i alla fall finns tabellen alltid i nĂ„got tabellerum. Och eftersom krypteringen sker pĂ„ nivĂ„ av tabellerum, sĂ„ Ă€r den antingen helt krypterad eller inte. Det gĂ„r alltsĂ„ inte att kryptera endast en del av tabeller i det primĂ€ra tabellerummet.Â
Om av nÄgon anledning filsystemet file-per-table Àr avstÀngt, skapas alla tabeller inom det systemtabellutrymme (system tablespace). I kan det systemtabellutrymmet krypteras med hjÀlp av variabeln innodbsystablespaceencrypt eller genom att anvÀnda krypteringsströmmar (encryption threads), men detta Àr fortfarande en experimentell funktion. Det finns ingen sÄdan i MySQL.
Innan vi gÄr vidare behöver vi titta pÄ strukturen för identifieraren för huvudnyckeln (master key ID). Den bestÄr av UUID, KEYID och prefixet "INNODBKey". Det ser ut sÄ hÀr: INNODBKey-UUID-KEYID.
UUID Àr uuid för servern med det krypterade tabellutrymmet. KEYID Àr helt enkelt ett konstant ökande vÀrde. Vid den ursprungliga skapelsen av huvudnyckeln Àr KEYID lika med 1. Vid nyckelrotation, nÀr en ny huvudnyckel skapas, Àr KEYID = 2 och sÄ vidare. Mer detaljer om rotation av huvudnycklar kommer vi att diskutera i de kommande artiklarna i denna serie.
Nu nÀr vi vet hur identifieraren för huvudnyckeln ser ut, lÄt oss se pÄ rubriken för det krypterade tabellutrymmet. NÀr tabellutrymmet krypteras, lÀggs krypteringsinformation till rubriken. Det ser ut som följande:

KEY ID Àr KEYID frÄn identifieraren för huvudnyckeln som vi redan har diskuterat. UUID Àr uuid för servern, som ocksÄ anvÀnds i identifieraren för huvudnyckeln. TABLESPACE KEY Àr tabellutrymmet nyckel som bestÄr av 256 bitar, slumpmÀssigt genererade av servern. Initieringsvektorn (IV, initialization vector) bestÄr ocksÄ av 256 slumpmÀssigt genererade bitar (Àven om det borde vara 128 bitar). IV anvÀnds för att initiiera AES-kryptering och avkryptering (frÄn 256 bitar anvÀnds endast 128). I slutet finns en CRC32-kontrollsumma för TABLESPACE KEY och IV.
Jag har under tiden förenklat nÄgot genom att sÀga att det i rubriken finns en krypterad tabellutrymesnyckel. I verkligheten lagras och krypteras tabellutrymesnyckeln och initieringsvektorn tillsammans med huvudnyckeln. Kom ihÄg att CRC32 berÀknas för tabellutrymesnyckeln och initieringsvektorn innan de krypteras.
Vad Àr CRC32 bra för?
Kort sagt, för att sÀkerstÀlla giltigheten av huvudnyckeln. Efter att ha avkrypterat tabellutrymmesnyckeln och initialiseringsvektorn berÀknas en kontrollsumma som jÀmförs med CRC32 som lagras i huvudet. Om kontrollsummorna matchar har vi rÀtt huvudnyckel och tabellutrymmesnyckel. Annars markeras tabellutrymmet som otillgÀngligt (vi kan fortfarande inte avkryptera det).
Du kanske undrar: nĂ€r utförs nyckelkontrollen? Svaret â vid serverstart. Servern med krypterade tabeller / tabellutrymmen lĂ€ser vid starten UUID, KEYID frĂ„n huvudet och genererar en identifikation för huvudnyckeln. Den hĂ€mtar sedan den nödvĂ€ndiga huvudnyckeln frĂ„n lagringen (keyring), avkrypterar tabellutrymmesnyckeln och kontrollerar kontrollsumman. Ă terigen, om kontrollsumman matchar Ă€r allt i ordning, om inte â tabellutrymmet markeras som otillgĂ€ngligt.
Om du har lÀst den tidigare artikeln i denna serie (), kanske du kommer ihÄg att nÀr serverns nyckellager anvÀnds, fÄr servern vid start endast en lista över nyckelidentifierare, mer exakt, key id och user id, eftersom detta par entydigt identifierar nyckeln. Och nu sÀger jag att servern vid start fÄr alla nycklar som behövs för att kontrollera avkryptering av tabellutrymmen. SÄ varför laddas vid initialisering, i fallet med serverlagret, endast keyid och userid, och inte alla nycklar? För att du kanske inte behöver alla nycklar. Detta Àr frÀmst kopplat till rotationen av huvudnyckeln. Vid rotation av huvudnyckeln skapas en ny huvudnyckel i lagret, men de gamla nycklarna tas inte bort. DÀrför kan det finnas mÄnga nycklar i serverns nyckellager som servern inte behöver och dÀrför inte extraheras vid serverstart.
Det Àr dags att diskutera fördelarna och nackdelarna med kryptering med hjÀlp av en huvudnyckel. Den största fördelen Àr att du bara behöver en krypteringsnyckel (huvudnyckeln) som lagras separat frÄn dina krypterade data. Detta gör serverstarten snabb och lagringen liten, vilket förenklar förvaltningen. Dessutom Àr det enkelt att regenerera den enda huvudnyckeln.
Men kryptering med huvudnyckeln har en stor nackdel: nĂ€r tabellutrymmet har krypterats med hjĂ€lp av tablespace_key förblir det alltid krypterat med samma nyckel. Rotation av huvudnyckeln hjĂ€lper hĂ€r inte. Varför Ă€r detta en nackdel? Vi vet att det finns buggar i MySQL som kan leda till plötsliga krasch och skapande av en core-fil. Eftersom core-filen innehĂ„ller en dump av serverns minne kan det hĂ€nda att den avkryperade nyckeln för tabellutrymmet finns i dumpen. Ănnu vĂ€rre, avkryperade nycklar för tabellutrymmet lagras i minnet, som kan svappa till disk. Du kanske sĂ€ger att detta inte Ă€r en nackdel, eftersom du behöver root-rĂ€ttigheter för att fĂ„ tillgĂ„ng till dessa filer och swap-partitionen. Ja. Men root behövs bara under en kort tid. NĂ€r nĂ„gon vĂ€l har fĂ„tt tillgĂ„ng till den avkryperade nyckeln för tabellutrymmet kan han/hon fortsĂ€tta anvĂ€nda den för att avkryptera data, Ă€ven utan root-rĂ€ttigheter. Dessutom kan disken stjĂ€las, och swap-partitionen/core-filer kan lĂ€sas med hjĂ€lp av tredjepartsverktyg. Syftet med TDE Ă€r att göra den olĂ€sbar, Ă€ven om disken blir stulen. det finns möjlighet till omkryptering av tabellutrymmet med nya genererade nycklar. Denna funktion kallas krypteringsströmmar (encryption threads) och Ă€r, vid tidpunkten för denna artikels skrivande, fortfarande experimentell.
LĂ€s mer:
KĂ€lla: habr.com
