🔐

RDS PostgreSQL 15以降のSSL強制化によりツール接続ができなくなった問題と対応

に公開

背景

環境とバージョンアップの経緯

RDSでPostgreSQL 12を使用していましたが、以下の理由でバージョン16へのアップグレードを実施しました:

  • PostgreSQL 12のサポート終了
  • サポート終了後の利用料金が大幅に上昇(約6倍)

アップグレードの流れ:

  1. 検証環境をPostgreSQL 16にアップグレード
  2. 2週間の動作確認(問題なし)
  3. 本番環境を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パラメータグループの作成

  1. RDSコンソールを開く
  2. 左メニューから「パラメータグループ」を選択
  3. 「パラメータグループの作成」をクリック
  4. 以下を設定:
    • パラメータグループファミリー: postgres16
    • グループ名: 任意(例: postgres16-no-ssl)
    • 説明: rds.force_ssl disabled
  5. 作成後、パラメータグループを開き「パラメータの編集」を選択
  6. rds.force_sslを検索し、値を0に変更
  7. 変更を保存

2. DBインスタンスへの適用

  1. RDSコンソールで対象のDBインスタンスを選択
  2. 「変更」をクリック
  3. 「追加の設定」セクションで、作成したパラメータグループを選択
  4. 「続行」→「すぐに適用」を選択
  5. 変更を適用

3. DBインスタンスの再起動

  1. 対象のDBインスタンスを選択
  2. 「アクション」→「再起動」をクリック
  3. 再起動を実行

再起動完了後、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内通信でもリスクがあるため、ネットワークレベルでの対策が必要

学んだポイント

  1. PostgreSQL 15以降の仕様変更: SSL/TLS接続がデフォルトで強制される
  2. パラメータグループの適用タイミング: 設定変更には再起動が必要
  3. ツールの互換性: Windows版ツールではSSL/TLS対応が不完全な場合がある
  4. セキュリティとの両立: SSL無効化する場合は他のセキュリティ対策が必須

バージョンアップ時は、SSL/TLSの挙動変更に注意し、事前に使用しているツールの対応状況を確認することが重要です。

GitHubで編集を提案

Discussion