Titkosítás a MySQL-ben: Mesterkulcs használata

Az új kurzus indítása előtt Adatbázisok Folytatjuk a MySQL titkosítással foglalkozó cikkek sorozatát.

Titkosítás a MySQL-ben: Mesterkulcs használata

A sorozat előző cikkében (Titkosítás MySQL-ben: kulcstároló) a kulcs tárolókról beszéltünk. Ebben a cikkben a fő kulcs (master key) használatát nézzük meg, és megvitatjuk a burkoló titkosítás (envelope encryption) előnyeit és hátrányait. 

A burkoló titkosítás ötlete abban rejlik, hogy a titkosításhoz használt kulcsok (tároló kulcsok) egy másik kulccsal (fő kulcs, master key) vannak titkosítva. Az adatok titkosítására valójában a tároló kulcsokat használják. Grafikus ábrázolásban ez így néz ki:

Titkosítás a MySQL-ben: Mesterkulcs használata

A fő kulcs (master key) a kulcstárolóban (keyring) található, míg a tároló kulcsok a titkosított tárolók fejlécében helyezkednek el (a tároló 0. oldalán). 

A fent látható ábrán:

  • Az A táblázat az 1-es kulccsal (Key 1) van titkosítva. Az 1-es kulcsot a fő kulcs (master key) segítségével titkosítják, és titkosítva tárolják az A táblázat fejlécében.

  • A B táblázat a 2-es kulccsal (Key 2) van titkosítva. A 2-es kulcsot a fő kulcs (master key) segítségével titkosítják, és titkosítva tárolják a B táblázat fejlécében.

  • Mindezek mellett.

Amikor a szervernek meg kell dekódolnia az A táblázatot, megszerzi a fő kulcsot a kulcstárolóból, elolvassa az 1-es kulcsot a titkosított A táblázat fejlécéből, és dekódolja az 1-es kulcsot. A dekódolt 1-es kulcs a szerver memóriájában van tárolva, és az A táblázat dekódolásához használják.

InnoDB

Az InnoDB rendszerben a tényleges titkosítás és dekódolás a be- és kiolvasás (I/O) szintjén történik. Tehát az oldal közvetlenül azelőtt van titkosítva, hogy a lemezre írnák, és azonnal dekódolják, miután a lemezről olvasják.

Az InnoDB titkosítása csak a tároló szintjén működik. Alapértelmezés szerint az összes táblázat külön tárolókban jön létre (file-per-table tablespace). Más szavakkal, egy olyan tároló jön létre, amely csak egy táblázatot tartalmazhat. Bár táblázatokat létrehozhat az alap tárolóban is (general tablespace). De bárhogy is van, a táblázat mindig egy tárolóban van. Mivel a titkosítás a tároló szintjén történik, ezért az teljesen titkosítva van, vagy egyáltalán nem. Tehát nem lehet az alap tárolóban csak a táblázatok egy részét titkosítani. 

Ha bármilyen okból a file-per-table ki van kapcsolva, akkor az összes tábla a rendszer táblázati térben (system tablespace) jön létre. Percona Server for MySQL A rendszer táblázati teret titkosíthatjuk az innodb változó használatával.systablespaceencrypt vagy titkosítási szálak (encryption threads) segítségével, de ez még mindig kísérleti funkció. A MySQL-ben ez nem elérhető.

Mielőtt tovább lépnénk, meg kell vizsgálnunk a mester kulcs azonosító (master key ID) szerkezetét. Ez UUID-ból, KEYID-ből és az "INNODBKey" előtagból áll. Így néz ki: INNODBKey-UUID-KEYID.

Az UUID az a szerver UUID, amely titkosított táblázati térrel rendelkezik. A KEYID csupán egy folyamatosan növekvő érték. A fő kulcs első létrehozásakor a KEYID 1. A kulcs rotálásakor, amikor új mester kulcsot hoznak létre, a KEYID = 2 és így tovább. A fő kulcsok rotációjáról a következő cikkekben fogunk beszélni.

Most, hogy tudjuk, hogyan néz ki a mester kulcs azonosítója, nézzük meg a titkosított táblázati tér fejlécét. Amikor a táblázati tér titkosítva van, a titkosítással kapcsolatos információt a fejléchez adják. Így néz ki:

Titkosítás a MySQL-ben: Mesterkulcs használata

A KEY ID a már megvitatott mester kulcs azonosító KEYID-ja. Az UUID a szerver uuid, amelyet szintén használnak a mester kulcs azonosítójában. A TABLESPACE KEY egy 256 bites kulcs, amelyet a szerver véletlenszerűen generál. Az inicializálási vektor (IV, initialization vector) szintén 256 véletlenszerűen generált bitből áll (bár 128 bitnek kellene lennie). Az IV-t a titkosítás és visszafejtés AES inicializálására használják (a 256 bitből csak 128 használható). A végén egy CRC32 ellenőrzőösszeg található a TABLESPACE KEY és az IV számára.

