vb.netでAWSのRDS(oracle)にEC2を使って、ポートフォワードでSSH接続した。

お仕事でAWSのRDSを使うのですが、VPNでも無いのにパブリックアクセシビリティをオンにしたまま、ノンセキュリティで接続するのはどうなのか?と自問自答の日々が続いてしまうので、せめてSSH接続ぐらいはしないとと思い、頑張ってみました。
色々とポートフォワードでSSH接続するブログ等がググると出てくるんだけど、そもそもvb.netのwinformsでRDSにSSH接続するなんて、古代の開発手法は現代では珍しいのでなかなか無い。ほぼC#
なので、忘備録としてブログにしました。
セキュリティ的にどうなの?とかやばいよ!みたいなところがあったら教えて下さい。
やはりWEBアプリを本気で勉強しないとヤバいよね。。。

で、以下はメモです。

  • 接続ルートはwinforms→(SSH接続)→EC2(踏み台)→同じVPC内のRDS
  • 同じVPC内にEC2を作る。SSH:22のみを通すようにセキュリティグループを設定する。
  • キーペアを作成し、PEMをダウンロードする。
  • winformsでvb.netを使っているのでvisualstudioからnuget経由にてoracle接続のDataAccessとSSH接続のssh.netをインストールします。(インストール方法はググってください。)
  • ダウンロードしたPEMを使用して、ポートフォワーディングでのSSH接続します。
  • で、あとは普通にoracle接続します。(これもググってね!)ただし、接続先はSSH接続しているEC2のローカルです。気を付ける。

vb.netとしては

  1. ssh.netでconnectを作成。
  2. そのconnectを使用して、.AddForwardedPort(sshローカルホスト,sshローカルポート,RDSホスト,RDSポート)でポートフォワード接続を作成。
  3. 作成したポートフォワード接続で.Start()で開始して、
  4. DB接続を行う。※この時に接続する先はSSH接続しているEC2のローカルです。接続アドレス、ポートは変更する。
  5. 終了にポートフォワード接続を.Stop()する。
  6. 最後にssh.netで作ったconnectをクローズして終了。

注意点しては、接続がアクティブ(やり取り)でないとタイムアウトが発生して、自動で接続が切れる。なのでDBとのやり取りで通信する時に接続するようにする。タイムアウトで接続が切れるのは、動作としては正常なので、タイムアウトしないように設定するのではなく、接続するときにのみにSSHを使用するようにしたほうがいい。気を付けないといけないは繰り返しでDB接続する場合は繰り返し前と後に接続開始、終了を入れるようプログラムを組まないとアプリが遅くなります。
WEBアプリでHTTPS接続するように今後はしたほうがいいはず。。。早くwinformsから抜け出さないと!

ソースを書こうと思ったけど、そのまま書くと色々バレそうなので、わかりにくいけど箇条書きにしてみました。ほぼほぼ今後の役には立たないけど。