DMV et vues de catalogue de SQL Server pour la surveillance de DuoKey SQL EKM
Renvoie des informations sur les fournisseurs cryptographiques enregistrés.
SELECT
provider_id,
name,
guid,
version,
dll_path,
is_enabled
FROM sys.cryptographic_providers;
GO| Colonne | Type de données | Description |
|---|---|---|
provider_id | int | Identifiant unique du fournisseur |
name | sysname | Nom du fournisseur cryptographique |
guid | uniqueidentifier | GUID du fournisseur |
version | nvarchar(256) | Chaîne de version du fournisseur |
dll_path | nvarchar(512) | Chemin vers la DLL du fournisseur |
is_enabled | bit | Indique si le fournisseur est activé (1) ou désactivé (0) |
Renvoie des informations sur les clés asymétriques de la base de données.
SELECT
name,
principal_id,
asymmetric_key_id,
pvt_key_encryption_type_desc,
algorithm_desc,
key_length,
sid,
thumbprint,
provider_id
FROM sys.asymmetric_keys;
GO| Colonne | Type de données | Description |
|---|---|---|
name | sysname | Nom de la clé |
asymmetric_key_id | int | Identifiant unique de la clé |
algorithm_desc | nvarchar(60) | Description de l'algorithme (par ex. RSA_2048) |
key_length | int | Longueur de la clé en bits |
thumbprint | varbinary(32) | Empreinte de la clé pour l'identification |
provider_id | int | ID du fournisseur EKM (NULL pour les clés non-EKM) |
provider_id n'est pas NULL sont des clés gérées par l'EKM.Renvoie des informations sur les identifiants SQL Server.
SELECT
credential_id,
name,
credential_identity,
create_date,
modify_date,
target_type,
target_id
FROM sys.credentials
WHERE name LIKE '%EKM%' OR name LIKE '%DuoKey%';
GO| Colonne | Type de données | Description |
|---|---|---|
credential_id | int | Identifiant unique |
name | sysname | Nom de l'identifiant |
credential_identity | nvarchar(4000) | Identité (Client ID pour DuoKey) |
create_date | datetime | Date de création de l'identifiant |
target_type | nvarchar(100) | Type de cible (CRYPTOGRAPHIC PROVIDER) |
target_id | int | ID du fournisseur cible |
SECRET n'est jamais exposée dans les vues système pour des raisons de sécurité.Renvoie l'état de chiffrement de toutes les bases de données. Il s'agit de la principale DMV pour surveiller l'état du TDE.
SELECT
database_id,
encryption_state,
create_date,
regenerate_date,
modify_date,
set_date,
opened_date,
key_algorithm,
key_length,
encryptor_thumbprint,
encryptor_type,
percent_complete
FROM sys.dm_database_encryption_keys;
GO| Colonne | Type de données | Description |
|---|---|---|
database_id | int | Identifiant de la base de données |
encryption_state | int | État de chiffrement actuel (0-6) |
key_algorithm | nvarchar(32) | Algorithme utilisé (par ex. AES) |
key_length | int | Longueur de la clé en bits (128, 192, 256) |
encryptor_thumbprint | varbinary(20) | Empreinte de la clé de protection |
percent_complete | real | Pourcentage d'avancement des changements d'état |
regenerate_date | datetime | Date de la dernière rotation de clé |
| État | Nom | Description |
|---|---|---|
| 0 | Aucune DEK | Aucune clé de chiffrement de base de données présente |
| 1 | Non chiffré | La DEK existe mais le chiffrement n'est pas activé |
| 2 | Chiffrement en cours | Chiffrement en cours |
| 3 | Chiffré | Base de données entièrement chiffrée |
| 4 | Changement de clé | Rotation de clé en cours |
| 5 | Déchiffrement en cours | Déchiffrement en cours |
| 6 | Changement de protection | Changement de protecteur en cours |
Renvoie les statistiques d'E/S pour les fichiers de données et de journaux. Utile pour surveiller l'impact du TDE sur les performances.
SELECT
database_id,
file_id,
num_of_reads,
num_of_writes,
io_stall_read_ms,
io_stall_write_ms,
size_on_disk_bytes
FROM sys.dm_io_virtual_file_stats(NULL, NULL);
GO| Colonne | Type de données | Description |
|---|---|---|
num_of_reads | bigint | Nombre de lectures émises |
num_of_writes | bigint | Nombre d'écritures émises |
io_stall_read_ms | bigint | Temps total d'attente des lectures (ms) |
io_stall_write_ms | bigint | Temps total d'attente des écritures (ms) |
size_on_disk_bytes | bigint | Taille du fichier sur le disque |
-- Verify EKM provider is operational
DECLARE @result INT;
BEGIN TRY
SELECT @result = COUNT(*)
FROM sys.cryptographic_providers
WHERE name = 'DuoKeyProvider' AND is_enabled = 1;
IF @result = 1
PRINT 'EKM Provider: HEALTHY';
ELSE
PRINT 'EKM Provider: NOT FOUND OR DISABLED';
END TRY
BEGIN CATCH
PRINT 'EKM Provider: ERROR - ' + ERROR_MESSAGE();
END CATCH
GO-- Track key creation and modification for rotation planning
SELECT
ak.name AS KeyName,
ak.create_date AS Created,
ak.modify_date AS Modified,
DATEDIFF(DAY, ak.create_date, GETDATE()) AS AgeDays,
CASE
WHEN DATEDIFF(DAY, ak.create_date, GETDATE()) > 365
THEN 'Rotation Recommended'
WHEN DATEDIFF(DAY, ak.create_date, GETDATE()) > 270
THEN 'Rotation Soon'
ELSE 'OK'
END AS RotationStatus
FROM sys.asymmetric_keys ak
WHERE ak.provider_id IS NOT NULL
ORDER BY ak.create_date;
GO-- Monitor ongoing encryption operations
SELECT
DB_NAME(database_id) AS DatabaseName,
encryption_state,
CASE encryption_state
WHEN 2 THEN 'Encrypting'
WHEN 4 THEN 'Key Rotating'
WHEN 5 THEN 'Decrypting'
WHEN 6 THEN 'Changing Protector'
END AS Operation,
percent_complete AS [Progress %],
modify_date AS LastUpdate,
DATEDIFF(MINUTE, modify_date, GETDATE()) AS MinutesSinceUpdate
FROM sys.dm_database_encryption_keys
WHERE encryption_state IN (2, 4, 5, 6);
GOCette requête fournit une vue d'ensemble complète de l'état de votre chiffrement TDE, adaptée aux tableaux de bord et aux outils de surveillance :
-- Comprehensive TDE encryption status dashboard
SELECT
DB_NAME(dek.database_id) AS [Database],
d.state_desc AS [DB State],
CASE dek.encryption_state
WHEN 0 THEN 'No DEK'
WHEN 1 THEN 'Unencrypted'
WHEN 2 THEN 'Encrypting...'
WHEN 3 THEN 'Encrypted'
WHEN 4 THEN 'Key Changing...'
WHEN 5 THEN 'Decrypting...'
WHEN 6 THEN 'Protection Changing...'
END AS [Encryption State],
dek.percent_complete AS [Progress %],
dek.key_algorithm + '_' + CAST(dek.key_length AS VARCHAR) AS [Algorithm],
ak.name AS [Protecting Key],
cp.name AS [EKM Provider],
dek.create_date AS [DEK Created],
dek.regenerate_date AS [Last Rotated],
DATEDIFF(DAY, ISNULL(dek.regenerate_date, dek.create_date), GETDATE())
AS [Days Since Rotation],
CASE
WHEN DATEDIFF(DAY, ISNULL(dek.regenerate_date, dek.create_date), GETDATE()) > 365
THEN 'OVERDUE'
WHEN DATEDIFF(DAY, ISNULL(dek.regenerate_date, dek.create_date), GETDATE()) > 270
THEN 'DUE SOON'
ELSE 'OK'
END AS [Rotation Status]
FROM sys.dm_database_encryption_keys dek
INNER JOIN sys.databases d ON dek.database_id = d.database_id
LEFT JOIN sys.asymmetric_keys ak ON dek.encryptor_thumbprint = ak.thumbprint
LEFT JOIN sys.cryptographic_providers cp ON ak.provider_id = cp.provider_id
ORDER BY d.name;
GO