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

キーローテーション

適用対象:
SQL Server 2016+TDE 暗号化 DBSysadmin 必須

概要​

キーローテーションは、暗号化キーを定期的に置き換えるセキュリティのベストプラクティスです。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 を再生成します。

1

現在のステータスを確認する

暗号化ステータスの確認SQL
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';
GO
2

DEK を再生成する

Database Encryption Key の再生成SQL
USE EmployeeDB;
ALTER DATABASE ENCRYPTION KEY
REGENERATE
WITH ALGORITHM = AES_256;
GO
3

進捗を監視する

再生成の監視SQL
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';
GO
注記

DEK ローテーション中、encryption_state = 4 はローテーションが進行中であることを示します。

完全キーローテーション(MEK + DEK)​

新しい非対称キーを作成し、DEK をローテーションすることで完全なキーローテーションを行います。

1

新しい非対称キーを作成する

DuoKey で新しいキーを作成SQL
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
2

新しいキーの資格情報を作成する

キー資格情報の作成SQL
CREATE CREDENTIAL SQL_EKM_Key_Rotated_CRED
WITH IDENTITY = '<client_id>',
SECRET = '<enrolled-agent-key>'
FOR CRYPTOGRAPHIC PROVIDER DuoKeyProvider;
GO
3

新しいキーのログインを作成する

ログインの作成とマッピングSQL
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;
GO
4

DuoKey で Encrypt を有効にする

警告

続行する前に、DuoKey で暗号化操作を有効にする必要があります。

  1. DuoKey Cockpit にログインする
  2. Keys セクションに移動する
  3. SQL_EKM_Key_Rotated を検索する
  4. Encrypt 操作を有効にする
  5. 変更を保存する
5

新しいマスターキーで DEK を再暗号化する

既存の DEK を新しい非対称キーにバインドします。DEK は新しいマスターによって再暗号化(再ラップ)されますが、その AES_256 アルゴリズムは変わりません。

DEK 保護の変更SQL
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; を実行してください。

6

ローテーションを確認する

キーローテーションの確認SQL
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

ローテーション後のタスク​

データベース操作のテスト​

データベースアクセスの確認SQL
-- 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

新しいバックアップの取得​

重要

キーローテーション後は常に直ちにデータベースをバックアップしてください。

ローテーション後のバックアップSQL
BACKUP DATABASE EmployeeDB
TO DISK = 'C:\Backups\EmployeeDB_AfterRotation.bak'
WITH
  COMPRESSION,
  CHECKSUM,
  STATS = 10;
GO

自動キーローテーション​

四半期ごとの DEK ローテーション用 SQL Agent ジョブSQL
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. システムの隔離: 影響を受けるシステムへのアクセスを制限する
  2. セキュリティチームへの通知: 情報セキュリティに警告する
  3. 影響の評価: 潜在的な侵害の範囲を判断する
  4. ローテーションの実行: 迅速なローテーションを実行する
緊急ローテーションスクリプトSQL
-- 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

トラブルシューティング​

ベストプラクティス​

キーローテーションチェックリスト

まずバックアップローテーション前に常にバックアップする
開発環境でテストまず非本番環境でローテーションをテストする
進捗を監視encryption_state と percent_complete を監視する
変更を文書化ローテーションを変更管理に記録する

次のステップ​