Aller au contenu principal

Surveillance et alertes

Surveillez l'état du chiffrement DuoKey SQL EKM et configurez des alertes

S'applique à :
SQL Server 2016+OpérationsSQL Server Agent

Vue d'ensemble

Une surveillance efficace garantit que vos bases de données chiffrées restent saines et conformes. Ce guide couvre la surveillance de l'état en temps réel, les vérifications d'état automatisées, les alertes SQL Server Agent et la journalisation d'audit.

Tableau de bord de chiffrement TDE● Tous les systèmes sont sains
Bases de données chiffrées
12
Chiffrement en attente
0
Rotation en retard
2
État du fournisseur
OK

Surveillance de l'état du chiffrement

Créer une vue d'état

Créez une vue pour surveiller facilement toutes les bases de données chiffrées :

Vue d'état du TDESQL
CREATE OR ALTER VIEW dbo.vw_TDE_Status
AS
SELECT
    DB_NAME(dek.database_id) AS DatabaseName,
    d.state_desc AS DatabaseState,
    CASE dek.encryption_state
        WHEN 0 THEN 'No DEK Present'
        WHEN 1 THEN 'Unencrypted'
        WHEN 2 THEN 'Encryption In Progress'
        WHEN 3 THEN 'Encrypted'
        WHEN 4 THEN 'Key Change In Progress'
        WHEN 5 THEN 'Decryption In Progress'
        WHEN 6 THEN 'Protection Change In Progress'
    END AS EncryptionStatus,
    dek.percent_complete AS ProgressPercent,
    dek.key_algorithm AS Algorithm,
    dek.key_length AS KeyLength,
    ak.name AS ProtectingKeyName,
    cp.name AS EKMProvider,
    dek.create_date AS DEKCreated,
    dek.regenerate_date AS LastKeyRotation,
    DATEDIFF(DAY, ISNULL(dek.regenerate_date, dek.create_date), GETDATE())
        AS DaysSinceRotation
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;
GO
Astuce
Interrogez régulièrement cette vue avec : SELECT * FROM dbo.vw_TDE_Status

Référence des états de chiffrement

Comprendre les états de chiffrement est essentiel pour la surveillance :

ÉtatValeurDescriptionAction requise
0Aucune DEKAucune clé de chiffrement de base de données présenteCréer une DEK avec CREATE DATABASE ENCRYPTION KEY
1Non chiffréeLa DEK existe mais le chiffrement n'est pas activéActiver avec ALTER DATABASE SET ENCRYPTION ON
2Chiffrement en coursChiffrement en coursAttendre la fin, surveiller percent_complete
3ChiffréeBase de données entièrement chiffréeAucune — fonctionnement normal
4Changement de cléRotation de clé en coursAttendre la fin
5DéchiffrementDéchiffrement en coursAttendre la fin
6Changement de protectionChangement de protecteur en coursAttendre la fin

Requêtes d'état rapides

Vérification rapide de l'étatSQL
-- All encrypted databases with status
SELECT
    DB_NAME(database_id) AS [Database],
    encryption_state,
    percent_complete
FROM sys.dm_database_encryption_keys;
GO

-- Check EKM provider is healthy
SELECT name, is_enabled, version
FROM sys.cryptographic_providers
WHERE name = 'DuoKeyProvider';
GO

-- Databases needing attention
SELECT
    DB_NAME(database_id) AS [Database],
    'Key rotation overdue' AS Issue
FROM sys.dm_database_encryption_keys
WHERE DATEDIFF(DAY, ISNULL(regenerate_date, create_date), GETDATE()) > 365;
GO

Procédure stockée de vérification de l'état

Cette procédure stockée complète recherche les problèmes courants et peut éventuellement envoyer des alertes par e-mail :

