Andmete krĂŒpteerimine MySQL-is: vĂ”tmehoidjad

Uue kursuse alguse eelÔhtul Andmebaasid oleme teie jaoks valmistanud tÔlke kasulikust artiklist.

Andmete krĂŒpteerimine MySQL-is: vĂ”tmehoidjad

Ahnustatud andmete krĂŒpteerimine (Transparent Data Encryption, TDE) on ilmnenud Percona Server for MySQL ja MySQLis juba ĂŒsna kaua aega tagasi. Kuid kas olete kunagi mĂ”elnud, kuidas see töötab ning millist mĂ”ju TDE teie serverile avaldab? Selles artiklisarjas vaatame, kuidas TDE töötab sisemiselt. Alustame vĂ”tmete salvestamisest, sest see on vajalik igasuguse krĂŒpteerimise toimimiseks. SeejĂ€rel vaatame lĂ€hemalt, kuidas krĂŒpteerimine töötab Percona Server for MySQLi/MySQLi puhul ja millised lisafunktsioonid on Percona Server for MySQLis.

MySQL Keyring

Keyring on pluginad, mis vĂ”imaldavad serveril kĂŒsida, luua ja kustutada vĂ”tmeid kohalikus failis (keyring_file) vĂ”i kaugserveris (nĂ€iteks HashiCorp Vaultis). VĂ”tmed on alati kohaliku vahemĂ€lu, et kiirendada nende kĂ€tte saamist.

Pluginaid saab jagada kahte kategooriasse:

  • Kohalik salvestus. NĂ€iteks kohalik fail (me nimetame seda failipĂ”hiseks vĂ”tmehoidjaks, file-based keyring).
  • Kaugsalvestus. NĂ€iteks Vault Server (me nimetame seda serveripĂ”hiseks vĂ”tmehoidjaks, server-based keyring).

See jaotus on oluline, kuna erinevad salvestustĂŒĂŒbid kĂ€ituvad veidi erinevalt mitte ainult vĂ”tmete salvestamisel ja kĂ€tte saamisel, vaid ka kĂ€ivitamisel.

Kui kasutatakse failipÔhist vÔtmehoidjat, laaditakse kÀivitamisel vahemÀllu kogu salvestuse sisu: key id, key user, key type ja ise vÔtme.

ServeripĂ”hise hoidla (nt Vault server) puhul laaditakse kĂ€ivitamisel ainult key id ja key user, seega vĂ”tmete hankimine ei aeglusta kĂ€ivitamist. VĂ”tmed laaditakse viivitatud meetodil, st vĂ”tme laaditakse Vaultist alles siis, kui see tĂ”eliselt vajalik on. PĂ€rast laadimist kantakse vĂ”tme vahemĂ€llu, et tulevikus ei oleks vajalik selle hankimiseks TLS-ĂŒhenduse kaudu Vault Serveriga. JĂ€rgmine arutelu kĂ€sitleb, millist teavet vĂ”tmehoidlas leidub.

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ĂŒpteerimisalgoritmil, 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Ă”tme on sĂŒsteemne, nĂ€iteks Master Key, on see vĂ€li tĂŒhi. Kui vĂ”ti luuakse keyring_udf abil, tĂ€histab see vĂ€li vĂ”tme omaniku.
  • ise vĂ”ti

VÔti on selgelt identifitseeritav paariga: key_id, user.

Samuti on erinevusi vÔtmete salvestamises ja kustutamises.

Faili salvestamine töötab kiiremini. Eeldada vĂ”iks, et vĂ”tmete hoidmine on lihtsalt vĂ”tme ĂŒhekorraline salvestamine faili, kuid ei ole - siin toimub rohkem operatsioone. Iga kord, kui faili salvestust muudetakse, luuakse kogu sisu varukoopia. Oletame, et faili nimi on my_biggest_secrets, siis varukoopia nimi on my_biggest_secrets.backup. Edasi muudetakse vahemĂ€lu (lisatakse vĂ”i kustutatakse vĂ”tmed) ja kui kĂ”ik on edukalt tehtud, siis vahemĂ€lu salvestatakse faili. Harvadel juhtudel, nagu serveri rike, vĂ”id nĂ€ha seda varukoopia faili. Varukoopia faili kustutatakse jĂ€rgmise vĂ”tmete laadimise ajal (tavaliselt pĂ€rast serveri taaskĂ€ivitamist).

