Рамзгузорӣ дар MySQL: Мағозаи калидҳо

Дар интизори оғози қабули нав барои курс "Махзани маълумот" Мо тарҷумаи мақолаи муфидро барои шумо омода кардем.

Рамзгузорӣ дар MySQL: Мағозаи калидҳо

Encryption Data Transparent (TDE) дар Сервери Percona барои MySQL ва MySQL барои муддати хеле зиёд. Аммо оё шумо ягон бор фикр кардаед, ки он чӣ гуна дар зери сарпӯш кор мекунад ва TDE метавонад ба сервери шумо чӣ таъсир расонад? Дар ин силсила мақолаҳо мо дида мебароем, ки чӣ тавр TDE дар дохили он кор мекунад. Биёед аз нигоҳдории калид оғоз кунем, зеро ин барои кор кардани ҳама рамзгузорӣ лозим аст. Сипас, мо муфассалтар дида мебароем, ки рамзгузорӣ дар сервери Percona барои MySQL/MySQL чӣ гуна кор мекунад ва чӣ гуна хусусиятҳои иловагии Percona Server барои MySQL дорад.

Калидҳои MySQL

Калидҳо плагинҳо мебошанд, ки ба сервер имкон медиҳанд калидҳоро дар файли маҳаллӣ (keyring_file) ё сервери дурдаст (ба монанди HashiCorp Vault) дархост, эҷод ва нест кунанд. Калидҳо ҳамеша ба таври маҳаллӣ кэш карда мешаванд, то ҷустуҷӯи онҳоро суръат бахшанд.

Плагинҳоро ба ду категория тақсим кардан мумкин аст:

  • Захираи маҳаллӣ. Масалан, файли маҳаллӣ (мо инро калидҳои ба файл асосёфта меномем).
  • Нигоҳдории дурдаст. Масалан, сервери Vault (мо инро калидҳои ба сервер асосёфта меномем).

Ин ҷудокунӣ муҳим аст, зеро намудҳои гуногуни нигаҳдорӣ на танҳо ҳангоми нигоҳдорӣ ва дарёфти калидҳо, балки ҳангоми иҷро кардани онҳо каме фарқ мекунанд.

Ҳангоми истифодаи нигаҳдории файл, ҳангоми оғозёбӣ, тамоми мундариҷаи нигаҳдорӣ ба кэш бор карда мешавад: ID калид, корбари калидӣ, навъи калид ва худи калид.

Дар мавриди мағозаи сервер (масалан, сервери Vault), ҳангоми оғозёбӣ танҳо ID калид ва корбари асосӣ бор карда мешавад, аз ин рӯ гирифтани ҳамаи калидҳо оғозро суст намекунад. Калидҳо танбалӣ бор карда мешаванд. Яъне худи калид аз Vault танҳо вақте ки он воқеан лозим аст, бор карда мешавад. Пас аз зеркашӣ, калид дар хотира кэш карда мешавад, то дар оянда ба он тавассути пайвастҳои TLS ба сервери Vault дастрасӣ пайдо нашавад. Баъд, биёед бубинем, ки дар мағозаи калидӣ кадом маълумот мавҷуд аст.

Маълумоти асосӣ инҳоро дар бар мегирад:

  • ID калид - идентификатори калид, масалан:
    INNODBKey-764d382a-7324-11e9-ad8f-9cb6d0d5dc99-1
  • навъи калид — навъи калид дар асоси алгоритми рамзгузории истифодашуда, арзишҳои имконпазир: "AES", "RSA" ё "DSA".
  • дарозии калид — дарозии калид бо байт, AES: 16, 24 ё 32, RSA 128, 256, 512 ва DSA 128, 256 ё 384.
  • истифода - соҳиби калид. Агар калид система бошад, масалан, Master Key, пас ин майдон холӣ аст. Агар калид бо истифода аз keyring_udf сохта шавад, пас ин майдон соҳиби калидро муайян мекунад.
  • худи калид

Калид аз ҷониби ҷуфт ягона муайян карда мешавад: key_id, корбар.

Дар нигоҳдорӣ ва нест кардани калидҳо низ фарқиятҳо мавҷуданд.

Нигоҳдории файл тезтар аст. Шояд шумо фикр кунед, ки мағозаи калидӣ танҳо як маротиба калиди файлро менависад, аммо не, дар ин ҷо чизи бештаре ҳаст. Ҳар вақте ки тағйироти нигаҳдории файл анҷом дода мешавад, аввал нусхаи эҳтиётии ҳамаи мундариҷа эҷод карда мешавад. Фарз мекунем, ки файл my_biggest_secrets номида мешавад, пас нусхаи эҳтиётӣ my_biggest_secrets.backup хоҳад буд. Баъдан, кэш иваз карда мешавад (калидҳо илова карда мешаванд ё нест карда мешаванд) ва агар ҳама чиз муваффақ бошад, кэш ба файл аз нав барқарор карда мешавад. Дар ҳолатҳои нодир, ба монанди нокомии сервер, шумо метавонед ин файли эҳтиётиро бинед. Файли эҳтиётӣ ҳангоми бори дигар бор кардани калидҳо нест карда мешавад (одатан пас аз бозоғоз кардани сервер).

