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