Kriptimi nĂ« MySQL: pĂ«rdorimi i ÇelĂ«sit Kryesor

Në prag të fillimit të një grupi të ri për kursin «Baza të dhënash» vazhdojmë të publikojmë një seri artikujsh mbi enkriptimin në MySQL.

Kriptimi nĂ« MySQL: pĂ«rdorimi i ÇelĂ«sit Kryesor

Në artikullin e kaluar të kësaj serie (Kriptimi në MySQL: depoja e çelësave) folëm për magazinat e çelësave. Në këtë artikull do të shqyrtojmë se si përdoret çelësi kryesor (master key), si dhe do të diskutojmë për avantazhet dhe disavantazhet e enkriptimit me metodën e enëve (envelope encryption). 

Ideja e enkriptimit me enë është që çelësat e përdorur për enkriptim (çelësa të tabelave) enkriptohen me një çelës tjetër (çelësi kryesor, master key). Për enkriptimin e të dhënave, në fakt, përdoren çelësat e tabelave. Kjo mund të paraqitet grafikisht si:

Kriptimi nĂ« MySQL: pĂ«rdorimi i ÇelĂ«sit Kryesor

ÇelĂ«si kryesor (master key) Ă«shtĂ« nĂ« magazinĂ«n e çelĂ«save (keyring), ndĂ«rsa çelĂ«sat e tabelave janĂ« nĂ« titujt e tabelave tĂ« enkriptura (nĂ« faqen 0 tĂ« tabelĂ«s). 

Në figurën më sipër:

  • Tabeli A Ă«shtĂ« enkriptuar me çelĂ«sin 1 (Key 1). ÇelĂ«si 1 Ă«shtĂ« enkriptuar me çelĂ«sin kryesor (master key) dhe ruhet nĂ« formĂ« tĂ« enkriptuar nĂ« titullin e tabelit A.

  • Tabeli B Ă«shtĂ« enkriptuar me çelĂ«sin 2 (Key 2). ÇelĂ«si 2 Ă«shtĂ« enkriptuar me çelĂ«sin kryesor (master key) dhe ruhet nĂ« formĂ« tĂ« enkriptuar nĂ« titullin e tabelit B.

  • Dhe kĂ«shtu me radhĂ«.

Kur serveri ka nevojĂ« tĂ« dekriptojĂ« tabelĂ«n A, ai merr çelĂ«sin kryesor nga depoja, lexon çelĂ«sin e enkriptuar 1 nga titulli i tabelĂ«s A dhe dekripton çelĂ«sin 1. ÇelĂ«si i dekriptuar 1 ruhet nĂ« memorien e serverit dhe pĂ«rdoret pĂ«r dekriptimin e tabelĂ«s A.

InnoDB

Në InnoDB, enkriptimi dhe dekriptimi realizohen në nivelin e hyrjes-daljes. Kjo do të thotë se faqja enkriptohet menjëherë para se të shkarkohet në disk dhe dekriptohet menjëherë pas leximit nga disku.

Në InnoDB, enkriptimi funksionon vetëm në nivelin e hapësirave të tabelave. Dhe si rregull, të gjitha tabelat krijohen në hapësira të veçanta tabelash (file-per-table tablespace). Duke folur ndryshe, krijohet një hapësirë tabelash që mund të përmbajë vetëm një tabelë. Megjithatë, ju gjithashtu mund të krijoni tabela në hapësirën e përgjithshme të tabelave (general tablespace). Por çdo rast, tabela gjithmonë ndodhet në ndonjë hapësirë tabelash. Dhe për shkak se enkriptingu kryhet në nivelin e hapësirës tabelore, ajo është ose e gjithë e enkriptuar, ose jo. Do të thotë se në hapësirën kryesore tabelore nuk mund të enkriptohet vetëm një pjesë e tabelave. 

Nëse për ndonjë arsye keni çaktivizuar file-per-table, të gjitha tabelat krijohen brenda hapësirës tabelore sistematike (system tablespace). Në Percona Server për MySQL hapësirën tabelore sistematike mund të enkriptohet me anë të variablës innodbsystablespaceencrypt ose duke përdorur rrjedha enkriptimi (encryption threads), por kjo është ende një funksion eksperimental. Kjo nuk ndodhet në MySQL.

