Chiffrement dans MySQL : utilisation de la clé principale

À l'approche du lancement d'un nouveau cycle pour le cours «Bases de donnĂ©es» Nous continuons Ă  publier une sĂ©rie d'articles sur le chiffrement dans MySQL.

Chiffrement dans MySQL : utilisation de la clé principale

Dans l'article précédent de cette série (Chiffrement dans MySQL : stockage des clés) 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 :

Chiffrement dans MySQL : utilisation de la clé principale

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 (file-per-table tablespace). 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 (general tablespace). 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 Percona Server for MySQL 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 :

Chiffrement dans MySQL : utilisation de la clé principale

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 (Chiffrement dans MySQL : stockage des clĂ©s), 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Ă©. Percona Server for MySQL 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.

En savoir plus sur le cours

Lire aussi :

Source : habr.com

Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS đŸ”„ Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster