TDE et AlwaysOn… Penser à protéger tempdb

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 * * * * *

Ce contenu a été publié dans DBA, Procédures MS SQL Server, SQL Server, Tips and tricks, avec comme mot(s)-clé(s) , , , , , . Vous pouvez le mettre en favoris avec ce permalien.