Amazon RDS PostgreSQLにpsqlからSSL接続する

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

3行まとめ

  • psql はデフォルトでSSL接続する
  • SSL接続を強制するにはパラメータグループの rds.force_ssl パラメータを変更する
  • ルート証明書を取得すれば、RDSのSSL証明書を検証できる

Amazon Aurora MySQL 向け SSL 接続方法

次の過去記事を参照ください。

【Amazon Aurora】SSLによる通信の暗号化

検証環境

Client

  • Amazon Linux 2
  • psql で PostgreSQL に接続

Database

  • RDS : Aurora PostgreSQL 9.6
  • RDS : PostgreSQL 10.4-R1

psql で SSL 接続

psql はデフォルトで SSL 接続を試し、Amazon RDS for PostgreSQL はデフォルトで SSL 通信に対応しています。

そのため、psql から Amazon RDS for PostgreSQL に接続する際に、特別なオプションを渡さなければ、SSL で接続します。

$ psql -h  $HOST "dbname=dbname user=username"
Password:
psql (10.4)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.
dbname=>

デフォルトで SSL 接続を試す仕様は、環境変数 PGSSLMODE で変更可能です。

環境変数で PGSSLMODE=disable を設定し、 非SSLで接続してみます

$ PGSSLMODE=disable \
  psql -h  $HOST "dbname=dbname user=username"
Password:
psql (10.4)
Type "help" for help.
dbname=>

先程と異なり SSL connection ... のメッセージが表示されていません。

SSL 接続を強制する

SSL 接続を強制するには RDS の rds.force_ssl パラメータをデフォルトの 0(off) から 1(on) に変更します。

このパラメータの設定は非 Aurora と Aurora でパラメータグループが異なります。

  • Amazon RDS for PostgreSQL の場合は Parameter groups
  • Amazon Aurora PostgreSQL の場合は DB cluster parameter group

変更を反映するためには DB インスタンスを再起動する必要があります。

SSL 接続を強制後、非 SSL 接続を試みると、エラーになります。

$ PGSSLMODE=disable \
  psql -h $HOST "dbname=dbname user=username"
psql: FATAL:  no pg_hba.conf entry for host "XX.XX.XX.XX", user "username", database "dbname", SSL off

SSL 証明書を検証する

なりすましを防止するために、ルート証明書を取得して、RDS エンドポイント用の SSL 証明書を検証する事ができます。

SSL 証明書を検証するには psql コマンドに sslmode=verify-full オプションを追加し、ルート証明書を指定します。

ルート証明書の管理

ルート証明書は次の URL から取得します。

psql からルート証明書を参照するには次の方法があります。

  • 証明書を psql デフォルトのパス($HOME/.postgresql/root.crt)にインストール
  • 環境変数で証明書のパスを指定($ PGSSLROOTCERT=/path/to/rds-combined-ca-bundle.pem psql ...)
  • psql の引数で証明書のパスを指定(sslrootcert=/path/to/root.crt)

SSL 証明書を検証して接続

バンドルのルート証明書をダウンロードし、psql の引数で証明書のパスを指定して SSL 証明書を検証する場合、以下のようになります。

$ wget https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem
$ psql -h $HOST \
  "dbname=dbname user=username sslrootcert=rds-combined-ca-bundle.pem sslmode=verify-full"
Password:
psql (10.4, server 9.6.8)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.
dbname=>

sslinfo エクステンションによるSSL接続状況の確認

PostgreSQL の sslinfo エクステンションを利用すると、SSL 接続状況を確認できます。

このエクステンションは

  • Amazon RDS for PostgreSQL
  • Amazon Aurora PostgreSQL

の両方で利用可能です。

# エクステンションを有効化
dbname=> create extension sslinfo;
CREATE EXTENSION

# SSL 接続ステータスを調べる。リザルトは boolean
dbname=> select ssl_is_used();
 ssl_is_used
-------------
 t
(1 row)

# SSL 暗号を調べる
dbname=> select ssl_cipher();
         ssl_cipher
-----------------------------
 ECDHE-RSA-AES256-GCM-SHA384
(1 row)

関連情報