新しい SSL/TLS 証明書を使用して Aurora PostgreSQL DB クラスターに接続するようにアプリケーションを更新 - Amazon Aurora

新しい SSL/TLS 証明書を使用して Aurora PostgreSQL DB クラスターに接続するようにアプリケーションを更新

2019 年 9 月 19 日に Amazon RDS は、Secure Socket Layer または Transport Layer Security(SSL/TLS)を使用して Aurora DB クラスターに接続するための新しい認証局(CA)証明書を公開しました。ここでは、新しい証明書を使用するためのアプリケーションの更新について説明します。

このトピックでは、クライアントアプリケーションが SSL/TLS を使用して DB クラスターに接続されているかどうかを判断できます。該当する場合はさらに、それらのアプリケーションの接続に証明書の検証が必要かどうかを確認できます。

注記

一部のアプリケーションは、サーバー上の証明書を正常に検証できる場合にのみ、Aurora PostgreSQL DB クラスターに接続されるように設定されています。

そのようなアプリケーションの場合は、新しい CA 証明書を含むように、クライアントアプリケーションの信頼ストアを更新する必要があります。

クライアントアプリケーションの信頼ストアで CA 証明書を更新した後、DB クラスターで証明書をローテーションできます。これらの手順を開発環境またはステージング環境でテストしてから、本番環境で実装することを強くお勧めします。

証明書のローテーションの詳細については、「SSL/TLS 証明書の更新」を参照してください。証明書のダウンロードの詳細については、SSL/TLS を使用した DB クラスターへの接続の暗号化 を参照してください。PostgreSQL DB クラスターで SSL/TLS を使用する方法については、「SSL での Aurora PostgreSQL データの保護」を参照してください。

アプリケーションが SSL を使用して Aurora PostgreSQL DB クラスターに接続しているかどうかの確認

DB クラスターの設定で rds.force_ssl パラメータの値を確認します。デフォルトでは、rds.force_ssl パラメータは 0(オフ)に設定されます。rds.force_ssl パラメータが 1(オン)に設定されている場合、クライアントは接続に SSL/TLS を使用する必要があります。パラメータグループの詳細については、「DB パラメータグループおよび DB クラスターパラメータグループを使用する」を参照してください。

rds.force_ssl1(オン)に設定されていない場合は、pg_stat_ssl ビューにクエリを発行して、SSL を使用する接続を確認します。たとえば次のクエリは、SSL 接続、および SSL を使用するクライアントに関する情報のみを返します。

select datname, usename, ssl, client_addr from pg_stat_ssl inner join pg_stat_activity on pg_stat_ssl.pid = pg_stat_activity.pid where ssl is true and usename<>'rdsadmin';

SSL/TLS 接続を使用する行のみが、接続に関する情報とともに表示されます。以下は出力例です。

datname | usename | ssl | client_addr ----------+---------+-----+------------- benchdb | pgadmin | t | 53.95.6.13 postgres | pgadmin | t | 53.95.6.13 (2 rows)

上記のクエリでは、クエリ実行時点の接続のみが表示されます。結果が表示されなくても、SSL 接続を使用しているアプリケーションが存在しないわけではありません。それ以降に別の SSL 接続が確立される場合もあります。

クライアントを接続するために証明書の検証が必要かどうかを確認する

psql や JDBC など、クライアントに SSL サポートが設定されている場合、クライアントは最初にデフォルトで SSL を使用してデータベースへの接続を試みます。クライアントが SSL を使用して接続できない場合、SSL を使用しない接続に戻ります。使用されるデフォルトの sslmode モードは、libpq ベースのクライアント(psql など)と JDBC では異なります。libpq ベースのクライアントはデフォルトで prefer に設定されますが、JDBC クライアントは verify-full に設定されます。サーバー上の証明書が検証されるのは、sslmoderequireverify-ca、または verify-full に設定されて sslrootcert が指定された場合のみです。証明書が無効な場合は、エラーがスローされます。

PGSSLROOTCERT を使用して、PGSSLMODE 環境変数を指定して証明書を検証します(PGSSLMODErequireverify-ca、または verify-full に設定します)。

PGSSLMODE=require PGSSLROOTCERT=/fullpath/rds-ca-2019-root.pem psql -h pgdbidentifier.cxxxxxxxx.us-east-2.rds.amazonaws.com -U masteruser -d postgres

