MySQL の暗号化: キヌストア

新芏コヌスの募集開始に向けお 「デヌタベヌス」 圹立぀蚘事の翻蚳をご甚意したした。

MySQL の暗号化: キヌストア

透過的デヌタ暗号化 (TDE) は、 MySQL 甹 Percona サヌバヌ MySQL もかなり長い間䜿甚されおきたした。 しかし、TDE が内郚でどのように機胜するのか、たた TDE がサヌバヌに䞎える圱響に぀いお考えたこずはありたすか? この䞀連の蚘事では、TDE が内郚でどのように動䜜するかを芋おいきたす。 暗号化を機胜させるにはキヌの保管が必芁ずなるため、キヌの保管から始めたしょう。 次に、Percona Server for MySQL/MySQL での暗号化の仕組みず、Percona Server for MySQL の远加機胜に぀いお詳しく芋おいきたす。

MySQL キヌリング

キヌリングは、サヌバヌがロヌカル ファむル (keyring_file) たたはリモヌト サヌバヌ (HashiCorp Vault など) 䞊のキヌをク゚リ、䜜成、削陀できるようにするプラグむンです。 キヌは、取埗を高速化するために垞にロヌカルにキャッシュされたす。

プラグむンは XNUMX ぀のカテゎリに分類できたす。

  • ロヌカルストレヌゞ。 たずえば、ロヌカル ファむル (これをファむルベヌスのキヌリングず呌びたす)。
  • リモヌトストレヌゞ。 たずえば、Vault Server (これをサヌバヌベヌスのキヌリングず呌びたす)。

キヌの保管時ず取埗時だけでなく、キヌの実行時も、ストレヌゞのタむプが異なるず動䜜が若干異なるため、この分離は重芁です。

ファむル ストレヌゞを䜿甚する堎合、起動時に、ストレヌゞの内容党䜓 (キヌ ID、キヌ ナヌザヌ、キヌ タむプ、キヌ自䜓) がキャッシュにロヌドされたす。

サヌバヌベヌスのストア (Vault Server など) の堎合、起動時にキヌ ID ずキヌ ナヌザヌのみがロヌドされるため、すべおのキヌを取埗しおも起動が遅くなるわけではありたせん。 キヌは遅延しおロヌドされたす。 ぀たり、キヌ自䜓は、実際に必芁な堎合にのみ Vault からロヌドされたす。 ダりンロヌドされたキヌはメモリにキャッシュされるため、今埌 Vault サヌバヌぞの TLS 接続を通じおアクセスする必芁はありたせん。 次に、キヌ ストアにどのような情報が存圚するかを芋おみたしょう。

重芁な情報には次のものが含たれたす。

  • キヌID — キヌ識別子、䟋:
    INNODBKey-764d382a-7324-11e9-ad8f-9cb6d0d5dc99-1
  • キヌタむプ — 䜿甚される暗号化アルゎリズムに基づくキヌのタむプ。可胜な倀: 「AES」、「RSA」、たたは「DSA」。
  • キヌの長さ — キヌの長さ (バむト単䜍)、AES: 16、24 たたは 32、RSA 128、256、512、および DSA 128、256 たたは 384。
  • user - キヌの所有者。 キヌがシステム (マスタヌ キヌなど) の堎合、このフィヌルドは空です。 keyring_udf を䜿甚しおキヌが䜜成された堎合、このフィヌルドはキヌの所有者を識別したす。
  • 鍵そのもの

キヌは、key_id、user のペアによっお䞀意に識別されたす。

キヌの保存ず削陀にも違いがありたす。

ファむルストレヌゞが高速になりたす。 キヌ ストアはキヌをファむルに XNUMX 回曞き蟌むだけだず思う​​かもしれたせんが、そうではありたせん。ここではさらに倚くの凊理が行われたす。 ファむル ストレヌゞの倉曎が行われるたびに、最初にすべおのコンテンツのバックアップ コピヌが䜜成されたす。 ファむルの名前が my_biggest_secrets だずするず、バックアップ コピヌは my_biggest_secrets.backup になりたす。 次に、キャッシュが倉曎され (キヌが远加たたは削陀され)、すべおが成功するず、キャッシュがファむルにリセットされたす。 サヌバヌ障害などのたれなケヌスでは、このバックアップ ファむルが衚瀺されるこずがありたす。 バックアップ ファむルは、次回キヌがロヌドされるずき (通垞はサヌバヌの再起動埌) に削陀されたす。

サヌバヌストレヌゞにキヌを保存たたは削陀する堎合、ストレヌゞは「キヌの送信」/「キヌの削陀のリク゚スト」コマンドを䜿甚しお MySQL サヌバヌに接続する必芁がありたす。

サヌバヌの起動速床に戻りたしょう。 起動速床がボヌルト自䜓の圱響を受けるずいう事実に加えお、起動時にボヌルトからどれだけのキヌを取埗する必芁があるかずいう問題もありたす。 もちろん、これはサヌバヌ ストレヌゞにずっお特に重芁です。 起動時に、サヌバヌは暗号化されたテヌブル/テヌブルスペヌスに必芁なキヌを確認し、ストレヌゞにキヌを芁求したす。 マスタヌ キヌ暗号化を備えた「クリヌンな」サヌバヌには、ストレヌゞから取埗する必芁があるマスタヌ キヌが XNUMX ぀存圚する必芁がありたす。 ただし、バックアップ サヌバヌがプラむマリ サヌバヌからバックアップを埩元する堎合など、より倚くのキヌが必芁になる堎合がありたす。 このような堎合、マスタヌキヌのロヌテヌションを提䟛する必芁がありたす。 これに぀いおは今埌の蚘事で詳しく説明したすが、ここでは、耇数のマスタヌ キヌを䜿甚するサヌバヌ、特にサヌバヌ偎のキヌ ストアを䜿甚する堎合、起動に少し時間がかかる可胜性があるこずに泚意しおください。

ここで、keyring_file に぀いおもう少し詳しく説明したしょう。 keyring_file を開発しおいたずき、サヌバヌの実行䞭に keyring_file の倉曎を確認する方法に぀いおも懞念しおいたした。 5.7 では、チェックはファむル統蚈に基づいお実行されたしたが、これは理想的な゜リュヌションではありたせんでした。8.0 では、SHA256 チェックサムに眮き換えられたした。

初めお keyring_file を実行するず、ファむル統蚈ずチェックサムが蚈算され、サヌバヌに蚘憶され、倉曎は䞀臎する堎合にのみ適甚されたす。 ファむルが倉曎されるず、チェックサムが曎新されたす。

Key Vault に関する倚くの質問に぀いおはすでに説明したした。 ただし、忘れられたり誀解されたりしがちなもう XNUMX ぀の重芁なトピックがありたす。それは、サヌバヌ間でのキヌの共有です。

私が意味したのは クラスタ内の各サヌバヌ (Percona サヌバヌなど) は、Percona サヌバヌがそのキヌを保存する必芁がある Vault サヌバヌ䞊に個別の堎所を持っおいる必芁がありたす。 ストレヌゞに保存された各マスタヌ キヌには、その識別子の䞭に Percona サヌバヌの GUID が含たれおいたす。 どうしおそれが重芁ですか Vault サヌバヌが 1 ぀だけあり、クラスタ内のすべおの Percona サヌバヌがその 2 ぀の Vault サヌバヌを䜿甚しおいるず想像しおください。 問題は明らかのようです。 すべおの Percona サヌバヌが、id = 1、id = 2 などの䞀意の識別子のないマスタヌ キヌを䜿甚した堎合、クラスタヌ内のすべおのサヌバヌは同じマスタヌ キヌを䜿甚したす。 GUID によっお提䟛されるのは、サヌバヌ間の区別です。 䞀意の GUID がすでに存圚する堎合、なぜサヌバヌ間でキヌを共有するこずに぀いお話すのでしょうか? 別のプラグむン - keyring_udf がありたす。 このプラグむンを䜿甚するず、サヌバヌ ナヌザヌは自分のキヌを Vault サヌバヌに保存できたす。 この問題は、ナヌザヌがサヌバヌ XNUMX でキヌを䜜成し、次にサヌバヌ XNUMX で同じ ID のキヌを䜜成しようずするず発生したす。次に䟋を瀺したす。

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

埅っお。 䞡方のサヌバヌが同じ Vault サヌバヌを䜿甚しおいたす。server2 で keyring_key_store 関数が倱敗するはずはありたせんか? 興味深いこずに、XNUMX ぀のサヌバヌで同じこずを実行しようずするず、゚ラヌが発生したす。

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

そうです、ROB_1 はすでに存圚したす。

たず 1 番目の䟋に぀いお説明したす。 前に述べたように、keyring_vault たたはその他のキヌリング プラグむンは、すべおのキヌ ID をメモリにキャッシュしたす。 したがっお、新しいキヌを䜜成した埌、ROB_1 がserverXNUMX に远加され、このキヌが Vault に送信されるだけでなく、キャッシュにも远加されたす。 ここで、同じキヌをもう䞀床远加しようずするず、keyring_vault はキヌがキャッシュに存圚するかどうかを確認し、゚ラヌをスロヌしたす。

最初のケヌスでは状況が異なりたす。 Server1 ず Server2 には個別のキャッシュがありたす。 ROB_1 をサヌバヌ 1 ず Vault サヌバヌのキヌ キャッシュに远加した埌、サヌバヌ 2 のキヌ キャッシュが同期しなくなりたす。 サヌバヌ 2 のキャッシュには ROB_1 キヌがありたせん。 したがっお、ROB_1 キヌは keyring_key_store ず Vault サヌバヌに曞き蟌たれ、実際には前の倀が䞊曞き (!) されたす。 これで、Vault サヌバヌ䞊の ROB_1 キヌは 543210987654321 に等しくなりたす。興味深いこずに、Vault サヌバヌはそのようなアクションをブロックせず、叀い倀を簡単に䞊曞きしたす。

これで、keyring_udf を䜿甚しおいおキヌを Vault に保存したい堎合に、Vault でのサヌバヌのパヌティショニングが重芁ずなる理由がわかりたした。 Vault サヌバヌ䞊でこの分離を実珟するにはどうすればよいでしょうか?

Vault にパヌティション分割するには XNUMX ぀の方法がありたす。 サヌバヌごずに異なるマりント ポむントを䜜成したり、同じマりント ポむント内で異なるパスを䜿甚したりできたす。 これを䟋で説明するず分かりやすくなりたす。 それでは、最初に個々のマりント ポむントを芋おみたしょう。

--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」ディレクトリを䜜成したす。 サヌバヌ 2 の堎合もすべお同様です。 mount_point/server1 たたは mount_point/server2 の最埌のシヌクレットを削陀するず、Vault サヌバヌはそれらのディレクトリも削陀したす。 パス分離を䜿甚する堎合は、マりント ポむントを XNUMX ぀だけ䜜成し、サヌバヌが別々のパスを䜿甚するように構成ファむルを倉曎する必芁がありたす。 マりント ポむントは、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 の暗号化: キヌストア

続きを読む

出所 habr.com

コメントを远加したす