IAM認証で RDS Proxy 接続を利用する際は証明書にお気をつけて

概要

IAM認証で RDS Proxy へ接続できます。その場合は以下のようなイメージになります。

クライアント -(1)-> Proxy -(2)-> DBクラスター/インスタンス

(1)はIAM認証で、(2)はSecrets Managerに保管されたID/Passによる接続です。
上記方法で接続しようとしたところ一部つまづいた部分があったので簡単な手順と一緒に共有します。

手順

Aurora Cluster 作成

今回は Aurora PostgreSQL 10.12 で試してみました。

Proxy -> Cluster 間はパスワード認証の為 以下で設定しました。

ここでIAM認証を選択してもProxy接続は可能でしたが、パスワード認証のみが推奨設定のようです。

Connecting to a Proxy Using IAM Authentication

~ make sure that the underlying RDS DB instance or Aurora DB cluster doesn’t have IAM enabled.

適宜セキュリティグループ等の設定を行い、DBクラスターを作成します。

Secrets Manager シークレット 作成

DBクラスターを作成する際に指定したユーザ名・パスワードを入力し、作成したDBクラスターを選択してシークレットを作成します。

Proxy 作成

IAM認証を利用する場合はTLS必須です。

作成したDBクラスターを選択します。
なお、DBクラスター/インスタンス作成中にProxyを作成すると、ターゲットグループの設定をやり直さなければいけない場合がありました。

作成したシークレットを選択し、IAM認証を有効化してProxyを作成します。

実際に接続してみる

EC2インスタンスからProxyへ接続してみます。
aws rds generate-db-auth-token (AWS CLI)を実行する為 適宜IAMロールを割り当て下さい。
今回は Amazon Linux 2 を使用しました。

DBサーバーに合わせて PostgreSQL 10系のクライアントをインストールします。

# amazon-linux-extras install postgresql10

RDS Proxy のエンドポイントを利用し、認証トークンを作成します。

# export RDSHOST="postgresql-proxy.proxy-xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com"
# export PGPASSWORD="$(aws rds generate-db-auth-token --hostname $RDSHOST --port 5432 --region ap-northeast-1 --username postgres)"

Proxy へのIAM認証接続に利用する証明書をダウンロードしておきます。

# wget https://www.amazontrust.com/repository/AmazonRootCA1.pem

dbname・user を指定して以下を実行すると、Proxy + IAM認証を利用してDBクラスターへ接続できます。

# psql "host=$RDSHOST port=5432 sslmode=require sslrootcert=AmazonRootCA1.pem dbname=postgres user=postgres"

悩んだ点

Proxyへ接続する為の証明書について、最初はこちらに記載されているような rds-ca-2019-root.pem や rds-combined-ca-bundle.pem を使っていましたが、

psql: SSL error: certificate verify failed

というエラーが発生し接続できませんでした。証明書が間違っていることはこのエラーから明白なのですが、かなり長いことハマってしまいました。
みなさんはお気をつけ下さい!

RDS Proxy Security

For a .pem file that you can use, download the Amazon Root CA 1 trust store from Amazon Trust Services.