🔐
RDS PostgreSQL 15以降のSSL強制化によりツール接続ができなくなった問題と対応
背景
環境とバージョンアップの経緯
RDSでPostgreSQL 12を使用していましたが、以下の理由でバージョン16へのアップグレードを実施しました:
- PostgreSQL 12のサポート終了
- サポート終了後の利用料金が大幅に上昇(約6倍)
アップグレードの流れ:
- 検証環境をPostgreSQL 16にアップグレード
- 2週間の動作確認(問題なし)
- 本番環境をPostgreSQL 16にアップグレード
発生した問題
本番環境のアップグレード後、データベースのメンテナンスツールとして使用しているA5:SQL Mk-2で接続できないという報告がありました。
環境構成:
- データベース: RDS PostgreSQL 16
- クライアント: Windows Server 2022上で動作するA5:SQL Mk-2
- ネットワーク: VPC内からの接続
発生した事象の詳細
エラーメッセージ
A5:SQL Mk-2で接続しようとすると、以下のエラーが表示されました:
no pg_hba.conf entry for host "10.12.1.38", user "xxxuser", database "dbname", no encryption
エラーメッセージの意味:
-
no pg_hba.conf entry: PostgreSQLの認証設定ファイルにマッチするエントリがない -
no encryption: 暗号化なしの接続が拒否されている
このメッセージから、TLS/SSL関連の問題であると特定できました。
根本原因
PostgreSQL 15から、RDSのデフォルト設定でSSL/TLS接続が強制されるようになりました。
| PostgreSQLバージョン |
rds.force_sslのデフォルト値 |
挙動 |
|---|---|---|
| 14以前 |
0 (無効) |
暗号化なし接続が可能 |
| 15以降 |
1 (有効) |
SSL/TLS接続を強制 |
参考記事:
RDSのPostgre15からSSL通信がデフォルトでONになって接続エラーが発生した件
SSL通信の試行と失敗
試行1: ツール側でSSL設定を有効化
A5:SQL Mk-2の接続設定で「SSLを使用する」をONにしましたが、以下のエラーが発生:
The other side has sent a failure alert: [40]
エラーコード40の意味:
TLSハンドシェイク中のエラー。主な原因として以下が考えられます:
- CA証明書が正しく設定されていない
- 暗号スイート(暗号化方式)の不一致
- TLSバージョンの不一致
試行2: CA証明書のインポート
AWS公式ドキュメントからCA証明書をダウンロードし、Windowsにインポートしました。
参考: SSL/TLS を使用した DB インスタンスまたはクラスターへの接続の暗号化
結果: 失敗
CA証明書をインポートしても同じエラーが発生しました。
原因の推測
以下の理由から、ツール側の制約と判断しました:
- 暗号スイートの不一致: A5:SQL Mk-2が対応する暗号化方式とRDSが要求する暗号化方式が一致しない可能性
- TLSバージョンの不一致: ツールが古いTLSバージョンのみサポートしている可能性
- Linuxクライアントでは問題なし: psqlコマンドなどLinux環境からは正常に接続できることを確認
対応方法: SSL強制を無効化
ツール側での対応が困難なため、RDS側でSSL強制を無効化する対応を実施しました。
対応手順
| ステップ | 作業内容 | 詳細 |
|---|---|---|
| 1 | DBパラメータグループ作成 |
rds.force_ssl = 0を設定した新規パラメータグループを作成 |
| 2 | DBインスタンスに適用 | 作成したパラメータグループをDBインスタンスに割り当て |
| 3 | DB再起動(重要) | パラメータグループの変更を有効化するため手動で再起動 |
AWSマネジメントコンソールでの設定
1. DBパラメータグループの作成
- RDSコンソールを開く
- 左メニューから「パラメータグループ」を選択
- 「パラメータグループの作成」をクリック
- 以下を設定:
- パラメータグループファミリー:
postgres16 - グループ名: 任意(例:
postgres16-no-ssl) - 説明:
rds.force_ssl disabled
- パラメータグループファミリー:
- 作成後、パラメータグループを開き「パラメータの編集」を選択
-
rds.force_sslを検索し、値を0に変更 - 変更を保存
2. DBインスタンスへの適用
- RDSコンソールで対象のDBインスタンスを選択
- 「変更」をクリック
- 「追加の設定」セクションで、作成したパラメータグループを選択
- 「続行」→「すぐに適用」を選択
- 変更を適用
3. DBインスタンスの再起動
- 対象のDBインスタンスを選択
- 「アクション」→「再起動」をクリック
- 再起動を実行
再起動完了後、A5:SQL Mk-2からSSLなしで接続できることを確認します。
Terraformでの実装
DBパラメータグループの定義
resource "aws_db_parameter_group" "this" {
name = "${var.env}-postgres-no-ssl-parameter"
family = "postgres16"
description = "Custom parameter group with rds.force_ssl disabled"
parameter {
name = "rds.force_ssl"
value = "0"
apply_method = "immediate" # immediateでも手動再起動が必要
}
tags = {
Name = "${var.env}-postgres-no-ssl"
Environment = var.env
}
}
ポイント:
-
family: PostgreSQLのメジャーバージョンを指定(postgres16) -
rds.force_ssl = "0": SSL強制を無効化 -
apply_method = "immediate": 変更を即座に適用(ただし再起動は必要)
DBインスタンスへの適用
resource "aws_db_instance" "db" {
identifier = "${var.env}-postgres-db"
engine = "postgres"
engine_version = "16"
# ... 省略 ...
db_name = var.database_name
parameter_group_name = aws_db_parameter_group.this.name # パラメータグループを適用
# ... 省略 ...
}
ポイント:
-
parameter_group_name: 作成したパラメータグループを指定
Terraform適用後の手順
# Terraformの適用
terraform plan
terraform apply
# 適用後、AWSコンソールまたはAWS CLIで手動再起動
aws rds reboot-db-instance --db-instance-identifier <your-db-identifier>
まとめ
| 項目 | 内容 |
|---|---|
| 問題 | PostgreSQL 15以降でSSL強制化により、一部のツールが接続できない |
| 原因 |
rds.force_sslのデフォルト値が1(有効)に変更された |
| 対応 | DBパラメータグループでrds.force_ssl = 0を設定 |
| 注意点 | パラメータグループ適用後は手動で再起動が必須 |
| セキュリティ | VPC内通信でもリスクがあるため、ネットワークレベルでの対策が必要 |
学んだポイント
- PostgreSQL 15以降の仕様変更: SSL/TLS接続がデフォルトで強制される
- パラメータグループの適用タイミング: 設定変更には再起動が必要
- ツールの互換性: Windows版ツールではSSL/TLS対応が不完全な場合がある
- セキュリティとの両立: SSL無効化する場合は他のセキュリティ対策が必須
バージョンアップ時は、SSL/TLSの挙動変更に注意し、事前に使用しているツールの対応状況を確認することが重要です。
Discussion