DB接続について調べていると、
- SSHトンネル
- 踏み台サーバー
- パスワード認証
- 秘密鍵認証
など様々な用語が出てきます。
最初は「SSHトンネルと踏み台サーバーって何が違うの?」、「秘密鍵はDBの認証なの?」と混乱したので、ChatGPT に整理してもらいました。
最初に結論
DB接続は大きく分けて
- 通信経路(どうやってDBまで到達するか)
- DB認証(DBへログインする方法)
の2つを考える必要があります。
PC
│
│ ①通信経路
│
├──直接接続
├──SSHトンネル
├──VPN
└──踏み台サーバー経由
│
│ ②DB認証
│
├──ユーザー名 + パスワード
├──SSL証明書
├──IAM認証
├──Kerberos
└──OS認証
│
▼
Database
ポイントは
- SSHトンネル = 通信経路
- 秘密鍵 = SSH認証
- DBパスワード = DB認証
ということです。
通信経路
① 直接接続
一番シンプルな構成です。
PC
│
│ TCP
│
▼
Database
接続情報は
- Host
- Port
- Database
- User
- Password
だけです。
開発環境ではよく見かけます。
② SSHトンネル
DBをインターネットへ公開せず、
SSHだけ公開します。
PC
│
│ SSH
▼
踏み台サーバー
│
▼
Database
実際には
localhost:5432
へ接続すると
localhost:5432
↓
SSHトンネル
↓
踏み台サーバー
↓
Database
へ転送されます。
DBeaverやDataGripなどのDBクライアントでは
「Use SSH Tunnel」
という設定があるのはこのためです。
③ VPN
会社のネットワークへVPN接続してからDBへ接続する方法です。
PC
│
VPN
│
▼
社内ネットワーク
│
▼
Database
VPN接続後は
192.168.x.x
などの社内IPが割り当てられ、
そのままDBへ接続できます。
踏み台サーバー(Bastion)とは?
ここが一番混乱しました。
実は
**踏み台サーバーは通信方式ではなく、「中継用のサーバー」**です。
PC
│
SSH
│
▼
踏み台サーバー
│
▼
Database
役割としては
- 外部からSSHできる
- DBが存在するネットワークへアクセスできる
という中継地点になります。
SSHトンネルと踏み台サーバーの違い
最初は
- SSHトンネル
- 踏み台サーバー
は別物だと思っていました。
実際には
SSHトンネルは踏み台サーバーを利用する通信方法の一つです。
踏み台サーバー
│
┌───────────┴───────────┐
│ │
SSHトンネルを張る SSHログインだけする
(DBeaverなど) (踏み台でpsql実行)
例えば
パターン① SSHトンネル
PC
│
SSHトンネル
│
▼
踏み台
│
▼
Database
PCから直接DBへ接続しているように見えますが、
実際にはSSHが通信を転送しています。
パターン② 踏み台へSSHログイン
PC
│
SSH
▼
踏み台
│
└── psql
踏み台サーバーへログインし、
psql
mysql
などを実行してDBへ接続します。
こちらはSSHトンネルではありません。
SSH認証
SSH自体にも認証があります。
パスワード認証
ssh user@server
Password:
簡単ですが、
総当たり攻撃に弱いため本番環境ではあまり使われません。
公開鍵認証(秘密鍵)
現在はこちらが主流です。
PC
id_rsa
(秘密鍵)
↓
Server
authorized_keys
(公開鍵)
サーバーは公開鍵を保持し、
PCは秘密鍵を保持します。
一致すればSSH接続できます。
メリット
- パスワード不要
- 非常に安全
- 本番環境で一般的
DB認証
SSHとは別に、
DB自身にもログインする必要があります。
代表的なのは
ユーザー名 + パスワード
User
Password
最も一般的です。
SSL証明書認証
client.crt
client.key
ca.crt
などの証明書を使います。
金融系などでよく使われます。
IAM認証
AWSのRDSなどで利用できます。
一時的な認証トークンを発行して接続するため、
DBパスワードを管理する必要がありません。
Kerberos認証
WindowsのActive Directoryと連携し、
WindowsへログインしていればDBへもログインできます。
OS認証
Linuxユーザーと連携して認証します。
例えば
sudo -u postgres psql
などです。
一番混乱しやすいポイント
例えばDBeaverで接続する場合
PC
│
SSH
│
▼
踏み台
│
▼
Database
認証は実は2回あります。
① SSHログイン
- パスワード
- または秘密鍵
↓
② DBログイン
- DBユーザー
- DBパスワード
つまり
SSH秘密鍵とDBパスワードは全く別物です。
実務で一番よく見る構成
個人的に一番イメージしやすかったのがこれです。
PC
│
│ SSH(秘密鍵認証)
▼
踏み台サーバー
│
│ SSHトンネル
▼
PostgreSQL
│
│ DBユーザー + パスワード
▼
ログイン
つまり
- SSH秘密鍵でサーバーへ入る
- SSHトンネルで通信する
- DBユーザー・パスワードでDBへログインする
という3段階になっています。
まとめ
| 項目 | 役割 |
|---|---|
| SSHトンネル | DBまでの通信経路 |
| 踏み台サーバー | 通信を中継するサーバー |
| パスワード認証 | SSHへログインする方法の一つ |
| 公開鍵認証(秘密鍵) | SSHへログインする方法の一つ |
| DBユーザー・パスワード | DBへログインする認証 |
| VPN | 社内ネットワークへ接続する通信経路 |
最初は「SSHトンネル」と「踏み台サーバー」を別物だと思っていましたが、
- 踏み台サーバー = 中継用のサーバー
- SSHトンネル = そのサーバーを利用して通信する方法
という関係を理解すると、全体像がかなりスッキリしました。