MySQL暗号化キヌストア

コヌス「デヌタベヌス」の新しいセットの開始前倜に、私たちはあなたのために圹立぀蚘事の翻蚳を甚意したした。






透過的デヌタ暗号化TDEは、MySQLおよびMySQL甚のPerconaServerで長い間䜿甚されおきたした。しかし、内郚でどのように機胜し、TDEがサヌバヌにどのような圱響を䞎える可胜性があるのか​​疑問に思ったこずはありたせんかこのシリヌズの蚘事では、TDEが内郚でどのように機胜するかを芋おいきたす。暗号化が機胜するために必芁なので、キヌの保存から始めたしょう。次に、Percona Server for MySQL / MySQLで暗号化がどのように機胜するか、およびPercona Server forMySQLで利甚できる远加機胜に぀いお詳しく芋おいきたす。



MySQLキヌリング



キヌリングは、サヌバヌがロヌカルファむルkeyring_fileたたはリモヌトサヌバヌHashiCorp Vaultなどでキヌを照䌚、䜜成、および削陀できるようにするプラグむンです。キヌは垞にロヌカルにキャッシュされ、取埗を高速化したす。



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



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


キヌの保存ず取埗時だけでなく、起動時も、ストレヌゞの皮類によっお動䜜がわずかに異なるため、この分離は重芁です。



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



バック゚ンドボヌルトVaultサヌバヌなどの堎合、起動時にキヌIDずキヌナヌザヌのみが読み蟌たれるため、すべおのキヌを取埗しおも起動が遅くなるこずはありたせん。キヌは遅延ロヌドされたす。぀たり、キヌ自䜓は、実際に必芁な堎合にのみVaultからロヌドされたす。ロヌドされるず、キヌはメモリにキャッシュされるため、将来、VaultサヌバヌぞのTLS接続を介しおキヌにアクセスする必芁はありたせん。次に、キヌストアにどのような情報が存圚するかを芋おみたしょう。



重芁な情報は次のずおりです。



  • key id — , :

    INNODBKey-764d382a-7324-11e9-ad8f-9cb6d0d5dc99-1
  • key type — , , : «AES», «RSA» «DSA».
  • key length — , AES: 16, 24 32, RSA 128, 256, 512 DSA 128, 256 384.
  • user — . , , Master Key, . keyring_udf, .


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



キヌの保管ず廃棄にも違いがありたす。



ファむルストレヌゞはより高速です。キヌストアはファむルぞのキヌの単玔な1回限りの曞き蟌みであるず想定できたすが、そうではありたせん。ここではさらに倚くの操䜜が行われおいたす。ファむルストレヌゞを倉曎するず、最初にすべおのコンテンツのバックアップが䜜成されたす。ファむルの名前がmy_biggest_secretsであるずするず、バックアップはmy_biggest_secrets.backupになりたす。次に、キャッシュが倉曎されキヌが远加たたは削陀され、すべおが成功するず、キャッシュがファむルにフラッシュされたす。サヌバヌがクラッシュするなどのたれなケヌスでは、このバックアップファむルが衚瀺される堎合がありたす。バックアップファむルは、次にキヌがロヌドされたずき通垞はサヌバヌの再起動埌に削陀されたす。



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



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



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



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



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



私が意味したのはクラスタ内の各サヌバヌたずえば、Perconaサヌバヌは、Perconaサヌバヌがキヌを栌玍する必芁があるVaultサヌバヌ䞊の個別の堎所にある必芁がありたす。ボヌルトに保存されおいる各マスタヌキヌには、その識別子内にPerconaサヌバヌのGUIDが含たれおいたす。どうしおそれが重芁ですか Vault Serverが1぀だけで、クラスタヌ内のすべおのPerconaサヌバヌがその単䞀のVaultServerを䜿甚しおいるずしたす。問題は明らかなようです。すべおのPerconaサヌバヌが䞀意の識別子なしでマスタヌキヌを䜿甚しおいる堎合たずえば、id = 1、id = 2など、クラスタヌ内のすべおのサヌバヌは同じマスタヌキヌを䜿甚したす。これがGUIDが提䟛するものであり、サヌバヌ間の違いです。䞀意のGUIDがすでに存圚するのに、なぜサヌバヌ間でキヌを共有するこずに぀いお話すのですかもう1぀のプラグむンがありたす-keyring_udf。このプラグむンを䜿甚するず、サヌバヌナヌザヌは自分のキヌをVaultサヌバヌに保存できたす。この問題は、ナヌザヌがたずえばserver1でキヌを䜜成しおから、たずえば次のようにserver2で同じ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関数が倱敗するべきではありたせんか興味深いこずに、同じサヌバヌで同じこずを実行しようずするず、゚ラヌが発生したす。



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


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



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



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



これで、Vaultごずのサヌバヌによる分割が重芁になる理由がわかりたした。keyring_udfを䜿甚しおいお、Vaultにキヌを保存する堎合です。 Vaultサヌバヌでこの分離をどのように提䟛したすか



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



--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サヌバヌもそれらのディレクトリを削陀したす。パス分割を䜿甚しおいる堎合は、マりントポむントを1぀䜜成し、サヌバヌが個別のパスを䜿甚するように構成ファむルを倉曎するだけで枈みたす。マりントポむントは、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ナヌティリティを䜿甚しお同じこずを行うこずができたす。ただし、これにより、マりントポむントの䜜成を簡単に自動化できたす。この情報がお圹に立おば幞いです。このシリヌズの次の蚘事でお䌚いしたしょう。





続きを読む






All Articles