Mindeközben kicsit leegyszerűsítettem azzal, hogy azt mondtam, a fejlécben titkosított táblázati tér kulcsa található. Valójában a táblázati tér kulcsa és az inicializálási vektor együtt tárolódik és titkosítódik a fő kulcs segítségével. Ne feledje, hogy a táblázati tér kulcsának és az inicializálási vektor titkosítása előtt CRC32-t számítanak ki számukra.

Miért van szükség CRC32-re?

Röviden, a fő kulcs érvényességének ellenőrzéséhez szükséges. A táblatér és az inicializáló vektor kulcsának visszafejtése után ellenőrző összeg számítódik, amelyet összehasonlítunk a fejlécben tárolt CRC32-vel. Ha az ellenőrző összegek megegyeznek, akkor a fő kulcs és a táblatér kulcsa helyes. Ellenkező esetben a táblatér hiányzóként van megjelölve (akkor sem tudjuk visszafejteni).

Megkérdezheti: mikor történik a kulcsok ellenőrzése? A válasz: a szerver indításakor. A titkosított táblák / táblaterek szerver indításkor beolvassa az UUID-t, a KEY-ta fejlécből, és generálja a fő kulcs azonosítóját. Ezután megszerzi a szükséges fő kulcsot a tárolóból (keyring), visszafejti a táblatér kulcsát, és ellenőrzi az ellenőrző összeget. Ismét, ha az ellenőrző összeg egyezik, akkor minden rendben van, ha nem – a táblatér hiányzóként van megjelölve.

Ha olvasta a sorozat előző részét (Titkosítás MySQL-ben: kulcstároló), akkor talán emlékszik rá, hogy a szerver kulcstárolójának használatakor a szerver indításkor csak a kulcsazonosítók listáját kapja meg, pontosabban a key id-t és a user id-t, mivel ez a pár egyértelműen azonosítja a kulcsot. Most azt mondom, hogy a szerver indításakor minden olyan kulcsot megkap, amely szükséges a táblatér kulcsainak visszafejtésének ellenőrzéséhez. De miért van az, hogy a szerver tárolójában, a kulcsok ellenőrzésekor, csak a keyid és userid jelenik meg, nem pedig minden kulcs? Mert nem szükséges az összes kulcs. Ez főleg a fő kulcs forgatásával kapcsolatos. A fő kulcs forgatásakor a tárolóban új fő kulcs kerül létrehozásra, de a régi kulcsok nem törölhetők. Így a szerver kulcstárolójában sok olyan kulcs lehet, amelyekre a szervernek nincs szüksége, ezért indításkor nem is kerülnek lekérdezésre.

Itt az ideje, hogy egy kicsit beszéljünk a főkulcsos titkosítás előnyeiről és hátrányairól. A legnagyobb előny, hogy csak egy titkosítási kulcsra (főkulcsra) van szükséged, amelyet külön tárolsz a titkosított adataidtól. Ez gyorsabbá teszi a szerverindítást és csökkenti a tárolási igényeket, ami megkönnyíti a kezelését. Továbbá, mivel csak egy főkulcs van, azt könnyen újragenerálhatod.

Azonban a főkulcsos titkosításnak van egy jelentős hátránya: miután a táblázat tér adott táblázat_key segítségével titkosításra került, folyamatosan ugyanazzal a kulccsal marad titkosítva. A főkulcs rotációja itt nem segít. Miért ez hátrány? Tudjuk, hogy a MySQL-ben vannak hibák, amelyek hirtelen leállásokhoz és core-fájlok létrehozásához vezethetnek. Mivel a core-fájlok tartalmazzák a szerver memória dumpját, előfordulhat, hogy a dumpban a táblázat tér dekódolt kulcsa található. Mi még rosszabb, hogy a dekódolt táblázat tér kulcsok a memóriában tárolódnak, ami lecsuszatható a lemezre. Mondhatod, hogy ez nem hátrány, mivel root-jogok szükségesek ezekhez a fájlokhoz és a swap területhez való hozzáféréshez. Igen. De a root-jogokra csak egy időre van szükséged. Amint valaki hozzáfér a dekódolt táblázat tér kulcshoz, ő/ő azt tovább tudja használni az adatok dekódolására, még root-jogok nélkül is. Ezenkívül a lemez ellopható, és a swap terület/core-fájlok harmadik féltől származó eszközökkel olvashatók. A TDE célja, hogy olvashatatlanná tegye, még ha a lemez ellopásra kerül is. Percona Server for MySQL lehetőséged van a táblázat tér újonnan generált kulcsokkal való újratitkosítására. Ezt a funkciót titkosítási szálaknak (encryption threads) hívják, és a cikk írásakor még mindig kísérleti fázisban van.

Tudjon meg többet a tanfolyamról

Tovább olvasva:

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster