Ignite で SQL Server 2016 の機能として Always Encrypted が発表されました。
この機能の情報を少しまとめてみたいと思います。
セキュリティ系のアップデートは、毎度恒例 Overview and Roadmap for Microsoft SQL Server Security を参照していただければと。
SQL Server 2016 / SQL Database として発表されていますので、両データベースで最終的には使用できるようになるのかと思います。
冒頭で紹介したセッションでは、さらに追加の情報が公開されています。
基本的な仕組みについてはキーノートで発表されたものと同じになっています。
追加の情報として、暗号化方式についての解説が行われています。
暗号化の方法として、
- Randomized Encryption
- Deterministic Encryption
の 2 種類が提供されるようです。
ランダム化された暗号化では、同一のデータを暗号化した場合でも、暗号化ごとに異なるデータとして格納が行われれています。
決定的な暗号化では、同一のデータを暗号化しても、同じデータで暗号化されます。
そのため、決定的な暗号化を使用している場合は、WHERE 句等の操作系の列として使用することができます。
セッション内ではデモも行われています。
CMK (Column Master Key) を使用した、CEK (Column Encryption Key) の作成からデモが行われています。
暗号化をするためには、CMK を使用して、CEK を作成する必要があります。
CMK のキーストアとしては、
- 証明書ストア
- Hardware Security Module (HSM)
- Azure Key Valut
というような複数の CMK ストアを使用することができます。
格納したキーについては「sys.column_master_key_definitions」で確認をすることができます。
これらのテーブルについては、すでに SQL Database v12 では実装されているようですね。
作成した CEK を使用して、各列を暗号化することができますが、テーブルを作成する際に、暗号化の設定をするようです。
sys.columns にも以下の項目が暗号化の状態を示す項目として拡張が行われています。
# v12 でも確認することができます。
- encryption_type
- encryption_type_desc
- encryption_algorithm_name
- column_encryption_key_id
- column_encryption_key_database_id
既に登録済みのデータを暗号化するための方法として、SSIS を使用したデータのインポートが紹介されています。
SSIS で、「.Net Framework Data Provider for SqlServer」を使用する際のオプションとして、「Column Encryption Setting」を設定できるようになっています。
これにより、既存データを暗号化データとして再インポートすることが可能となっています。
暗号化されたデータをアプリケーションで扱うためには接続文字列にも設定が必要となります。
暗号化された状態のデータに対して、通常の接続文字列でアクセスをすると、以下のようにバイトデータとしての認識となります。
Always Encrypted で暗号化されたデータにアクセスするためには、アプリケーション側でも「Column Encryption Setting」を有効にする必要があります。
これにより、アプリケーションから、暗号化されたデータを複合化することができます。
暗号化されたデータへのアクセスは、SQL Profiler 等でキャプチャをしても、暗号化された状態で検索が行われるため、複合化されたデータについてはクエリレベルのアクセスでも表れてこない形となります。
Column Encryption Setting については、SqlClient Connection String Structure を読んでみるとよいかと思います。
Always Encrypted は SQL Server 2005 で実装された CLE (Cell Level Encryption) を透過的に利用できるように拡張したものというイメージでしょうかね。