Chidere nan MySQL: Keystore

Nan patisipe nan kòmansman an nan yon nouvo enskripsyon pou kou a "Baz done" Nou te prepare yon tradiksyon yon atik itil pou ou.

Chidere nan MySQL: Keystore

Transparent Data Encryption (TDE) te parèt nan Percona sèvè pou MySQL ak MySQL pou kèk tan. Men, èske ou janm panse sou fason li fonksyone anba kapo a ak ki enpak TDE ka genyen sou sèvè ou a? Nan seri atik sa a nou pral gade ki jan TDE travay anndan an. Ann kòmanse ak depo kle, depi sa a se obligatwa pou nenpòt ki chifreman travay. Lè sa a, nou pral pran yon gade pi pre nan ki jan chifreman travay nan Percona Server for MySQL/MySQL ak ki lòt karakteristik Percona Server for MySQL genyen.

MySQL Keyring

Keyring yo se grefon ki pèmèt sèvè a rechèch, kreye, ak efase kle nan yon dosye lokal (keyring_file) oswa sou yon sèvè aleka (tankou HashiCorp Vault). Kle yo toujou kachèt lokalman pou pi vit rekipere yo.

Plugins yo ka divize an de kategori:

  • Depo lokal yo. Pou egzanp, yon fichye lokal (nou rele sa a yon seri kle ki baze sou dosye).
  • Depo aleka. Pou egzanp, Vault Server (nou rele sa a yon seri kle ki baze sou sèvè).

Separasyon sa a enpòtan paske diferan kalite depo konpòte yo yon ti kras diferan, pa sèlman lè yo estoke ak rekipere kle, men tou lè yo kouri yo.

Lè w ap itilize yon depo dosye, sou demaraj, tout sa ki nan depo a chaje nan kachèt la: id kle, itilizatè kle, kalite kle, ak kle nan tèt li.

Nan ka yon magazen bò sèvè (tankou sèvè vout), sèlman id kle a ak itilizatè kle yo chaje nan demaraj, kidonk jwenn tout kle yo pa ralanti demaraj la. Kle yo chaje parese. Sa vle di, kle nan tèt li chaje soti nan vout sèlman lè li aktyèlman nesesè. Yon fwa telechaje, kle a nan kachèt nan memwa pou li pa bezwen jwenn aksè nan koneksyon TLS ak sèvè Vault la nan lavni. Apre sa, an n gade nan ki enfòmasyon ki prezan nan magazen kle a.

Enfòmasyon kle yo gen bagay sa yo:

  • kle id - idantifyan kle, pou egzanp:
    INNODBKey-764d382a-7324-11e9-ad8f-9cb6d0d5dc99-1
  • kalite kle — Kalite kle ki baze sou algorithm chifreman yo itilize, valè posib: "AES", "RSA" oswa "DSA".
  • longè kle — longè kle an byte, AES: 16, 24 oswa 32, RSA 128, 256, 512 ak DSA 128, 256 oswa 384.
  • itilizatè - pwopriyetè kle a. Si kle a se sistèm, pou egzanp, Master Key, Lè sa a, jaden sa a se vid. Si yo kreye yon kle lè l sèvi avèk keyring_udf, Lè sa a, jaden sa a idantifye pwopriyetè kle a.
  • kle nan tèt li

Se kle a inikman idantifye pa pè a: key_id, itilizatè.

Genyen tou diferans ki genyen nan estoke ak efase kle yo.

Depo dosye se pi vit. Ou ta ka panse ke yon magazen kle se tou senpleman ekri kle a nan yon dosye yon fwa, men non, gen plis pase isit la. Chak fwa yo fè yon modifikasyon depo dosye, yo kreye yon kopi backup tout kontni an premye. Ann di dosye a rele my_biggest_secrets, Lè sa a, kopi backup la pral my_biggest_secrets.backup. Apre sa, kachèt la chanje (kle yo ajoute oswa efase) epi, si tout bagay reyisi, kachèt la reset nan yon dosye. Nan ka ki ra, tankou yon echèk sèvè, ou ka wè dosye backup sa a. Fichye backup la efase pwochen fwa kle yo chaje (anjeneral apre sèvè a rekòmanse).

Lè wap sove oswa efase yon kle nan yon depo sèvè, depo a dwe konekte ak sèvè MySQL la ak kòmandman "voye kle a" / "demann kle efase".

Ann tounen nan vitès demaraj sèvè. Anplis de sa nan lefèt ke vitès la demaraj afekte pa vout nan tèt li, gen tou pwoblèm nan nan konbyen kle nan vout la bezwen yo dwe rekipere nan demaraj. Natirèlman, sa a se espesyalman enpòtan pou depo sèvè. Sou demaraj, sèvè a tcheke ki kle ki nesesè pou tab chiffré/espas tab epi li mande kle a nan depo a. Sou yon sèvè "pwòp" ak chifreman Master Key, dwe gen yon sèl Master Key, ki dwe rekipere nan depo. Sepandan, yo ka mande yon pi gwo kantite kle, pou egzanp, lè sèvè backup la ap restore yon backup soti nan sèvè prensipal la. Nan ka sa yo, yo ta dwe bay wotasyon Kle Mèt la. Sa a pral kouvri an plis detay nan atik nan lavni, byenke isit la mwen ta renmen sonje ke yon sèvè ki sèvi ak plizyè Kle Mèt ka pran yon ti tan ankò pou kòmanse, espesyalman lè w ap itilize yon magazen kle bò sèvè.

Koulye a, ann pale yon ti kras plis sou keyring_file. Lè m 'te devlope keyring_file, mwen te tou konsène sou ki jan yo tcheke pou keyring_file chanjman pandan sèvè a ap kouri. Nan 5.7, chèk la te fèt ki baze sou estatistik dosye, ki pa t 'yon solisyon ideyal, ak nan 8.0 li te ranplase ak yon checksum SHA256.

Premye fwa ou kouri keyring_file, estatistik dosye ak yon sòm chèk yo kalkile, ke yo sonje pa sèvè a, epi chanjman yo aplike sèlman si yo matche. Lè dosye a chanje, checksum la mete ajou.

Nou te deja kouvri anpil kesyon sou vout kle yo. Sepandan, gen yon lòt sijè enpòtan ki souvan bliye oswa mal konprann: pataje kle atravè serveurs.

Kisa mwen vle di? Chak sèvè (pa egzanp, Percona Server) nan gwoup la dwe gen yon kote apa sou sèvè Vault la kote Percona Server dwe estoke kle li yo. Chak Kle Mèt ki te sove nan depo a gen GUID Sèvè Percona a nan idantifyan li yo. Poukisa li enpòtan? Imajine ke ou gen yon sèl Sèvè Vault ak tout Sèvè Percona nan gwoup la sèvi ak yon sèl Sèvè Vault sa a. Pwoblèm nan sanble evidan. Si tout sèvè Percona te itilize yon Kle Mèt san idantifyan inik, tankou id = 1, id = 2, elatriye, Lè sa a, tout sèvè nan gwoup la ta itilize menm Kle Mèt la. Ki sa ki GUID bay se distenksyon ki genyen ant serveurs. Poukisa Lè sa a, pale sou pataje kle ant sèvè si yon GUID inik deja egziste? Gen yon lòt plugin - keyring_udf. Avèk Plugin sa a, itilizatè sèvè ou a ka estoke kle yo sou sèvè Vault la. Pwoblèm nan rive lè yon itilizatè kreye yon kle sou server1, pou egzanp, epi Lè sa a, eseye kreye yon kle ak menm ID sou server2, pou egzanp:

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

Tann. Tou de sèvè yo ap itilize menm sèvè Vault la, èske fonksyon keyring_key_store pa ta dwe echwe sou server2? Enteresan, si ou eseye fè menm bagay la sou yon sèl sèvè, ou pral resevwa yon erè:

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

Se vre, ROB_1 deja egziste.

Ann diskite sou dezyèm egzanp lan an premye. Kòm nou te di pi bonè, keyring_vault oswa nenpòt lòt plugin keyring kachèt tout ID kle nan memwa. Se konsa, apre yo fin kreye yon nouvo kle, yo ajoute ROB_1 nan server1, epi anplis voye kle sa a nan Vault, yo ajoute kle a tou nan kachèt la. Kounye a, lè nou eseye ajoute menm kle a yon dezyèm fwa, keyring_vault tcheke si kle a egziste nan kachèt la epi voye yon erè.

Nan premye ka a sitiyasyon an diferan. Sèvè1 ak sèvè2 gen kachèt separe. Apre w fin ajoute ROB_1 nan kachèt kle sou sèvè 1 ak sèvè Vault la, kachèt kle sou sèvè 2 a pa senkronize. Pa gen okenn kle ROB_2 nan kachèt la sou server1. Kidonk, kle ROB_1 ekri nan keyring_key_store ak nan sèvè Vault la, ki aktyèlman ranplase (!) valè anvan an. Koulye a, kle ROB_1 sou sèvè Vault la se 543210987654321. Enteresan, sèvè Vault la pa bloke aksyon sa yo epi byen fasil ranplase ansyen valè a.

Koulye a, nou ka wè poukisa patisyon sèvè nan Vault ka enpòtan - lè w ap itilize keyring_udf epi ou vle sere kle nan Vault. Ki jan yo reyalize separasyon sa a sou yon sèvè Vault?

Gen de fason pou patisyon nan Vault. Ou ka kreye diferan pwen mòn pou chak sèvè, oswa itilize diferan chemen nan menm pwen mòn lan. Sa a pi byen ilistre ak egzanp. Se konsa, ann gade pwen mòn endividyèl yo an premye:

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

Isit la ou ka wè ke server1 ak server2 ap itilize diferan pwen mòn. Lè divize chemen yo, konfigirasyon an ap gade jan sa a:

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

Nan ka sa a, tou de serveurs itilize menm pwen mòn "mount_point", men chemen diferan. Lè ou kreye premye sekrè sou sèvè 1 lè l sèvi avèk chemen sa a, sèvè Vault la otomatikman kreye yon anyè "sèvè1". Pou server2 tout bagay sanble. Lè ou efase dènye sekrè a nan mount_point/server1 oswa mount_point/server2, sèvè Vault la tou efase anyè sa yo. Nan ka ou itilize separasyon chemen, ou ta dwe kreye yon sèl pwen mòn epi chanje dosye konfigirasyon yo pou serveurs yo sèvi ak chemen separe. Yon pwen mòn ka kreye lè l sèvi avèk yon demann HTTP. Sèvi ak CURL sa a ka fè tankou sa a:

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

Tout jaden (TOKEN, VAULT_CA, VAULT_URL, SECRET_MOUNT_POINT) koresponn ak paramèt fichye konfigirasyon an. Natirèlman, ou ka itilize sèvis piblik Vault pou fè menm bagay la. Men, li pi fasil pou otomatize kreyasyon yon pwen mòn. Mwen espere ou jwenn enfòmasyon sa yo itil epi nou pral wè ou nan pwochen atik yo nan seri sa a.

Chidere nan MySQL: Keystore

Li piplis:

Sous: www.habr.com

Add nouvo kòmantè