踏み台サーバでトンネリングしてSQLserverに接続する。
この仕組みを構築しましたので備忘として残します。
構成としては以下のようになります。
要件としては、特定のSSHユーザに対して以下の設定をおこなうようにしました。
① ポートフォワーディングのみを許可し、その他コマンド実行を許容しない(ポートフォワーディング専用とする)
② 特定のIPアドレスからのみ通信を許可する
③ 特定の場所へのみアクセスを許可する
④ 鍵認証の強制(パスワード認証を許可しない)
このための設定を以下に記載します。
1. OpenSSHのインストールと起動確認
Amazon Linuxにログインし、OpenSSHをインストールします(Amazon Linuxでは通常標準でインストールされていますが、念のため確認・起動します)。
# インストール(既に入っている場合は更新のみ)
sudo dnf install -y openssh-server
# 起動と自動起動設定
sudo systemctl enable --now sshd
2. トンネル専用ユーザーの作成
シェルログインやsudo権限を持たない専用ユーザーを作成します。
# ログインシェルを /sbin/nologin にしてユーザー作成
sudo useradd -m -s /sbin/nologin tunnel-user
# .sshディレクトリの作成と権限設定
sudo mkdir -p /home/tunnel-user/.ssh
sudo chmod 700 /home/tunnel-user/.ssh
sudo touch /home/tunnel-user/.ssh/authorized_keys
sudo chmod 600 /home/tunnel-user/.ssh/authorized_keys
sudo chown -R tunnel-user:tunnel-user /home/tunnel-user/.ssh
3. 接続元PC(クライアント)で鍵ペアを作成する
PCで以下のコマンドを実行します(今回はWindowsで実行)。
# 暗号化強度の高い ed25519 形式で作成
ssh-keygen -t ed25519 -f ./id_ed25519_tunnel
生成されるファイル:
-
id_ed25519_tunnel(秘密鍵) -
id_ed25519_tunnel.pub(公開鍵)
4. 公開鍵の内容を確認する
作成された公開鍵(.pubの方)の中身を表示して、コピーします。
cat id_ed25519_tunnel.pub
ssh-ed25519 AAAA... という文字列が表示されるので、これをコピーしておきます。
5. サーバー側(Amazon Linux)へ登録する
Amazon Linuxにログインし、先ほど作成した tunnel-user の設定ファイルに書き込みます。
# rootまたはsudo権限のあるユーザーで実行
sudo vi /home/tunnel-user/.ssh/authorized_keys
ファイルの中に、制限オプション + コピーした公開鍵 を1行で貼り付けます。
restrict,port-forwarding,permitopen="xx.xx.xx.xx:1433" ssh-ed25519 AAAAC3NzaC1...(ここにコピーした公開鍵を貼り付け)...
貼り付けたら保存(:wq)します。
※ xx.xx.xx.xx は接続先のホスト名、IPアドレスに書き換えて入力してください。
各オプションの説明:
-
restrict:
no-pty, no-agent-forwarding, no-X11-forwarding, no-user-rc などをまとめて無効化します。 -
port-forwarding:
restrict で一旦すべて禁止された機能のうち、ポートフォワーディングだけを明示的に許可します。 -
permitopen="ホスト:ポート":
接続先をSQL ServerのIPまたはホスト名とポートだけに制限します。
6. OpenSSH設定(sshd_config)の編集
/etc/ssh/sshd_config の 末尾に設定を追加します。特定のユーザー・IPからの接続に対して、鍵認証を強制します。
また、指定外のIPからアクセスした場合、サーバー側は「このユーザーに許可された認証方法がない」と判断し、接続を拒否します。
sudo vi /etc/ssh/sshd_config
ファイルの最下行に以下を追記してください。
# ファイル末尾に追加
Match User tunnel-user Address xx.xx.xx.xx
PasswordAuthentication no
PubkeyAuthentication yes
AuthenticationMethods publickey
※ xx.xx.xx.xx は接続元(オフィスや自宅)のIPアドレスに書き換えて入力してください。
※ Match ブロックはファイルの最後に書く必要があります(それ以降の設定がすべてMatch対象になるため)。
設定を反映させます。
sudo systemctl restart sshd
クライアントからの接続方法
上記設定後、以下のコマンドでSSHトンネリングができるようになります。
# -N: コマンドを実行しない(トンネル専用)
# -L: ローカルの1433番をRDSの1433番に転送
ssh -i ./id_ed25519_tunnel -N -L 1433:xx.xx.xx.xx:1433 tunnel-user@踏み台のIP
※ xx.xx.xx.xx は接続先のホスト名、IPアドレスに書き換えて入力してください。
何もエラーが出ずにコマンドが待機状態(プロンプトが戻ってこない状態)になれば成功です。
この状態でSSMSからSQLserverへ接続してみます。
接続する際はサーバー名に127.0.0.1を指定し、サーバー証明書を信頼するにチェックを入れてください。
接続できました。
この設定のほかに、SQLserverで権限を絞ったユーザを作成することや、セキュリティグループにてNW側でアクセスを制御する等も必須になるとは思いますが、今回は踏み台サーバ上の設定のみ記録しました。