Ҳангоми захира кардан ё нест кардани калид дар анбори сервер, нигаҳдорӣ бояд ба сервери MySQL бо фармонҳои "фиристодани калид" / "дархости несткунии калидҳо" пайваст шавад.

Биёед ба суръати оғози сервер баргардем. Илова бар он, ки ба суръати оғозёбӣ худи анбор таъсир мерасонад, инчунин масъалае вуҷуд дорад, ки ҳангоми оғозёбӣ чанд калидро аз анбор гирифтан лозим аст. Албатта, ин махсусан барои нигоҳдории сервер муҳим аст. Ҳангоми оғозёбӣ сервер тафтиш мекунад, ки кадом калид барои ҷадвалҳо/фазоҳои рамзгузоришуда лозим аст ва калидро аз анбор дархост мекунад. Дар сервери "тоза" бо рамзгузории Калиди Мастер, бояд як Калиди асосӣ мавҷуд бошад, ки бояд аз анбор гирифта шавад. Аммо, шумораи зиёди калидҳо метавонанд талаб карда шаванд, масалан, вақте ки сервери эҳтиётӣ нусхаи эҳтиётиро аз сервери асосӣ барқарор мекунад. Дар чунин мавридҳо гардиши калиди асосӣ бояд таъмин карда шавад. Ин дар мақолаҳои оянда муфассалтар баррасӣ хоҳад шуд, гарчанде ки дар ин ҷо ман мехоҳам қайд намоям, ки сервере, ки аз якчанд калидҳои Мастер истифода мебарад, метавонад каме бештар вақт гирад, махсусан ҳангоми истифодаи мағозаи калидҳои сервер.

Акнун биёед каме бештар дар бораи keyring_file сӯҳбат кунем. Вақте ки ман keyring_file-ро таҳия мекардам, ман инчунин дар бораи чӣ гуна тафтиш кардани тағироти keyring_file ҳангоми кор кардани сервер нигарон будам. Дар 5.7, санҷиш дар асоси омори файл анҷом дода шуд, ки ин ҳалли беҳтарин набуд ва дар 8.0 он бо маблағи санҷиши SHA256 иваз карда шуд.

Вақте ки шумо бори аввал keyring_file-ро иҷро мекунед, омори файл ва маблағи чек ҳисоб карда мешавад, ки сервер онҳоро дар хотир нигоҳ медорад ва тағирот танҳо дар сурати мувофиқат кардан татбиқ карда мешаванд. Вақте ки файл тағир меёбад, маблағи назоратӣ нав карда мешавад.

Мо аллакай саволҳои зиёдеро дар бораи хазинаҳои калидӣ баррасӣ кардем. Бо вуҷуди ин, як мавзӯи муҳими дигаре ҳаст, ки аксар вақт фаромӯш карда мешавад ё нодуруст фаҳмида мешавад: мубодилаи калидҳо дар байни серверҳо.

Ман чиро дар назар дорам? Ҳар як сервер (масалан, Сервери Percona) дар кластер бояд дар сервери Vault макони алоҳида дошта бошад, ки дар он сервери Percona бояд калидҳои худро нигоҳ дорад. Ҳар як калиди асосии дар анбор захирашуда дорои GUID-и сервери Percona дар дохили идентификатори он мебошад. Чаро муҳим аст? Тасаввур кунед, ки шумо танҳо як сервери Vault доред ва ҳамаи серверҳои Percona дар кластер ин сервери ягонаи Vault-ро истифода мебаранд. Мушкилот равшан ба назар мерасад. Агар ҳамаи серверҳои Percona Калиди Мастерро бе идентификаторҳои беназир истифода мекарданд, ба монанди id = 1, id = 2 ва ғайра, пас ҳамаи серверҳои кластер як Калиди Мастерро истифода мебурданд. Он чизе ки GUID пешниҳод мекунад, фарқияти байни серверҳо мебошад. Пас чаро дар бораи мубодилаи калидҳо байни серверҳо сӯҳбат кунед, агар GUID-и беназир аллакай мавҷуд бошад? Васлкунаки дигар вуҷуд дорад - keyring_udf. Бо ин плагин, корбари сервери шумо метавонад калидҳои худро дар сервери Vault нигоҳ дорад. Мушкилот вақте ба миён меояд, ки корбар масалан, дар сервер1 калид эҷод мекунад ва сипас кӯшиш мекунад, ки калидро бо ҳамон ID дар server2 эҷод кунад, масалан:

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

Интизор шавед. Ҳарду серверҳо ҳамон сервери Vault-ро истифода мебаранд, набояд функсияи keyring_key_store дар server2 ноком шавад? Ҷолиб он аст, ки агар шумо кӯшиш кунед, ки ҳамин корро дар як сервер иҷро кунед, шумо хатогиро мегиред:

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

Дуруст аст, ROB_1 аллакай вуҷуд дорад.

Биёед аввал мисоли дуюмро муҳокима кунем. Тавре ки мо қаблан гуфта будем, keyring_vault ё ягон плагини дигари калидӣ ҳамаи ID-ҳои калидиро дар хотира кэш мекунад. Ҳамин тавр, пас аз сохтани калиди нав, ROB_1 ба сервер1 илова карда мешавад ва ба ғайр аз фиристодани ин калид ба Vault, калид низ ба кэш илова карда мешавад. Ҳоло, вақте ки мо кӯшиш мекунем, ки ҳамон як калидро бори дуюм илова кунем, keyring_vault месанҷад, ки калид дар кэш мавҷуд аст ё не ва хатогӣ содир мекунад.

Дар ҳолати аввал вазъият дигар аст. Server1 ва server2 кэшҳои алоҳида доранд. Пас аз илова кардани ROB_1 ба кеши калидӣ дар сервер1 ва сервери Vault, кэши калид дар server2 ҳамоҳанг нест. Дар кэш дар сервер2 калиди ROB_1 мавҷуд нест. Ҳамин тариқ, калиди ROB_1 ба keyring_key_store ва ба сервери Vault навишта мешавад, ки воқеан арзиши қаблиро (!) аз нав менависад. Ҳоло калиди ROB_1 дар сервери Vault 543210987654321 аст. Ҷолиб он аст, ки сервери Vault ин гуна амалҳоро манъ намекунад ва ба осонӣ арзиши кӯҳнаро аз нав сабт мекунад.

Акнун мо метавонем бифаҳмем, ки чаро тақсимоти сервер дар Vault метавонад муҳим бошад - вақте ки шумо keyring_udf-ро истифода мебаред ва мехоҳед калидҳоро дар Vault нигоҳ доред. Чӣ тавр ба ин ҷудошавӣ дар сервери Vault ноил шудан мумкин аст?

Ду роҳи тақсим кардан ба Vault вуҷуд дорад. Шумо метавонед барои ҳар як сервер нуқтаҳои гуногуни васлкунӣ эҷод кунед ё роҳҳои гуногунро дар як нуқтаи васлкунӣ истифода баред. Ин беҳтарин бо мисолҳо нишон дода шудааст. Пас, биёед аввал ба нуқтаҳои инфиродии васлкунӣ назар андозем:

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

Дар ин ҷо шумо мебинед, ки server1 ва server2 нуқтаҳои гуногуни пайвасткуниро истифода мебаранд. Ҳангоми тақсим кардани роҳҳо, конфигуратсия чунин хоҳад буд:

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

Дар ин ҳолат, ҳарду сервер як нуқтаи васлкунӣ "mount_point" -ро истифода мебаранд, аммо роҳҳои гуногун. Вақте ки шумо бо истифода аз ин роҳ сирри аввалро дар server1 эҷод мекунед, сервери Vault ба таври худкор директорияи "server1" -ро эҷод мекунад. Барои server2 ҳама чиз монанд аст. Вақте ки шумо махфи охиринро дар mount_point/server1 ё mount_point/server2 нест мекунед, сервери Vault низ он директорияҳоро нест мекунад. Агар шумо ҷудокунии роҳро истифода баред, шумо бояд танҳо як нуқтаи васлкунӣ эҷод кунед ва файлҳои конфигуратсияро тағир диҳед, то серверҳо роҳҳои алоҳидаро истифода баранд. Нуқтаи васлкунӣ метавонад бо истифода аз дархости HTTP эҷод карда шавад. Бо истифода аз CURL инро метавон чунин анҷом дод:

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

Ҳама майдонҳо (TOKEN, VAULT_CA, VAULT_URL, SECRET_MOUNT_POINT) ба параметрҳои файли конфигуратсия мувофиқанд. Албатта, шумо метавонед утилитаҳои Vault-ро барои ҳамин кор истифода баред. Аммо автоматикунонии сохтани нуқтаи васлкунӣ осонтар аст. Ман умедворам, ки шумо ин маълумотро муфид хоҳед ёфт ва мо шуморо дар мақолаҳои навбатии ин силсила мебинем.

Рамзгузорӣ дар MySQL: Мағозаи калидҳо

Бештар:

Манбаъ: will.com

Илова Эзоҳ