デフォルトでは、クライアントアプリケーションと AnalyticDB for PostgreSQL インスタンス間で送信されるデータは、ネットワーク上をプレーンテキストで転送されます。SSL 暗号化は、これらの接続をトランスポート層で保護し、データ整合性を確保し、不正な傍受を防ぎます。
前提条件
開始する前に、以下をご確認ください。
AnalyticDB for PostgreSQL インスタンスがあること
注意事項
SSL 証明書の有効期間は 1 年間です。有効期限が切れる前に証明書を更新してください。証明書の有効期限が切れると、暗号化された接続を使用するアプリケーションはインスタンスに接続できなくなります。
SSL 暗号化により、CPU 使用率が大幅に増加し、ネットワークの往復レイテンシが増加する可能性があります。インスタンスへのパブリック接続を暗号化する必要がある場合にのみ、SSL を有効にしてください。
SSL 暗号化の有効化
この操作によりインスタンスが再起動します。この操作はオフピーク時間帯に実行してください。
AnalyticDB for PostgreSQL コンソールにログインします。
コンソールの左上隅で、インスタンスが存在するリージョンを選択します。
対象のインスタンスを見つけ、その ID をクリックします。
左側のナビゲーションウィンドウで、[セキュリティコントロール] をクリックします。
[SSL 暗号化] タブをクリックします。
[SSL 暗号化] をオンにします。
[SSL 暗号化の有効化] メッセージで、[OK] をクリックします。インスタンスが再起動します。再起動が完了し、SSL のステータスが [有効] と表示されたら、証明書のダウンロードに進みます。
[証明書のダウンロード] をクリックします。
証明書ファイル
ダウンロードしたパッケージには、3 つの証明書ファイルが含まれています。
| ファイル | フォーマット | ユースケース |
|---|---|---|
| PEM ファイル | PEM | Windows 以外のアプリケーション:psql、Python、Go、Linux、または macOS クライアント |
| P7B ファイル | PKCS#7 | Windows アプリケーション |
| JKS ファイル | Java KeyStore | Java アプリケーション。デフォルトのトラストストアパスワード:apsaradb |
JDK 7 と JDK 8 の設定
JDK 7 または JDK 8 で JKS ファイルを使用する場合は、アプリケーションホストの jre/lib/security/Java.security ファイルで次のプロパティを変更します。
jdk.tls.disabledAlgorithms=SSLv3, RC4, DH keySize < 224
jdk.certpath.disabledAlgorithms=MD2, RSA keySize < 1024この変更を行わないと、SSL ハンドシェイクは次のエラーで失敗します。
javax.net.ssl.SSLHandshakeException: DHPublicKey does not comply to algorithm constraintsSSL を使用した接続
SSL 暗号化を有効にして証明書をダウンロードした後、SSL を使用するようにクライアントを設定します。
psql
sslmode および sslrootcert パラメーターを使用して SSL で接続します。
psql "host=<your-instance-endpoint> port=<port> dbname=<database> user=<username> sslmode=verify-ca sslrootcert=<path-to-pem-file>"次のプレースホルダーを置き換えます。
| プレースホルダー | 説明 | 例 |
|---|---|---|
<your-instance-endpoint> | インスタンスのエンドポイント | gp-bp1xxxxx-master.gpdb.rds.aliyuncs.com |
<port> | サービスポート | 5432 |
<database> | ターゲットデータベース名 | postgres |
<username> | データベースアカウント | dbadmin |
<path-to-pem-file> | ダウンロードした PEM 証明書ファイルへのパス | /home/user/certs/ca-cert.pem |
JDBC
Java アプリケーションの場合、SSL パラメーターを JDBC 接続 URL に追加します。
jdbc:postgresql://<your-instance-endpoint>:<port>/<database>?sslmode=verify-ca&sslrootcert=<path-to-pem-file>PEM ファイルの代わりに JKS ファイルを使用する場合は、トラストストアを JVM 引数として設定します。
java -Djavax.net.ssl.trustStore=<path-to-jks-file> \
-Djavax.net.ssl.trustStorePassword=apsaradb \
-jar your-application.jarsslmode オプション
PostgreSQL クライアントは、次の sslmode 値をサポートしています。
| sslmode | 暗号化 | 証明書検証 | 推奨 |
|---|---|---|---|
disable | いいえ | いいえ | いいえ |
allow | サーバーが必要とする場合のみ | いいえ | いいえ |
prefer | サーバーがサポートしている場合ははい | いいえ | いいえ |
require | はい | いいえ | パブリック接続の最小要件 |
verify-ca | はい | CA に対してサーバー証明書を検証 | はい |
verify-full | はい | 証明書とホスト名を検証 | 最も安全 |
パブリック接続の場合は、verify-ca または verify-full を使用してサーバー証明書を検証し、中間者攻撃を防ぎます。
SSL 接続の検証
SSL で接続した後、暗号化がアクティブであることを確認します。
psql ログインバナーの確認
psql で接続すると、ログインバナーに SSL 接続の詳細が表示されます。出力は次のようになります。
Password for user dbadmin:
psql (14.0)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256)
Type "help" for help.SSL connection の行は、接続が暗号化されていることを示します。
接続ステータスのクエリ
すべてのアクティブな接続の SSL ステータスを表示するには、次を実行します。
SELECT datname, usename, ssl, client_addr
FROM pg_stat_ssl
JOIN pg_stat_activity ON pg_stat_ssl.pid = pg_stat_activity.pid
ORDER BY ssl;ssl 列の値が t であることは、接続が SSL を使用していることを示します。
SSL 証明書の更新
SSL 証明書は 1 年後に有効期限が切れます。接続の失敗を避けるために、有効期限が切れる前に更新してください。
この操作によりインスタンスが再起動します。この操作はオフピーク時間帯に実行してください。
AnalyticDB for PostgreSQL コンソールにログインします。
コンソールの左上隅で、インスタンスが存在するリージョンを選択します。
対象のインスタンスを見つけ、その ID をクリックします。
左側のナビゲーションウィンドウで、[セキュリティコントロール] をクリックします。
[SSL 暗号化] タブをクリックします。
[SSL 暗号化] の右側にある [有効期間の更新] をクリックします。
[SSL 証明書の有効期間の更新] メッセージで、[OK] をクリックします。
インスタンスが再起動したら、新しい証明書をダウンロードし、すべてのクライアントアプリケーションで更新します。
SSL 暗号化の無効化
この操作によりインスタンスが再起動します。この操作はオフピーク時間帯に実行してください。
AnalyticDB for PostgreSQL コンソールにログインします。
コンソールの左上隅で、インスタンスが存在するリージョンを選択します。
対象のインスタンスを見つけ、その ID をクリックします。
左側のナビゲーションウィンドウで、[セキュリティコントロール] をクリックします。
[SSL 暗号化] タブをクリックします。
[SSL 暗号化] をオフにします。
[SSL 暗号化の無効化] メッセージで、[OK] をクリックします。
SSL を無効にした後、sslrootcert などの SSL 固有のパラメーターを削除するようにクライアント接続文字列を更新します。
トラブルシューティング
SSLHandshakeException: DHPublicKey does not comply to algorithm constraints
原因:デフォルトの JDK 7 または JDK 8 のセキュリティ設定が、サーバーで使用される DH キーサイズを拒否します。
解決策:jre/lib/security/Java.security ファイルを次のように変更します。
jdk.tls.disabledAlgorithms=SSLv3, RC4, DH keySize < 224
jdk.certpath.disabledAlgorithms=MD2, RSA keySize < 1024この変更を行った後、アプリケーションを再起動します。
SSL を有効にした後の接続拒否
原因:SSL が有効になった後、インスタンスがまだ再起動中です。
解決策:接続する前に、コンソールでインスタンスのステータスが [実行中] に戻るまで待ちます。
証明書の有効期限切れエラー
原因:SSL 証明書が 1 年間の有効期間を超えました。
解決策:コンソールで [有効期間の更新] をクリックして証明書を更新し、新しい証明書をダウンロードしてすべてのクライアントにデプロイします。
API リファレンス
| 操作 | 説明 |
|---|---|
| DescribeDBInstanceSSL | インスタンスの SSL 暗号化設定を照会します |
| ModifyDBInstanceSSL | SSL 暗号化の有効化、無効化、または SSL 証明書の更新を行います |