Le chiffrement TDE (Tranparent Data Encryption) permet de chiffrer l’intégralité du stockage de la base (données, index et transactions…) en garantissant aux requêtes les mêmes performances que si la base n’était pas chiffrée. Mais il existe une petite faille lorsque l’on utilise la haute disponibilité via AlwaysOn…
TDE appelé en français chiffrement transparent des données, consiste à chiffrer le stockage, c’est à dire les fichiers de la base que ces fichiers contiennent des données (tables, index…) ou des transactions (en particulier le journal de transaction). Ceci s’effectuant à la volée : au moment des lectures physiques du disque un déchiffrement est effectué, comme un chiffrement s’effectue au moment d’écrire transactions et données d’index ou de table.
Pour que le service soit complet il convient aussi de chiffrer la base tempdb. En effet, des données peuvent y séjourner de manière transitoire, du fait de tables temporaires implicites ou explicites. C’est pourquoi dès qu’un chiffrement TDE est mis en place, la base système tempdb est automatiquement chiffrée. Ceci se fait au moment du lancement de la commande :
ALTER DATABASE ... SET ENCRYPTION ON;
Le problème se pose lorsque des réplicas de la base chiffrée en mode TDE sont disposées sur d’autres serveurs dans le cadre d’une haute disponibilité via AlwaysOn. En effet, les bases de production enrôlées dans un groupe de disponibilité sont bien chiffrées sur les secondaires, car l’initialisation passe par une restauration de la base.
Cependant il n’en est rien pour les bases tempdb des réplicas secondaires, car ce n’est qu’au moment du passage de la commande lançant le chiffrement de la base, que tempdb est aussi enrôlé dans ce chiffrement…
Autrement dit, si l’on ne fait rien, la base tempdb reste en clair, et les données transitoires des bases chiffrées via TDE sont lisible telle quel…
La solution consiste donc à forcer la base tempdb a être chiffrée du point de vue TDE en créant artificiellement une base de données que l’on va mettre sous TDE puis supprimer.
Le script suivant réalise cette opération :
-- Vérifions que la base système tempdb n'est pas chiffrée via TDE : SELECT name, is_encrypted FROM sys.databases WHERE name = 'tempdb'; GO -- Création d'une base transitoire CREATE DATABASE [.]; GO -- Chiffrement de la base transitoire USE [.]; GO CREATE DATABASE ENCRYPTION KEY WITH ALGORITHM = TRIPLE_DES_3KEY ENCRYPTION BY SERVER CERTIFICATE CERT_TDE_tempdb; GO ALTER DATABASE [.] SET ENCRYPTION ON; GO -- Suppression de la base transitoire USE [.]; GO ALTER DATABASE [.] SET SINGLE_USER WITH ROLLBACK IMMEDIATE; GO USE master; GO DROP DATABASE [.]; GO -- Vérification du chiffrement TDE pour tempdb SELECT name, is_encrypted FROM sys.databases WHERE name = 'tempdb'; GO
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
* Le site sur les SGBD relationnels et le SQL : https://sqlpro.developpez.com *
* le blog SQL, SQL Server, SGBDR... sur : https://blog.developpez.com/sqlpro/ *
* Expert Microsoft SQL Server, MVP (Most valuable Professional) depuis 14 ans *
* Entreprise SQL SPOT : modélisation, conseil, audit, optimisation, formation *
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *