プリントスタック TOKYO

データベースとセキュリティの世界から離れて早数年。過去の記憶を探しています。

SQL Server 2008 Transparent Data Encryption

Microsoft SQL Server 2008(Katmai)の Transparent Data Encryption を紹介します。
SQL Server 2008 から TDE (透過的データ暗号)の機能が実装されています。これは、Oracle Database の TDE と異なり、ページ単位で行われます。サポートする暗号アルゴリズムは、AES 128ビット / AES 192 ビット / AES 256 ビット / 3DES 3KEYS と代表的なものをサポートしています。
簡単なポイントは下記のことでしょう。

  • ページ単位の暗号
  • AES 128ビット / AES 192 ビット / AES 256 ビット / 3DES 3KEYS をサポート
  • EKM/HSMをサポート

SQL Server 2008 の TDE を利用するには下に記載した手順を実施することで行えます。

  1. マスターキーの作成
  2. マスターキーで保護された証明書を作成または取得
  3. データベースの暗号鍵を作成して証明書で保護
  4. 暗号するようにデータベースを設定

Oracle の TDE と比較すると幾分か回りくどいように感じますが、実際のT-SQLは下のようになります。

USE master;
GO
--Create a master key
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'password';
GO
--Create a certificate to use with TDE
CREATE CERTIFICATE 証明書名 WITH SUBJECT = '証明書のタイトル'
GO
--Change to the database to encrypt
USE 暗号対象のデータベース名
GO
--Create your database master key
CREATE DATABASE ENCRYPTION KEY
WITH ALGORITHM = AES_128 --Use a strong algorithm
ENCRYPTION BY SERVER CERTIFICATE 証明書名
GO
--Alter the database to encrypt it with the
--master database key
ALTER DATABASE 暗号対象のデータベース名
SET ENCRYPTION ON
GO

前述した手順のとおりにはなりませんが、実際に行ってみた手順を紹介します。

1. データベース x505 を作成

2. 証明書とマスター鍵を作成

USE master;
GO
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'password';
GO
CREATE CERTIFICATE TDECERT WITH SUBJECT = 'TDECert'
GO

3. 暗号データベースの作成

USE x505
GO
CREATE DATABASE ENCRYPTION KEY
WITH ALGORITHM = AES_128 --Use a strong algorithm
ENCRYPTION BY SERVER CERTIFICATE TDECERT
GO
ALTER DATABASE AdventureWorks
SET ENCRYPTION ON
GO

4. テーブル T1 を作成

USE x505;
CREATE TABLE T1 ( COL1 NUMERIC(7) PRIMARY KEY, COL2 VARCHAR(44), COL3 DATE )
INSERT INTO T1 VALUES ( 1, 'what`s up', getdate() )
Microsoft SQL Server 2008 オンラインブック には、以下のようにあります。

・カタログビューと動的管理ビュー

オブジェクト名説明
sys.databasesデータベース情報を表示するカタログ ビュー
sys.certificatesデータベース内の証明書を表示するカタログ ビュー
sys.dm_database_encryption_keysデータベースで使用されている暗号化キー、および、データベースの暗号化の状態に関する情報を表示する動的管理ビュー

これを取得するために下のようなT-SQLを発行してみます。

use master
select b.name, a.key_algorithm, a.key_length from sys.dm_database_encryption_keys a, sys.databases b where a.database_id = b.database_id

結果として下のイメージのように取得できました。x505データベースが AES の 128 bit で暗号化されていることがわかります。

f:id:yukiwillbe:20131029153757j:plain

次に実際のMDFファイルをテキストエディタで見てみます。内容を見る限り、ファイルは一定間隔に認識不可能な文字列が並んでいることがわかります。

f:id:yukiwillbe:20131029153823j:plain

このMDFファイルのファイルサイズは「Microsoft SQL Server 2008 オンラインブック」にあるとおり、暗号化することによりファイルのサイズが大きくなることはありません。
透過的なデータ暗号化では、暗号化されたデータベースのサイズが増えることはありません。

以降は、Microsoft SQL Server 2008 のオンラインブックに記載されている内容を記述したものです。

マスターキー
データベースのマスタキーは対称キーで証明書の秘密鍵やデータベース内に存在する非対称キーを保護するときに使用します。データベースのマスターキーを作成するときは、3DES アルゴリズムとユーザーが指定するパスワードを使用してマスターキーを暗号化しています。
これらデータベースのマスタキーに関する情報は、「sys.symmetric_keys」 カタログ ビューで確認できます。なお、操作するための権限としてデータベースに対する CONTROL 権限が必要となります。

use master
select * from sys.symmetric_keys

証明書
証明書は、IETF X.509v3 標準に準拠しています。
CREATE CERTIFICATE(T-SQL)では、ファイルまたはアセンブリから証明書を読み込むことができ、鍵ペアを生成して自己署名証明書を作成することもできます。
SQL Server によって生成される秘密鍵の鍵長は 1024 ビットになり、外部ソースからインポートされる秘密鍵の最小は 384 ビット、最大長は 3456 ビットでなければなりません。
ただし、インポートされる秘密鍵の長さは 64 ビットの整数倍である必要があり、また、この秘密鍵は公開鍵に対応していなけばなりません。
ENCRYPTION BY PASSWORD オプションは、秘密鍵をデータベースのマスターキーで暗号化しない場合には指定する必要はなく、このオプションは秘密鍵をパスワードで暗号化するときだけに使用することになります。
もしも、パスワードを指定しない場合は、証明書の秘密鍵はデータベースのマスタ鍵を使用して暗号化される。このときデータベース マスタ鍵を利用して暗号化されている場合、暗号解除のパスワードを指定する必要はありません。

use master
select * from sys.certificates

暗号鍵
サポートしているアルゴリズムは、AES 128ビット / AES 192 ビット / AES 256 ビット / 3DES 3KEYS になります。
データベースの暗号鍵は、データベースからエクスポートできません。また、この暗号鍵を使用できるのはシステムサーバでのデバッグ権限を持つユーザ、および、データベースの暗号鍵を暗号化、暗号解除するために利用する証明書へのアクセス権を持つユーザに限られています。
操作するための権限として、データベースに対する CONTROL 権限、および、データベースの暗号鍵の暗号化するための証明書に対する VIEW DEFINITION 権限が必要があります。

use x505
select * from sys.dm_database_encryption_keys

これらの詳しい情報は「SQL Server 2008」にあります。