Windowsクライアントを使って、クラウド上のLinuxサーバでGUIアプリを実行したい（4）

# 今回は多段ssh

前回は踏み台サーバ利用編の1回目として「連続ログイン方式」を書いた。今回2回目として「多段ssh方式」について説明する。なお前回から続いた内容なので、4から始まる連続した段落番号をつけている。

* [Windowsクライアントを使って…（1）](https://qiita.com/yamada-hakase/items/952406904beffb9f5e85)→全体像を説明 
* [Windowsクライアントを使って…（2）](https://qiita.com/yamada-hakase/items/80cef4ed58fefbba266b)→設定＆踏み台なし接続
* [Windowsクライアントを使って…（3）](https://qiita.com/yamada-hakase/items/e1946b8a598f4cc0bcfa)→踏み台あり接続Part1

# 4. 多段ssh方式で接続する

この方式の特徴は、Windowsクライアントから最終的な接続先サーバまで1回の操作で接続できることだ。そして最大のメリットは踏み台サーバに秘密鍵を置く必要がないことである。とくにパブリック・クラウドではありがたい。

### 4-1. たくさんの実現方法がある多段ssh

Windowsの場合、たとえ同じsshクライアントを使っても、多段sshにはたくさんの実現方式がある。LinuxにおけるOpenSSHとは異なり、決定的な多段sshの方法がないのが悩みどころだ。

そもそもsshクライアントがPuTTY、Tera Term、RLogin、Poderosa、Windows 10のOpenSSHとバラエティー豊かなことが、さらに複雑さを増しているのだが。

あらためて調べてみるとパスワード認証では多くの方法があるが、クラウドで一般的なssh公開鍵認証では選択肢が限られる。

**<font color="blue">そこで今回はPuTTYに含まれるPageantを使用した方法を説明する。</font>**

パスワード認証はたくさん情報があるので、そちらを見て欲しい。

### 4-2. Pageantとは

Pageantはssh認証のエージェントで、管理下の秘密鍵はメモリ上に保持される（Linuxのssh-agent相当）。

よく使われるケースとしては、秘密鍵に付けたパスフレーズの入力省略である。パスフレーズで保護された秘密鍵は、使うたびにパスフレーズの入力を要求される。しかしPageantを利用すると、1回パスフレーズを入力すれば、それ以降Pageantが起動している間は入力しなくてすむ。

今回はPageantが秘密鍵をメモリにロードする機能と、PuTTYの認証パラメータを転送する機能を併用して、多段sshを実現している。「連続ログイン方式」と「多段ssh方式」の違いを表したのが次の図である。

![ssh-xserver05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/ea6b2332-b52a-f62c-c304-edada9dbf3ea.png)

### 4-3. 事前準備する

事前準備としてPageantに秘密鍵を設定する。なお前回説明したサーバ側のライブラリインストールなど[「1-3. 前提条件」](https://qiita.com/yamada-hakase/items/e1946b8a598f4cc0bcfa)の作業は終わっているものとする。

#### 4-3-1. Pageantに秘密鍵を設定する方法

Pageantに秘密鍵を設定するには、いくつかの方法がある。以下のいずれの方法でもよいが、今回は2の方法を説明する。

1. Pageantのショートカットをデスクトップに作成し、そこに秘密鍵をドロップする
1. Pageantのショートカットをデスクトップに作成し、リンク先を「`pageant.exe 秘密鍵ファイル名`」に変更する
1. Pageantを起動して[Add key]で秘密鍵を追加する

#### 4-3-2. Pageantに秘密鍵を設定する

1. Pageantのショートカットをデスクトップに作成する。`C:\Program Files\PuTTY\pageant.exe`などからデスクトップにショートカットを作成する。
1. Pageantのショートカットを右クリックし、リストからプロパティを選択する。
![multistage-ssh10.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/e300a343-b4cd-f14e-1cf1-ce9d38fb39f2.png)

1. リンク先のテキストボックスに`pageant.exe`の後ろに1スペース開けて、秘密鍵のフルパスを記入する。<font color="red">このとき必ず拡張子がppkのPuTTY形式の秘密鍵を指定すること。</font>入力が終わったら[OK]をクリックしてダイアログを終了する。
![pageant01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/2a058f94-c2b6-dccf-4eef-73fc59ad330e.png)
1. 作成したショートカットをクリックしてPageantを起動する。エラーが出なければ正しく動作している可能性が高い。またパスフレーズで保護されている秘密鍵ではパスフレーズが要求される。
2. Pageantが起動すると右下のタスクバーに表示される。右クリックしてポップアップを表示し、[View Keys]をクリックする。
![multistage-ssh11.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/3132c161-e3c1-e8f8-db6a-326c3f307771.png)

1. 正常に登録されると、以下のように秘密鍵が表示される。以上で事前準備は終了である。
![multistage-ssh13.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/5e91225d-aa69-f729-a80e-6efba7f3b8db.png)

### 4-4. PuTTYで多段sshを設定する

PuTTYの設定では、以下2つのSessionを作成する。これまでの[第2回](https://qiita.com/yamada-hakase/items/80cef4ed58fefbba266b)、[第3回](https://qiita.com/yamada-hakase/items/e1946b8a598f4cc0bcfa)を実行していれば1の作業は不要だ。しかし前回の手順を実施していない人もいるはずなので、復習も兼ねて説明する。

1. PuTTYで踏み台サーバまでの接続を作成
1. PuTTYで接続先サーバまで多段sshの接続を作成

今回想定している環境は以下のとおり。

|サーバ|ホスト名|パブリックIP|プライベートIP|
|:--:|:--:|:--:|:--:|
|踏み台サーバ|bastion|あり（132.x.x.x）|あり|
|接続先サーバ|target|なし|10.1.0.5|

#### 4-4-1. PuTTYで踏み台サーバまでの接続を作成

1. PuTTYを起動する。**[Host Name]**には踏み台サーバのIPアドレスを指定する。インターネット経由でアクセスするときはパブリックIPを指定する。
![multistage-ssh01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/f8f96f01-a24f-e52a-1981-dcc5ee6d7831.png)

1. 左側のツリーから[Connection]-[SSH]-[Auth]を選択し、**[Attempt authentication Using Pageant（Pageantを使って認証する）]**にチェックを入れる。また今までは一番下の[Private key file]に秘密鍵を指定していたが、Pageantを利用しているときは省略できる。逆に設定しても構わない。
![multistage-ssh03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/c33cdb64-de0b-8dbd-6893-9a27695efd26.png)

1. 左側のツリーから[Connection]-[SSH]-[X11]を選択し、**[Enable X11 Forwarding（X11フォワーディングを有効にする）]**をチェックを入れる。
![multistage-ssh04.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/e0b379b1-4a02-1533-f0ea-233726648f36.png)

1. 設定した変更を保存する。左側ツリーの[Session]に戻り設定を保存するか、タイトルバー左のPuTTYアイコンをクリックし、**[Change Settings（設定の変更）]**で設定を保存する。このとき保存する名前を「bastion」とする（別に何でもよい）。
![multistage-ssh05.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/877775a0-2d40-f23c-143a-ae50bcabd963.png)
![multistage-ssh05-1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/aba9707f-1aac-b357-5fa0-c48f68125d43.png)

#### 4-4-2. PuTTYで接続先サーバまで多段sshの接続を作成

次に多段sshで接続先サーバ（ホスト名:target）への接続を作成する。

1. 前のステップで作成した「bastion」を元に、PuTTYの新しいSessionを作成する。4-4-1.から連続で実行していないときは、既存の設定をロードする。
2. [Connection]-[SSH]を選択し、**[Remote Command]**テキストボックスには踏み台サーバで実行するコマンドを入力する。今回は接続先サーバのプライベートIPを指定するので「`ssh -X <接続先サーバ>`」と入力する。オプションは`-XC`でも構わない。
![multistage-ssh06.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/b8bb67f4-ab57-5f53-9c5c-16e1d6f2a4c3.png)

1. [Connection]-[SSH]-[Auth]で**[Allow agent forwarding（エージェントフォワーディングを認める）]**にチェックを入れる。これでPageant管理下の秘密鍵が踏み台サーバに転送できるようになる。
![multistage-ssh07.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/afbcdb4f-8885-9d12-ceb0-3175ad060095.png)

1. 先ほどと同じ手順で、設定した変更を保存する。今回は「bastion-mh-target」という名前でセーブする（mh = Multi Hopの略）。以上ですべての設定が終わったので、次に実際に接続する。

### 4-5. 接続先サーバに接続する

接続先サーバに接続し、GUIアプリ画面をWindowsクライアントまで転送する。

1. PuTTYを起動し、前のセクションで作成した「bastion-mh-target」をロードする。[Open]をクリックして接続を開始する。
2. 表示されているプロンプトからも、接続先サーバへの接続が成功していることがわかる。

```shell-session```
[opc@target ~]$
```
3.`DISPLAY`環境変数が設定されているか確認する。正しく設定していれば、自動的に設定されているはずである。

```shell-session```
[opc@target ~]$ echo $DISPLAY
localhost:10.0
```

4.動作確認のためxeyesを起動する。デスクトップに以下の目玉が表示されれば成功だ。タイトルバーには接続先サーバのホスト名が表示されている。

```shell-session```
[opc@target ~]$ xeyes &
```

![mh-ssh-xeyes.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/10138dc1-3933-aaf4-70b8-e5bcdf9ef50f.png)

# 5. Xサーバが適用できないケースもある

これまでの4回で以下の3方式の手順を説明した。とくに多段ssh方式は最初の設定が複雑なこともあり、十分に浸透しているとは言えないが、覚えてしまえば簡単である。

* 踏み台なしで接続する
* 踏み台ありで接続する（連続ログイン方式）
* 踏み台ありで接続する（多段ssh方式）

### 5-1. XcXsrv/XmingなどのXサーバが有効でないケース

しかし弱点もある。次のような条件がある場合だ。

* 外部ネットワークに接続するには、オンプレミスの外部アクセス用踏み台サーバを経由する必要がある
* 外部アクセス用の踏み台サーバにXcXsrv/Xmingがインストールされていない
* 外部アクセス用の踏み台サーバには管理者権限がなく、追加のプログラムをインストールできない

XcXsrv/Xmingは事前にインストールが必要なソフトウェアなので、上記環境では利用できない。
![ssh-xserver03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/c6b0e93a-72cb-4f63-ef55-3c5cc869ce83.png)

**そのときでも使えるのがVNCやxrdpだ。VNCクライアントには、ファイルを置くだけで使えるものがある。またxrdpは、Windows標準のリモートデスクトップクライアントを使用するのでインストール自体が不要だ。**

それぞれの方法は1回目でリンクを紹介しているので、それを見てほしい。

# 6. まとめ

* Xサーバを利用すると、WindowsクライアントでLinux上のGUIアプリを実行できる
* VNCでも同じことはできるが、Xサーバには「使用するポートは最小限」「通信経路の暗号化」「サーバ側の設定が少ない」といった数多くの魅力がある
* Xサーバは踏み台サーバ経由でも利用できる
* 多段sshと組み合わせることで、サーバ側に秘密鍵を保存する必要がなく、クラウド環境に適している

# 7. 参考資料

* [Xming環境構築](https://cell-innovation.nig.ac.jp/surfers/R_Xming.html)
* [PuTTYでプライベートなAmazon Linuxサーバへ多段ログインしてみた](https://dev.classmethod.jp/tool/putty-private-amazon-linux-login/)
* [WSL上にXサーバをインストールしてGUIを実現する（VcXsrv編）](https://www.atmarkit.co.jp/ait/articles/1812/06/news040.html)
* [PuTTY User Manual](https://www.ssh.com/ssh/putty/putty-manuals/0.68/Chapter9.html)

各クラウドベンダからも以下のような資料が提供されている。最後の2つはVNCの方法である。

* [Running Graphical Applications Securely on Oracle Cloud Infrastructure（PDF）](https://cloud.oracle.com/iaas/whitepapers/run_graphical_apps_securely_on_oci.pdf)
* [Windows のデスクトップ機能を使用して RHEL 7.3 の Amazon EC2 Linux ...](https://aws.amazon.com/jp/premiumsupport/knowledge-center/connect-to-rhel-73-windows/)
* [Windows からデスクトップ機能を使用して Amazon EC2 Linux](https://aws.amazon.com/jp/premiumsupport/knowledge-center/connect-ec2-linux-windows/)