Tutorial Advent Calendar 2020 17日目
エンジニアの山下です。
先日社内で「SSHトンネル」というワードを耳にして、恥ずかしながら初耳でしたので試してみることにしました。
SSHトンネルとは
SSHトンネルはSSHポートフォワーディングとも呼ばれており、SSHによって確立した通信経路を利用して、クライアントが直接アクセスできないサーバーのポートへ転送してくれる仕組みのことです。
これによって、SSHアクセスが可能なWebサーバーを踏み台にして、直接接続できないイントラネット内へアクセスすることが可能になります。
なんでSSH?
SSHとは「Secure Shell」の略で、暗号や認証によってネットワークに接続された機器を安全に遠隔操作・管理するための手法です。
sshコマンドを使うことで、リモートマシンにSSHでログインし、リモートマシン上でコマンドを実行することができます。
このsshコマンドには「-L」というポートを転送するオプションが存在します。
以下のようなコマンドでローカルのポート番号へのアクセスをリモートのポート番号へ転送することができます。
ssh -L [ローカルのポート番号]:[リモートホストのアドレス]:[リモートホストのポート番号] -i [踏み台となるSSH鍵] [接続ユーザー名]@[パブリックIP]
このSSHのポート転送機能を用いて、以下のように直接アクセス不可なサーバーへの接続が実現します。
- 踏み台となるサーバーへSSH接続
- 踏み台サーバーへのアクセスを目的のサーバーへポート転送する(ポートフォワーディング)
- ポートフォワーディングした状態で目的のサーバーへログインする
何となく理論は理解したので、実際に試してみます。
試してみる
踏み台サーバー(EC2)を経由してPostgreSQLサーバー(RDS)に接続します。
準備
AWSのEC2でインスタンスを立ち上げます。
セキュリティーグループの設定を以下のようにします。
※ 攻撃を防ぐため、実際のサービスで利用する時には22番以外のポートへの変更が推奨されます。
AWSのRDSでデータベースを作成します。
セキュリティーグループの設定を以下のようにします。
カスタムのソースには、EC2のセキュリティーグループを指定します。
実験
踏み台サーバー経由でSQLサーバーへ接続します。
以下のコマンドをターミナルで実行します。
ssh -L 8800:[RDSのエンドポイント]:5432 -i [pemファイルへのパス] ec2-user@[EC2のパブリックIP] -p 22
これで、「localhost:8800」がEC2の踏み台サーバーを経由してRDSのエンドポイントへつながりました。
ターミナルはそのままの状態で、SQLサーバーにログインします。
今回はPosticoを使用します。
Posticoを立ち上げ、localhost:8800に接続します。UserとPasswordはRDSでデータベースを作成した時のものを使用します。
接続に成功しました。
終わり
今回、初耳だったSSHトンネルについて調べて試してみましたが、読んでわかることと実際にやってみてわかることは大きく違うことを改めて実感しました。
まだまだ分からないことが山ほどありますが、できる限り手を動かすことで身につけていきたいなと思います。
ありがとうございました。