Ìsekóòdù ni MySQL: Keystore

Ni ifojusona ti ibẹrẹ iforukọsilẹ tuntun fun iṣẹ-ẹkọ naa "Ibi ipamọ data" A ti pese itumọ ọrọ ti o wulo fun ọ.

Ìsekóòdù ni MySQL: Keystore

Sihin Data ìsekóòdù (TDE) han ni Olupin Percona fun MySQL ati MySQL fun igba diẹ. Ṣugbọn ṣe o ti ronu nipa bi o ṣe n ṣiṣẹ labẹ iho ati ipa wo ni TDE le ni lori olupin rẹ? Ninu jara ti awọn nkan a yoo wo bii TDE ṣe n ṣiṣẹ ni inu. Jẹ ki a bẹrẹ pẹlu ibi ipamọ bọtini, nitori eyi ni a nilo fun eyikeyi fifi ẹnọ kọ nkan lati ṣiṣẹ. Lẹhinna a yoo wo diẹ sii bi fifi ẹnọ kọ nkan ṣe ṣiṣẹ ni Percona Server fun MySQL/MySQL ati kini awọn ẹya afikun Percona Server fun MySQL ni.

MySQL Keyring

Keyring jẹ awọn afikun ti o gba olupin laaye lati beere, ṣẹda, ati paarẹ awọn bọtini ni faili agbegbe kan (keyring_file) tabi lori olupin latọna jijin (gẹgẹbi HashiCorp Vault). Awọn bọtini ti wa ni ipamọ nigbagbogbo ni agbegbe lati yara imupadabọ wọn.

Awọn afikun le pin si awọn ẹka meji:

  • Ibi ipamọ agbegbe. Fun apẹẹrẹ, faili agbegbe (a pe eyi ni bọtini bọtini orisun faili).
  • Ibi ipamọ latọna jijin. Fun apẹẹrẹ, olupin ifinkan (a pe eyi ni bọtini bọtini orisun olupin).

Iyapa yii jẹ pataki nitori awọn oriṣiriṣi oriṣiriṣi ti ibi ipamọ huwa ni iyatọ diẹ, kii ṣe nigba titoju ati gbigba awọn bọtini pada nikan, ṣugbọn tun nigba ṣiṣe wọn.

Nigbati o ba nlo ibi ipamọ faili kan, ni ibẹrẹ, gbogbo awọn akoonu inu ibi ipamọ naa ni a kojọpọ sinu kaṣe: id bọtini, olumulo bọtini, iru bọtini, ati bọtini funrararẹ.

Ninu ọran ti ile itaja ẹgbẹ olupin kan (bii olupin Vault), nikan bọtini id ati olumulo bọtini ni a kojọpọ ni ibẹrẹ, nitorinaa gbigba gbogbo awọn bọtini ko fa fifalẹ ibẹrẹ naa. Awọn bọtini ti wa ni ti kojọpọ ọlẹ. Iyẹn ni, bọtini funrararẹ ti kojọpọ lati ifinkan nikan nigbati o nilo gangan. Ni kete ti o ti ṣe igbasilẹ, bọtini ti wa ni ipamọ ni iranti ki o ko nilo lati wọle nipasẹ awọn asopọ TLS si olupin Vault ni ọjọ iwaju. Nigbamii, jẹ ki a wo iru alaye ti o wa ninu ile itaja bọtini.

Alaye bọtini ni awọn wọnyi:

  • bọtini id - idanimọ bọtini, fun apẹẹrẹ:
    INNODBKey-764d382a-7324-11e9-ad8f-9cb6d0d5dc99-1
  • oriṣi bọtini - oriṣi bọtini ti o da lori algorithm fifi ẹnọ kọ nkan ti a lo, awọn iye to ṣeeṣe: “AES”, “RSA” tabi “DSA”.
  • ipari bọtini - ipari bọtini ni awọn baiti, AES: 16, 24 tabi 32, RSA 128, 256, 512 ati DSA 128, 256 tabi 384.
  • olumulo - eni ti bọtini. Ti bọtini ba jẹ eto, fun apẹẹrẹ, Titunto si Key, lẹhinna aaye yii jẹ ofo. Ti bọtini kan ba ṣẹda nipa lilo keyring_udf, lẹhinna aaye yii ṣe idanimọ ẹniti o ni bọtini naa.
  • bọtini funrararẹ

Bọtini naa jẹ idanimọ ni iyasọtọ nipasẹ bata: key_id, olumulo.

Awọn iyatọ tun wa ninu fifipamọ ati piparẹ awọn bọtini.

