إنتقل إلى المحتوى الرئيسي

المراقبة والتنبيه

راقب حالة تشفير DuoKey SQL EKM وقم بتكوين التنبيهات

ينطبق على:
SQL Server 2016+العملياتSQL Server Agent

نظرة عامة

تضمن المراقبة الفعّالة بقاء قواعد بياناتك المشفّرة سليمة ومتوافقة. يغطّي هذا الدليل مراقبة الحالة الفورية وفحوصات السلامة الآلية وتنبيهات SQL Server Agent وتسجيل التدقيق.

لوحة معلومات تشفير TDE● جميع الأنظمة سليمة
قواعد البيانات المشفّرة
12
التشفير المعلّق
0
التدوير متأخّر
2
حالة الموفّر
OK

مراقبة حالة التشفير

إنشاء طريقة عرض الحالة

أنشئ طريقة عرض لتسهيل مراقبة جميع قواعد البيانات المشفّرة:

طريقة عرض حالة 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
نصيحة
استعلم عن طريقة العرض هذه بانتظام باستخدام: SELECT * FROM dbo.vw_TDE_Status

مرجع حالات التشفير

فهم حالات التشفير أمر بالغ الأهمية للمراقبة:

الحالةالقيمةالوصفالإجراء المطلوب
0لا يوجد DEKلا يوجد مفتاح تشفير لقاعدة البياناتإنشاء DEK باستخدام CREATE DATABASE ENCRYPTION KEY
1غير مشفّرمفتاح DEK موجود لكن التشفير غير مُفعَّلالتفعيل باستخدام ALTER DATABASE SET ENCRYPTION ON
2قيد التشفيرالتشفير قيد التقدّمانتظر اكتمال العملية، وراقب percent_complete
3مشفَّرةقاعدة البيانات مشفَّرة بالكامللا شيء - تشغيل طبيعي
4تغيير المفتاحتدوير المفتاح قيد التنفيذانتظر اكتمال العملية
5قيد فك التشفيرفك التشفير قيد التنفيذانتظر اكتمال العملية
6تغيير الحمايةتغيير أداة الحماية قيد التنفيذانتظر اكتمال العملية

استعلامات الحالة السريعة

فحص الحالة السريعSQL
-- 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

إجراء مخزّن لفحص السلامة

يتحقّق هذا الإجراء المخزّن الشامل من المشكلات الشائعة ويمكنه اختياريًا إرسال تنبيهات بريد إلكتروني:

إجراء فحص السلامةSQL
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

أمثلة الاستخدام

تنفيذ فحص السلامةSQL
-- 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
ملاحظة
يتطلّب إجراء فحص السلامة تكوين Database Mail لتنبيهات البريد الإلكتروني. راجع وثائق Microsoft Database Mail.

تنبيهات SQL Server Agent

أنشئ مهمة SQL Server Agent آلية لتشغيل فحص السلامة وفق جدول زمني:

إنشاء مهمة 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

خيارات الجدولة

الجدولfreq_typefreq_subday_typefreq_subday_interval
كل ساعة4 (يوميًا)8 (ساعة)1
كل 15 دقيقة4 (يوميًا)4 (دقيقة)15
كل 6 ساعات4 (يوميًا)8 (ساعة)6
مرة واحدة يوميًا في الساعة 6 صباحًا4 (يوميًا)1 (مرة واحدة)N/A
مهم
تأكّد من تشغيل SQL Server Agent وأن حساب الخدمة يملك أذونات إرسال البريد الإلكتروني في حال استخدام Database Mail.

مراقبة الأداء

راقب أداء الإدخال/الإخراج لضمان ألا يسبّب TDE عبئًا زائدًا مفرطًا:

استعلام خط أساس الأداءSQL
-- 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

المقاييس الرئيسية التي يجب مراقبتها

المقياسالنطاق السليمالإجراء عند التجاوز
AvgReadLatencyMs< 20msتحقّق من إدخال/إخراج التخزين، وفكّر في تخزين أسرع
AvgWriteLatencyMs< 20msتحقّق من إدخال/إخراج التخزين، وفكّر في تحسين السجل
المعالج أثناء التشفير< 80%جدوِل التشفير خارج ساعات الذروة
تقدّم فحص TDEمتزايدتحقّق من الأقفال واختناقات الإدخال/الإخراج
نصيحة
يضيف TDE عادةً عبئًا زائدًا بنسبة 3-5% للقراءات و5-10% للكتابات. تقلّل المعالجات الحديثة المزوّدة بتعليمات AES-NI هذا التأثير بشكل كبير.

تكوين التدقيق

مكّن SQL Server Audit لتتبّع عمليات المفاتيح لأغراض الامتثال:

تكوين التدقيقSQL
-- 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

الأحداث المُلتقطة

مجموعة الأحداثما الذي تلتقطه
DATABASE_CHANGE_GROUPعمليات CREATE/ALTER/DROP DATABASE
SCHEMA_OBJECT_ACCESS_GROUPالوصول إلى مفاتيح التشفير والشهادات
BACKUP_RESTORE_GROUPعمليات النسخ الاحتياطي والاستعادة
تنبيه
تأكّد من وجود مسار ملف التدقيق وأن حساب خدمة SQL Server يملك أذونات الكتابة. قد تنمو ملفات التدقيق لتصبح كبيرة - طبّق التدوير.