データベース暗号化
データベース暗号化
DuoKey EKM を使用して Transparent Data Encryption(TDE)を有効にする
概要
Transparent Data Encryption(TDE)は、Database Encryption Key(DEK)を使用してデータベース全体のストレージを暗号化します。DuoKey EKM では、この DEK は DuoKey のクラウドプラットフォームに保存された非対称キーによって保護され、追加のセキュリティレイヤーを提供します。
前提条件
- DuoKey EKM プロバイダーで構成された SQL Server
- 非対称キーが作成され、DuoKey で暗号化が有効になっていること
- SQL Server Management Studio(SSMS)がインストールされていること
- SQL Server の Sysadmin 権限
暗号化階層
DuoKey クラウドプラットフォーム
マスター暗号化キー (MEK)
MPC で保護SQL Server (master データベース)
非対称キー (EKM)
RSA-2048ユーザーデータベース
データベース暗号化キー (DEK)
AES-256データファイル
.mdf, .ndf, .ldf
保存時に暗号化データベースの作成と TDE の有効化
データベースの作成または選択
新しいデータベースを作成するか、既存のものを使用します:
-- Create a new database
CREATE DATABASE EmployeeDB;
GO
USE EmployeeDB;
CREATE TABLE Employees (
EmployeeID INT PRIMARY KEY,
FirstName VARCHAR(128),
LastName VARCHAR(128),
Salary DECIMAL(10, 2),
SSN VARCHAR(11)
);
GODatabase Encryption Key の作成
DuoKey の非対称キーによって保護された DEK を作成します:
USE EmployeeDB;
CREATE DATABASE ENCRYPTION KEY
WITH ALGORITHM = AES_256
ENCRYPTION BY SERVER ASYMMETRIC KEY SQL_EKM_Key;
GO| アルゴリズム | キーサイズ | 推奨事項 |
|---|---|---|
| AES_128 | 128 ビット | 良好なセキュリティ |
| AES_192 | 192 ビット | より良いセキュリティ |
| AES_256 | 256 ビット | 推奨 - 最も強力 |
| Triple DES | 168 ビット | 非推奨 |
最も強力な暗号化には AES_256 を使用してください。最新のハードウェアでは、パフォーマンスへの影響を最小限に抑えつつ優れたセキュリティを提供します。
暗号化の有効化
データベースで TDE を有効にします:
ALTER DATABASE EmployeeDB
SET ENCRYPTION ON;
GO暗号化は非同期で実行されます。大規模なデータベースの場合、このプロセスには時間がかかることがあります。
暗号化の進捗を監視する
SELECT
DB_NAME(database_id) AS DatabaseName,
encryption_state,
CASE encryption_state
WHEN 0 THEN 'No database encryption key 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 Status,
percent_complete,
encryptor_type
FROM sys.dm_database_encryption_keys;
GO暗号化状態のリファレンス
| 状態 | 値 | 説明 | 必要なアクション |
|---|---|---|---|
| 0 | DEK なし | データベース暗号化キーが存在しません | CREATE DATABASE ENCRYPTION KEY で DEK を作成 |
| 1 | 未暗号化 | DEK は存在しますが暗号化が有効になっていません | ALTER DATABASE SET ENCRYPTION ON で有効化 |
| 2 | 暗号化中 | 暗号化が進行中 | 完了を待機し、percent_complete を監視します |
| 3 | 暗号化済み | データベースは完全に暗号化されています | なし - 通常の運用 |
| 4 | キー変更 | キーローテーションを実行中 | 完了を待機します |
| 5 | 復号中 | 復号を実行中 | 完了を待機します |
| 6 | 保護の変更 | 保護機能の変更を実行中 | 完了を待機します |
暗号化を確認する
SELECT
d.name AS DatabaseName,
d.is_encrypted,
dek.encryption_state,
dek.percent_complete,
dek.key_algorithm,
dek.key_length
FROM sys.databases d
LEFT JOIN sys.dm_database_encryption_keys dek
ON d.database_id = dek.database_id
WHERE d.name = 'EmployeeDB';
GOUSE master;
SELECT
ak.name AS AsymmetricKeyName,
ak.algorithm_desc,
ak.key_length,
cp.name AS CryptoProviderName
FROM sys.asymmetric_keys ak
INNER JOIN sys.cryptographic_providers cp
ON ak.provider_id = cp.provider_id;
GOデータ操作のテスト
暗号化を有効にした後、データ操作が透過的に機能することをテストします。
USE EmployeeDB;
-- Insert test data
INSERT INTO Employees (EmployeeID, FirstName, LastName, Salary, SSN)
VALUES
(1, 'John', 'Doe', 75000.00, '123-45-6789'),
(2, 'Jane', 'Smith', 82000.00, '987-65-4321'),
(3, 'Bob', 'Johnson', 68000.00, '555-12-3456');
GO
-- Query data (works transparently)
SELECT * FROM Employees;
GOデータはアプリケーションに対して透過的でありながら、保存中に自動的に暗号化されます。
パフォーマンスに関する考慮事項
初期暗号化
- CPU: 中程度の増加
- I/O: 大幅なアクティビティ
- 速度: 約 1-5 GB/分
- データベースはオンラインのまま
継続的な影響
- 読み取り操作: 3-5% のオーバーヘッド
- 書き込み操作: 5-10% のオーバーヘッド
- CPU 使用率: 1-3% の増加
- AES-NI が影響を軽減
- 初期暗号化はメンテナンスウィンドウ中にスケジュールする
- 暗号化中は CPU と I/O を監視する
- 最高のパフォーマンスのために AES-NI 対応プロセッサを使用する
- 十分な tempdb 領域を確保する
複数のデータベースを暗号化する
スクリプトを使用して、複数のデータベースを一度に暗号化します。
DECLARE @dbname NVARCHAR(128);
DECLARE @sql NVARCHAR(MAX);
DECLARE db_cursor CURSOR FOR
SELECT name FROM sys.databases
WHERE name NOT IN ('master', 'tempdb', 'model', 'msdb')
AND is_encrypted = 0;
OPEN db_cursor;
FETCH NEXT FROM db_cursor INTO @dbname;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = N'USE [' + @dbname + '];
CREATE DATABASE ENCRYPTION KEY
WITH ALGORITHM = AES_256
ENCRYPTION BY SERVER ASYMMETRIC KEY SQL_EKM_Key;
ALTER DATABASE [' + @dbname + '] SET ENCRYPTION ON;';
EXEC sp_executesql @sql;
PRINT 'Encrypted database: ' + @dbname;
FETCH NEXT FROM db_cursor INTO @dbname;
END;
CLOSE db_cursor;
DEALLOCATE db_cursor;
GO暗号化を無効にする
暗号化を無効にするとデータベースが復号されます。大規模なデータベースの場合、かなりの時間がかかることがあります。
-- Disable encryption
ALTER DATABASE EmployeeDB
SET ENCRYPTION OFF;
GO
-- Monitor decryption progress
SELECT
DB_NAME(database_id) AS DatabaseName,
encryption_state,
percent_complete
FROM sys.dm_database_encryption_keys
WHERE DB_NAME(database_id) = 'EmployeeDB';
GO
-- After decryption completes (encryption_state = 1)
USE EmployeeDB;
DROP DATABASE ENCRYPTION KEY;
GOベストプラクティス
セキュリティ
データベースを早期に暗号化し、バックアップキーを保護し、キーアクセスを監査する
運用
本番前にテストし、パフォーマンスを監視し、成長に備える
メンテナンス
定期的なバックアップ、復元のテスト、DuoKey へのアクセス維持