すべてのプロダクト
Search
ドキュメントセンター

PolarDB:EncJDBC の統合

最終更新日:Jan 14, 2026

機密データベース機能は、専用のクライアントドライバーである Encrypted Java Database Connectivity (EncJDBC) を提供し、コードを変更することなく Java アプリケーションとシームレスに統合できます。EncJDBC は自動的に暗号文を復号し、プレーンテキストデータを返します。このプロセスはアプリケーションに対して透過的に実行されます。アプリケーションは、数行の設定だけで機密データベース機能に接続でき、既存のビジネスコードを変更する必要はありません。

ソリューションアーキテクチャ

機密データベース機能は、データベースプロキシをベースにした動的な暗号化・復号ソリューションです。プロキシレイヤーは、クエリ結果に含まれる事前に設定された機密フィールドを暗号化してからクライアントに返します。クライアントアプリケーションは、専用の EncJDBC ドライバーを使用して、受信したデータを透過的に復号する必要があります。

ワークフローとロール権限

  1. クエリリクエスト:クライアントアプリケーションは、EncJDBC ドライバーを介して、標準の SQL クエリを PolarDB のクラスターエンドポイントに送信します。

  2. プロキシ処理:データベースプロキシはリクエストを受信し、実行のためにバックエンドのデータベースカーネルに転送します。

  3. 動的な暗号化:クエリ結果が返されると、プロキシレイヤーはそれが事前に定義された暗号化ポリシーに一致するかどうかを確認します。一致が見つかった場合、結果セット内の機密フィールドは、Key Management Service (KMS) または自己管理キーから指定されたキーを使用して暗号化されます。

  4. データ返却:暗号化された結果セットがクライアントに返されます。

  5. 透過的な復号:クライアント上の EncJDBC ドライバーが自動的に暗号文を復号します。アプリケーションはプレーンテキストデータを受け取り、プロセス全体がビジネスコードに対して透過的に実行されます。

クエリ結果はデータベースアカウントのロールによって異なります:

  • スーパー管理者:クエリ結果は常にプレーンテキストであり、暗号化ポリシーの影響を受けません。これはデータベースの管理や監査に役立ちます。

  • 通常ユーザー:クエリ結果は暗号文として返されます。クライアント側でデータを復号するには、EncJDBC ドライバーと正しいキーを使用する必要があります。

  • その他のユーザー:クエリ結果は暗号文として返され、復号することはできません。

制限事項

この機能を実装する前に、以下の制限事項を確認し、機能がビジネスおよび技術アーキテクチャの要件を満たしているかどうかを評価してください。

  • エンドポイント要件:暗号化ルールは、クラスターエンドポイントまたはカスタムエンドポイントを使用して接続した場合にのみ有効になります。プライマリエンドポイントに直接接続するとプロキシがバイパスされ、暗号化機能が無効になります。

  • キー管理:自己管理キーを使用する場合、キーローテーションはサポートされません。また、キーの紛失や漏洩のリスクもあります。キーが失われた場合、対応する暗号化されたデータは復号できません。キーを管理するためには、厳格なセキュリティプロシージャを確立する必要があります。

  • JDK バージョン:JDK 1.8 以降を使用する必要があります。

KMS キーの使用

ステップ 1:KMS アクセス権限の設定

  1. AccessKey ペアの取得:Resource Access Management (RAM) ユーザーの AccessKeyIdAccessKeySecret を取得します。これにより、アプリケーションは Key Management Service (KMS) によって管理されるマスター暗号化キー (MEK) を取得できます。

    1. KMS へのアクセスに適した RAM ユーザーが既にある場合は、そのユーザーを使用できます。

    2. 適切な RAM ユーザーがいない場合は、RAM コンソールに移動します。左側のナビゲーションウィンドウで、[ID 管理] > [ユーザー] を選択します。[ユーザーの作成] をクリックし、画面の指示に従ってユーザーを作成します。

  2. RAM ユーザーへの権限付与

    1. RAM コンソールに移動します。左側のナビゲーションウィンドウで、[権限管理] > [アクセスポリシー] を選択します。[アクセスポリシーの作成] をクリックします。スクリプトエディターに切り替え、次の内容をコピーして [OK] をクリックします。ポリシー名を入力し、作成を完了します。

      {
          "Version": "1",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": "KMS:Decrypt",
                  "Resource": "*"
              }
          ]
      }
    2. RAM コンソールに戻ります。左側のナビゲーションウィンドウで、[ID 管理] > [ユーザー] を選択します。対象の RAM ユーザーを見つけます。[操作] 列で、[権限の追加] をクリックします。新しく作成したアクセスポリシーをユーザーに付与します。これにより、PolarDB はデータを動的に復号できるようになります。

  3. KMS インスタンスエンドポイントの取得:

    • VPC エンドポイント (デフォルト): デフォルトでは、KMS インスタンスのキーは VPC 内からのみアクセスできます。KMS インスタンス管理ページに移動し、インスタンスが配置されているリージョンを選択し、ターゲット KMS インスタンスを見つけ、[操作] 列の [詳細] をクリックします。その後、[基本情報] タブで、インスタンスの VPC エンドポイントを表示できます。

    • パブリックエンドポイント:インターネット経由でキーにアクセスするには、[RD Multi-Account] タブでパブリックネットワークアクセスを有効にする必要があります。パブリックアクセスを有効にすると、[基本情報] タブで [パブリックエンドポイント] を表示できます。

ステップ 2:依存関係のインストール

Maven プロジェクトの pom.xml ファイルに次の依存関係を追加します。

<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-cls-jdbc</artifactId>
    <version>1.0.10-1</version>
</dependency>
説明

Maven の依存関係を追加する際、必要に応じて version の値を置き換えてください。aliyun-cls-jdbc の最新バージョンは公式サイトで確認できます。

ステップ 3:データベース接続のための MEK の設定

MEK は、JDBC properties、ファイル、または URL を使用して構成できます。2 つ以上のメソッドを使用して JDBC を構成する場合、優先順位は次のとおりです。JDBC properties 構成 > ファイル構成 > URL 構成。

説明
  • 以下の設定および接続方法では、MEK はクライアント側でローカルに処理され、安全な方法 (エンベロープ暗号化) を使用してサーバーに送信されるため、MEK が漏洩することはありません。

  • ビジネスコードに AccessKey ペア (AccessKeyIdAccessKeySecret) をハードコーディングしないでください。この例では、システム環境変数を使用して AccessKey ペアを管理します。詳細については、「Linux、macOS、および Windows システムでの環境変数の設定」をご参照ください。

  • 一時的なアクセス認証情報を使用して KMS で管理される MEK を取得するには、STS SDK を使用して一時的な認証情報である Security Token Service (STS) トークンを取得できます。STS SDK の例については、「STS SDK の概要」をご参照ください。

JDBC プロパティ設定

標準の JDBC 接続を確立する際に、Properties オブジェクトを使用してカスタム属性を設定できます。

// エンドポイント (ホスト名)、ポート、データベースインスタンス名 (dbname)、ユーザー名、パスワードなどの接続情報を準備します。
String hostname = "your-hostname";
String port = "your-port";
String dbname = "your-database-name";
String username = "your-username";
String password = "your-password";

// 環境変数から AccessKey ID と AccessKey Secret を取得します。
String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
String accessKeySecret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
// 一時的な STS アクセス認証情報を使用して KMS キーを読み取る場合は、取得した Security Token Service トークン (SecurityToken) も入力する必要があります。
// String stsToken= "yourSecurityToken";

// KMS インスタンスのエンドポイントには、パブリックネットワークアクセスの場合はパブリックエンドポイントを、VPC 内のアクセスの場合はインスタンスの VPC エンドポイントを使用します。
String kmsEndpoint = "your-kms-endpoint";

Properties props = new Properties();
props.setProperty("user", username);
props.setProperty("password", password);
props.setProperty("ALIBABA_CLOUD_ACCESS_KEY_ID", accessKeyId);
props.setProperty("ALIBABA_CLOUD_ACCESS_KEY_SECRET", accessKeySecret);
props.setProperty("ALIBABA_CLOUD_KMS_ENDPOINT", kmsEndpoint);
// props.setProperty("ALIBABA_CLOUD_STS_TOKEN","stsToken");

// 以下は MySQL データベースの接続 URL フォーマットです: "jdbc:mysql:encdb://%s:%s/%s"。
String dbUrl = String.format("jdbc:mysql:encdb://%s:%s/%s", hostname, port, dbname);

// 以下は MySQL データベース用の EncJDBC ドライバーをロードします。
Class.forName("com.aliyun.encdb.mysql.jdbc.EncDriver");

// データベース接続を取得します。
Connection connection = DriverManager.getConnection(dbUrl, props);

// ... クエリを開始 ...
URL 設定

KMS キーを取得するためのパラメーターを URL に埋め込むことができます。

// エンドポイント (ホスト名)、ポート、データベースインスタンス名 (dbname)、ユーザー名、パスワードなどの接続情報を準備します。
String hostname = "your-hostname";
String port = "your-port";
String dbname = "your-database-name";
String username = "your-username";
String password = "your-password";

// 環境変数から AccessKey ID と AccessKey Secret を取得します。
String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
String accessKeySecret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
// 一時的な STS アクセス認証情報を使用して KMS キーを読み取る場合は、取得した Security Token Service トークン (SecurityToken) も入力する必要があります。
// String stsToken= "yourSecurityToken";

// KMS インスタンスのエンドポイントには、パブリックネットワークアクセスの場合はパブリックエンドポイントを、VPC 内のアクセスの場合はインスタンスの VPC エンドポイントを使用します。
String kmsEndpoint = "your-kms-endpoint";

// 以下は MySQL データベースの接続 URL フォーマットです。
String dbUrl = String.format("jdbc:mysql:encdb://%s:%s/%s?ALIBABA_CLOUD_ACCESS_KEY_ID=%s&ALIBABA_CLOUD_ACCESS_KEY_SECRET=%s&ALIBABA_CLOUD_KMS_ENDPOINT=%s", hostname, port, dbname, accessKeyId, accessKeySecret, kmsEndpoint);
// STS トークンを使用します。
// String dbUrl = String.format("jdbc:mysql:encdb://%s:%s/%s?ALIBABA_CLOUD_ACCESS_KEY_ID=%s&ALIBABA_CLOUD_ACCESS_KEY_SECRET=%s&ALIBABA_CLOUD_KMS_ENDPOINT=%s&ALIBABA_CLOUD_STS_TOKEN=%s", hostname, port, dbname, accessKeyId, accessKeySecret, kmsEndpoint, stsToken);

// 以下は MySQL データベース用の EncJDBC ドライバーをロードします。
Class.forName("com.aliyun.encdb.mysql.jdbc.EncDriver");

// データベース接続を取得します。
Connection connection = DriverManager.getConnection(dbUrl, username, password);

// ... クエリを開始 ...

ステップ 4:暗号化された列からプレーンテキストデータをクエリする

データベースへの接続に成功した後、通常の JDBC クエリと同様にデータベース操作を実行できます。EncJDBC は暗号化された列を自動的に復号し、プレーンテキストデータを返します。

// クエリ文を作成します。
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery("SELECT * FROM your_table_name");

// 結果セットを走査します。
while (resultSet.next()) {
    for (int i = 0; i < resultSet.getMetaData().getColumnCount(); i++) {
        System.out.print(resultSet.getString(i + 1));
        System.out.print("\t");
    }
    System.out.print("\n");
}

付録:完全なコード例

説明

この例では、Maven バージョン 3.9.9IntelliJ IDEA Community Edition 2024.1.2 開発ツールを使用しています。

import java.sql.*;
import java.util.Properties;

public class EncryptedColumnAccess {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        // 以下の接続情報を、エンドポイント (ホスト名)、ポート、データベースインスタンス名 (dbname)、ユーザー名、パスワードなど、ご利用のインスタンスの詳細に更新してください。
        String hostname = "your-hostname";
        String port = "your-port";
        String dbname = "your-database-name";
        String username = "your-username";
        String password = "your-password";

        // 環境変数から AccessKey ID と AccessKey Secret を取得します。
        String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
        String accessKeySecret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
        // 一時的な STS アクセス認証情報を使用して KMS キーを読み取る場合は、取得した Security Token Service トークン (SecurityToken) も入力する必要があります。
        // String stsToken= "yourSecurityToken";

        // KMS インスタンスのエンドポイントには、パブリックネットワークアクセスの場合はパブリックエンドポイントを、VPC 内のアクセスの場合はインスタンスの VPC エンドポイントを使用します。
        String kmsEndpoint = "your-kms-endpoint";

        Properties props = new Properties();
        props.setProperty("user", username);
        props.setProperty("password", password);
        props.setProperty("ALIBABA_CLOUD_ACCESS_KEY_ID", accessKeyId);
        props.setProperty("ALIBABA_CLOUD_ACCESS_KEY_SECRET", accessKeySecret);
        props.setProperty("ALIBABA_CLOUD_KMS_ENDPOINT", kmsEndpoint);
        // props.setProperty("ALIBABA_CLOUD_STS_TOKEN","stsToken");

