はじめに
RDS をプライベートサブネットに配置すると、外部からの不正アクセスを防げる一方、開発者 PC から直接接続できなくなります。
本記事では AWS Client VPN を使って、セキュアにプライベートサブネットの RDS(PostgreSQL)へ接続する手順を解説します。
構成イメージ
開発者PC
│
│ UDP 443(TLS / 相互証明書認証)
▼
Client VPN エンドポイント(パブリックサブネット)
│
│ 認証ルール + ルートテーブル
▼
プライベートサブネット
│
│ SG: 5432 許可(クライアントCIDR から)
▼
Amazon RDS(PostgreSQL)
前提条件
| 項目 | 内容 |
|---|---|
| VPC CIDR | 10.0.0.0/16 |
| パブリックサブネット |
10.0.0.0/24(VPN 関連付け用) |
| プライベートサブネット |
10.0.1.0/24(RDS 配置) |
| クライアント CIDR |
10.100.0.0/22(VPN 払い出し用) |
| DB エンジン | PostgreSQL |
| ポート | 5432 |
Step 1: 証明書の作成と ACM へのインポート
Easy-RSA を使ってサーバー・クライアント証明書を生成します。
git clone https://github.com/OpenVPN/easy-rsa.git
cd easy-rsa/easyrsa3
./easyrsa init-pki
./easyrsa build-ca nopass
./easyrsa build-server-full server nopass
./easyrsa build-client-full client1 nopass
生成した証明書を ACM にインポートします。
# サーバー証明書
aws acm import-certificate \
--certificate fileb://pki/issued/server.crt \
--private-key fileb://pki/private/server.key \
--certificate-chain fileb://pki/ca.crt \
--region ap-northeast-1
# クライアント証明書
aws acm import-certificate \
--certificate fileb://pki/issued/client1.crt \
--private-key fileb://pki/private/client1.key \
--certificate-chain fileb://pki/ca.crt \
--region ap-northeast-1
ポイント: ACM のリージョンは Client VPN エンドポイントを作成するリージョンと合わせてください。
Step 2: Client VPN エンドポイントの作成
マネジメントコンソール → VPC → Client VPN エンドポイント → 作成
| 設定項目 | 値 |
|---|---|
| クライアント IPv4 CIDR | 10.100.0.0/22 |
| サーバー証明書 ARN | ACM でインポートしたサーバー証明書 |
| 認証方式 | 相互認証(クライアント証明書) |
| クライアント証明書 ARN | ACM でインポートしたクライアント証明書 |
| DNS サーバー |
10.0.0.2(VPC の DNS) |
| プロトコル | UDP |
| Split Tunnel | 有効 |
Split Tunnel を有効にする理由: VPC 宛の通信のみ VPN 経由にすることで、インターネット通信への影響をなくしパフォーマンスを向上させます。
Step 3: ターゲットネットワークの関連付け
Client VPN エンドポイント → ターゲットネットワークの関連付け
関連付けるサブネット: パブリックサブネット(10.0.0.0/24)
Step 4: 認証ルールとルートの追加
認証ルール
Client VPN エンドポイント → 認証ルール → 受信ルールの追加
| 項目 | 値 |
|---|---|
| アクセス先 CIDR |
10.0.1.0/24(RDS のサブネット) |
| アクセスを許可 | すべてのユーザー |
ルートの追加
Client VPN エンドポイント → ルート → ルートの作成
| 項目 | 値 |
|---|---|
| ルートの送信先 | 10.0.1.0/24 |
| ターゲットサブネット | 関連付けたサブネット |
Step 5: セキュリティグループの設定
Client VPN エンドポイントの SG
Client VPN エンドポイントのインバウンドルールは不要です。
AWSマネージドサービスのため、UDP 443 のインバウンドルールをSGに設定する必要はありません。アウトバウンドのみ設定します。
| 方向 | プロトコル | ポート | 対象 |
|---|---|---|---|
| アウトバウンド | すべて | すべて | 0.0.0.0/0 |
RDS のセキュリティグループ(重要)
RDS の SG には、クライアント CIDR からのインバウンドを許可する必要があります。
| 方向 | プロトコル | ポート | ソース |
|---|---|---|---|
| インバウンド | TCP | 5432 |
10.100.0.0/22(クライアント CIDR) |
ここが最重要ポイントです。 RDS の SG でクライアント CIDR(VPN 払い出し IP 帯)からのポート 5432 を許可しないと接続できません。
Step 6: クライアント設定ファイルの準備
.ovpn ファイルのダウンロード
Client VPN エンドポイント → クライアント設定のダウンロード
証明書情報を追記
ダウンロードした .ovpn ファイルの末尾に、クライアント証明書と秘密鍵を追記します。
# 証明書の内容を確認
cat pki/issued/client1.crt
cat pki/private/client1.key
# .ovpn ファイルの末尾に追加
<cert>
-----BEGIN CERTIFICATE-----
(client1.crt の内容をここに貼り付け)
-----END CERTIFICATE-----
</cert>
<key>
-----BEGIN PRIVATE KEY-----
(client1.key の内容をここに貼り付け)
-----END PRIVATE KEY-----
</key>
Step 7: VPN 接続と RDS への接続確認
VPN 接続
# CLI の場合
sudo openvpn --config downloaded-client-config.ovpn
# または AWS VPN Client(GUI)を使用
疎通確認
# ポート疎通確認
nc -zv mydb.xxxxxx.ap-northeast-1.rds.amazonaws.com 5432
# Connection to mydb... 5432 port [tcp/postgresql] succeeded!
PostgreSQL に接続
psql \
-h mydb.xxxxxx.ap-northeast-1.rds.amazonaws.com \
-U postgres \
-d mydb \
-p 5432
接続成功すれば以下のプロンプトが表示されます。
psql (15.x)
SSL connection (protocol: TLSv1.3, ...)
Type "help" for help.
mydb=#
VPC の DNS 設定確認
RDS のエンドポイント名前解決のため、VPC の DNS 設定を確認します。
VPC → DNS 設定
| 項目 | 設定値 |
|---|---|
| DNS 解決 | 有効 |
| DNS ホスト名 | 有効 |
Client VPN エンドポイントの DNS サーバーに VPC DNS(10.0.0.2 など)を設定することで、RDS のエンドポイント名を解決できます。
トラブルシューティング
| 症状 | 確認ポイント |
|---|---|
| タイムアウトする | RDS SG のインバウンド(5432)にクライアント CIDR が許可されているか |
| 名前解決できない | VPN エンドポイントの DNS に VPC DNS(サブネット+2)を設定しているか |
| VPN 自体が繋がらない | ACM 証明書のリージョンが VPN エンドポイントと一致しているか |
| VPN 接続後も RDS に届かない | Split Tunnel 有効時はルートに 10.0.1.0/24 が追加されているか |
| 認証ルールエラー | クライアント CIDR 10.100.0.0/22 がルート・認証ルールに含まれているか |
まとめ
| コンポーネント | 設定内容 | ポイント |
|---|---|---|
| Client VPN エンドポイント SG | アウトバウンドのみ | インバウンドは不要 |
| RDS SG | インバウンド 5432 許可 | ソースはクライアント CIDR |
| 認証ルール | プライベートサブネット CIDR を許可 | — |
| ルートテーブル | プライベートサブネット CIDR を追加 | — |
| Split Tunnel | 有効 | VPC 宛のみ VPN 経由 |
よくある誤解として「Client VPN エンドポイントの SG にインバウンド UDP 443 を開ける必要がある」と思われがちですが、不要です。接続先リソース(RDS)の SG でクライアント CIDR を許可することが重要です。