こんにちは!
BFT名古屋支店の佐野です。
久しぶりの記事執筆になります。
今回は業務の効率化のために最近実施した内容である、
インターネットからの接続を断っているプライベートなセグメントにあるRDS(PostgreSQLデータベース)に、ローカルの端末からポートフォワーディングを利用して接続する方法を紹介します。
はじめに
環境の前提として、以下の図の通り、RDSを外部に公開していないプライベートなセグメントに置いています。
作業やメンテナンスの際は一度インターネットに繋がっているパブリックセグメントにあるWindows10の踏み台サーバー(EC2)にRDP接続で経由し、改めてポート5432を使用した接続により、PostgreSQLのRDSに接続しています。
※以下の図におけるNACLは“ネットワークACL”、SGは“セキュリティグループ”を表します。
しかし、資材やコードを投入する場合、それらをいちいち踏み台サーバーに入れて作業するのは大変ですし、セキュリティの都合上はばかられる場面もあるかと思います。 そういった際は、どうにかして以下のような経路で、直接RDSに接続したいと考えることもあるでしょう。
当然ですが、プライベートセグメントですので、そのままでは直接入ることはできません。
だからと言ってインターネットの穴を開けてパブリックセグメント化しまっては本末転倒です。
中にあるのはデータベースなので、セキュリティ的には一番気を使わなければいけないところ。疎通できる道は最低限としなければいけません。
でも利便性も惜しい、直接ローカルな端末からアクセスしたい……
それを実現する方法が、今回の記事タイトルにも記した「ポートフォワーディング」です。
ポートフォワーディングって?
ポートフォワーディングとは「一定のポートで送られてきた通信を、その通信に対応するように設定したポートからそのまま別の通信先へ送る」ことです。
ポートフォワードや、ポート転送ともいわれます。
ポートフォワーディングを駆使することで、ローカル端末からの通信を踏み台サーバーにそのままRDSに送ってもらうことが可能となり、実質的にローカル端末からRDSの直接接続、直接操作を行なうことができるようになります。
ポートフォワーディングを使用した際の具体的な経路は以下のようになり、踏み台サーバーに通信を転送してもらってローカル端末からRDSの接続を確立しています。
ただ、今回の記事で紹介するポートフォワーディングを行なう際、ローカル端末から踏み台サーバーにSSH接続を行なう必要があるため、前提として以下の設定が必要です。
- 経由するSSHサーバー(今回は踏み台サーバー)があるセグメントのネットワークACL
- 経由するSSHサーバー(今回は踏み台サーバー)に関連付けられているセキュリティグループ
- Windowsの場合、OpenSSHサーバーによるSSH接続設定
ポートフォワーディングを設定し、ローカル端末でRDSに接続する
では実際に行なった、ポートフォワーディングを設定してローカル端末からRDSに接続するための手順を紹介していきます。
今回はAWSの環境を想定していますので、まず最初に行なうべきはネットワークの許可設定です。
●ネットワークACLとセキュリティグループの設定
前提として前述した通り、今回の方法でポートフォワーディングを行なうためにはSSH接続が必要なため、ローカル端末から踏み台サーバーへのSSH接続を許可する必要があります。
今回の踏み台サーバーはWindowsであり、RDP接続のみ許可している前提となります。
ですので、SSH接続を許可するためにネットワークACLとセキュリティグループに以下の通りのルール設定を加えます。
- ネットワークACL許可設定(パブリックセグメント)
通信方向 | タイプ | プロトコル | ポート範囲 | 送信元/送信先 | 許可/拒否 |
---|---|---|---|---|---|
インバウンド | すべてのトラフィック | すべて | すべて | [ローカル端末IP] | ALLOW |
アウトバウンド | すべてのトラフィック | すべて | すべて | [ローカル端末IP] | ALLOW |
- セキュリティグループ許可設定(踏み台サーバー)
通信方向 | タイプ | プロトコル | ポート範囲 | 送信元/送信先 |
---|---|---|---|---|
インバウンド | SSH | TCP | 22 | [ローカル端末IP] |
●SSHサーバーの設定
ネットワークACLとセキュリティグループにSSH接続の許可設定を行なった後は、踏み台サーバーをSSHサーバーとして使用するための設定を行ないます。
今回はWindows10の機能として用意されている「Windows 10 OpenSSH Server」を使用し、SSH接続ができるように設定します。
Windows 10 OpenSSH Serverのインストール手順およびOpenSSH SSH Serverのサービス開始手順、SSH接続用のユーザーの作成については、以下の参考記事をご参照ください。
●ポートフォワーディングする
ネットワークACLとセキュリティグループの設定、踏み台サーバーをSSHサーバーとするための設定が完了し、SSH接続用ユーザーも作成したら、いよいよポートフォワーディングを行ないます。
Windows10であれば、SSHによるポートフォワーディングを行なうのに特別なソフトウェアは必要ありません。
SSHコマンドを以下のように実行することで、ポートフォワーディングを行なうことができます。
ssh {SSH接続用ユーザ}@{踏み台サーバのホスト} -L {ローカルで待ち受けるポート}:{転送先のホスト}:{転送先ホストのポート}
ここで言う「ローカルで待ち受けるポート」とは"図3.ポートフォワーディングを利用したRDSへの接続”で「送るポート」と表記したポートです。
ポートフォワーディングを行なうサーバー(ここでは踏み台サーバー)は、このポートで送られてきた通信を「転送先ホストのポート」に転送します。
また今回の接続先はRDSであるため、転送先のホストは接続したいRDSのエンドポイントとなります。
以下、今回の記事の元となった作業にて使用した情報を例として、表と具体的なコマンドを示します。
(ユーザー名、IPアドレス、ホスト名はある程度伏せています)
- 項目対応表
項目 | 値 |
---|---|
SSH接続用ユーザ | pf-user |
踏み台サーバのホスト | 10.60.xxx.xxx |
ローカルで待ち受けるポート | 5432 |
転送先のホスト | hogehoge-rds.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com |
転送先のホストのポート | 5432 |
- 表を元にした具体的なコマンド
ssh pf-user@10.60.xxx.xxx -L 5432:hogehoge-rds.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com:5432
以上コマンドの実行後ポートフォワーディングによる接続が正しく行われているか、netstatコマンドをローカル端末で実行して確認します。
実行結果に、ローカルで待ち受けしたポートでのLISTENINGの結果が含まれていれば、正しく接続できています。
- 実行例
PS C:\Users> netstat -na アクティブな接続 プロトコル ローカル アドレス 外部アドレス 状態 ~~~中略~~~ TCP 127.0.0.1:5432 0.0.0.0:0 LISTENING ~~~以下省略~~~
そしてこの状態で127.0.0.1の5432に向けて通信すると、ポートフォワーディングにより通信がRDSに転送され、PostgreSQLにログインすることができます。
具体的なコマンド実施例を以下に示します。
- ポートフォワーディングによってRDSに接続した例
PS C:\Users> psql -h 127.0.0.1 -p 5432 -U [postgreSQLユーザー名] -d [データベース名] psql (11.12, server 11.11) SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off) Type "help" for help. [データベース名]=>
最後に
以上、ローカルな端末からプライベートなRDSへ実質的に直接接続する方法、そしてポートフォワーディングの紹介でした。
冒頭にて述べた通り、データベースは可能な限りセキュリティを締めたプライベートセグメントに置きたいが、その場合でもローカル端末での操作を行ないたい!という時に今回紹介した手法はとても有効に働くかと思います。
こういったシチュエーションを求めている方々に、この記事が助けになれば幸いです。