Procédure de vérification de l'étatSQL
CREATE OR ALTER PROCEDURE dbo.usp_TDE_HealthCheck
    @AlertThresholdDays INT = 365,
    @SendEmail BIT = 0,
    @EmailRecipients NVARCHAR(500) = NULL
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @Issues TABLE (
        Severity VARCHAR(20),
        Category VARCHAR(50),
        DatabaseName NVARCHAR(128),
        Issue NVARCHAR(500),
        Recommendation NVARCHAR(500)
    );

    -- Check for databases that should be encrypted but aren't
    INSERT INTO @Issues
    SELECT
        'WARNING',
        'Encryption Gap',
        name,
        'Database is not encrypted',
        'Consider enabling TDE for this database'
    FROM sys.databases
    WHERE database_id > 4  -- Exclude system databases
    AND is_encrypted = 0
    AND name NOT IN ('tempdb', 'ReportServer', 'ReportServerTempDB');

    -- Check for key rotation overdue
    INSERT INTO @Issues
    SELECT
        'WARNING',
        'Key Rotation',
        DB_NAME(database_id),
        'Key rotation overdue (' +
            CAST(DATEDIFF(DAY, ISNULL(regenerate_date, create_date), GETDATE()) AS VARCHAR) +
            ' days since last rotation)',
        'Rotate DEK per security policy'
    FROM sys.dm_database_encryption_keys
    WHERE DATEDIFF(DAY, ISNULL(regenerate_date, create_date), GETDATE()) > @AlertThresholdDays;

    -- Check for stuck encryption operations
    INSERT INTO @Issues
    SELECT
        'CRITICAL',
        'Encryption Stuck',
        DB_NAME(database_id),
        'Encryption operation stuck at ' + CAST(percent_complete AS VARCHAR) + '%',
        'Investigate I/O performance and DuoKey connectivity'
    FROM sys.dm_database_encryption_keys
    WHERE encryption_state IN (2, 4, 5, 6)
    AND percent_complete < 100
    AND DATEDIFF(HOUR, modify_date, GETDATE()) > 4;

    -- Check EKM provider status
    IF NOT EXISTS (
        SELECT 1 FROM sys.cryptographic_providers
        WHERE name = 'DuoKeyProvider' AND is_enabled = 1
    )
    BEGIN
        INSERT INTO @Issues VALUES (
            'CRITICAL',
            'EKM Provider',
            'N/A',
            'DuoKey EKM Provider is not enabled or missing',
            'Verify provider installation and enable if disabled'
        );
    END

    -- Return results
    SELECT * FROM @Issues
    ORDER BY
        CASE Severity WHEN 'CRITICAL' THEN 1 WHEN 'WARNING' THEN 2 ELSE 3 END,
        Category, DatabaseName;

    -- Optionally send email (requires Database Mail configured)
    IF @SendEmail = 1 AND EXISTS (SELECT 1 FROM @Issues)
    BEGIN
        DECLARE @body NVARCHAR(MAX);
        SELECT @body = STRING_AGG(
            Severity + ': ' + Category + ' - ' + DatabaseName + ': ' + Issue,
            CHAR(13) + CHAR(10)
        ) FROM @Issues;

        EXEC msdb.dbo.sp_send_dbmail
            @recipients = @EmailRecipients,
            @subject = 'SQL EKM Health Check Alert',
            @body = @body;
    END
END
GO

Exemples d'utilisation

Exécuter la vérification de l'étatSQL
-- Basic health check (returns issues only)
EXEC dbo.usp_TDE_HealthCheck;
GO

-- With custom threshold (90 days for key rotation)
EXEC dbo.usp_TDE_HealthCheck @AlertThresholdDays = 90;
GO

-- With email alerts (requires Database Mail)
EXEC dbo.usp_TDE_HealthCheck
    @AlertThresholdDays = 365,
    @SendEmail = 1,
    @EmailRecipients = '[email protected],[email protected]';
GO
Remarque
La procédure de vérification de l'état nécessite que Database Mail soit configuré pour les alertes par e-mail. Voir Documentation Microsoft Database Mail.

Alertes SQL Server Agent

Créez un travail SQL Server Agent automatisé pour exécuter la vérification de l'état selon une planification :

Créer un travail AgentSQL
-- Create health check job
USE msdb;
GO

EXEC dbo.sp_add_job
    @job_name = N'TDE_HealthCheck_Hourly',
    @enabled = 1,
    @description = N'Hourly TDE encryption health check';
GO

