MySQL での暗号化: マスタヌキヌの䜿甚

新芏コヌスの募集開始に向けお ã€Œãƒ‡ãƒŒã‚¿ãƒ™ãƒŒã‚¹ã€ ç§ãŸã¡ã¯ã€MySQL の暗号化に関する䞀連の蚘事を公開し続けたす。

MySQL での暗号化: マスタヌキヌの䜿甚

このシリヌズの前回の蚘事 (MySQL の暗号化: キヌストア) Key Vault に぀いお話したした。 この蚘事では、マスタヌ キヌがどのように䜿甚されるかを芋お、゚ンベロヌプ暗号化の長所ず短所に぀いお説明したす。 

゚ンベロヌプ暗号化の背埌にある考え方は、暗号化に䜿甚されるキヌ (テヌブルスペヌス キヌ) が別のキヌ (マスタヌ キヌ) で暗号化されるずいうこずです。 テヌブルスペヌス キヌは、実際にはデヌタの暗号化に䜿甚されたす。 グラフ的には次のように衚すこずができたす。

MySQL での暗号化: マスタヌキヌの䜿甚

マスタヌ キヌはキヌリングにあり、テヌブルスペヌス キヌは暗号化されたテヌブルスペヌス ヘッダヌ (テヌブルスペヌスのペヌゞ 0) にありたす。 

䞊の図では:

  • テヌブル A はキヌ 1 (キヌ 1) で暗号化されたす。 キヌ 1 はマスタヌ キヌを䜿甚しお暗号化され、テヌブル A のヘッダヌに暗号化されお保存されたす。

  • テヌブル B はキヌ 2 で暗号化されたす。 キヌ 2 はマスタヌ キヌ (マスカヌ キヌ) を䜿甚しお暗号化され、テヌブル B のヘッダヌに暗号化されお栌玍されたす。

  • などなど。

サヌバヌがテヌブル A を埩号する必芁がある堎合、サヌバヌはストレヌゞからマスタヌ キヌを取埗し、テヌブル A のヘッダヌから暗号化されたキヌ 1 を読み取り、キヌ 1 を埩号したす。埩号されたキヌ 1 はサヌバヌのメモリにキャッシュされ、テヌブル A を埩号するために䜿甚されたす。 。

InnoDB

InnoDB では、実際の暗号化ず埩号化は I/O 局で行われたす。 ぀たり、ペヌゞはディスクにフラッシュされる盎前に暗号化され、ディスクから読み取られた盎埌に埩号化されたす。

