SQL Server-DMVs und Katalogsichten zur Überwachung von DuoKey SQL EKM
Gibt Informationen über registrierte kryptografische Anbieter zurück.
SELECT
provider_id,
name,
guid,
version,
dll_path,
is_enabled
FROM sys.cryptographic_providers;
GO| Spalte | Datentyp | Beschreibung |
|---|---|---|
provider_id | int | Eindeutige Kennung für den Anbieter |
name | sysname | Name des kryptografischen Anbieters |
guid | uniqueidentifier | Anbieter-GUID |
version | nvarchar(256) | Versionszeichenfolge des Anbieters |
dll_path | nvarchar(512) | Pfad zur Anbieter-DLL |
is_enabled | bit | Ob der Anbieter aktiviert (1) oder deaktiviert (0) ist |
Gibt Informationen über asymmetrische Schlüssel in der Datenbank zurück.
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| Spalte | Datentyp | Beschreibung |
|---|---|---|
name | sysname | Schlüsselname |
asymmetric_key_id | int | Eindeutige Kennung für den Schlüssel |
algorithm_desc | nvarchar(60) | Algorithmusbeschreibung (z. B. RSA_2048) |
key_length | int | Schlüssellänge in Bit |
thumbprint | varbinary(32) | Schlüssel-Fingerabdruck zur Identifizierung |
provider_id | int | EKM-Anbieter-ID (NULL für Nicht-EKM-Schlüssel) |
provider_id ungleich NULL sind EKM-verwaltete Schlüssel.Gibt Informationen über SQL Server-Anmeldedaten zurück.
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| Spalte | Datentyp | Beschreibung |
|---|---|---|
credential_id | int | Eindeutige Kennung |
name | sysname | Name der Anmeldedaten |
credential_identity | nvarchar(4000) | Identität (Client-ID für DuoKey) |
create_date | datetime | Zeitpunkt der Erstellung der Anmeldedaten |
target_type | nvarchar(100) | Zieltyp (CRYPTOGRAPHIC PROVIDER) |
target_id | int | ID des Zielanbieters |
SECRET wird aus Sicherheitsgründen niemals in Systemsichten offengelegt.Gibt den Verschlüsselungsstatus für alle Datenbanken zurück. Dies ist die primäre DMV zur Überwachung des TDE-Status.
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| Spalte | Datentyp | Beschreibung |
|---|---|---|
database_id | int | Datenbankkennung |
encryption_state | int | Aktueller Verschlüsselungsstatus (0-6) |
key_algorithm | nvarchar(32) | Verwendeter Algorithmus (z. B. AES) |
key_length | int | Schlüssellänge in Bit (128, 192, 256) |
encryptor_thumbprint | varbinary(20) | Fingerabdruck des schützenden Schlüssels |
percent_complete | real | Prozentualer Fortschritt bei Statusänderungen |
regenerate_date | datetime | Datum der letzten Schlüsselrotation |
| Status | Name | Beschreibung |
|---|---|---|
| 0 | Kein DEK | Kein Datenbankverschlüsselungsschlüssel vorhanden |
| 1 | Unverschlüsselt | DEK vorhanden, aber Verschlüsselung nicht aktiviert |
| 2 | Wird verschlüsselt | Verschlüsselung wird durchgeführt |
| 3 | Verschlüsselt | Datenbank vollständig verschlüsselt |
| 4 | Schlüssel wird geändert | Schlüsselrotation wird durchgeführt |
| 5 | Wird entschlüsselt | Entschlüsselung wird durchgeführt |
| 6 | Schutz wird geändert | Änderung des Schutzes wird durchgeführt |
Gibt E/A-Statistiken für Daten- und Protokolldateien zurück. Nützlich zur Überwachung der Auswirkungen von TDE auf die Leistung.
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| Spalte | Datentyp | Beschreibung |
|---|---|---|
num_of_reads | bigint | Anzahl der ausgeführten Lesevorgänge |
num_of_writes | bigint | Anzahl der ausgeführten Schreibvorgänge |
io_stall_read_ms | bigint | Gesamte Wartezeit auf Lesevorgänge (ms) |
io_stall_write_ms | bigint | Gesamte Wartezeit auf Schreibvorgänge (ms) |
size_on_disk_bytes | bigint | Größe der Datei auf dem Datenträger |
-- 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);
GODiese Abfrage bietet einen vollständigen Überblick über Ihren TDE-Verschlüsselungsstatus und eignet sich für Dashboards und Überwachungstools:
-- 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