EXEC dbo.sp_add_jobstep
    @job_name = N'TDE_HealthCheck_Hourly',
    @step_name = N'RunHealthCheck',
    @subsystem = N'TSQL',
    @command = N'EXEC dbo.usp_TDE_HealthCheck
        @AlertThresholdDays = 365,
        @SendEmail = 1,
        @EmailRecipients = ''[email protected]''',
    @database_name = N'master';
GO

EXEC dbo.sp_add_schedule
    @schedule_name = N'Hourly',
    @freq_type = 4,
    @freq_interval = 1,
    @freq_subday_type = 8,
    @freq_subday_interval = 1;
GO

EXEC dbo.sp_attach_schedule
    @job_name = N'TDE_HealthCheck_Hourly',
    @schedule_name = N'Hourly';
GO

EXEC dbo.sp_add_jobserver
    @job_name = N'TDE_HealthCheck_Hourly';
GO

PRINT 'Health check job created successfully.';
GO

Options de planification

Planificationfreq_typefreq_subday_typefreq_subday_interval
Toutes les heures4 (Quotidien)8 (Heure)1
Toutes les 15 minutes4 (Quotidien)4 (Minute)15
Toutes les 6 heures4 (Quotidien)8 (Heure)6
Une fois par jour à 6 h4 (Quotidien)1 (Une fois)N/A
Important
Assurez-vous que SQL Server Agent est en cours d'exécution et que le compte de service dispose des autorisations nécessaires pour envoyer des e-mails si vous utilisez Database Mail.

Surveillance des performances

Surveillez les performances d'E/S pour vous assurer que le TDE n'entraîne pas de surcharge excessive :

Requête de référence des performancesSQL
-- TDE Performance Baseline Query
SELECT
    DB_NAME(fs.database_id) AS DatabaseName,
    mf.name AS FileName,
    mf.type_desc AS FileType,
    fs.num_of_reads AS Reads,
    fs.num_of_writes AS Writes,
    fs.io_stall_read_ms AS ReadStallMs,
    fs.io_stall_write_ms AS WriteStallMs,
    CAST(fs.size_on_disk_bytes / 1024.0 / 1024.0 AS DECIMAL(10,2)) AS SizeMB,
    d.is_encrypted AS Encrypted,
    CASE
        WHEN fs.num_of_reads > 0
        THEN CAST(fs.io_stall_read_ms / fs.num_of_reads AS DECIMAL(10,2))
        ELSE 0
    END AS AvgReadLatencyMs,
    CASE
        WHEN fs.num_of_writes > 0
        THEN CAST(fs.io_stall_write_ms / fs.num_of_writes AS DECIMAL(10,2))
        ELSE 0
    END AS AvgWriteLatencyMs
FROM sys.dm_io_virtual_file_stats(NULL, NULL) fs
INNER JOIN sys.master_files mf
    ON fs.database_id = mf.database_id AND fs.file_id = mf.file_id
INNER JOIN sys.databases d
    ON fs.database_id = d.database_id
WHERE d.is_encrypted = 1
ORDER BY fs.io_stall_read_ms + fs.io_stall_write_ms DESC;
GO

Indicateurs clés à surveiller

IndicateurPlage saineAction si dépassé
AvgReadLatencyMs< 20msVérifiez les E/S de stockage, envisagez un stockage plus rapide
AvgWriteLatencyMs< 20msVérifiez les E/S de stockage, envisagez d'optimiser les journaux
Processeur pendant le chiffrement< 80%Planifiez le chiffrement en dehors des heures de pointe
Progression de l'analyse TDEEn augmentationVérifiez les verrous et les goulets d'étranglement d'E/S
Astuce
Le TDE ajoute généralement une surcharge de 3 à 5 % pour les lectures et de 5 à 10 % pour les écritures. Les processeurs modernes dotés d'instructions AES-NI réduisent considérablement cet impact.

Configuration de l'audit

Activez SQL Server Audit pour suivre les opérations sur les clés à des fins de conformité :

Configuration de l'auditSQL
-- Create server audit
CREATE SERVER AUDIT TDE_Audit
TO FILE (FILEPATH = 'C:\SQLAudit\', MAXSIZE = 100 MB)
WITH (QUEUE_DELAY = 1000, ON_FAILURE = CONTINUE);
GO

ALTER SERVER AUDIT TDE_Audit WITH (STATE = ON);
GO

-- Create audit specification for crypto operations
CREATE SERVER AUDIT SPECIFICATION TDE_AuditSpec
FOR SERVER AUDIT TDE_Audit
ADD (DATABASE_CHANGE_GROUP),
ADD (SCHEMA_OBJECT_ACCESS_GROUP),
ADD (BACKUP_RESTORE_GROUP)
WITH (STATE = ON);
GO

PRINT 'Audit configuration created successfully.';
GO

Événements capturés

Groupe d'événementsCe qu'il capture
DATABASE_CHANGE_GROUPOpérations CREATE/ALTER/DROP DATABASE
SCHEMA_OBJECT_ACCESS_GROUPAccès aux clés de chiffrement et aux certificats
BACKUP_RESTORE_GROUPOpérations de sauvegarde et de restauration
Attention
Assurez-vous que le chemin du fichier d'audit existe et que le compte de service SQL Server dispose des autorisations d'écriture. Les fichiers d'audit peuvent devenir volumineux : mettez en place une rotation.