0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AWS Client VPN 経由でプライベートサブネットの RDS(PostgreSQL)に接続する

0
Posted at

はじめに

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 エンドポイントの作成

マネジメントコンソール → VPCClient 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 を許可することが重要です。


参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?