Amazon RDS PostgreSQLにpsqlからSSL接続する
3行まとめ
- psql はデフォルトでSSL接続する
- SSL接続を強制するにはパラメータグループの
rds.force_ssl
パラメータを変更する - ルート証明書を取得すれば、RDSのSSL証明書を検証できる
Amazon Aurora MySQL 向け 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 から取得します。
- (新旧の証明書をバンドル) https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem
- (新しい証明書のみ) https://s3.amazonaws.com/rds-downloads/rds-ca-2015-root.pem
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)