VĂ”tme salvestamise vĂ”i kustutamise korral serveri hoidlas peab hoidla ĂŒhendust vĂ”tma MySQL serveriga, kasutades kĂ€ske 'saada vĂ”tme' / 'kustu vĂ”tme' ('send the key' / 'request key deletion').

Tagasi minnes serveri kĂ€ivitamise kiiruseni. Peale selle, et salvestus ise mĂ”jutab kĂ€ivitamise kiirus, on ka kĂŒsimus, kui palju vĂ”tmeid peate salvestusest kĂ€ivitamisel saama. Loomulikult on see eriti oluline serveri hoidlate puhul. KĂ€ivitamisel kontrollib server, milline vĂ”ti on vajalik krĂŒpteeritud tabelite / tabeliruumide jaoks ja nĂ”uab vĂ”tme salvestusest. 'Puhas' server, millel on Master Key - krĂŒpteerimisel peab olema ĂŒks Master Key, mis tuleb salvestusest vĂ€lja vĂ”tta. Siiski vĂ”ib olla vajalik ka rohkem vĂ”tmeid, kui nĂ€iteks varu serveris taastatakse varukoopia peamisest serverist. Sellistel juhtudel tuleks ette nĂ€ha Master Key rotatsioon. Selle kohta kĂ€sitletakse rohkem tulevastes artiklites, kuigi siin tahaksin mainida, et server, mis kasutab mitmeid Master Key, vĂ”ib kĂ€ivituda natuke kauem, eriti vĂ”tmehoidla kasutamise korral.

NĂŒĂŒd rÀÀgime veel natuke keyring_file'ist. Kui töötasin keyring_file'i kallal, muretsesin ka selle ĂŒle, kuidas kontrollida keyring_file'i muutumist serveri töö ajal. Versioonis 5.7 toimus kontroll faili statistika pĂ”hjal, mis ei olnud ideaalne lahendus, ja versioonis 8.0 asendati see SHA256 kontrollsummaga.

Esimese kĂ€ivitamise korral arvutatakse keyring_file'i fĂŒĂŒsilise faili statistika ja kontrollsumma, mis salvestatakse serverisse, ning muudatused rakendatakse ainult juhul, kui need kattuvad. Faili muutmisel uuendatakse kontrollsummat.

Oleme juba arutanud paljusid vĂ”tmehoidla kĂŒsimusi. Siiski on veel ĂŒks oluline teema, millele sageli ei pöörata tĂ€helepanu vĂ”i mida mĂ”istetakse valesti — vĂ”tmete jagamine serverite kaupa.

Mida ma sellega silmas pean? Igal serveril (nĂ€iteks Percona Server) klastris peab olema oma eraldi koht Vault serveris, kuhu Percona Server peab oma vĂ”tmed salvestama. Igas vĂ”tmehoidlas hoitavas Master Key's sisaldub GUID Percona Serveri 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 nĂ€ib olevat ilmne. Kui kĂ”ik Percona Serverid kasutaksid Master Key'd ilma ainulaadsete identifikaatoriteta, nĂ€iteks id = 1, id = 2 jne, siis kĂ”ik serverid klastris kasutaksid sama Master Key'd. Just seda tagab GUID — eristamine serverite vahel. Miks siis rÀÀkida vĂ”tmete jagamisest serverite vahel, kui juba on olemas ainulaadne GUID? On veel ĂŒks plugin — keyring_udf. Selle plugina abil saab teie serveri kasutaja hoida oma vĂ”tmeid Vault serveris. Probleem tekib siis, kui kasutaja loob vĂ”tme, nĂ€iteks serveris server1, ja seejĂ€rel proovib luua sama identifikaatoriga vĂ”tme serveris server2, nĂ€iteks:

--server1:
select keyring_key_store('ROB_1','AES',"123456789012345");
1
--1 tÀhistab eduka lÔpuleviimise
--server2:
select keyring_key_store('ROB_1','AES',"543210987654321");
1