        // MySQL データベースの接続 URL フォーマットは "jdbc:mysql:encdb://%s:%s/%s" です。
        String dbUrl = String.format("jdbc:mysql:encdb://%s:%s/%s", hostname, port, dbname);

        // EncJDBC ドライバーをロードします。
        Class.forName("com.aliyun.encdb.mysql.jdbc.EncDriver");

        // データベース接続を取得します。
        Connection connection = DriverManager.getConnection(dbUrl, props);

        // クエリを開始します。
        try {
            // クエリ文を作成します。
            Statement statement = connection.createStatement();
            ResultSet resultSet = statement.executeQuery("SELECT * FROM users");

            // 結果セットを走査します。
            while (resultSet.next()) {
                int id = resultSet.getInt("id");
                String name = resultSet.getString("username");
                String phone = resultSet.getString("phone");

                // テーブルスキーマに基づいて他のフィールドを処理します。
                System.out.println("ID: " + id + ", Name: " + name + ", Phone: " + phone);
            }

            // リソースを閉じます。
            resultSet.close();
            statement.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

ローカルキーの使用

ステップ 1:MEK の生成

警告

MEK は、クライアントが暗号化されたデータにアクセスすることを承認するためのルート認証情報です。セキュリティ上の理由から、暗号化データベースは MEK を保存または管理しません。また、MEK の生成やバックアップサービスも提供しません。MEK の生成はお客様の責任で行ってください。MEK の保存と管理はデータベースのセキュリティにとって重大であるため、MEK を安全にバックアップすることを推奨します。

MEK:MEK は、安全な非対称鍵暗号化プロトコルを使用してクライアントからデータベースサーバーに送信されます。これにより、サーバーとクライアントは同じキーを共有して、対称暗号化による安全なデータ伝送が可能になります。

有効な値:長さ 32 文字の 16 バイトの 16 進文字列。例:00112233445566778899aabbccddeeff

一般的な生成方法:パスワード生成ツールやプログラミング言語のランダム関数を使用できます。

  • Linux では、組み込みの OpenSSL ツールを使用できます。openssl rand -hex 16 を実行してキーを生成します。

    # OpenSSL を使用して安全なランダムキーを生成
    openssl rand -hex 16
    # 出力例: 11ce9a9489fab7355cf710837cea5d5b
  • Windows では、OpenSSL パッケージをインストールできます。

ステップ 2:依存関係のインストール

Maven プロジェクトの pom.xml ファイルに次の依存関係を追加します。

<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-cls-jdbc</artifactId>
    <version>1.0.10-1</version>
</dependency>
説明

Maven の依存関係を追加する際、必要に応じて version の値を置き換えてください。aliyun-cls-jdbc の最新バージョンは公式サイトで確認できます。

ステップ 3:データベース接続のための MEK の設定

MEK は、JDBC プロパティ、ファイル、または URL を使用して設定できます。JDBC を 2 つ以上の方法で設定する場合、優先順位は次のようになります:JDBC プロパティ設定 > ファイル設定 > URL 設定。

説明

以下の設定および接続方法では、MEK はクライアント側でローカルに処理され、安全な方法 (エンベロープ暗号化) を使用してサーバーに送信されるため、MEK が漏洩することはありません。

JDBC プロパティ設定

標準の JDBC 接続を確立する際に、Properties オブジェクトを使用してカスタム属性を設定できます。

// エンドポイント (ホスト名)、ポート、データベースインスタンス名 (dbname)、ユーザー名、パスワードなどの接続情報を準備します。
String hostname = "your-hostname";
String port = "your-port";
String dbname = "your-database-name";
String username = "your-username";
String password = "your-password";

// カスタマーマスターキー。
String mek = "00112233445566778899aabbccddeeff"; 

Properties props = new Properties();
props.setProperty("user", username);
props.setProperty("password", password);
props.setProperty("MEK", mek);

// MySQL データベースの接続 URL フォーマットは "jdbc:mysql:encdb://%s:%s/%s" です。
String dbUrl = String.format("jdbc:mysql:encdb://%s:%s/%s", hostname, port, dbname);

// MySQL データベース用の EncJDBC ドライバーをロードします。
Class.forName("com.aliyun.encdb.mysql.jdbc.EncDriver");

// データベース接続を取得します。
Connection connection = DriverManager.getConnection(dbUrl, props);

// ... クエリを開始 ...
ファイル設定
説明

ファイル設定方法は、ローカル MEK の設定にのみ適用されます。

設定ファイルから、必要な MEK などのパラメーターをインポートできます。プロジェクトで、encJdbcConfigFile という名前のプロパティを設定し、その値を設定ファイルのパスに設定します。パスを指定しない場合、システムはデフォルトで encjdbc.conf ファイルを使用します。以下のコードは、設定ファイルの内容を示しています:

MEK=00112233445566778899aabbccddeeff

  1. 設定ファイルの場所は、次の 2 つの方法のいずれかで指定できます:

    • プロジェクトのリソースディレクトリにファイルを配置します。次の図を参照してください:

      image

    • プログラムのランタイムディレクトリであるプロジェクトのルートディレクトリにファイルを配置します。

  2. ファイルを設定した後、プログラムで追加の設定を行う必要はありません。次のコードを参照してください:

    // エンドポイント (ホスト名)、ポート、データベースインスタンス名 (dbname)、ユーザー名、パスワードなどの接続情報を準備します。
    String hostname = "your-hostname";
    String port = "your-port";
    String dbname = "your-database-name";
    String username = "your-username";
    String password = "your-password";
    
    // MySQL データベースの接続 URL フォーマットは "jdbc:mysql:encdb://%s:%s/%s" です。
    String dbUrl = String.format("jdbc:mysql:encdb://%s:%s/%s", hostname, port, dbname);
    
    // MySQL データベース用の EncJDBC ドライバーをロードします。
    Class.forName("com.aliyun.encdb.mysql.jdbc.EncDriver");
    
    // データベース接続を取得します。
    Connection connection = DriverManager.getConnection(dbUrl, username, password);
    
    // ... クエリを開始 ...
URL 設定

MEK などのパラメーターを URL に埋め込むことができます。

// エンドポイント (ホスト名)、ポート、データベースインスタンス名 (dbname)、ユーザー名、パスワードなどの接続情報を準備します。
String hostname = "your-hostname";
String port = "your-port";
String dbname = "your-database-name";
String username = "your-username";
String password = "your-password";

 // カスタマーマスターキー。
String mek = "00112233445566778899aabbccddeeff";

// MySQL データベースの接続 URL フォーマットは "jdbc:mysql:encdb://%s:%s/%s?MEK=%s" です。
String dbUrl = String.format("jdbc:mysql:encdb://%s:%s/%s?MEK=%s", hostname, port, dbname, mek);

// MySQL データベース用の EncJDBC ドライバーをロードします。
Class.forName("com.aliyun.encdb.mysql.jdbc.EncDriver");

// データベース接続を取得します。
Connection connection = DriverManager.getConnection(dbUrl, username, password);

// ... クエリを開始 ...

ステップ 4:暗号化された列からプレーンテキストデータをクエリする

データベースへの接続に成功した後、通常の JDBC クエリと同様にデータベース操作を実行できます。EncJDBC は暗号化された列を自動的に復号し、プレーンテキストデータを返します。

// クエリ文を作成します。
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery("SELECT * FROM your_table_name");

// 結果セットを走査します。
while (resultSet.next()) {
    for (int i = 0; i < resultSet.getMetaData().getColumnCount(); i++) {
        System.out.print(resultSet.getString(i + 1));
        System.out.print("\t");
    }
    System.out.print("\n");
}

付録:完全なコード例

説明

この例では、Maven バージョン 3.9.9IntelliJ IDEA Community Edition 2024.1.2 開発ツールを使用しています。

import java.sql.*;
import java.util.Properties;

public class EncryptedColumnAccess {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        // 以下の接続情報を、エンドポイント (ホスト名)、ポート、データベースインスタンス名 (dbname)、ユーザー名、パスワードなど、ご利用のインスタンスの詳細に更新してください。
        String hostname = "your-hostname";
        String port = "your-port";
        String dbname = "your-database-name";
        String username = "your-username";
        String password = "your-password";
        
        // これは単なる例です。より複雑なキーを使用してください。
        String mek="00112233445566778899aabbccddeeff";

        Properties props = new Properties();
        props.setProperty("user", username);
        props.setProperty("password", password);
        props.setProperty("MEK", mek);
        
        // MySQL データベースの接続 URL フォーマットは "jdbc:mysql:encdb://%s:%s/%s" です。
        String dbUrl = String.format("jdbc:mysql:encdb://%s:%s/%s", hostname, port, dbname);

        // EncJDBC ドライバーをロードします。
        Class.forName("com.aliyun.encdb.mysql.jdbc.EncDriver");

        // データベース接続を取得します。
        Connection connection = DriverManager.getConnection(dbUrl, props);

        // クエリを開始します。
        try {
            // クエリ文を作成します。
            Statement statement = connection.createStatement();
            ResultSet resultSet = statement.executeQuery("SELECT * FROM users");

            // 結果セットを走査します。
            while (resultSet.next()) {
                int id = resultSet.getInt("id");
                String name = resultSet.getString("username");
                String phone = resultSet.getString("phone");

                // テーブルスキーマに基づいて他のフィールドを処理します。
                System.out.println("ID: " + id + ", Name: " + name + ", Phone: " + phone);
            }

            // リソースを閉じます。
            resultSet.close();
            statement.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

よくある質問

EncJDBC を統合する際に、「Code: Forbidden.KeyNotFound; Message: code: 404, The specified Key is not found.」というエラーが表示されます。どうすればよいですか?

アプリケーションで KMS インスタンスのエンドポイントが正しく設定されているか確認してください。

  • アプリケーション環境の確認:KMS インスタンスのエンドポイントは、VPC とパブリックネットワークで異なります。

    • VPC エンドポイント (デフォルト): デフォルトでは、KMS インスタンスのキーは VPC 内からのみアクセスできます。KMS インスタンス管理ページに移動し、インスタンスが配置されているリージョンを選択し、対象の KMS インスタンスを見つけて、[操作] 列の [詳細] をクリックします。その後、[基本情報] タブで、インスタンスの VPC エンドポイントを表示できます。

    • パブリックエンドポイント:インターネット経由でキーにアクセスするには、[RD Multi-Account] タブでパブリックネットワークアクセスを有効にする必要があります。パブリックアクセスを有効にすると、[基本情報] タブで [パブリックエンドポイント] を表示できます。

  • KMS インスタンスリージョンの確認

    • KMS インスタンスのリージョンに基づいてエンドポイントを調整します。たとえば、中国 (杭州) のパブリックエンドポイントは kms.cn-hangzhou.aliyuncs.com であり、中国 (北京) のパブリックエンドポイントは kms.cn-beijing.aliyuncs.com である必要があります。

EncJDBC を統合する際に、「Code: UnsupportedOperation; Message: code: 400, This action is not supported.」というエラーが表示されます。どうすればよいですか?

このエラーは、以下の理由で発生する可能性があります。以下の考えられる原因を確認してください:

  • KMS の カスタマーマスターキーではなく、デフォルトキーのマスターキーを使用している可能性があります。

    説明

    デフォルトのマスターキーは、クラウド製品によるサーバー側の暗号化にのみ使用できます。クライアント側のデータ暗号化には使用できません。機密データベース機能のためにクライアント側でデータを暗号化するには、インスタンスを作成し、ソフトウェアベースまたはハードウェアベースのカスタマーマスターキー (CMK) を購入する必要があります。

  • KMS インスタンスでパブリックネットワークアクセスが有効になっていません。

EncJDBC を統合する際に、「Code: Forbidden.NoPermission; Message: code: 403, This operation for XXX is forbidden by permission system.」というエラーが表示されます。どうすればよいですか?

ご利用の AccessKey ペア (AccessKeyIdAccessKeySecret) に、KMS にアクセスするために必要な権限がない可能性があります。PolarDB がデータを動的に復号できるように、KMS:Decrypt 権限を付与する必要があります。

  1. RAM コンソールに移動します。左側のナビゲーションウィンドウで、[権限管理] > [アクセスポリシー] を選択します。[アクセスポリシーの作成] をクリックします。スクリプトエディターに切り替え、次の内容をコピーして [OK] をクリックします。ポリシー名を入力し、作成を完了します。

    {
        "Version": "1",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": "KMS:Decrypt",
                "Resource": "*"
            }
        ]
    }
  2. RAM コンソールに戻ります。左側のナビゲーションウィンドウで、[ID 管理] > [ユーザー] を選択します。対象の RAM ユーザーを見つけます。[操作] 列で、[権限の追加] をクリックします。新しく作成したアクセスポリシーをユーザーに付与します。これにより、PolarDB はデータを動的に復号できるようになります。