外部から踏み台サーバ経由の多段SSH接続をWindowsクライアントから行う
はじめに
VPC環境を構築する際、サブネットを多段に分割してセキュリティレベルを分ける構成にすることが多いかと思います。例えば以下の例のように、
- インターネットへ、又はインターネットから直接接続可能なサブネット(Public)
- インターネットへ直接接続出来ず、Publicサブネットに配置されたサーバを経由してのみインターネット接続が可能なサブネット(Protect)
のような形です。この場合Protectサブネットに配置されたEC2からインターネットに接続する場合はPublicサブネットにあるEC2をNATとして経由し、逆にインターネット側からメンテナンスなどで接続される場合も同様にPublicサブネットにあるEC2を踏み台として経由して通信を行います。
さて、この踏み台サーバを経由したメンテナンスの場合、問題になるのがSSH接続に使用する秘密鍵です。秘密鍵はその名の通り秘密にするものなので、何らかの形で漏洩してしまった場合大きなセキュリティリスクとなるため、可能な限り複製はしたくありません。このため踏み台サーバに秘密鍵のコピーを置くことなく、ProtectサブネットのEC2に対しSSH接続が行えるのが理想です。
そこで、その踏み台サーバ経由での公開鍵暗号方式による多段SSH接続を、Windowsクライアントから行う方法をまとめてみました。
Windowsクライアントからの接続方法
前提
まず、以下を前提とします。
- 全てのEC2にSSHログイン可能なユーザが登録されていること。
- リモート接続したいユーザの公開鍵が各EC2に登録したユーザの~/.ssh/authenticated_keysに登録されていること。
- リモート接続したいユーザの秘密鍵がローカルPC(Windows)にのみ配置されていること。
- セキュリティグループでインターネットから踏み台サーバにSSH接続可能な設定となっていること。
- セキュリティグループで踏み台サーバから各EC2サーバにSSH接続可能な設定となっていること。
Tera Term
実は、TeraTermでSSHポートフォワードが出来るの、初めて知りました。昔はPortForwarderをよく使っていました...
Tera Termを起動し、メニューバーから[setup]-[SSH Forwarding]をクリックします。
[TTSSH: Forwarding Setup]画面が開くので、[Add]ボタンをクリックします。
[SSH Port Forwarding]画面が開くので、
- Forward local port ... ローカルPC側で設定するポート番号。well-knownで無ければ何でも良いので、適当に設定します。
- to remote machine ... 接続したいProtectサブネットのEC2のプライベートIPアドレスを設定します。
- port ... 接続したいProtectサブネットのEC2のSSH接続ポート。特に変更していなければ22になります。
を設定し、[OK]ボタンをクリックします。
設定が登録されていることを確認し、[OK]ボタンをクリックします。
さて、実際に接続してみます。まず踏み台サーバに普通にSSH接続する必要がありますので、メニューバーから[File]-[New connection]をクリックします。
[New connection]画面が開きますので、[Host:]欄に踏み台サーバのEIPを入力してSSH接続します。
SSH認証画面が表示されますので、[User name]欄に踏み台サーバに登録されているユーザ名を登録します。秘密鍵の作り方によってはパスフレーズが登録されていると思いますので、必要に応じて[Passphrase]欄を入力します。また[Use RSA/DSA/ECDSA key to log in]をチェックし、[Private key file]で秘密鍵を指定します。入力後、[OK]ボタンを押すことで、踏み台サーバにSSH接続されます。
踏み台サーバのSSH接続画面を開いたまま、もう1つTera Termを起動します。[Host:]欄に"127.0.0.1"を、[TCP port#:]欄には[SSH Port Forwarding]の[Forward local port]で設定したポート番号を入力し、[OK]ボタンを押します。
これでProtectサブネットに配置されたEC2にSSH接続できます。
WinSCP
WinSCPでは、Putty形式の鍵ファイルしかサポートされていませんので、OpenSSHのコマンドなどで作成した秘密鍵ファイルの場合、Putty形式への変換が必要になります。
エクスプローラで[WinSCPのインストールフォルダ¥PuTTY¥puttygen.exe]をダブルクリックして実行します。
[PuTTY Key Generator]画面が表示されますので、[Load]ボタンをクリックし、秘密鍵ファイルを指定します。
秘密鍵にパスフレーズが設定されている場合には以下画面が表示されますので、パスフレーズを入力して[OK]ボタンをクリックします。
以下のNotice画面が表示されるので[OK]ボタンをクリックします。
秘密鍵が正常にインポートされると、以下のように秘密鍵ファイルの情報が表示されます。[Save private key]ボタンをクリックします。
PuTTY形式に変換した秘密鍵を保存するフォルダを選択し、ファイル名を入力して[保存]ボタンをクリックします。
さて、それではここからが本題です。WinSCP画面を開き、新しいサイトで[セッション]欄を設定します。
- 転送プロトコル ... SCP又はSFTPを選択します。
- ホスト名 ... ProtectサブネットのEC2のプライベートIPアドレスを設定します。
- ポート番号... ProtectサブネットのEC2のSSH接続ポート番号を設定します。
- ユーザ名 ... ProtectサブネットのEC2に設定されたユーザ名を設定します。
- パスワード ... パスワード認証を使っていない場合は不要です。
設定後、[設定]-[設定]をクリックします。
[高度なサイトの設定]画面が開きます。まず[SSH]-[認証]を開き、[認証条件]で秘密鍵ファイルを指定します。
次に[接続]-[トンネル]を開き、[SSHトンネルを経由して接続]をチェックします。[ホスト名]欄に踏み台サーバのEIP、[ユーザ名]に踏み台サーバにSSHログインするためのユーザ名を設定します。また[秘密鍵]欄で秘密鍵ファイルを指定します。設定後[OK]ボタンをクリックします。
[WinSCP ログイン]画面に戻るので、[ログイン]ボタンをクリックします。
接続が進行します。この際秘密鍵にパスフレーズを設定している場合にはパスフレーズの入力が求められますので、入力し[OK]ボタンを押します。踏み台サーバとProtectサブネットのEC2と2回ログインする形になりますので、パスフレーズも2回求められます。
これでWinSCPにてProtectサブネットに配置されたEC2にSSH接続できます。
OpenSSHクライアント
まぁぶっちゃけ、WindowsクライアントにVirtualBoxなどでVMを立ち上げちゃってOpenSSHでコマンドラインで接続する方が楽かと思います。~/.ssh/configに以下のように記述する感じですね。
Host bastion HostName 1.2.3.4 User smokeymonkey IdentityFile /home/smokeymonkey/.ssh/id_rsa Host Protect-EC2 Hostname 192.168.0.1 User smokeymonkey IdentityFile /home/smokeymonkey/.ssh/id_rsa ProxyCommand ssh -W %h:%p bastion
あとはssh Protect-EC2とすれば接続出来ます。
まとめ
Windowsクライアントには他にも様々なソフトウェアがありますが、最近のものは大体SSHポートフォワードに対応しているようです。使い慣れたOSとソフトウェアで作業をするのが一番効率的だと思いますので、Windowsユーザの皆さんのご参考になれば幸いです。