メインコンテンツまでスキップ

監視とアラート

DuoKey SQL EKM の暗号化状態を監視し、アラートを構成する

適用対象:
SQL Server 2016+運用SQL Server Agent

概要

効果的な監視により、暗号化されたデータベースが健全でコンプライアンスに準拠した状態を維持できます。このガイドでは、リアルタイムの状態監視、自動ヘルスチェック、SQL Server Agent アラート、監査ログについて説明します。

TDE 暗号化ダッシュボード● すべてのシステムが正常です
暗号化されたデータベース
12
暗号化保留中
0
ローテーション期限超過
2
プロバイダーの状態
OK

暗号化状態の監視

状態ビューを作成する

暗号化されたすべてのデータベースを簡単に監視するためのビューを作成します:

TDE 状態ビューSQL
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

暗号化状態のリファレンス

暗号化状態を理解することは、監視において非常に重要です:

状態値説明必要なアクション
0DEK なしデータベース暗号化キーが存在しませんCREATE DATABASE ENCRYPTION KEY で DEK を作成
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 ジョブを作成します:

エージェントジョブを作成するSQL
-- 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
1 時間ごと4 (毎日)8 (時間)1
15 分ごと4 (毎日)4 (分)15
6 時間ごと4 (毎日)8 (時間)6
毎日午前 6 時に 1 回4 (毎日)1 (1 回)N/A
重要
SQL Server Agent が実行されており、Database Mail を使用する場合はサービスアカウントにメールを送信する権限があることを確認してください。

パフォーマンス監視

I/O パフォーマンスを監視して、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ストレージ I/O を確認し、より高速なストレージを検討します
AvgWriteLatencyMs< 20msストレージ I/O を確認し、ログの最適化を検討します
暗号化中の CPU< 80%業務時間外に暗号化をスケジュールします
TDE スキャンの進捗増加中ロックや I/O ボトルネックを確認します
ヒント
TDE は通常、読み取りで 3〜5%、書き込みで 5〜10% のオーバーヘッドを追加します。AES-NI 命令を備えた最新の CPU は、この影響を大幅に最小化します。

監査の構成

コンプライアンスのためにキー操作を追跡するには、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_GROUPCREATE/ALTER/DROP DATABASE 操作
SCHEMA_OBJECT_ACCESS_GROUP暗号化キーと証明書へのアクセス
BACKUP_RESTORE_GROUPバックアップと復元の操作
注意
監査ファイルのパスが存在し、SQL Server のサービスアカウントに書き込み権限があることを確認してください。監査ファイルは大きくなる可能性があるため、ローテーションを実装してください。