Ibi ipamọ faili yiyara. O le ro pe ile itaja bọtini kan n kọ bọtini si faili lẹẹkan, ṣugbọn rara, diẹ sii n lọ nibi. Nigbakugba ti iyipada ibi ipamọ faili kan ṣe, ẹda afẹyinti ti gbogbo akoonu ni a kọkọ ṣẹda. Jẹ ki a sọ pe faili naa ni a pe ni my_biggest_secrets, lẹhinna ẹda afẹyinti yoo jẹ my_biggest_secrets.backup. Nigbamii ti, kaṣe ti yipada (awọn bọtini ti wa ni afikun tabi paarẹ) ati, ti ohun gbogbo ba ṣaṣeyọri, kaṣe naa ti tunto si faili kan. Ni awọn iṣẹlẹ ti o ṣọwọn, gẹgẹbi ikuna olupin, o le rii faili afẹyinti yii. Faili afẹyinti ti paarẹ nigbamii ti awọn bọtini ba ti kojọpọ (nigbagbogbo lẹhin ti olupin ti tun bẹrẹ).

Nigbati o ba fipamọ tabi piparẹ bọtini kan ni ibi ipamọ olupin, ibi ipamọ gbọdọ sopọ si olupin MySQL pẹlu awọn aṣẹ “firanṣẹ bọtini” / “piparẹ bọtini ibere”.

Jẹ ki a pada si iyara ibẹrẹ olupin. Ni afikun si otitọ pe iyara ifilọlẹ naa ni ipa nipasẹ ifinkan funrararẹ, ọrọ tun wa ti iye awọn bọtini lati inu ifinkan nilo lati gba pada ni ibẹrẹ. Dajudaju, eyi ṣe pataki fun ibi ipamọ olupin. Ni ibẹrẹ, olupin n ṣayẹwo bọtini wo ni o nilo fun awọn tabili ti paroko/awọn aaye tabili ati beere bọtini lati ibi ipamọ naa. Lori olupin “mimọ” pẹlu fifi ẹnọ kọ nkan Titunto, gbọdọ jẹ bọtini Titunto kan, eyiti o gbọdọ gba pada lati ibi ipamọ. Sibẹsibẹ, nọmba ti o tobi ju ti awọn bọtini le nilo, fun apẹẹrẹ, nigbati olupin afẹyinti ba n mu afẹyinti pada lati olupin akọkọ. Ni iru awọn igba bẹẹ, yiyi bọtini Titunto yẹ ki o pese. Eyi yoo ni alaye diẹ sii ni awọn nkan iwaju, botilẹjẹpe nibi Emi yoo fẹ lati ṣe akiyesi pe olupin ti o nlo Awọn bọtini Titunto pupọ le gba diẹ diẹ sii lati bẹrẹ, paapaa nigba lilo ile itaja bọtini ẹgbẹ olupin kan.

Bayi jẹ ki a sọrọ diẹ si nipa keyring_file. Nigbati mo n ṣe idagbasoke keyring_file, Mo tun ṣe aniyan nipa bi a ṣe le ṣayẹwo fun awọn ayipada keyring_file nigba ti olupin n ṣiṣẹ. Ni 5.7, a ṣe ayẹwo ayẹwo ti o da lori awọn iṣiro faili, eyiti kii ṣe ojutu ti o dara julọ, ati ni 8.0 o ti rọpo pẹlu SHA256 checksum.

Ni igba akọkọ ti o ba ṣiṣẹ keyring_file, awọn iṣiro faili ati checksum jẹ iṣiro, eyiti olupin ranti, ati pe awọn ayipada nikan ni a lo ti wọn ba baamu. Nigbati faili ba yipada, a ṣe imudojuiwọn checksum.

A ti bo ọpọlọpọ awọn ibeere tẹlẹ nipa awọn ifinkan bọtini. Sibẹsibẹ, koko-ọrọ pataki miiran wa ti o gbagbe nigbagbogbo tabi ko loye: awọn bọtini pinpin kaakiri awọn olupin.

Kini mo tumọ si? Olupin kọọkan (fun apẹẹrẹ, Percona Server) ninu iṣupọ gbọdọ ni ipo ọtọtọ lori olupin Vault ninu eyiti Percona Server gbọdọ tọju awọn bọtini rẹ. Bọtini Titunto kọọkan ti a fipamọ sinu ibi ipamọ ni GUID ti olupin Percona ninu idamo rẹ ninu. Kini idi ti o ṣe pataki? Fojuinu pe o ni olupin Vault kanṣoṣo ati gbogbo awọn olupin Percona ninu iṣupọ lo olupin Vault nikan yẹn. Iṣoro naa dabi gbangba. Ti gbogbo awọn olupin Percona ba lo bọtini Titunto laisi awọn idamọ alailẹgbẹ, gẹgẹbi id = 1, id = 2, ati bẹbẹ lọ, lẹhinna gbogbo awọn olupin inu iṣupọ yoo lo bọtini Titunto kanna. Ohun ti GUID pese ni iyatọ laarin awọn olupin. Kilode ti o sọrọ nipa awọn bọtini pinpin laarin awọn olupin ti GUID alailẹgbẹ wa tẹlẹ? Ohun itanna miiran wa - keyring_udf. Pẹlu ohun itanna yii, olumulo olupin rẹ le fi awọn bọtini wọn pamọ sori olupin Vault. Iṣoro naa nwaye nigbati olumulo kan ṣẹda bọtini kan lori olupin1, fun apẹẹrẹ, ati lẹhinna gbiyanju lati ṣẹda bọtini kan pẹlu ID kanna lori olupin2, fun apẹẹrẹ:

