Dans ce tutoriel je vais vous expliquer comment chiffrer les tables d’une base de données MariaDB à l’aide de clé. Je commence toutefois par vous avertir, ce n’est pas une solution miracle et MariaDB est un peu en retard par rapport à d’autres SGBDR. Voyons un peu pourquoi avant de passer à la suite.
Le chiffrement des données est souvent perçu comme une garantie de sécurité, mais est-ce vraiment utile pour une base de données MariaDB ? En fait, pas tant que ça. Si, sur le papier, chiffrer une base peut sembler être une bonne idée, la mise en œuvre pratique laisse à désirer, notamment parce que la clé de chiffrement est souvent stockée à proximité des fichiers de configuration ou de la base elle-même. Un attaquant qui parvient à accéder aux fichiers de la base pourrait donc très facilement récupérer la clé de déchiffrement, rendant le chiffrement inutile.
Certes, il est possible de déplacer la clé vers un autre fichier ou un autre emplacement, mais cela ne fait que repousser le problème. Tant que la clé reste accessible quelque part sur le système, elle peut être compromise. L’idéal serait de charger cette clé en mémoire lors du démarrage du service MariaDB, sans la laisser persister sur le disque. Mais cette fonctionnalité n’est pas disponible nativement dans MariaDB, ce qui limite la réelle efficacité du chiffrement.
D’un point de vue conformité, chiffrer une base de données qui contient des informations sensibles, comme des données personnelles, peut répondre à certaines exigences réglementaires. Cela peut également rassurer les parties prenantes d’un projet en leur donnant une illusion de sécurité. Cependant, si la clé de chiffrement est mal protégée, cela ne servira qu’à compliquer la tâche d’un attaquant, sans vraiment protéger les données.
Le chiffrement des tables dans MariaDB est surtout utile pour satisfaire des exigences légales ou pour calmer les inquiétudes des décideurs. Mais pour une sécurité réelle, il ne faut pas se reposer uniquement sur cette fonctionnalité : il est crucial de sécuriser le serveur avec des outils comme des pare-feux (iptables), des systèmes de détection d’intrusion (Suricata), des mesures anti-bruteforce (fail2ban), et des solutions de monitoring (Splunk, par exemple). Le chiffrement seul ne fait pas tout. Comme toujours, la sécurité repose sur un ensemble de pratiques et de couches de protection.
Vous êtes donc prévenu et on peut passer la partie qui vous intéresse vraiment, comment chiffrer les tables de votre base de données MariaDB. Dans ce tutoriel, je vais seulement vous expliquer comment faire et il faudra que vous mettiez en place le reste de la sécurité. De toute façon, c’est déjà bien en place sur votre serveur web non ?
Générer des clés de chiffrement
Tout d’abord, nous devons générer des clés de chiffrement qui seront utilisées par MariaDB. Pour cela, nous allons utiliser l’utilitaire openssl
pour générer des chaînes HEX aléatoires. Exécutez les commandes suivantes en tant que superutilisateur :
# sudo su
# mkdir -p /etc/mysql/encryption
# cd /etc/mysql/encryption
Ensuite, générez quatre clés aléatoires avec des chaînes HEX de 32 caractères et enregistrez-les dans un fichier nommé keys
:
# echo "1;"$(openssl rand -hex 32) > keys
# echo "2;"$(openssl rand -hex 32) >> keys
# echo "3;"$(openssl rand -hex 32) >> keys
# echo "4;"$(openssl rand -hex 32) >> keys
Vous pouvez afficher le contenu du fichier keys
pour vérifier que les clés ont bien été générées :
# cat keys
Le fichier de clés devrait ressembler à ceci :
1;d87bd3a4eddbf6ca7312b35f49930833507a7e3470a65a5c0e99525815025afe
2;e916611f0e7d091c33913f3bebd70f475b40dd7fe2f7f63d384ebf4a74181ecf
3;3d69be819dfcf68eb0333651d4d8e88592b56bff59f5e85c774e61129b3b5138
4;e7b0144fa62372278ac25218eb52c61ff8a993c25ec9d2a9edca3aa0355ae0b8
Chiffrer le fichier de clés
Nous allons maintenant chiffrer ce fichier keys
à l’aide d’un mot de passe. Vous pouvez générer un mot de passe aléatoire avec openssl
:
# openssl rand -hex 128 > password_file
Ensuite, utilisez ce mot de passe pour chiffrer le fichier de clés :
# openssl enc -aes-256-cbc -md sha1 -pass file:password_file -in keys -out keys.enc
Le fichier chiffré keys.enc
sera utilisé par MariaDB pour chiffrer les tables.
Changer la configuration de MariaDB
MariaDB utilise le plugin file_key_management pour gérer les clés de chiffrement. Nous allons ajouter cette configuration dans un fichier .cnf. Trouvez le bon fichier de configuration, dans mon cas sur Ubuntu, il s’agit de :
# vi /etc/mysql/mariadb.conf.d/50-server.cnf
Ajoutez alors le contenu suivant dans la partie [mariadb] :
[mariadb]
## Gestion des clés via un fichier
plugin_load_add = file_key_management
file_key_management_filename = /etc/mysql/encryption/keys.enc
file_key_management_filekey = FILE:/etc/mysql/encryption/password_file
file_key_management_encryption_algorithm = aes_cbc
## Configuration de l'encryption pour InnoDB/XtraDB
innodb_default_encryption_key_id = 1
innodb_encrypt_tables = ON
innodb_encrypt_log = ON
innodb_encryption_threads = 4
## Configuration de l'encryption pour Aria
aria_encrypt_tables = ON
## Chiffrement des fichiers temporaires et des logs
encrypt-tmp-disk-tables = 1
encrypt-tmp-files = 1
encrypt_binlog = ON
Protéger les fichiers sensibles
Les fichiers keys.enc
et password_file
contiennent des informations sensibles et doivent être protégés. N’oubliez pas l’introduction, c’est une protection au milieu des autres. Changez leurs permissions pour que seuls les utilisateurs autorisés puissent y accéder :
# cd /etc/mysql/
# sudo chown -R mysql:root ./encryption
# sudo chmod 500 /etc/mysql/encryption/
# cd ./encryption
# chmod 400 keys.enc password_file
# chmod 644 /etc/mysql/mariadb.conf.d/encryption.cnf
Redémarrer MariaDB
Après avoir configuré et sécurisé les fichiers, redémarrez le service MariaDB pour appliquer les changements :
# service mysql restart
ou
# service mariadb restart
Chiffrer les tables existantes
Connectez vous à MariaDB et sélectionnez votre base de données et chiffrez une table existante :
MariaDB [(none)]> USE zonetuto;
MariaDB [zonetuto]> ALTER TABLE users ENCRYPTED=YES;
Attention, si votre table est lourde avec beaucoup de lignes et selon la puissance de votre serveur web, la modification de cette table peu prendre du temps. Donc faites attention sur un serveur de production, il est préférable de couper votre application pour une maintenance.
Vérifier le chiffrement
Pour vérifier que la table a bien été chiffrée, utilisez la commande strings
sur le fichier .ibd
correspondant à la table :
# strings /var/lib/mysql/zonetuto/users.ibd | head -n 20
C’est normalement totalement illisible. Vous pouvez aussi directement vérifier dans MariaDB à l’aide de la requête SQL suivante :
SHOW TABLE STATUS LIKE 'nom_de_la_table';
J’obtiens alors les informations suivantes sur ma table users :
*************************** 1. row ***************************
Name: users
Engine: InnoDB
Version: 10
Row_format: Dynamic
Rows: 9706151
Avg_row_length: 81
Data_length: 792707072
Max_data_length: 0
Index_length: 660422656
Data_free: 0
Auto_increment: 9742816
Create_time: 2024-09-05 08:54:20
Update_time: 2024-09-10 16:32:05
Check_time: NULL
Collation: utf8mb4_unicode_ci
Checksum: NULL
Create_options: `ENCRYPTED`=YES
Comment:
Max_index_length: 0
Temporary: N
1 row in set (0.000 sec)
Dans cet exemple, la table users
est chiffrée, car la ligne Create_options
indique ENCRYPTED=YES
.
Chiffrer les nouvelles tables par défaut
Si vous souhaitez que toutes les nouvelles tables soient chiffrées par défaut, ajoutez cette ligne à votre fichier de configuration :
innodb-encrypt-tables=FORCE
Cela garantira que toutes les nouvelles tables créées seront automatiquement chiffrées. Vous avez maintenant configuré et activé le chiffrement des tables dans MariaDB. Vous pouvez continuer à gérer vos bases de données tout en assurant un niveau supplémentaire de sécurité pour vos données.