à l'approche du lancement d'un nouveau cycle pour le cours  Nous continuons à publier une série d'articles sur le chiffrement dans MySQL.

Dans l'article prĂ©cĂ©dent de cette sĂ©rie () nous avons parlĂ© des magasins de clĂ©s. Dans cet article, nous examinerons comment la clĂ© maĂźtresse (master key) est utilisĂ©e, ainsi que les avantages et les inconvĂ©nients du chiffrement par enveloppes (envelope encryption).Â
L'idĂ©e du chiffrement par enveloppes est que les clĂ©s utilisĂ©es pour le chiffrement (clĂ©s d'espace de table) sont chiffrĂ©es par une autre clĂ© (la clĂ© maĂźtresse, master key). Ce sont en fait les clĂ©s d'espace de table qui sont utilisĂ©es pour chiffrer les donnĂ©es. Graphiquement, cela peut ĂȘtre reprĂ©sentĂ© comme suit :

La clĂ© maĂźtresse (master key) est stockĂ©e dans un magasin de clĂ©s (keyring), tandis que les clĂ©s d'espace de table se trouvent dans les en-tĂȘtes des espaces de table chiffrĂ©s (sur la page 0 de l'espace de table).Â
Sur l'illustration ci-dessus :
La table A est chiffrĂ©e avec la clĂ© 1 (Key 1). La clĂ© 1 est chiffrĂ©e avec la clĂ© maĂźtresse (master key) et est stockĂ©e de maniĂšre chiffrĂ©e dans l'en-tĂȘte de la table A.
La table B est chiffrĂ©e avec la clĂ© 2 (Key 2). La clĂ© 2 est chiffrĂ©e avec la clĂ© maĂźtresse (master key) et est stockĂ©e de maniĂšre chiffrĂ©e dans l'en-tĂȘte de la table B.
Et ainsi de suite.
Lorsque le serveur doit dĂ©chiffrer la table A, il rĂ©cupĂšre la clĂ© maĂźtresse du magasin, lit la clĂ© 1 chiffrĂ©e dans l'en-tĂȘte de la table A et dĂ©chiffre la clĂ© 1. La clĂ© 1 dĂ©chiffrĂ©e est mise en cache en mĂ©moire sur le serveur et utilisĂ©e pour dĂ©chiffrer la table A.
InnoDB
Dans InnoDB, le chiffrement et le dĂ©chiffrement rĂ©els sont effectuĂ©s au niveau d'E/S. Cela signifie que la page est chiffrĂ©e juste avant d'ĂȘtre Ă©crite sur le disque et dĂ©chiffrĂ©e immĂ©diatement aprĂšs avoir Ă©tĂ© lue depuis le disque.
Dans InnoDB, le chiffrement fonctionne uniquement au niveau des espaces de table. Par dĂ©faut, toutes les tables sont créées dans des espaces de table sĂ©parĂ©s (). En d'autres termes, un espace de table contenant uniquement une table est créé. Bien que vous puissiez Ă©galement crĂ©er des tables dans l'espace de table principal (). Mais dans tous les cas, la table se trouve toujours dans un espace de table. Et puisque le chiffrement est effectuĂ© au niveau de l'espace de table, il est soit complĂštement chiffrĂ©, soit pas du tout. Cela signifie qu'il n'est pas possible de chiffrer seulement certaines tables dans l'espace de table principal.Â
Si, pour une raison quelconque, vous avez désactivé file-per-table, alors toutes les tables sont créées dans l'espace de table systÚme (system tablespace). Dans il est possible de chiffrer l'espace de table systÚme à l'aide de la variable innodbsystablespaceencrypt ou en utilisant des fils de chiffrement (encryption threads), mais cela reste une fonctionnalité expérimentale. Cela n'existe pas dans MySQL.
Avant de continuer, nous devons examiner la structure de l'identifiant de la clé principale (master key ID). Il est composé d'un UUID, d'un ID de clé (KEYID) et du préfixe « INNODBKey ». Cela se présente comme suit : INNODBKey-UUID-KEYID.
UUID est l'UUID du serveur avec un espace de table chiffré. L'ID de clé (KEYID) est simplement une valeur qui augmente continuellement. Lors de la création initiale de la clé principale, l'ID de clé KEYID est égal à 1. Lors de la rotation de la clé, lorsque une nouvelle clé principale est créée, l'ID de clé KEYID = 2 et ainsi de suite. Nous parlerons plus en détail de la rotation des clés principales dans les prochains articles de cette série.
Maintenant que nous savons Ă quoi ressemble l'identifiant de la clĂ© principale, examinons l'en-tĂȘte de l'espace de table chiffrĂ©. Lorsque l'espace de table est chiffrĂ©, les informations de chiffrement sont ajoutĂ©es Ă l'en-tĂȘte. Cela se prĂ©sente comme suit :

L'ID de clĂ© est l'ID de clĂ© (KEYID) de l'identifiant de la clĂ© principale dont nous avons dĂ©jĂ parlĂ©. UUID est l'UUID du serveur, qui est Ă©galement utilisĂ© dans l'identifiant de la clĂ© principale. L'ESPACE DE TABLE KEY est une clĂ© d'espace de table, composĂ©e de 256 bits gĂ©nĂ©rĂ©s alĂ©atoirement par le serveur. Le vecteur d'initialisation (IV, initialization vector) consiste Ă©galement en 256 bits gĂ©nĂ©rĂ©s alĂ©atoirement (bien qu'il devrait en fait ĂȘtre de 128 bits). L'IV est utilisĂ© pour initialiser le chiffrement et le dĂ©chiffrement AES (sur les 256 bits, seuls 128 sont utilisĂ©s). Ă la fin, il y a une somme de contrĂŽle CRC32 pour l'ESPACE DE TABLE KEY et l'IV.
Jusqu'Ă prĂ©sent, j'ai un peu simplifiĂ© en disant que l'en-tĂȘte contient une clĂ© d'espace de table chiffrĂ©e. En rĂ©alitĂ©, la clĂ© d'espace de table et le vecteur d'initialisation sont stockĂ©s et chiffrĂ©s ensemble Ă l'aide de la clĂ© principale. Rappelez-vous qu'avant de chiffrer la clĂ© d'espace de table et le vecteur d'initialisation, un CRC32 est calculĂ© pour eux.
Ă quoi sert CRC32 ?
En rĂ©sumĂ©, il s'agit de s'assurer de la validitĂ© de la clĂ© principale. AprĂšs le dĂ©chiffrement de la clĂ© de l'espace de table et du vecteur d'initialisation, une somme de contrĂŽle est calculĂ©e et comparĂ©e au CRC32 stockĂ© dans l'en-tĂȘte. Si les sommes de contrĂŽle correspondent, nous avons la bonne clĂ© principale et la clĂ© de l'espace de table. Sinon, l'espace de table est marquĂ© comme manquant (nous ne pourrons de toute façon pas le dĂ©chiffrer).
Vous pouvez vous demander : Ă quel moment les clĂ©s sont-elles vĂ©rifiĂ©es ? La rĂ©ponse est : au dĂ©marrage du serveur. Un serveur avec des tables chiffrĂ©es / des espaces de tables lit le UUID, la KEY.L'ID de l'en-tĂȘte et gĂ©nĂšre un identifiant de clĂ© principale. Il obtient ensuite la clĂ© principale nĂ©cessaire Ă partir du stockage (keyring), dĂ©chiffre la clĂ© de l'espace de table et vĂ©rifie la somme de contrĂŽle. Encore une fois, si la somme de contrĂŽle correspond, tout est en ordre, sinon l'espace de table est marquĂ© comme manquant.
Si vous avez lu l'article prĂ©cĂ©dent de cette sĂ©rie (), vous vous souvenez peut-ĂȘtre qu'en utilisant le stockage de clĂ©s cĂŽtĂ© serveur, le serveur obtient uniquement la liste des identifiants de clĂ©s, plus prĂ©cisĂ©ment, l'id de la clĂ© et l'id utilisateur, car cette paire identifie de maniĂšre unique la clĂ©. Et maintenant, je dis que le serveur, au dĂ©marrage, obtient toutes les clĂ©s nĂ©cessaires pour vĂ©rifier la possibilitĂ© de dĂ©chiffrer les clĂ©s des espaces de tables. Pourquoi, alors, lors de l'initialisation, dans le cas d'un stockage de clĂ©s cĂŽtĂ© serveur, seul le key id et le user id sont chargĂ©s, et non toutes les clĂ©s ?id et userid, et non toutes les clĂ©s ? Parce que vous n'avez peut-ĂȘtre pas besoin de toutes les clĂ©s. C'est principalement liĂ© Ă la rotation de la clĂ© principale. Lors de la rotation de la clĂ© principale, une nouvelle clĂ© principale est créée dans le stockage, mais les anciennes clĂ©s ne sont pas supprimĂ©es. Ainsi, dans le stockage de clĂ©s cĂŽtĂ© serveur, vous pouvez avoir de nombreuses clĂ©s qui ne sont pas nĂ©cessaires au serveur et, par consĂ©quent, ne sont pas extraites lors du dĂ©marrage du serveur.
Il est temps de parler des avantages et des inconvénients du chiffrement utilisant une clé maßtre. Le plus grand avantage est qu'il vous faut seulement une clé de chiffrement (la clé maßtre), qui sera stockée séparément de vos données chiffrées. Cela rend le démarrage du serveur rapide et le stockage réduit, ce qui facilite la gestion. De plus, il est facile de régénérer la clé maßtre unique.
Cependant, le chiffrement avec une clĂ© maĂźtre prĂ©sente un grand inconvĂ©nient : une fois que l'espace de table est chiffrĂ© avec keys, il reste toujours chiffrĂ© avec la mĂȘme clĂ©. La rotation de la clĂ© maĂźtre n'est pas utile ici. Pourquoi est-ce un inconvĂ©nient ? Nous savons que MySQL a des bugs qui peuvent entraĂźner un plantage soudain et la crĂ©ation d'un fichier core. Puisque le fichier core contient un dump de la mĂ©moire du serveur, il se peut que la clĂ© chiffrĂ©e pour l'espace de table soit prĂ©sente dans ce dump. Pire encore, les clĂ©s dĂ©chiffrĂ©es de l'espace de table sont conservĂ©es en mĂ©moire, qui peut ĂȘtre Ă©changĂ©e sur le disque. On pourrait dire que ce n'est pas un inconvĂ©nient, puisqu'il vous faut les droits root pour accĂ©der Ă ces fichiers et Ă la partition d'Ă©change. Oui. Mais l'accĂšs root n'est nĂ©cessaire que pendant un certain temps. Une fois que quelqu'un a accĂšs Ă la clĂ© dĂ©chiffrĂ©e de l'espace de table, il ou elle peut continuer Ă l'utiliser pour dĂ©chiffrer des donnĂ©es mĂȘme sans les droits root. De plus, le disque peut ĂȘtre volĂ©, et la partition d'Ă©change ou les fichiers core peuvent ĂȘtre lus avec des outils tiers. L'objectif du TDE est de rendre cela illisible, mĂȘme si le disque est volĂ©. Il y a une possibilitĂ© de re-chiffrement de l'espace de table avec de nouvelles clĂ©s gĂ©nĂ©rĂ©es. Cette fonction s'appelle les flux de chiffrement (encryption threads) et, au moment de la rĂ©daction de cet article, elle est encore expĂ©rimentale.
Lire aussi :
Source : habr.com
