キーローテーション
キーローテーション
DuoKey EKM でセキュリティを強化するために暗号化キーをローテーションする
概要
キーローテーションは、暗号化キーを定期的に置き換えるセキュリティのベストプラクティスです。DuoKey SQL EKM では、ローテーションできるキーには 2 つのタイプがあります。
前提条件
- DuoKey EKM で暗号化されたデータベース
- DuoKey EKM プロバイダーで構成された SQL Server
- SQL Server Management Studio(SSMS)がインストールされていること
- SQL Server の Sysadmin 権限
- TDE のキー階層の理解
キーのタイプとローテーションのシナリオ
Master Encryption Key(MEK)
DuoKey プラットフォームに保存された非対称キー
Database Encryption Key(DEK)
データベースを暗号化する対称キー
| シナリオ | ローテーション対象 | 複雑さ | 操作タイプ |
|---|---|---|---|
| DEK のみのローテーション | Database Encryption Key | 低 | オンライン、定常運用 |
| MEK のみのローテーション | 非対称キー(MEK) | 中 | 計画・調整が必要 |
| 完全ローテーション | DEK と MEK の両方 | 高 | 計画・調整が必要 |
マスター(非対称)キーのローテーションは、定常的な「ダウンタイムなし」の作業ではありません。計画的かつ調整のうえで実施する必要があります。すなわち、新しいマスターをバインドし、依存する各 DEK を新しいキーで再暗号化し、それに依存するすべてのデータベースおよびバックアップの移行が完了するまでは古いマスターを保持してください。いずれかの TDE データベースまたはバックアップがまだ依存している間は、バインド済みのマスターキーを削除、ローテーション、または移動しないでください。DEK をアンラップできなくなり、データベースが suspect/オフライン状態になります。
なぜキーをローテーションするのか?
露出の制限
時間の経過に伴うキー侵害のリスクを軽減します
コンプライアンス
規制要件を満たす(PCI-DSS、HIPAA)
インシデント対応
セキュリティインシデント手順の一部
ベストプラクティス
業界標準のセキュリティプラクティス
推奨されるローテーションスケジュール
| データ分類 | ローテーション間隔 |
|---|---|
| 重要データ | 3-6 か月ごと |
| 機密データ | 6-12 か月ごと |
| 標準データ | 毎年 |
| インシデントベース | 侵害の疑いがある場合は直ちに |
DEK のみのローテーション
最も単純なローテーションで、同じ MEK を保持しながら Database Encryption Key を再生成します。
現在のステータスを確認する
SELECT
DB_NAME(database_id) AS DatabaseName,
encryption_state,
percent_complete,
key_algorithm,
key_length
FROM sys.dm_database_encryption_keys
WHERE DB_NAME(database_id) = 'EmployeeDB';
GODEK を再生成する
USE EmployeeDB;
ALTER DATABASE ENCRYPTION KEY
REGENERATE
WITH ALGORITHM = AES_256;
GO進捗を監視する
SELECT
DB_NAME(database_id) AS DatabaseName,
encryption_state,
CASE encryption_state
WHEN 4 THEN 'Key change in progress'
WHEN 3 THEN 'Key change complete'
ELSE 'Unexpected state'
END AS Status,
percent_complete
FROM sys.dm_database_encryption_keys
WHERE DB_NAME(database_id) = 'EmployeeDB';
GODEK ローテーション中、encryption_state = 4 はローテーションが進行中であることを示します。
完全キーローテーション(MEK + DEK)
新しい非対称キーを作成し、DEK をローテーションすることで完全なキーローテーションを行います。
新しい非対称キーを作成する
USE master;
CREATE ASYMMETRIC KEY SQL_EKM_Key_Rotated
FROM PROVIDER DuoKeyProvider
WITH ALGORITHM = RSA_2048,
PROVIDER_KEY_NAME = 'SQL_EKM_Key_Rotated',
CREATION_DISPOSITION = CREATE_NEW;
GO新しいキーの資格情報を作成する
CREATE CREDENTIAL SQL_EKM_Key_Rotated_CRED
WITH IDENTITY = '<client_id>',
SECRET = '<enrolled-agent-key>'
FOR CRYPTOGRAPHIC PROVIDER DuoKeyProvider;
GO新しいキーのログインを作成する
CREATE LOGIN SQL_EKM_Key_Rotated_LOGIN
FROM ASYMMETRIC KEY SQL_EKM_Key_Rotated;
GO
ALTER LOGIN SQL_EKM_Key_Rotated_LOGIN
ADD CREDENTIAL SQL_EKM_Key_Rotated_CRED;
GODuoKey で Encrypt を有効にする
続行する前に、DuoKey で暗号化操作を有効にする必要があります。
- DuoKey Cockpit にログインする
- Keys セクションに移動する
SQL_EKM_Key_Rotatedを検索する- Encrypt 操作を有効にする
- 変更を保存する
新しいマスターキーで DEK を再暗号化する
既存の DEK を新しい非対称キーにバインドします。DEK は新しいマスターによって再暗号化(再ラップ)されますが、その AES_256 アルゴリズムは変わりません。
USE EmployeeDB;
ALTER DATABASE ENCRYPTION KEY
ENCRYPTION BY SERVER ASYMMETRIC KEY SQL_EKM_Key_Rotated;
GO中間的なアルゴリズムの変更はありません。DEK は一貫して AES_256 のままであり、変更されるのはそれを保護するマスターキーだけです。依存するすべてのデータベースおよびバックアップが新しいキーへ移行されるまでは、以前のマスターキーを保持してください。
新しいマスターの下でさらに新しい DEK を発行する場合は、再暗号化の完了後に ALTER DATABASE EmployeeDB ENCRYPTION KEY REGENERATE WITH ALGORITHM = AES_256; を実行してください。
ローテーションを確認する
SELECT
DB_NAME(database_id) AS DatabaseName,
encryption_state,
encryptor_thumbprint,
encryptor_type
FROM sys.dm_database_encryption_keys
WHERE DB_NAME(database_id) = 'EmployeeDB';
GO
-- Compare with new key thumbprint
USE master;
SELECT
name AS AsymmetricKeyName,
thumbprint,
algorithm_desc
FROM sys.asymmetric_keys
WHERE name = 'SQL_EKM_Key_Rotated';
GOローテーション後のタスク
データベース操作のテスト
-- Test read access
USE EmployeeDB;
SELECT TOP 10 * FROM Employees;
GO
-- Test write access
INSERT INTO Employees (EmployeeID, FirstName, LastName, Salary)
VALUES (999, 'Test', 'User', 50000.00);
GO
-- Verify and cleanup
SELECT * FROM Employees WHERE EmployeeID = 999;
DELETE FROM Employees WHERE EmployeeID = 999;
GO新しいバックアップの取得
キーローテーション後は常に直ちにデータベースをバックアップしてください。
BACKUP DATABASE EmployeeDB
TO DISK = 'C:\Backups\EmployeeDB_AfterRotation.bak'
WITH
COMPRESSION,
CHECKSUM,
STATS = 10;
GO自動キーローテーション
USE msdb;
GO
EXEC dbo.sp_add_job
@job_name = N'QuarterlyKeyRotation',
@enabled = 1,
@description = N'Rotates DEK for encrypted databases';
GO
EXEC dbo.sp_add_jobstep
@job_name = N'QuarterlyKeyRotation',
@step_name = N'RotateDEK',
@subsystem = N'TSQL',
@command = N'
USE EmployeeDB;
ALTER DATABASE ENCRYPTION KEY
REGENERATE WITH ALGORITHM = AES_256;
-- Wait for completion
WAITFOR DELAY ''00:01:00'';
-- Backup after rotation
BACKUP DATABASE EmployeeDB
TO DISK = N''C:\Backups\EmployeeDB_PostRotation.bak''
WITH COMPRESSION;',
@retry_attempts = 2,
@retry_interval = 5;
GO
EXEC dbo.sp_add_schedule
@schedule_name = N'Quarterly',
@freq_type = 16, -- Monthly
@freq_interval = 1,
@freq_recurrence_factor = 3; -- Every 3 months
GO
EXEC dbo.sp_attach_schedule
@job_name = N'QuarterlyKeyRotation',
@schedule_name = N'Quarterly';
GO自動ローテーションは十分にテストし、監視する必要があります。常にエラー処理と通知を含めてください。
緊急キーローテーション
キー侵害の疑いがある場合は、直ちに緊急ローテーションを実行してください。
即時対応
- システムの隔離: 影響を受けるシステムへのアクセスを制限する
- セキュリティチームへの通知: 情報セキュリティに警告する
- 影響の評価: 潜在的な侵害の範囲を判断する
- ローテーションの実行: 迅速なローテーションを実行する
-- 1. Create emergency key
USE master;
CREATE ASYMMETRIC KEY Emergency_Rotation_Key
FROM PROVIDER DuoKeyProvider
WITH ALGORITHM = RSA_2048,
PROVIDER_KEY_NAME = 'Emergency_Rotation_Key',
CREATION_DISPOSITION = CREATE_NEW;
GO
-- 2. Configure credentials (follow standard steps)
-- 3. Enable encrypt operation in DuoKey
-- 4. Re-encrypt the DEK by the emergency master key
-- (DEK stays AES_256 - no intermediate algorithm change)
USE EmployeeDB;
ALTER DATABASE ENCRYPTION KEY
ENCRYPTION BY SERVER ASYMMETRIC KEY Emergency_Rotation_Key;
GO
-- 5. Optionally issue a fresh DEK under the new master
ALTER DATABASE ENCRYPTION KEY
REGENERATE WITH ALGORITHM = AES_256;
GO
-- 6. Verify and backup
SELECT * FROM sys.dm_database_encryption_keys;
GO
BACKUP DATABASE EmployeeDB
TO DISK = 'C:\Backups\EmergencyRotation.bak'
WITH COMPRESSION;
GO