Uue kursuse alguse eelÔhtul oleme teie jaoks tÔlkinud kasuliku artikli.

Andmete lĂ€bipaistev krĂŒpteerimine (Transparent Data Encryption, TDE) ilmus ja MySQL juba mĂ”nda aega tagasi. Kuid kas olete kunagi mĂ”elnud, kuidas see töötab ning millist mĂ”ju TDE vĂ”ib teie serverile avaldada? Selles artiklisarjas vaatleme, kuidas TDE töötab seestpoolt. Alustame vĂ”tmete salvestamisest, kuna see on vajalik iga krĂŒpteerimise jaoks. SeejĂ€rel uurime pĂ”hjalikult, kuidas krĂŒpteerimine Percona Server for MySQL/MySQL-s toimib ja millised tĂ€iendavad funktsioonid on Percona Server for MySQL-l.
MySQL Keyring
Keyring on pistikprogrammid, mis vÔimaldavad serveril pÀrida, luua ja kustutada vÔtmeid kohalikus failis (keyring_file) vÔi eemalserveris (nÀiteks HashiCorp Vaultis). VÔtmed vahetatakse alati kohalikult, et kiirendada nende saamist.
Pistikprogramme saab jagada kahte kategooriasse:
- Kohalik salvestamine. NÀiteks kohalik fail (me nimetame seda failipÔhiseks vÔtmehoidjaks, file-based keyring).
- Kaugsalvestamine. NÀiteks Vault Server (me nimetame seda serveripÔhiseks vÔtmehoidjaks, server-based keyring).
See jaotamine on oluline, kuna erinevat tĂŒĂŒpi salvestuslahendused kĂ€ituvad veidi erinevalt, mitte ainult vĂ”tmete salvestamisel ja saamisel, vaid ka nende kĂ€ivitamisel.
Failide salvestamise korral laetakse kÀivitamisel kÔik salvestuse sisu vahemÀllu: key id, key user, key type ja ise vÔtmed.
Serveri salvestamise korral (nĂ€iteks Vault server) laetakse kĂ€ivitamisel ainult key id ja key user, seetĂ”ttu ei aeglusta vĂ”tmete saamine kĂ€ivitamist. VĂ”tmed laaditakse laiskalt, see tĂ€hendab, et vĂ”tme sisu laetakse Vaultist alles siis, kui see tegelikult on vajalik. PĂ€rast laadimist salvestatakse vĂ”tme sisu mĂ€llu, et tulevikus ei oleks vaja selle jĂ€rele pöörduda Vault Serveri kaudu TLS-ĂŒhenduste kaudu. Vaatame lĂ€hemalt, millist teavet salvestuses on.
VÔtme teave sisaldab jÀrgmist:
- key id â vĂ”tme identifikaator, nĂ€iteks:
INNODBKey-764d382a-7324-11e9-ad8f-9cb6d0d5dc99-1 - key type â vĂ”tme tĂŒĂŒp, mis pĂ”hineb kasutataval krĂŒptimisalgoritmil, vĂ”imalikud vÀÀrtused: âAESâ, âRSAâ vĂ”i âDSAâ.
- key length â vĂ”tme pikkus baitides, AES: 16, 24 vĂ”i 32, RSA: 128, 256, 512 ja DSA: 128, 256 vĂ”i 384.
- kasutaja â vĂ”tme omanik. Kui vĂ”ti on sĂŒsteemi oma, nĂ€iteks Master Key, siis see vĂ€li on tĂŒhi. Kui vĂ”ti luuakse keyring_udf abil, siis see vĂ€li tĂ€histab vĂ”tme omanikku.
- ise vÔtme
VÔti on unikaalselt tuvastatav paari abil: key_id, user.
Samuti on erinevusi vÔtmete hoidmise ja kustutamise osas.
Failihaldus töötab kiiremini. VĂ”ib arvata, et vĂ”tmete hoidmine on lihtsalt vĂ”tme ĂŒhekordne salvestamine faili, kuid see pole nii â siin toimub rohkem toiminguid. Iga kord, kui failihalduses toimub muudatus, luuakse esmalt varukoopia kogu sisust. Oletame, et fail kannab nime my_biggest_secrets, siis varukoopia nimetatakse my_biggest_secrets.backup. Edasi muudetakse vahemĂ€lu (lisatakse vĂ”i eemaldatakse vĂ”tmeid) ja kui kĂ”ik Ă”nnestub, siis vahemĂ€lu kirjutatakse faili tagasi. Harvadel juhtudel, nagu serveri ebaĂ”nnestumine, vĂ”ite nĂ€ha seda varukoopia faili. Varukoopia faili kustutatakse jĂ€rgmise vĂ”tmete laadimise kĂ€igus (tavaliselt pĂ€rast serveri taaskĂ€ivitamist).
Klavi sĂ€ilitamisel vĂ”i kustutamisel peab serveri salvestus ĂŒhenduma MySQL serveriga, kasutades kĂ€ske "saada vĂ”ti" / "taotleda vĂ”tme kustutamist".
Naaseme serveri kĂ€ivitamise kiiruseni. Lisaks sellele, et kĂ€ivitamise kiirus sĂ”ltub salvestusest, on ka oluline kĂŒsimus, kui palju vĂ”tmeid salvestusest tuleb kĂ€ivitamisel vĂ”tta. See on loomulikult eriti tĂ€htis serveri salvestuste puhul. KĂ€ivitamisel kontrollib server, milline vĂ”ti on vajalik krĂŒptitud tabelite / tabeli ruumide jaoks ja kĂŒsib vĂ”tme salvestusest. "Puhta" serveri puhul, kus on Master Key - krĂŒptimine peab olema ĂŒks Master Key, mis tuleb salvestusest vĂ€lja vĂ”tta. Kuid vĂ”ib olla vajalik ka rohkem vĂ”tmeid, nĂ€iteks kui varu serverile taastatakse varukoopia pĂ”hiserverilt. Sellistes olukordades tuleks ette nĂ€ha Master Key rotatsioon. Selle kohta kĂ€sitletakse rohkem tulevikes artiklites, kuigi ma tahaksin siin mĂ€rkida, et server, mis kasutab mitmeid Master Key, vĂ”ib kĂ€ivituda veidi kauem, eriti vĂ”tme salvestuse kasutamisel.
NĂŒĂŒd rÀÀgime natuke lĂ€hemalt keyring_file'ist. Kui ma keyring_file'i arendasin, muretsesin ka selle ĂŒle, kuidas kontrollida keyring_file'i muudatusi serveri töö ajal. Versioonis 5.7 tehti kontroll failistatistika alusel, mis ei olnud ideaalne lahendus, ja versioonis 8.0 asendati see SHA256 kontrollsummaga.
Esimese kÀivitamise ajal arvutatakse keyring_file'i statistika ja kontrollsumma, mis salvestatakse serverisse, ning muudatusi rakendatakse ainult siis, kui need vastavad. Faili muutmisel uuendatakse kontrollsummat.
Oleme juba kĂ€sitlenud paljusid teemasid vĂ”tmehoidlate kohta. Kuid on veel ĂŒks oluline teema, mida sageli unustatakse vĂ”i valesti mĂ”istetakse â vĂ”tmete jagamine serverite vahel.
Mida ma silmas pean? Igal serveril (nt Percona Server) klastris peab olema Vault serveris eraldi koht, kus Percona Server peab oma vĂ”tmed hoidma. Igas Vaultis talletatud Master Key sisaldab GUID'i Percona Serveri identifikaatori sees. Miks see oluline on? Kujutage ette, et teil on ainult ĂŒks Vault Server ja kĂ”ik Percona Serverid klastris kasutavad seda ĂŒhte Vault Serverit. Probleem tundub olevat ilmne. Kui kĂ”ik Percona Serverid kasutaksid Master Keyd ilma ainulaadsete identifikaatoriteta, nĂ€iteks id = 1, id = 2 jne, kasutaksid kĂ”ik klastris olevad serverid sama Master Keyd. Mis tagabki GUID â eristuse serverite vahel. Miks siis rÀÀkida vĂ”tmete jagamisest serverite vahel, kui juba eksisteerib ainulaadne GUID? On veel ĂŒks pistikprogramm â keyring_udf. Selle pistikprogrammi abil vĂ”ib teie serveri kasutaja hoida oma vĂ”tmeid Vault serveris. Probleem tekib siis, kui kasutaja loob vĂ”tme, nĂ€iteks serveris server1, ja seejĂ€rel pĂŒĂŒab luua vĂ”tme sama identifikaatoriga serveris server2, nĂ€iteks:
--server1:
select keyring_key_store('ROB_1','AES',"123456789012345");
1
--1 tÀhendab eduka lÔpetamist
--server2:
select keyring_key_store('ROB_1','AES',"543210987654321");
1Palun oodake. MĂ”lemad serverid kasutavad sama Vault Serverit, kas keyring_key_store funktsioon ei tohiks serveris server2 lĂ”petada tĂ”rget? Huvitav, et kui proovite sama teha ĂŒhel serveril, siis saate tĂ”rke:
--server1:
select keyring_key_store('ROB_1','AES',"123456789012345");
1
select keyring_key_store('ROB_1','AES',"543210987654321");
0Ăige, ROB_1 juba eksisteerib.
Arutame kĂ”igepealt teist nĂ€idet. Nagu me varem mainisime, cached keyring_vault vĂ”i mĂ”ni muu salvestuspesa (keyring) kĂ”ik vĂ”tmeidentifikaatorid mĂ€llu. Nii et pĂ€rast uue vĂ”tme loomist lisatakse ROB_1 serverisse server1, ja lisaks sellele, et saata see vĂ”ti Vault'i, lisatakse vĂ”tme ka cache'i. NĂŒĂŒd, kui ĂŒritame sama vĂ”tit teist korda lisada, kontrollib keyring_vault, kas see vĂ”ti on cache'is olemas, ning tagastab tĂ”rke.
Esimeses olukorras on olukord teine. Serveritel server1 ja server2 on eraldi vahemĂ€lud. PĂ€rast ROB_1 klahvi lisamist serveri server1 ja Vault'i vĂ”tme vahemĂ€llu pole serveri server2 vĂ”tme vahemĂ€lu sĂŒnkroonitud. Serveri server2 vahemĂ€lus ei ole klahvi ROB_1. Seega salvestatakse klahv ROB_1 keyring_key_store'isse ja Vault'is, mis tĂ”epoolest kirjutab (!) ĂŒle eelneva vÀÀrtuse. NĂŒĂŒd on klahv ROB_1 Vault'is vĂ”rdne 543210987654321. Huvitav, et Vault ei blokeeri selliseid toiminguid ja kirjutab vanad vÀÀrtused lihtsalt ĂŒle.
NĂŒĂŒd nĂ€eme, miks serverite kaupa eraldamine Vault'is vĂ”ib olla oluline â kui kasutate keyring_udf-d ja soovite klahve Vault'is salvestada. Kuidas tagada selline eraldamine Vault'i serveris?
Vault'i eraldamiseks on kaks vĂ”imalust. Saate iga serveri jaoks luua erinevad montaaĆŸipunktid vĂ”i kasutada erinevaid teid ĂŒhes montaaĆŸipunktis. Parim on seda nĂ€idata nĂ€idete kaudu. Alustame aga eraldi montaaĆŸipunktidest:
--server1:
vault_url = http://127.0.0.1:8200
secret_mount_point = server1_mount
token = (...)
vault_ca = (...)
--server2:
vault_url = http://127.0.0.1:8200
secret_mount_point = server2_mount
token = (...)
vault_ca = (...)Siit on nÀha, et server1 ja server2 kasutavad erinevaid mount-punkte. Tee jagamisel nÀeb konfiguratsioon vÀlja jÀrgmine:
--server1:
vault_url = http://127.0.0.1:8200
secret_mount_point = mount_point/server1
token = (...)
vault_ca = (...)
--server2:
vault_url = http://127.0.0.1:8200
secret_mount_point = mount_point/server2
token = (...)
vault_ca = (...)Selles olukorras kasutavad mĂ”lemad serverid ĂŒhte ja sama mount-punkti âmount_pointâ, kuid erinevaid teid. Kui serveris server1 luuakse esimene saladus sellel teel, loob Vaulti server automaatselt katalooge âserver1â. Server2 puhul on kĂ”ik samamoodi. Kui kustutate viimase saladuse mount_point/server1 vĂ”i mount_point/server2, kustutab Vaulti server samuti need kataloogid. Kui kasutate teede jagamist, peate looma ainult ĂŒhe mount-punkti ja muutma konfiguratsioonifailid nii, et serverid kasutaksid eraldi teid. Mount-punkti saab luua HTTP-pĂ€ringu kaudu. CURL-iga saab seda teha jĂ€rgmiselt:
curl -L -H "X-Vault-Token: TOKEN" --cacert VAULT_CA
--data '{"type":"generic"}' --request POST VAULT_URL/v1/sys/mounts/SECRET_MOUNT_POINTKĂ”ik vĂ€ljad (TOKEN, VAULT_CA, VAULT_URL, SECRET_MOUNT_POINT) vastavad konfiguratsioonifaili nĂ”uetele. Loomulikult on vĂ”imalik kasutada Vault utiliite samu asju teha. Kuid nii on lihtsam automatiseerida montaaĆŸikoha loomist. Loodan, et see teave on teile kasulik ja nĂ€eme jĂ€rgmistes artiklites sellest sarjast.
Loe edasi:
Allikas: habr.com
