Always Encrypted

Always Encryptedで暗号化されたカラムを一時的に復号化して更新してみた

Always Encryptedで暗号化されたカラムの暗号化キーを保護するための列マスターキーを、Azure Key Vault上に作成している場合、SSMS(SQL Server Management Studio)からAzure Portalに接続できない場合は、SSMS上でAlways Encryptedで暗号化されたカラムを更新することができない。

ただし、PowerShellからAzure Portalに接続できる場合は、PowerShellを用いてAlways Encryptedで暗号化されたカラムの暗号化を一時解除した後で、SSMS上でデータ更新を行い、PowerShellを用いて再度暗号化することで、Always Encryptedで暗号化されたカラムを更新することができる。

今回は、その手順でAlways Encryptedで暗号化されたカラムを一時的に復号化して更新してみたので、共有する。

前提条件

下記記事の実装が完了していること。

Always Encryptedで暗号化されたカラムを更新してみたJDBC接続文字列に「columnEncryptionSetting=Enabled」を追加し、Azure Key Vault に対する...

また、PowerShellのバージョンは5以上で、SqlServerモジュールがインストールされているものとする。
前提条件

なお、SqlServerモジュールのインストール方法は、以下のサイトを参照のこと。
https://docs.microsoft.com/ja-jp/sql/powershell/download-sql-server-ps-module?view=sql-server-ver15



Always Encryptedで暗号化されたカラムの更新手順

SSMS上でAlways Encryptedで暗号化されたカラムを更新することができない場合は、PowerShellを用いてAlways Encryptedで暗号化されたカラムの暗号化を一時解除した後で、SSMS上でデータ更新を行い、PowerShellを用いて再度暗号化する。その手順は、以下の通り。

1) SSMS(SQL Server Management Studio)上でUSER_PASSテーブルを確認すると、以下のように、列「pass_encrypted」が暗号化されていることが確認できる。

Always Encryptedで暗号化されたカラムの更新_1

2) 「Windows PowerShell」メニューから、「Windows PowerShell」を選択し、PowerShellを起動する。
Always Encryptedで暗号化されたカラムの更新_2_1

起動したPowerShellの画面は、以下の通り。
Always Encryptedで暗号化されたカラムの更新_2_2

3) SqlServerモジュールをインポートする。

Always Encryptedで暗号化されたカラムの更新_3

4) Azure上のSQLデータベースに接続する。

Always Encryptedで暗号化されたカラムの更新_4_1

なお、上記コマンドで指定しているDB接続先($connStr)は、Azure Portal上のSQLデータベースの「接続先」メニュー、「ADO.NET」で確認できる。
Always Encryptedで暗号化されたカラムの更新_4_2



5) Azureにサインインする。

Always Encryptedで暗号化されたカラムの更新_5_1

上記コマンドを指定すると、サインインするための画面が表示されるため、Azure Portalにログインするためのメールアドレスを指定し、「次へ」ボタンを押下する。
Always Encryptedで暗号化されたカラムの更新_5_2

パスワードの入力を求められるため、パスワードを入力し「サインイン」ボタンを押下する。
Always Encryptedで暗号化されたカラムの更新_5_3

サインインが完了すると、以下のように、プロンプトが終了する。
Always Encryptedで暗号化されたカラムの更新_5_4

6) Always Encryptedにより暗号化された列の復号化を実施する。

Always Encryptedで暗号化されたカラムの更新_6_1

なお、Always Encryptedにより列の復号化中は、以下の画面が表示される。
Always Encryptedで暗号化されたカラムの更新_6_2

7) SSMS上でUSER_PASSテーブルを確認すると、以下のように、列「pass_encrypted」の暗号化が解除されていることが確認できる。

Always Encryptedで暗号化されたカラムの更新_7_1

また、Always Encryptedのマスターキー、暗号化キーは、以下のように残ったままであることが確認できる。
Always Encryptedで暗号化されたカラムの更新_7_2

8) SSMS上で、USER_PASSテーブルのデータ更新を行う。

Always Encryptedで暗号化されたカラムの更新_8

9) SSMS上でUSER_PASSテーブルを確認すると、以下のように、列「pass」「pass_encrypted」が更新されていることが確認できる。

Always Encryptedで暗号化されたカラムの更新_9

10) Always Encryptedにより、先ほど復号した列を再度暗号化する。

Always Encryptedで暗号化されたカラムの更新_10_1

なお、Always Encryptedにより列の暗号化中は、以下の画面が表示される。
Always Encryptedで暗号化されたカラムの更新_10_2

11) SSMS上でUSER_PASSテーブルを確認すると、以下のように、列「pass_encrypted」が再び暗号化されていることが確認できる。

Always Encryptedで暗号化されたカラムの更新_11

12) 以下の記事のプログラムをローカル環境で実行し確認する。

Always Encryptedで暗号化されたカラムを更新してみたJDBC接続文字列に「columnEncryptionSetting=Enabled」を追加し、Azure Key Vault に対する...

ローカル環境のApp Service、Azure Functionsを起動し、「http:// (ホスト名):(ポート番号)」とアクセス後、「getUserPassの値を取得」ボタンを押下すると、以下のように、更新後のパスワードが表示されることが確認できる。
Always Encryptedで暗号化されたカラムの更新_12_1

Always Encryptedで暗号化されたカラムの更新_12_2

要点まとめ

  • Always Encryptedで暗号化されたカラムを一時的に復号化して更新するには、PowerShellを用いてAlways Encryptedで暗号化されたカラムの暗号化を一時解除した後で、SSMS上でデータ更新を行い、PowerShellを用いて再度暗号化すればよい。