開発者のノートPCがプライベートRDSエンドポイントへ接続するとタイムアウトするのに、同じ認証情報なら踏み台ホストからは通ります。何も落ちていません。そのノートPCとデータベースの間の経路には、名前解決、トラフィックを運ぶルート、データベースが実際に見る送信元を許可するセキュリティグループの規則という三つのうちの一つが欠けています。他の二つを変える前に、どれが欠けているかを見極めてください。

失敗を正しい層で読む

タイムアウトは一つのエラーではありません。解決しない名前は、パケットが機械を出る前に失敗します。経路のないアドレスはパケットを黒い穴へ送ります。フィルタされたポートは、間違ったホストとまったく同じに見える待ち時間を生みます。手順を順番に実行し、最初に失敗したところで止めてください。

dig +short db.internal.example
nc -vz db.internal.example 5432

名前がパブリックアドレスを返す場合、あるいは何も返さない場合、まだトンネルは問題ではありません。

名前が解決し、ポートテストが固まる場合は、解決したアドレスとデータベースが報告するアドレスを比べます。マネージドエンドポイントはVPCの内側ではプライベートアドレスに解決し、外側では役に立つ何にも解決しないことがあり、古い検索からコピーしたアドレスはもう応答しないホストを指します。

トンネルとルートを切り離す

クライアントVPNに接続しても、すべてのプライベート範囲が自動的にルーティングされるわけではありません。プロファイルはサービスが押し出すルートを運び、クライアントはその一部しかインストールしないことがあります。クライアントが実際に追加した範囲と、データベースのアドレスがそのどれかに入るかを見てください。

ip route get 10.20.40.15
ip addr show tun0

トンネルインターフェースを指すルートは必要ですが十分ではなく、向こう側が依然としてトラフィックを受け入れる必要があります。

分割トンネルのプロファイルが、この半端な失敗のいつもの原因です。プロファイルが想定したアプリケーションには効きますが、データベースの範囲をトンネルの外に残すため、ファイアウォールが出すのとまったく同じタイムアウトになります。

セキュリティグループを実際の送信元に合わせる

RDSのセキュリティグループが許可するのは送信元であり、人ではありません。アーキテクチャによって、送信元はVPNクライアントのプール、踏み台のプライベートアドレス、あるいはトラフィックが変換されるNATアドレスになります。規則と実際のパケットの送信元を合わせて読んでください。

aws ec2 describe-security-groups --group-ids sg-0123456789abcdef0 \
  --query 'SecurityGroups[].IpPermissions'

ノートPC一台の自宅アドレスに対する規則は、アクセス設計ではなく保守の問題です。

クライアントVPNやNATゲートウェイが経路に入ると、データベースは開発者のトンネルアドレスではなく変換器のアドレスを見ることがあります。動く踏み台の設定からコピーした規則がノートPCで失敗するのは、二つの経路がどちらも内部に見えても異なる送信元から届くからです。

広い道より狭い道を選ぶ

一人の開発者に一つのデータベースが必要なとき、セッションベースの転送は完全なネットワークトンネルより運用が安く済むことがよくあります。ローカルのクライアントは転送されたポートに接続し、遠隔の構成要素がネットワークの内側からデータベース接続を張ります。

ssh -N -L 5432:db.internal.example:5432 bastion.internal.example

その設計ではTLS検証をそのまま残してください。クライアントは期待する名前に対してサーバ証明書を検証すべきであり、ローカルの転送ポートは検証を切る理由にならず、切ると捕まえる価値のある身元の問題をちょうど隠してしまいます。

完全なトンネルと狭い転送のどちらを選ぶかは、範囲についての判断であり、セキュリティの見せ物ではありません。

繰り返せる道を残す

解決済みのアドレスではなくエンドポイント名、セキュリティグループが許可する送信元の範囲、開発者が使うデータベースのロールを記録してください。この三つの事実が、電話なしで今後の失敗の多くを説明します。クライアントプロファイルの版も、古いものが運んでいたルートを外す変更があり得るので加えてください。

そのうえで、承認された送信元の外にあるクライアントが依然として拒否されることを一度だけ試します。

設定した本人にしか動かないプライベートなデータベースは、プライベートなアクセスではなく、再発見を待つ記録されていない例外です。経路を書き残せば、次の開発者は謎ではなく方法を受け継ぎます。

関連記事