クライアントアプリケーションと Hologres 間のデータ伝送のセキュリティを向上させるために、Secure Socket Layer(SSL)暗号化伝送を有効にすることができます。SSL は、デジタル証明書と Transport Layer Security(TLS)などの暗号化アルゴリズムを使用して、Hologres インスタンスとクライアント間のネットワーク接続を暗号化します。これにより、送信データのセキュリティと整合性が確保されます。
シナリオ
SSL 暗号化伝送は、以下のシナリオに適しています。
データベースへのリモートアクセス: クライアントからデータベースにリモートアクセスする場合、SSL 暗号化伝送を有効にして、データ伝送中のセキュリティを向上させることができます。
セキュリティコンプライアンス: 業界標準や規制に基づいてデータ伝送に暗号化が必要な場合、SSL 暗号化伝送を有効にして、セキュリティ要件を満たすことができます。
SSL は、トランスポート層でネットワーク接続を暗号化します。これにより、送信データのセキュリティと整合性が向上しますが、ネットワーク接続の応答時間が長くなります。
前提条件
Hologres インスタンスが購入済みであること。詳細については、「Hologres インスタンスの購入」をご参照ください。
PostgreSQL クライアントまたは Java Database Connectivity(JDBC)ドライバーがダウンロードおよびインストールされていること。詳細については、「コマンドライン」または「JDBC」をご参照ください。
注意事項
Hologres V1.1 以降では、伝送暗号化がサポートされています。Hologres V1.2 以降では、Transport Layer Security(TLS)がサポートされています。Hologres V2.1 以降では、SSL 暗号化伝送で認証局(CA)証明書を使用し、Hologres コンソールで SSL 暗号化伝送を有効にすることができます。
説明Hologres インスタンスのバージョンが V1.1 より前の場合、Hologres コンソールで Hologres インスタンスを手動でアップグレードするか、Hologres DingTalk グループに参加して Hologres テクニカルサポートに連絡することができます。 Hologres コンソールで Hologres インスタンスを手動でアップグレードする方法の詳細については、「手動アップグレード(ベータ)」をご参照ください。テクニカルサポートを受ける方法の詳細については、「Hologres のオンラインサポートを受ける」をご参照ください。
インスタンスの SSL 暗号化伝送を有効または無効にするたびに、インスタンスが再起動されます。注意して進めてください。デフォルトでは、SSL 暗号化伝送は無効になっています。
Hologres インスタンスに対して SSL 暗号化伝送が有効になっている場合、SSL 接続を介して Hologres インスタンスに接続できます。この場合、クライアントを使用して Hologres インスタンスに接続するときに、Hologres への接続を暗号化するかどうかを明示的に指定する必要があります。
Hologres インスタンスに対して SSL 暗号化伝送が無効になっている場合、非 SSL 接続を介してのみ Hologres インスタンスに接続できます。
次の表に、Hologres でサポートされている SSL 暗号化伝送モードを示します。
SSL 暗号化伝送モード
サポートされているバージョン
必須: クライアントは、データの送信に使用される接続のみを暗号化するために SSL を使用します。
V1.1
CA 検証: クライアントは、データの送信に使用される接続を暗号化するために SSL を使用し、CA 証明書を使用して Hologres サーバーを検証します。
V2.1
完全検証: クライアントは、データの送信に使用される接続を暗号化するために SSL を使用し、CA 証明書を使用して Hologres サーバーを検証し、CA 証明書で指定された CN またはドメインネームシステム(DNS)が、接続確立時に指定された Hologres エンドポイントと一致するかどうかを確認します。
V2.1
SSL 証明書の有効期間は 1 年です。SSL 証明書の有効期限が切れたら、手動で更新する必要があります。そうしないと、SSL 証明書の有効期限が切れた後に SSL 暗号化伝送を使用できなくなります。
SSL 暗号化伝送を有効にすると、CPU 負荷が増加し、読み取り/書き込みレイテンシが増加します。
SSL 暗号化伝送を有効にした後、暗号化を有効にするには、既存の接続を閉じて再確立する必要があります。
SSL 暗号化伝送を有効または無効にするか、SSL 証明書を更新すると、Hologres インスタンスが再起動されます。再起動には約 3 分かかります。操作はオフピーク時に行ってください。
手順 1: Hologres インスタンスの SSL 暗号化伝送を有効にする
Hologres コンソール にログインします。左上隅で、リージョンを選択します。
左側のナビゲーションペインで、[インスタンス] をクリックします。表示されるページで、目的のインスタンスの ID をクリックします。
[インスタンスの詳細]ページの左側のナビゲーションペインで、[データセキュリティ] をクリックします。
[SSL] タブで、[SSL 暗号化] スイッチをオンにします。
[SSL 暗号化を有効にする] メッセージで、[SSL 暗号化を有効にする] をクリックします。
手順 2: CA 証明書をダウンロードする
Hologres は CA 証明書を提供します。クライアントから Hologres インスタンスにリモート接続する場合、インスタンスの CA 証明書を使用して Hologres インスタンスを検証できます。
Hologres コンソール にログインします。左上隅で、リージョンを選択します。
左側のナビゲーションペインで、[インスタンス] をクリックします。表示されるページで、目的のインスタンスの ID をクリックします。
[インスタンスの詳細]ページの左側のナビゲーションペインで、[データセキュリティ] をクリックします。
[SSL] タブで、[証明書のダウンロード] をクリックします。
手順 3: Hologres インスタンスに接続する
PostgreSQL クライアントまたは JDBC ドライバーを使用して、Hologres インスタンスに接続できます。パラメーターを設定して、接続の SSL 暗号化伝送を有効にすることができます。
PostgreSQL CLI を使用して Hologres インスタンスに接続する
コマンド
PG_USER=<AccessKey ID> PG_PASSWORD=<AccessKey Secret> PG_SSLMODE=<SSL Mode> PG_SSLROOTCERT=<certificate folder> PGSSLMODE=$PG_SSLMODE PGSSLROOTCERT=$PG_SSLROOTCERT PGUSER=$PG_USER PGPASSWORD=$PG_PASSWORD psql -p <Port> -h <Endpoint> -d <Database>パラメーター
パラメーター
説明
AccessKey ID
Alibaba Cloud アカウントの AccessKey ID。
アクセスキーのペア ページから AccessKey ID を取得できます。
環境変数を設定し、環境変数から AccessKey ID と AccessKey シークレットを取得することをお勧めします。これは、漏洩のリスクを軽減するのに役立ちます。
AccessKey Secret
Alibaba Cloud アカウントの AccessKey シークレット。
アクセスキーのペア ページから AccessKey シークレットを取得できます。
環境変数を設定し、環境変数から AccessKey ID と AccessKey シークレットを取得することをお勧めします。これは、漏洩のリスクを軽減するのに役立ちます。
SSL モード
PostgreSQL クライアントが Hologres インスタンスに接続する暗号化モード。有効な値:
require: クライアントは、データの送信に使用される接続を暗号化するために SSL を使用します。
verify-ca: クライアントは、データの送信に使用される接続を暗号化するために SSL を使用し、Hologres インスタンスを検証します。
verify-full: クライアントは、データの送信に使用される接続を暗号化するために SSL を使用し、Hologres インスタンスを検証し、CA 証明書で指定された CN または DNS が接続確立時に指定された Hologres エンドポイントと一致するかどうかを確認します。
disable: クライアントは、暗号化伝送に SSL を使用しません。
証明書フォルダー
CA 証明書の保存パス。
SSL Modeを verify-ca または verify-full に設定する場合は、このパラメーターを設定する必要があります。ポート
Hologres インスタンスのパブリックポート番号。
例:
80。エンドポイント
Hologres インスタンスのパブリックエンドポイント。
例:
xxx-cn-hangzhou.hologres.aliyuncs.com。データベース
接続する Hologres データベースの名前。
Hologres インスタンスを購入すると、postgres という名前のデータベースが自動的に作成されます。
postgres データベースに接続できます。ただし、このデータベースに割り当てられるリソースは限られています。ビジネスに十分なリソースを確保するために、Hologres コンソールにアクセスしてデータベースを作成することをお勧めします。詳細については、「データベースの作成」をご参照ください。
例:
mydb。検証
PGSSLMODE パラメーターを
requireに設定し、Hologres に接続するときに次のメッセージが表示された場合、接続は SSL を使用して暗号化されます。
JDBC ドライバーを使用して Hologres インスタンスに接続する
JDBC ドライバーを使用して Hologres インスタンスに接続する場合、ssl パラメーターと sslmode パラメーターを使用して、SSL 暗号化伝送を有効にするかどうかを指定できます。Hologres での接続結果は、各パラメーターの値によって異なります。次の表に、値と結果のマッピングを示します。
Hologres インスタンスに対して SSL 暗号化伝送が有効になっている | ssl | sslmode | 結果 |
はい | true |
| クライアントを Hologres インスタンスに接続して操作を実行できます。データは、クライアントと Hologres インスタンス間で送信されるときに暗号化されます。 |
はい | false |
| クライアントを Hologres インスタンスに接続して操作を実行できます。データは、クライアントと Hologres インスタンス間で送信されるときに暗号化されません。 |
いいえ | true |
| 次の図に示すエラーメッセージが報告されます。
|
いいえ | false |
| クライアントを Hologres インスタンスに接続して操作を実行できます。データは、クライアントと Hologres インスタンス間で送信されるときに暗号化されません。 |
サンプルコード
// Hologres インスタンスのエンドポイントを指定します。
String hostname = "hgxxxxxxx-cn-hangzhou-vpc.hologres.aliyuncs.com:80";
// Hologres インスタンスのポート番号を指定します。
String port = "80";
// 接続するデータベースの名前を指定します。
String dbname = "postgres";
String jdbcUrl = "jdbc:postgresql://" + hostname + ":" + port + "/" + dbname+"?binaryTransfer=true";
Properties properties = new Properties();
// データベースへの接続に使用する AccessKey ID を指定します。環境変数を設定し、環境変数から AccessKey ID を取得することをお勧めします。
properties.setProperty("user", "accessid");
// データベースへの接続に使用する AccessKey シークレットを指定します。環境変数を設定し、環境変数から AccessKey シークレットを取得することをお勧めします。
properties.setProperty("password", "accesskey");
// 暗号化伝送に SSL を使用します。
properties.setProperty("ssl", "true");
// CA の公開鍵を指定します。
properties.setProperty("sslrootcert", path + "/" + "hologres_certificate.crt");
// SSL 接続モードを指定します。有効な値: require、verify-ca、verify-full。
properties.setProperty("sslmode", "verify-full");
try {
Class.forName("org.postgresql.Driver");
Connection connection = DriverManager.getConnection(jdbcUrl, properties);
// この例では、postgres という名前のデータベースに example という名前のテーブルが含まれており、テーブルからデータがクエリされます。
PreparedStatement preparedStatement = connection.prepareStatement("select * from " +
"example");
ResultSet resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
ResultSetMetaData rsmd = resultSet.getMetaData();
int columnCount = rsmd.getColumnCount();
Map map = new HashMap();
for (int i = 0; i < columnCount; i++) {
map.put(rsmd.getColumnName(i + 1).toLowerCase(), resultSet.getObject(i + 1));
}
System.out.println(map);
}
} catch (Exception exception) {
exception.printStackTrace();
}