--server1:
select keyring_key_store('ROB_1','AES',"123456789012345");
1
--1 значит успешное завершение
--server2:
select keyring_key_store('ROB_1','AES',"543210987654321");
1

Duro. Awọn olupin mejeeji nlo olupin ifinkan kanna, ko yẹ ki iṣẹ keyring_key_store kuna lori olupin2? O yanilenu, ti o ba gbiyanju lati ṣe kanna lori olupin kan, iwọ yoo gba aṣiṣe kan:

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

Iyẹn tọ, ROB_1 ti wa tẹlẹ.

Jẹ́ ká kọ́kọ́ jíròrò àpẹẹrẹ kejì. Gẹgẹbi a ti sọ tẹlẹ, keyring_vault tabi eyikeyi ohun itanna keyring miiran ti ṣafipamọ gbogbo awọn ID bọtini ni iranti. Nitorina, lẹhin ṣiṣẹda bọtini titun, ROB_1 ti wa ni afikun si olupin1, ati ni afikun si fifiranṣẹ bọtini yii si Vault, bọtini naa tun wa ni afikun si kaṣe naa. Ni bayi, nigba ti a ba gbiyanju lati ṣafikun bọtini kanna ni akoko keji, keyring_vault ṣayẹwo boya bọtini naa wa ninu kaṣe ati jabọ aṣiṣe kan.

Ninu ọran akọkọ, ipo naa yatọ. Server1 ati olupin2 ni awọn caches lọtọ. Lẹhin fifi ROB_1 kun si kaṣe bọtini lori olupin1 ati olupin Vault, kaṣe bọtini lori olupin2 ko ni amuṣiṣẹpọ. Ko si bọtini ROB_2 ninu kaṣe lori olupin1. Nitorinaa, bọtini ROB_1 ti kọ si keyring_key_store ati si olupin Vault, eyiti o tun kọ (!) iye ti tẹlẹ. Bayi bọtini ROB_1 lori olupin Vault jẹ 543210987654321. O yanilenu, olupin Vault ko ṣe idiwọ iru awọn iṣe bẹẹ ati ni irọrun kọ iye atijọ.

Bayi a le rii idi ti ipinpin olupin ni Vault le ṣe pataki - nigbati o ba nlo keyring_udf ati pe o fẹ lati tọju awọn bọtini ni Vault. Bii o ṣe le ṣaṣeyọri ipinya yii lori olupin Vault kan?

Awọn ọna meji lo wa lati pin si Vault. O le ṣẹda awọn oriṣiriṣi awọn aaye oke fun olupin kọọkan, tabi lo awọn ọna oriṣiriṣi laarin aaye oke kanna. Eyi jẹ apejuwe ti o dara julọ pẹlu awọn apẹẹrẹ. Nitorinaa jẹ ki a wo awọn aaye oke kọọkan ni akọkọ:

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

Nibi o le rii pe olupin1 ati olupin2 nlo awọn aaye oke oriṣiriṣi. Nigbati o ba pin awọn ọna, iṣeto naa yoo dabi eyi:

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

Ni idi eyi, awọn olupin mejeeji lo aaye oke kanna "mount_point", ṣugbọn awọn ọna oriṣiriṣi. Nigbati o ba ṣẹda aṣiri akọkọ lori olupin1 nipa lilo ọna yii, olupin ifinkan ṣẹda itọsọna “server1” laifọwọyi. Fun server2 ohun gbogbo ni iru. Nigbati o ba pa aṣiri ti o kẹhin rẹ ni mount_point/server1 tabi mount_point/server2, olupin Vault tun npa awọn ilana naa. Ni irú ti o lo iyapa ọna, o gbọdọ ṣẹda nikan kan òke ojuami ki o si yi awọn iṣeto ni awọn faili ki awọn olupin lo lọtọ ototo. A le ṣẹda aaye oke kan nipa lilo ibeere HTTP kan. Lilo CURL eyi le ṣee ṣe bi eleyi:

curl -L -H "X-Vault-Token: TOKEN" –cacert VAULT_CA
--data '{"type":"generic"}' --request POST VAULT_URL/v1/sys/mounts/SECRET_MOUNT_POINT

Gbogbo awọn aaye (TOKEN, VAULT_CA, VAULT_URL, SECRET_MOUNT_POINT) ṣe deede si awọn aye ti faili iṣeto. Nitoribẹẹ, o le lo awọn ohun elo Vault lati ṣe kanna. Ṣugbọn o rọrun lati ṣe adaṣe adaṣe ti aaye oke kan. Mo nireti pe alaye yii wulo ati pe a yoo rii ọ ni awọn nkan atẹle ninu jara yii.

Ìsekóòdù ni MySQL: Keystore

Ka siwaju:

orisun: www.habr.com

Fi ọrọìwòye kun