Para se të vazhdojmë, na nevojitet të shqyrtojmë strukturën e identifikuesit të çelësit kryesor (master key ID). Ai përbëhet nga UUID, KEYID dhe prefiksi «INNODBKey». Kjo duket kështu: INNODBKey-UUID-KEYID.

UUID — Ă«shtĂ« uuid i serverit me hapĂ«sirĂ«n tabelore tĂ« enkriptuar. KEYID — Ă«shtĂ« vetĂ«m njĂ« vlerĂ« qĂ« rritet vazhdimisht. NĂ« krijimin fillestar tĂ« çelĂ«sit kryesor, KEYID Ă«shtĂ« e barabartĂ« me 1. NĂ« rrotullimin e çelĂ«sit, kur krijohet njĂ« çelĂ«s i ri kryesor, KEYID = 2 dhe kĂ«shtu me radhĂ«. NĂ« vazhdim do tĂ« flasim mĂ« nĂ« detaje pĂ«r rotacionin e çelĂ«save kryesorĂ« nĂ« artikujt e tjerĂ« tĂ« kĂ«saj serie.

Tani që dimë se si duket identifikuesi i çelësit kryesor, le të shikojmë titullin e hapësirës së tabelave të enkriptuara. Kur hapësira e tabelave është e enkriptuar, informacioni mbi enkriptimin i shtohet titullit. Kjo duket si më poshtë:

Kriptimi nĂ« MySQL: pĂ«rdorimi i ÇelĂ«sit Kryesor

ÇELSI ID — Ă«shtĂ« ÇELSIID nga identifikuesi i çelĂ«sit kryesor, i cili Ă«shtĂ« diskutuar mĂ« parĂ«. UUID Ă«shtĂ« uuid i serverit, i cili gjithashtu pĂ«rdoret nĂ« identifikuesin e çelĂ«sit kryesor. ÇELSI I HAPËSIRËS SË TABELAVE — Ă«shtĂ« çelĂ«si i hapĂ«sirĂ«s sĂ« tabelave, i cili pĂ«rbĂ«het nga 256 bit, tĂ« gjeneruar rastĂ«sisht nga serveri. Vektori i inicializimit (IV, initialization vector) gjithashtu pĂ«rbĂ«het nga 256 bit tĂ« gjeneruar rastĂ«sisht (ndonĂ«se duhet tĂ« jetĂ« 128 bit). IV pĂ«rdoret pĂ«r tĂ« inicializuar enkriptime dhe dekriptime AES (nga 256 bit, pĂ«rdoren vetĂ«m 128). NĂ« fund, prihet njĂ« kontrollues CRC32 pĂ«r ÇELSIN E HAPËSIRËS SË TABELAVE dhe IV.

Gjatë gjithë këtij kohë kam thënë pak më thjesht që në titull ka një çelës të koduar të hapësirës së tabelës. Në të vërtetë, çelësi i hapësirës së tabelës dhe vektori i inicializimit ruhen dhe kodohen së bashku me çelësin kryesor. Kini parasysh se para se të kodohen çelësi i hapësirës së tabelës dhe vektori i inicializimit, për to llogaritet CRC32.

Pse është e nevojshme CRC32?

Nëse e shprehim në dy fjalë, që të sigurohemi për vlefshmërinë e çelësit kryesor. Pas çkodimit të çelësit të hapësirës së tabelës dhe vektorit të inicializimit, llogaritet një shumë kontrolli dhe krahasohet me CRC32-në e ruajtur në titull. Nëse shumat e kontrollit përputhen, atëherë kemi çelësin kryesor të duhur dhe çelësin e hapësirës së tabelës. Në të kundërt, hapësira e tabelës shënohet si e munguar (ndonëse ende nuk do të mund ta çkodojmë).

Mund tĂ« pyesni: nĂ« cilin moment kryhet verifikimi i çelĂ«save? PĂ«rgjigja Ă«shtĂ« — gjatĂ« nisjes sĂ« serverit. Serveri me tabela tĂ« koduara / hapĂ«sira tabelash lexon UUID-nĂ«, KEY nĂ« fillim.ID nga titulli dhe gjeneron identifikuesin e çelĂ«sit kryesor. Pastaj, ai merr çelĂ«sin kryesor tĂ« nevojshĂ«m nga depoja (keyring), çelon çelĂ«sin e hapĂ«sirĂ«s sĂ« tabelĂ«s dhe kontrollon shenjĂ«n e kontrollit. PĂ«rsĂ«ri, nĂ«se shenja e kontrollit pĂ«rputhet, gjithçka Ă«shtĂ« nĂ« rregull, nĂ«se jo — hapĂ«sira e tabelĂ«s shĂ«nohet si e munguar.

Nëse keni lexuar artikullin e kaluar të kësaj serie (Kriptimi në MySQL: depoja e çelësave), mund të mbani mend se kur përdoret depoja e çelësave në server, serveri, në fillim, merr vetëm listën e identifikuesve të çelësave, më saktësisht, key id dhe user id, pasi kjo çift e identifikon qartë çelësin. Dhe tani po them, se serveri, në fillim, merr të gjithë çelësat e nevojshëm për verifikimin e mundësisë për të çelësuar çelësat e hapësirave të tabelave. Pra, pse gjatë inicializimit, në rastin e depojes së çelësit në server, ngarkohen vetëm keyid dhe userid, dhe jo të gjitha çelësat? Sepse ndoshta nuk keni nevojë për të gjithë çelësat. Kjo kryesisht lidhet me rotacionin e çelësit kryesor. Kur çelësi kryesor rotullohet në magazinë, krijohet një çelës i ri kryesor, por çelësat e vjetër nuk fshihen. Prandaj, në magazinën e serverit të çelësave mund të keni shumë çelësa që nuk i nevojiten serverit dhe, si pasojë, nuk nxirren gjatë aktivizimit të serverit.

Ka ardhur koha për të biseduar pak për avantazhet dhe disavantazhet e enkriptimit duke përdorur çelësin kryesor. Avantazhi më i madh është se ju nevojitet vetëm një çelës enkriptimi (çelësi kryesor), që do të ruhet veçmas nga të dhënat tuaja të enkriptuara. Kjo e bën aktivizimin e serverit të shpejtë, dhe magazinën të vogël, gjë që e lehtëson menaxhimin. Dhe gjithashtu çelësi kryesor i vetëm është lehtësisht i riparueshëm.

Megjithatë, enkriptimi me çelësin kryesor ka një të metë të madhe: një herë që hapësira e tabelave është enkriptuar me tablespace_key, ajo mbetet gjithmonë e enkriptuar me të njëjtin çelës. Rrotullimi i çelësit kryesor këtu nuk ndihmon. Pse është kjo një e metë? Ne e dimë se në MySQL ka bugs që mund të çojnë në dështim të papritur dhe krijimin e një skedari core. Duke qenë se skedari core përmban një dump të memories së serverit, mund të ndodhë që në dump të ketë çelësin e enkriptuar të hapësirës së tabelave. Ajo që është edhe më e keqe, çelësat e enkriptuar të hapësirës së tabelave ruhen në memory, e cila mund të swap në disk. Mund të thoni se kjo nuk është një e metë, pasi ju nevojiten të drejtat root për të aksesuar këto skedarë dhe seksionin e swap. Po, por root është i nevojshëm vetëm për një kohë të shkurtër. Sa herë që dikush të ketë akses në çelësin e enkriptuar të hapësirës së tabelave, ai/ajo do të jetë në gjendje ta përdorë atë për të dekoduar të dhënat, madje pa pasur nevojë për të drejtat root. Për më tepër, disku mund të vidhet, dhe skedarët e swapit/core mund të lexohen me ndihmën e mjeteve të jashtme. Qëllimi i TDE është ta bëjë atë të padukshëm, edhe nëse disku vidhet. Percona Server për MySQL ka mundësi për rishifrimin e hapësirës tablike me çelësa të rinj të gjeneruar. Kjo funksion quhet rrjedha e enkriptimit (encryption threads) dhe në momentin e shkruajtjes së këtij artikulli ende përfundimisht është eksperimentale.

Mëso më shumë për kursin

Lexoni më shumë:

Burimi: habr.com

Bli njĂ« hosting tĂ« besueshĂ«m pĂ«r faqet me mbrojtje DDoS, VPS VDS serverĂ« đŸ”„ Bli njĂ« hosting tĂ« besueshĂ«m pĂ«r faqet me mbrojtje DDoS, VPS VDS serverĂ« | ProHoster