Zum Hauptinhalt springen

Überwachung und Alarmierung

Überwachen Sie den DuoKey SQL EKM-Verschlüsselungsstatus und konfigurieren Sie Warnungen

Gilt für:
SQL Server 2016+BetriebSQL Server Agent

Überblick

Eine wirksame Überwachung stellt sicher, dass Ihre verschlüsselten Datenbanken fehlerfrei und konform bleiben. Dieser Leitfaden behandelt die Echtzeit-Statusüberwachung, automatisierte Zustandsprüfungen, SQL Server Agent-Warnungen und die Audit-Protokollierung.

TDE-Verschlüsselungs-Dashboard● Alle Systeme fehlerfrei
Verschlüsselte Datenbanken
12
Ausstehende Verschlüsselung
0
Rotation überfällig
2
Provider-Status
OK

Überwachung des Verschlüsselungsstatus

Statusansicht erstellen

Erstellen Sie eine Ansicht zur einfachen Überwachung aller verschlüsselten Datenbanken:

TDE-StatusansichtSQL
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
Tipp
Fragen Sie diese Ansicht regelmäßig ab mit: SELECT * FROM dbo.vw_TDE_Status

Referenz der Verschlüsselungszustände

Das Verständnis der Verschlüsselungszustände ist entscheidend für die Überwachung:

ZustandWertBeschreibungErforderliche Aktion
0Kein DEKKein Datenbankverschlüsselungsschlüssel vorhandenDEK mit CREATE DATABASE ENCRYPTION KEY erstellen
1UnverschlüsseltDEK vorhanden, Verschlüsselung jedoch nicht aktiviertMit ALTER DATABASE SET ENCRYPTION ON aktivieren
2Verschlüsselung läuftVerschlüsselung wird durchgeführtAuf Abschluss warten, percent_complete überwachen
3VerschlüsseltDatenbank vollständig verschlüsseltKeine – normaler Betrieb
4SchlüsselwechselSchlüsselrotation wird durchgeführtAuf Abschluss warten
5Entschlüsselung läuftEntschlüsselung wird durchgeführtAuf Abschluss warten
6SchutzwechselWechsel des Protektors wird durchgeführtAuf Abschluss warten

Schnelle Statusabfragen

Schnelle StatusprüfungSQL
-- 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

Gespeicherte Prozedur für Zustandsprüfung

Diese umfassende gespeicherte Prozedur prüft auf häufige Probleme und kann optional E-Mail-Warnungen versenden:

Zustandsprüfungs-ProzedurSQL
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

Anwendungsbeispiele

Zustandsprüfung ausführenSQL
-- 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
Hinweis
Die Zustandsprüfungs-Prozedur erfordert, dass Database Mail für E-Mail-Warnungen konfiguriert ist. Siehe Microsoft Database Mail-Dokumentation.

SQL Server Agent-Warnungen

Erstellen Sie einen automatisierten SQL Server Agent-Auftrag, um die Zustandsprüfung nach einem Zeitplan auszuführen:

Agent-Auftrag erstellenSQL
-- 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

Zeitplanoptionen

Zeitplanfreq_typefreq_subday_typefreq_subday_interval
Jede Stunde4 (Täglich)8 (Stunde)1
Alle 15 Minuten4 (Täglich)4 (Minute)15
Alle 6 Stunden4 (Täglich)8 (Stunde)6
Einmal täglich um 6 Uhr4 (Täglich)1 (Einmal)N/A
Wichtig
Stellen Sie sicher, dass SQL Server Agent ausgeführt wird und das Dienstkonto über Berechtigungen zum Versenden von E-Mails verfügt, wenn Database Mail verwendet wird.

Leistungsüberwachung

Überwachen Sie die E/A-Leistung, um sicherzustellen, dass TDE keinen übermäßigen Mehraufwand verursacht:

Abfrage der Leistungs-BaselineSQL
-- 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

Wichtige zu beobachtende Kennzahlen

KennzahlGesunder BereichMaßnahme bei Überschreitung
AvgReadLatencyMs< 20msSpeicher-E/A prüfen, schnelleren Speicher in Betracht ziehen
AvgWriteLatencyMs< 20msSpeicher-E/A prüfen, Protokolloptimierung in Betracht ziehen
CPU während der Verschlüsselung< 80%Verschlüsselung außerhalb der Betriebszeiten planen
TDE-Scan-FortschrittSteigendAuf Sperren und E/A-Engpässe prüfen
Tipp
TDE verursacht typischerweise 3-5 % Mehraufwand bei Lesevorgängen und 5-10 % bei Schreibvorgängen. Moderne CPUs mit AES-NI-Befehlen minimieren diese Auswirkung erheblich.

Audit-Konfiguration

Aktivieren Sie SQL Server Audit, um Schlüsseloperationen für die Compliance nachzuverfolgen:

Audit-KonfigurationSQL
-- 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

Erfasste Ereignisse

EreignisgruppeWas erfasst wird
DATABASE_CHANGE_GROUPCREATE/ALTER/DROP DATABASE-Operationen
SCHEMA_OBJECT_ACCESS_GROUPZugriff auf Verschlüsselungsschlüssel und Zertifikate
BACKUP_RESTORE_GROUPSicherungs- und Wiederherstellungsvorgänge
Vorsicht
Stellen Sie sicher, dass der Pfad zur Audit-Datei existiert und das SQL Server-Dienstkonto über Schreibberechtigungen verfügt. Audit-Dateien können sehr groß werden - richten Sie eine Rotation ein.