طرق عرض DMV والكتالوج في SQL Server لمراقبة DuoKey SQL EKM
تُرجع معلومات حول موفّري التشفير المسجّلين.
SELECT
provider_id,
name,
guid,
version,
dll_path,
is_enabled
FROM sys.cryptographic_providers;
GO| العمود | نوع البيانات | الوصف |
|---|---|---|
provider_id | int | المعرّف الفريد للموفّر |
name | sysname | اسم موفّر التشفير |
guid | uniqueidentifier | GUID الموفّر |
version | nvarchar(256) | سلسلة إصدار الموفّر |
dll_path | nvarchar(512) | مسار ملف DLL الخاص بالموفّر |
is_enabled | bit | ما إذا كان الموفّر مُمكَّنًا (1) أو معطّلًا (0) |
تُرجع معلومات حول المفاتيح غير المتماثلة في قاعدة البيانات.
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| العمود | نوع البيانات | الوصف |
|---|---|---|
name | sysname | اسم المفتاح |
asymmetric_key_id | int | المعرّف الفريد للمفتاح |
algorithm_desc | nvarchar(60) | وصف الخوارزمية (مثال: RSA_2048) |
key_length | int | طول المفتاح بالبت |
thumbprint | varbinary(32) | بصمة المفتاح للتعريف |
provider_id | int | معرّف موفّر EKM (NULL للمفاتيح غير التابعة لـ EKM) |
provider_id غير NULL هي مفاتيح مُدارة بواسطة EKM.تُرجع معلومات حول بيانات اعتماد 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| العمود | نوع البيانات | الوصف |
|---|---|---|
credential_id | int | معرّف فريد |
name | sysname | اسم بيانات الاعتماد |
credential_identity | nvarchar(4000) | الهوية (Client ID لـ DuoKey) |
create_date | datetime | وقت إنشاء بيانات الاعتماد |
target_type | nvarchar(100) | نوع الهدف (CRYPTOGRAPHIC PROVIDER) |
target_id | int | معرّف الموفّر الهدف |
SECRET لا تُكشف مطلقًا في طرق عرض النظام لأسباب أمنية.تُرجع حالة التشفير لجميع قواعد البيانات. هذه هي الـ DMV الأساسية لمراقبة حالة 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| العمود | نوع البيانات | الوصف |
|---|---|---|
database_id | int | معرّف قاعدة البيانات |
encryption_state | int | حالة التشفير الحالية (0-6) |
key_algorithm | nvarchar(32) | الخوارزمية المستخدمة (مثال: AES) |
key_length | int | طول المفتاح بالبت (128، 192، 256) |
encryptor_thumbprint | varbinary(20) | بصمة المفتاح الحامي |
percent_complete | real | النسبة المئوية للاكتمال لتغييرات الحالة |
regenerate_date | datetime | تاريخ آخر تدوير للمفتاح |
| الحالة | الاسم | الوصف |
|---|---|---|
| 0 | لا يوجد DEK | لا يوجد مفتاح تشفير لقاعدة البيانات |
| 1 | غير مشفّر | الـ DEK موجود لكن التشفير غير مُمكَّن |
| 2 | قيد التشفير | التشفير قيد التقدّم |
| 3 | مشفّر | قاعدة البيانات مشفّرة بالكامل |
| 4 | قيد تغيير المفتاح | تدوير المفتاح قيد التقدّم |
| 5 | قيد فك التشفير | فك التشفير قيد التقدّم |
| 6 | قيد تغيير الحماية | تغيير الحامي قيد التقدّم |
تُرجع إحصائيات الإدخال/الإخراج لملفات البيانات والسجل. مفيدة لمراقبة تأثير TDE على الأداء.
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| العمود | نوع البيانات | الوصف |
|---|---|---|
num_of_reads | bigint | عدد عمليات القراءة الصادرة |
num_of_writes | bigint | عدد عمليات الكتابة الصادرة |
io_stall_read_ms | bigint | إجمالي وقت انتظار القراءات (مللي ثانية) |
io_stall_write_ms | bigint | إجمالي وقت انتظار الكتابات (مللي ثانية) |
size_on_disk_bytes | bigint | حجم الملف على القرص |
-- 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);
GOيوفّر هذا الاستعلام نظرة عامة كاملة على حالة تشفير TDE لديك، مناسبة للوحات المعلومات وأدوات المراقبة:
-- 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