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

データベース暗号化

適用対象:
SQL Server 2016+TDE 有効Sysadmin 必須

概要​

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 の有効化​

1

データベースの作成または選択

新しいデータベースを作成するか、既存のものを使用します:

データベースの作成SQL
-- 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)
);
GO
2

Database Encryption Key の作成

DuoKey の非対称キーによって保護された DEK を作成します:

DEK の作成SQL
USE EmployeeDB;
CREATE DATABASE ENCRYPTION KEY
WITH ALGORITHM = AES_256
ENCRYPTION BY SERVER ASYMMETRIC KEY SQL_EKM_Key;
GO
アルゴリズムキーサイズ推奨事項
AES_128128 ビット良好なセキュリティ
AES_192192 ビットより良いセキュリティ
AES_256256 ビット推奨 - 最も強力
Triple DES168 ビット非推奨
ヒント

最も強力な暗号化には AES_256 を使用してください。最新のハードウェアでは、パフォーマンスへの影響を最小限に抑えつつ優れたセキュリティを提供します。

3

暗号化の有効化

データベースで TDE を有効にします:

TDE の有効化SQL
ALTER DATABASE EmployeeDB
SET ENCRYPTION ON;
GO
注記

暗号化は非同期で実行されます。大規模なデータベースの場合、このプロセスには時間がかかることがあります。

暗号化の進捗を監視する​

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

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

状態値説明必要なアクション
0DEK なしデータベース暗号化キーが存在しませんCREATE DATABASE ENCRYPTION KEY で DEK を作成
1未暗号化DEK は存在しますが暗号化が有効になっていませんALTER DATABASE SET ENCRYPTION ON で有効化
2暗号化中暗号化が進行中完了を待機し、percent_complete を監視します
3暗号化済みデータベースは完全に暗号化されていますなし - 通常の運用
4キー変更キーローテーションを実行中完了を待機します
5復号中復号を実行中完了を待機します
6保護の変更保護機能の変更を実行中完了を待機します

暗号化を確認する​

データベース暗号化の確認SQL
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';
GO
非対称キー使用状況の確認SQL
USE 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

データ操作のテスト​

暗号化を有効にした後、データ操作が透過的に機能することをテストします。

暗号化されたデータベースのテストSQL
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 領域を確保する

複数のデータベースを暗号化する​

スクリプトを使用して、複数のデータベースを一度に暗号化します。

一括暗号化スクリプトSQL
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

暗号化を無効にする​

警告

暗号化を無効にするとデータベースが復号されます。大規模なデータベースの場合、かなりの時間がかかることがあります。

TDE の無効化SQL
-- 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 へのアクセス維持

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

次のステップ​