sslrootcert 引数を使用して、接続文字列形式で sslmode を使用して証明書を検証します(sslmoderequireverify-ca、または verify-full に設定します)。

psql "host=pgdbidentifier.cxxxxxxxx.us-east-2.rds.amazonaws.com sslmode=require sslrootcert=/full/path/rds-ca-2019-root.pem user=masteruser dbname=postgres"

たとえば前述の例の場合は、無効なルート証明書を使用すると、クライアントで次のようなエラーが表示されます。

psql: SSL error: certificate verify failed

アプリケーション信頼ストアの更新

PostgreSQL アプリケーションの信頼ストアの更新については、PostgreSQL のドキュメントの「Secure TCP/IP Connections with SSL」を参照してください。

注記

信頼ストアを更新するとき、新しい証明書を追加できるだけでなく、古い証明書を保持できます。

JDBC のアプリケーション信頼ストアの更新

SSL/TLS 接続に JDBC を使用するアプリケーションの信頼ストアを更新できます。

JDBC アプリケーションの信頼ストアを更新するには

  1. すべての AWS リージョンで動作する 2019 ルート証明書をダウンロードし、そのファイルを信頼ストアのディレクトリに置きます。

    ルート証明書のダウンロードについては、SSL/TLS を使用した DB クラスターへの接続の暗号化 を参照してください。

  2. 次のコマンドを使用して、証明書を .der 形式に変換します。

    openssl x509 -outform der -in rds-ca-2019-root.pem -out rds-ca-2019-root.der

    ファイル名を、ダウンロードしたファイル名に置き換えます。

  3. 次のコマンドを使用して、証明書をキーストアにインポートします。

    keytool -import -alias rds-root -keystore clientkeystore -file rds-ca-2019-root.der
  4. キーストアが正常に更新されたことを確認します。

    keytool -list -v -keystore clientkeystore.jks

    キーストアのパスワードを求められたら、パスワードを入力します。

    出力には次の内容が含まれている必要があります。

    rds-root,date, trustedCertEntry, Certificate fingerprint (SHA1): D4:0D:DB:29:E3:75:0D:FF:A6:71:C3:14:0B:BF:5F:47:8D:1C:80:96 # This fingerprint should match the output from the below command openssl x509 -fingerprint -in rds-ca-2019-root.pem -noout

各種アプリケーションでの SSL/TLS 接続の使用

以下に、各種アプリケーションでの SSL/TLS 接続の使用に関する情報を示します。

  • psql

    接続文字列または環境変数としてオプションを指定することで、クライアントがコマンドラインから呼び出されます。SSL/TLS 接続の場合、関連するオプションは sslmode(環境変数 PGSSLMODE)、sslrootcert(環境変数 PGSSLROOTCERT)です。

    オプションの完全なリストについては、PostgreSQL のドキュメントの「Parameter Key Words」を参照してください。環境変数の完全なリストについては、PostgreSQL のドキュメントの「Environment Variables」を参照してください。

  • pgAdmin

    このブラウザベースのクライアントは、PostgreSQL データベースに接続するために使用できる使いやすいインターフェイスです。

    接続の設定については、pgAdmin のドキュメントを参照してください。

  • JDBC

    JDBC は、Java アプリケーションとのデータベース接続を可能にします。

    JDBC を使用した PostgreSQL データベースへの接続に関する一般情報については、PostgreSQL のドキュメントの「Connecting to the Database」を参照してください。SSL/TLS を使用した接続については、PostgreSQL のドキュメントの「クライアントの設定」を参照してください。

  • Python

    PostgreSQL データベースに接続するために一般的に使用される Python ライブラリは、psycopg2 です。

    psycopg2 の使用については、psycopg2 のドキュメントを参照してください。PostgreSQL データベースへの接続方法に関する簡単なチュートリアルについては、「Psycopg2 Tutorial」を参照してください。connect コマンドで受け入れられるオプションについては、「The psycopg2 module content」を参照してください。

重要

データベース接続で SSL/TLS を使用することを決定し、アプリケーションの信頼ストアを更新したら、rds-ca-2019 証明書を使用するようにデータベースを更新できます。手順については、「DB インスタンスの変更による CA 証明書の更新」のステップ 3 を参照してください。