SQLデータベースを暗号化する機能についてご紹介致します。二種類の暗号化方法がありますので、比較しながら見ていきましょう。
Transparent Data Encryption (TDE)
【特徴】
SQLデータベースを暗号化する機能 ※SQL Server 2008 導入
ディスクに書き込まれる前に暗号化され、メモリ上に展開されるタイミングで複合化される。
暗号化、複合化は SQL Server 自体が実施するため、アプリケーション側は一切意識する必要が無い。
※暗号化すると圧縮率(バックアップなど)が非常に悪くなります。
直接HDDからデータを複製された場合のみ保護される。
暗号化範囲:データベース単位
暗号化テクノロジー:AES256 , 3DES
暗号化キーの管理:Microsoft
※SQL(IaaS) の場合、鍵の管理もユーザーが行うので、KeyVaultを利用できます。
【サポート対象】
Azure SQL Database、Azure SQL Data Warehouse、SQL Server(2008以降)
【しくみ】
①Data Protection API (DPAPI):Windows2000以降からOSに組み込まれている暗号化機能。サービスマスターキーを暗号化する。
②サービスマスターキー:SQLサーバー構築時に自動で作成される。データベースマスターキーを暗号化する。
③データベースマスターキー:証明書を作成する。マスターシステムデータベースに格納。
④証明書:データベース暗号化キーを暗号化する。マスターシステムデータベースに格納。
⑤データベース暗号化キー:ユーザーデータベースを暗号化する。ユーザーデータベースに格納。
※Azure SQL Database版 TDE は、これらの処理を自動で行ないます。
【暗号化手順】
(SQL データベース)ー[Transparent Data Encrytion]ー[オン]を選択
Always Encrypted
【特徴】
SQLデータベースを暗号化する機能 ※SQL Server 2016 導入
SQLクライアント側にて暗号化/復号化を実施
※暗号化すると、SSMSからは参照しかできなくなります。
暗号化範囲:列(カラム)単位
暗号化テクノロジー:AES256(CEK) , RSA(CMK)
暗号化キーの管理:ユーザー (Azure Key Vault)
※暗号化対象となる、SQLと同一リージョンであること
【サポート対象】
Azure SQL Database、SQL Server(2016以降)
【しくみ】
[暗号化]
[SSMS]は[CMK]を作成し[UserID]を使い[KeyVault]に格納。[CMK]より[CEK]を生成し暗号化を実施。[CEK]はDBに格納。
[復号化]
・[SSMS]は[UserID]を使い[KeyVault]から[CMK]、[CEK]を取得し復号化する。
・[SQL Client]は[AzureAD App]を使い[KeyVault]から[CMK]、[CEK]を取得し復号化する。
【暗号化手順】
全体の流れ
Step1:「認証用アプリケーション」の作成 ※詳細はこちら
Step2:「Key Vault」の作成 ※手順省略
Step3:「常に暗号化」の実行
SQL Databaseを作成し、SSMS (SQL Server Management Studio)にて接続します。
テスト用に数字が並んだだけの、簡単なテーブルを作成します。
SSMSで作成した[テーブルを選択]右クリックー[列の暗号化]を選択※今回は[c1]列のみ暗号化
暗号化の種類
決定論的:同じ文字列からは、同じ暗号値を生成する
ランダム化:同じ文字列でも、違う暗号値を生成する
「Key Vault」にアクセスできるユーザー(アクセスポリシー登録済み)を指定する。
これで暗号化完了です!!
テーブルを確認してみましょう。
[c1]列のみ暗号化されているのがわかります。
復号化して表示したい場合、SSMSで[Column Encryption Setting=enabled]を追記
すると、復号化した状態で表示できます。
めでたし、めでたし!
このままでは、終われません。鍵の格納場所が気になります!!
CMK、CEKを確認しましょう!
マスターキー[CMK_Auto1]、暗号化キー[CEK_Auto1]が作成されています。
暗号化キーはデータベース内に格納されています。
マスターキーは「Key Vault」に格納されているのが確認できます。
ポータルから「Key Vault」を見ると、マスターキーが確認できます。