Oodake. MĂ”lemad serverid kasutavad sama Vault Serverit, ei peaks keyring_key_store funktsioon serveris server2 lĂ”ppema veaga? Huvitav on see, et kui proovite sama asja teha ĂŒhel serveril, saate vea:

--server1:
select keyring_key_store('ROB_1','AES',"123456789012345");
1
select keyring_key_store('ROB_1','AES',"543210987654321");
0

Õige, ROB_1 on juba olemas.

Arutame kĂ”igepealt teise nĂ€ite. Nagu me varem mainisime, keyring_vault vĂ”i mĂ”ni muu ladu plugin (keyring) salvestab kĂ”ik vĂ”tme identifikaatorid mĂ€llu. Seega, pĂ€rast uue vĂ”tme loomist, ROB_1 lisatakse serverisse server1, ja peale selle vĂ”tme saatmist Vaulti, lisatakse see ka vahemĂ€esse. NĂŒĂŒd, kui proovime sama vĂ”tme teist korda lisada, kontrollib keyring_vault, kas see vĂ”ti on vahemĂ€lus olemas, ja annab veateate.

Esimeses olukorras on olukord teine. Serverites server1 ja server2 on eraldi vahemĂ€lud. PĂ€rast ROB_1 lisamist vĂ”tmete vahemĂ€llu serveris server1 ja Vault serverisse ei sĂŒnkroniseerita vĂ”tmete vahemĂ€lu serveris server2. Serveris server2 ei ole vĂ”tme ROB_1. Seega kirjutatakse vĂ”ti ROB_1 keyring_key_store'i ja Vault serverisse, mis tegelikult kirjutab (!) eelneva vÀÀrtuse ĂŒle. NĂŒĂŒd on Vault serveris vĂ”tme ROB_1 vÀÀrtus vĂ”rdne 543210987654321. Huvitav, et Vault server ei blokeeri selliseid toiminguid ja kirjutab lihtsalt vana vÀÀrtuse ĂŒle.

NĂŒĂŒd nĂ€eme, miks hajutamine serverite kaupa Vaultis vĂ”ib olla oluline — kui kasutate keyring_udf ja soovite ladu hoida Vaultis. Kuidas tagada selline hajutamine Vault serveris?

Vaultis on kaks viisi hajutamiseks. VĂ”ite luua iga serveri jaoks erinevad mount-punkid vĂ”i kasutada erinevaid teid ĂŒhe mount-punkti sees. Parim on seda nĂ€idata nĂ€idete abil. Niisiis, vaatame kĂ”igepealt eraldi mount-punkte:

--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 = sever2_mount
token = (...)
vault_ca = (...)

Siit on nÀha, et server1 ja server2 kasutavad erinevaid mount-punkte. Teede hajutamise korral nÀeb konfigureerimine vÀlja jÀrgmiselt:

--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/sever2
token = (...)
vault_ca = (...)

Antud juhul kasutavad mĂ”lemad serverid sama mount-punkti «mount_point», kuid erinevaid teid. Kui esimese saladuse loomisel serveris server1 sellel teel loob Vault automaatselt katalooge «server1». Serveri server2 puhul on kĂ”ik analoogne. Kui kustutate viimase saladuse mount_point/server1 vĂ”i mount_point/server2-s, kustutab Vault ka need kataloogid. Kui kasutate teede eristamist, peaksite looma ainult ĂŒhe mount-punkti ja muutma konfiguratsiooni faile, et serverid kasutaksid eraldi teid. Mount-punkti saab luua HTTP-pĂ€ringu abil. CURL-i abil 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_POINT

KÔik vÀljad (TOKEN, VAULT_CA, VAULT_URL, SECRET_MOUNT_POINT) vastavad konfiguratsioonifaili parameetritele. Loomulikult saab sama teha Vault utiliitide abil. Kuid mount-punkti loomise automatiseerimine on lihtsam. Loodan, et see teave on teile kasulik ja kohtume jÀrgmistes selle seeria artiklites.

Andmete krĂŒpteerimine MySQL-is: vĂ”tmehoidjad

Loe edasi:

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster