セキュリティで保護されたエンクレーブが設定された Always Encrypted を JDBC Driver と共に使用する
このページでは、セキュア エンクレーブを使用する Always Encrypted と Microsoft JDBC Driver 8.2 (以降) for SQL Server を使用して Java アプリケーションを開発する方法について説明します。
セキュア エンクレーブ機能は、既存の Always Encrypted 機能への追加機能です。 セキュア エンクレーブの目的は、Always Encrypted データを使用する際の制限に対処することです。 以前は、Always Encrypted データに対してユーザーが実行できたのは等価比較のみであり、他の操作を実行するには、データを取得して暗号化を解除する必要がありました。 セキュア エンクレーブは、セキュア エンクレーブ内のプレーンテキスト データに対してサーバー側で計算ができるようにすることで、このような制限に対応しています。 セキュリティで保護されたエンクレーブは、SQL Server プロセス内にあるメモリの保護された領域です。 SQL Server エンジン内部での機密データの処理を目的に、信頼された実行環境として機能します。 セキュリティで保護されたエンクレーブは、その他の SQL Server やホスティング マシン上の他のプロセスに対してはブラック ボックスに見えます。 デバッガーを使用しても、外部からエンクレーブ内のデータやコードを表示する方法はありません。
前提条件
- 開発用マシンに Microsoft JDBC Driver 8.2 (以降) for SQL Server がインストールされていることを確認します。
- DLL や KeyStores など、環境の依存関係が正しいパスに配置されていることを確認します。 セキュリティで保護されたエンクレーブは既存の Always Encrypted 機能のアドオンであり、前提条件が類似しています。
注意
以前のバージョンの JDK 8 を使用している場合は、必要に応じて、Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files (JCE 管轄ポリシー ファイル (無制限強度)) をダウンロードしてインストールします。 インストール手順、および考えられるエクスポート/インポート問題に関する詳細について、zip ファイルに含まれる Readme を必ず読んでください。
Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 8 Download からポリシー ファイルをダウンロードできます
セキュア エンクレーブの設定
セキュリティで保護されたエンクレーブを使い始めるには、「チュートリアル: セキュリティで保護されたエンクレーブが設定された Always Encrypted を SQL Server で使い始める」、「チュートリアル: Intel SGX エンクレーブが設定された Always Encrypted を Azure SQL Database で使い始める」、または「チュートリアル: VBS エンクレーブが設定された Always Encrypted を Azure SQL Database で使い始める」に従ってください。 詳しくは、「セキュリティで保護されたエンクレーブが設定された Always Encrypted」をご覧ください。
接続文字列プロパティ
データベース接続に対してエンクレーブ計算を有効にするには、Always Encrypted を有効することに加えて、次の接続文字列キーワードを設定する必要があります。
enclaveAttestationProtocol - 構成証明プロトコルを指定します。
- SQL Server とホスト ガーディアン サービス (HGS) を使用している場合は、このキーワードの値を
HGS
にする必要があります。 - Azure SQL データベース と Microsoft Azure Attestation を使用している場合は、このキーワードの値を
AAS
にする必要があります。 - 構成証明サービスを使用できない環境でセキュア エンクレーブを使用している場合は、このキーワードの値を
NONE
にする必要があります。 JDBC 12.2 以降が必要です。
- SQL Server とホスト ガーディアン サービス (HGS) を使用している場合は、このキーワードの値を
enclaveAttestationUrl: - 構成証明 URL (構成証明サービス エンドポイント) を指定します。 構成証明サービス管理者から、ご利用の環境用の構成証明 URL を取得する必要があります。
- SQL Server とホスト ガーディアン サービス (HGS) を使用している場合は、「HGS 構成証明 URL を確認して共有する」を参照してください。
- Azure SQL データベース と Microsoft Azure Attestation を使用している場合は、「構成証明ポリシーの構成証明 URL を確認する」を参照してください。
NONE
構成証明プロトコルを使用している場合、このプロパティは空白のままにできます。
SQL Server 用 Microsoft JDBC ドライバー からセキュリティで保護されたエンクレーブが設定された Always Encrypted を有効にするには、ユーザーは columnEncryptionSetting を有効にし、上記の接続文字列プロパティの両方を正しく設定する必要があります。
セキュア エンクレーブの使用
エンクレーブ接続プロパティが適切に設定されている場合、この機能の動作は透過的です。 セキュア エンクレーブをクエリに使用する必要があるかどうかが、ドライバーによって自動的に判断されます。 エンクレーブの計算をトリガーするクエリの例を次に示します。 データベースとテーブルのセットアップについては、「チュートリアル: セキュリティで保護されたエンクレーブが設定された Always Encrypted を SQL Server で使い始める」または チュートリアル: セキュリティで保護されたエンクレーブが設定された Always Encrypted の Azure SQL Database での使用開始に関する記事をご覧ください。
高度なクエリを実行すると、エンクレーブの計算がトリガーされます。
private static final String URL = "jdbc:sqlserver://<server>:<port>;encrypt=true;user=<username>;password=<password>;databaseName=ContosoHR;columnEncryptionSetting=enabled;enclaveAttestationUrl=<attestation-url>;enclaveAttestationProtocol=<attestation-protocol>;";
try (Connection c = DriverManager.getConnection(URL)) {
try (PreparedStatement p = c.prepareStatement("SELECT * FROM Employees WHERE SSN LIKE ?")) {
p.setString(1, "%6818");
try (ResultSet rs = p.executeQuery()) {
while (rs.next()) {
// Do work with data
}
}
}
try (PreparedStatement p = c.prepareStatement("SELECT * FROM Employees WHERE SALARY > ?")) {
((SQLServerPreparedStatement) p).setMoney(1, new BigDecimal(0));
try (ResultSet rs = p.executeQuery()) {
while (rs.next()) {
// Do work with data
}
}
}
}
列の暗号化を切り替えた場合も、エンクレーブの計算がトリガーされます。
private static final String URL = "jdbc:sqlserver://<server>:<port>;encrypt=true;user=<username>;password=<password>;databaseName=ContosoHR;columnEncryptionSetting=enabled;enclaveAttestationUrl=<attestation-url>;enclaveAttestationProtocol=<attestation-protocol>;";
try (Connection c = DriverManager.getConnection(URL);Statement s = c.createStatement()) {
s.executeUpdate("ALTER TABLE Employees ALTER COLUMN SSN CHAR(11) NULL WITH (ONLINE = ON)");
}
Java 8 ユーザー
この機能には、RSASSA-PSA 署名アルゴリズムが必要です。 このアルゴリズムは JDK 11 で追加されましたが、JDK 8 へのバックポートはされていません。 JDK 8 バージョンの SQL Server 用 Microsoft JDBC ドライバー でこの機能を使用する場合は、RSASSA-PSA 署名アルゴリズムをサポートする独自のプロバイダーを読み込むか、BouncyCastleProvider
のオプションの依存関係を含める必要があります。 今後、JDK 8 に署名アルゴリズムがバック ポートされるか、JDK 8 のサポート ライフサイクルが終了した場合は、依存関係が削除されます。