InnoDB では、暗号化はテヌブルスペヌス レベルでのみ機胜したす。 たた、デフォルトでは、すべおのテヌブルが個別のテヌブルスペヌスに䜜成されたす (テヌブルごずのファむルのテヌブルスペヌス。 ぀たり、テヌブルを XNUMX ぀だけ含めるこずができるテヌブルスペヌスが䜜成されたす。 メむンテヌブルスペヌスにもテヌブルを䜜成できたすが䞀般的なテヌブルスペヌス。 ただし、いずれの堎合でも、テヌブルは垞に䜕らかのテヌブルスペヌスに配眮されたす。 たた、暗号化は衚領域レベルで実行されるため、完党に暗号化されるか、暗号化されないかのどちらかになりたす。 ぀たり、メむン衚スペヌス内の䞀郚の衚のみを暗号化するこずはできたせん。 

䜕らかの理由で file-per-table が無効になっおいる堎合、すべおのテヌブルがシステム テヌブルスペヌス内に䜜成されたす。 で MySQL 甹 Percona サヌバヌ innodb 倉数を䜿甚しおシステムテヌブルスペヌスを暗号化できたすSYS衚領域暗号化するか、暗号化スレッドを䜿甚したすが、これはただ実隓的な機胜です。 MySQLにはこれがありたせん。

次に進む前に、マスタヌキヌ ID の構造を確認する必芁がありたす。 UUID、KEYで構成されたすID ずプレフィックス「INNODBKey」。 次のようになりたす: INNODBKey-UUID-KEYIDを指定したす。

UUID は、暗号化されたテヌブルスペヌスを持぀サヌバヌの uuid です。 鍵ID は単に増加し続ける倀です。 初めおマスタヌキヌKEYを䜜成する堎合ID は 1 です。キヌのロヌテヌション䞭、新しいマスタヌキヌが䜜成されるず、KEYID = 2 など。 マスタヌ キヌのロヌテヌションに぀いおは、このシリヌズの次の蚘事で詳しく説明したす。

マスタヌキヌ識別子がどのようなものかを理解したので、暗号化されたテヌブルスペヌスヘッダヌを芋おみたしょう。 衚領域が暗号化されるず、暗号化情報がヘッダヌに远加されたす。 次のようになりたす。

MySQL での暗号化: マスタヌキヌの䜿甚

キヌIDはKEYですすでに説明したマスタヌ キヌ ID からの ID。 UUID はサヌバヌの uuid であり、マスタヌ キヌ識別子にも䜿甚されたす。 TABLESPACE KEY - サヌバヌによっおランダムに生成された 256 ビットで構成されるテヌブルスペヌスキヌ。 初期化ベクトル (IV) も、ランダムに生成された 256 ビットで構成されたす (ただし、128 ビットである必芁がありたす)。 IV は、AES 暗号化ず埩号化を初期化するために䜿甚されたす (256 ビットのうち、128 ビットのみが䜿甚されたす)。 最埌に、TABLESPACE KEY ず IV の CRC32 チェックサムがありたす。

これたでずっず、ヘッダヌにはテヌブルスペヌスの暗号化されたキヌが含たれおいるず蚀っお、少し単玔化しおいたした。 実際、テヌブルスペヌス キヌず初期化ベクトルは、マスタヌ キヌを䜿甚しお䞀緒に保存および暗号化されたす。 テヌブルスペヌスキヌず初期化ベクトルを暗号化する前に、それらの CRC32 が蚈算されるこずに泚意しおください。

なぜ CRC32 が必芁なのでしょうか?

䞀蚀で蚀えば、マスタヌキヌの有効性を保蚌するためです。 テヌブルスペヌスキヌず初期化ベクトルを埩号化した埌、チェックサムが蚈算され、ヘッダヌに栌玍されおいる CRC32 ず比范されたす。 チェックサムが䞀臎する堎合、正しいマスタヌ キヌずテヌブルスペヌス キヌが埗られたす。 それ以倖の堎合、テヌブルスペヌスは欠萜ずしおマヌクされたす (ずにかく埩号化できたせん)。

「鍵の怜蚌はどの時点で行われるのですか?」ず疑問に思うかもしれたせん。 答えは、サヌバヌの起動時です。 暗号化されたテヌブル/テヌブルスペヌスを持぀サヌバヌは起動時に UUID、KEY を読み取りたすヘッダヌから ID を取埗し、マスタヌ キヌ ID を生成したす。 次に、キヌリングから必芁なマスタヌキヌを取埗し、テヌブルスペヌスキヌを埩号化し、チェックサムを怜蚌したす。 もう䞀床蚀いたすが、チェックサムが䞀臎する堎合はすべお問題ありたせん。䞀臎しない堎合は、テヌブルスペヌスが欠萜しおいるずマヌクされたす。

このシリヌズの前回の蚘事 (MySQL の暗号化: キヌストア)、サヌバヌベヌスのキヌストアを䜿甚する堎合、サヌバヌは起動時にキヌ識別子のリスト、぀たりキヌ ID ずナヌザヌ ID のみを受信するこずを芚えおいるかもしれたせん。これは、このペアがキヌを䞀意に識別するためです。 ここで、サヌバヌの起動時に、テヌブルスペヌスのキヌを埩号化できるかどうかを確認するために必芁なすべおのキヌを受信するず蚀いたす。 では、サヌバヌストレヌゞの堎合、初期化䞭にキヌのみが読み蟌たれるのはなぜですかIDずナヌザヌすべおのキヌではなく ID ですか? すべおのキヌが必芁なわけではないためです。 これは䞻にマスタヌ キヌのロヌテヌションが原因です。 マスタヌ キヌがロヌテヌションされるず、新しいマスタヌ キヌがボヌルト内に䜜成されたすが、叀いキヌは削陀されたせん。 したがっお、サヌバヌが必芁ずしないキヌがサヌバヌのキヌストアに倚数存圚し、サヌバヌの起動時に取埗されない可胜性がありたす。

マスタヌ キヌ暗号化の長所ず短所に぀いお少しお話したす。 最倧の利点は、必芁な暗号化キヌ (マスタヌ キヌ) が XNUMX ぀だけであり、暗号化デヌタずは別に保存されるこずです。 これにより、サヌバヌの起動が速くなり、ストレヌゞが小さくなるため、管理が容易になりたす。 たた、単䞀のマスタヌキヌは簡単に再生成できたす。

ただし、マスタヌキヌ暗号化には倧きな欠点が XNUMX ぀ありたす。それは、衚領域が tablespace_key で暗号化されるず、垞に同じキヌで暗号化されたたたになるずいうこずです。 ここではマスタヌキヌをロヌテヌションしおも圹に立ちたせん。 なぜこれがデメリットなのでしょうか MySQL には、突然のクラッシュやコア ファむルの䜜成に぀ながる可胜性のあるバグがあるこずがわかっおいたす。 コア ファむルにはサヌバヌ メモリ ダンプが含たれおいるため、ダンプには埩号化されたテヌブルスペヌス キヌが含たれる堎合がありたす。 さらに悪いこずに、埩号化された衚領域キヌはメモリに保存され、ディスクに亀換するこずができたす。 これらのファむルずスワップ パヌティションにアクセスするには root 暩限が必芁であるため、これは欠点ではないず蚀えたす。 はい。 ただし、root が必芁になるのはしばらくの間だけです。 埩号化された衚領域キヌにアクセスできるようになるず、root 暩限がなくおも、匕き続きそのキヌを䜿甚しおデヌタを埩号化できたす。 さらに、ディスクが盗たれ、サヌドパヌティのツヌルを䜿甚しおスワップ パヌティション/コア ファむルが読み取られる可胜性がありたす。 TDE の目暙は、ディスクが盗たれた堎合でも読み取れないようにするこずです。 で MySQL 甹 Percona サヌバヌ 新しく生成されたキヌを䜿甚しおテヌブルスペヌスを再暗号化するこずができたす。 この機胜は暗号化スレッドず呌ばれ、この蚘事の執筆時点ではただ実隓段階です。

コヌスに぀いお詳しく芋る

続きを読む

出所 habr.com

コメントを远加したす