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

# 1. 踏み台サーバ利用編

これまでの2回で、Linuxサーバ上でGUIアプリを実行する方法の全体像と、その基本的な手順を説明した。今回は踏み台サーバを経由した方法を説明する。

* [Windowsクライアントを使って…（1）](https://qiita.com/yamada-hakase/items/952406904beffb9f5e85)
* [Windowsクライアントを使って…（2）](https://qiita.com/yamada-hakase/items/80cef4ed58fefbba266b)

### 1-2. 踏み台サーバ経由とは

エンタープライズ・ネットワークやパブリック・クラウドで一般的に利用するテクニックで、ネットワークを分離し、アクセス管理を特定のサーバに集中することで、セキュリティを高める仕組みだ。

英語ではbastionサーバ（発音はバスティオン）と書かれることが多い。

前回は下図の「直接サーバに接続する場合」を説明した。今回は**<font color="blue">「踏み台サーバ経由で接続する場合」</font>**の方法を説明する。
![ssh-xserver02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/ced9d9cd-281b-dd18-2d85-bd2647964b60.png)

複数のサーバが登場するので「接続先サーバ＝最終的な接続先サーバ」と定義し、ここでGUIアプリケーションを起動する。

### 1-3. 前提条件

前提条件は以下の通り。踏み台サーバにxeyesは不要だが、X11フォワーディング関連のライブラリやsshdの設定は必要になる。

* Windowsクライアントから踏み台サーバにsshで接続できること
* 踏み台サーバから接続先サーバへsshで接続できること
* 踏み台サーバと接続先サーバの両方に、X11フォワーディングに必要な設定がしてあること（[第2回](https://qiita.com/yamada-hakase/items/80cef4ed58fefbba266b)に紹介済み）

### 1-4. 実現方法

おもな方法としては次の2つがある。

1. <font color="blue">踏み台サーバにsshログインしたあと、続けて接続先サーバにsshログインする</font>
2. <font color="blue">多段sshで接続先サーバに接続する</font>

もっともシンプルな方法は1である。実際にやってみると簡単すぎて驚く人もいるだろう。

**しかしパブリック・クラウドなどでは問題がある。踏み台サーバにログイン用の秘密鍵を置く必要があるからだ。**

### 1-5. クラウドに秘密鍵を置いてはいけない？

いろいろなところで書かれていることだが、何の前提条件も無しに

**「パブリック・クラウドに秘密鍵を置いてはいけない！」**

と言うつもりはない。

パブリック・クラウドでも、利用者によってセキュリティ設定は異なるだろう。また専用線やVPNなどの閉域網接続だけで、さらにインターネットとのIN/OUTを禁止していれば、安全性は高いと言える。

最終的な判断は各社のセキュリティ・ポリシーに従うとして、少なくとも次の場所に秘密鍵を置かないほうがいいだろう。

* パブリック・クラウドのパブリック・セグメントにあるサーバ（厳密なホワイトリスト制御しているときは？？？） 
* オンプレミスのDMZにあるサーバ（ssh公開鍵認証しているとき）

### 1-6. 今回説明する方法は？
1の方法を「連続ログイン方式」、2の方法を「多段ssh方式」として、それぞれ説明する。

# 2. 連続ログイン方式で接続する

この方式では以下の2段階で接続先サーバに接続する。

1. Windowsクライアントからssh（PuTTY）で踏み台サーバに接続
2. 踏み台サーバ上のOpenSSH（sshコマンド）で接続先サーバに接続

そのため事前に秘密鍵を踏み台サーバに配置する必要がある。その事前準備も合わせて説明する。

### 2-1. 事前準備する

踏み台サーバで使用できる秘密鍵はOpenSSH形式に限られる。PuTTY形式の秘密鍵しかないときは、事前にPuTTY Key Generator（puttygen.exe）で変換する。

**秘密鍵の形式変換（オプションの作業）：**

1. `puttygen.exe`を起動する。

2. [File]-[Load Private Key]で、PuTTY形式の秘密鍵をロードする。

3. [Conversions]-[Export OpenSSH Key]を選択する。パスフレーズで秘密鍵を保護していないときは質問のダイアログが表示されるが、そのまま[Yes]を選択する。

4. 保存先とファイル名を聞かれるので、適当な名前を付けて保存する。今回は`id_rsa.pem`という名前で保存する。

**秘密鍵のコピー：**

1. 秘密鍵を踏み台サーバにコピーする。

2. 今回はopcユーザの`$HOME/.ssh/id_rsa.pem`に配置する。

3. 秘密鍵のパーミッションが`600`になっていないときは変更する。

```shell-session
chmod 600 $HOME/.ssh/id_rsa.pem
ls -l $HOME/.ssh/id_rsa.pem
```

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

事前準備が終わったので、接続先サーバに接続し、GUIアプリ画面をWindowsクライアントまで転送する。

1. Windowsクライアントから、X11フォワーディングを有効にしたPuTTYで踏み台サーバに接続する（前回説明済み）。

2. 踏み台サーバから接続先サーバにsshで接続する。ssh公開鍵認証とパスワード認証でのコマンド・シンタックスは以下の通り。
オプションの`-X`はX11フォワーディングで`-C`は圧縮である。最低でも`-X`は指定する必要がある。同じユーザで接続するときは、ユーザ名は省略できる。

**ssh公開鍵認証：**

```shell-session
ssh -XC -i <秘密鍵ファイル > <接続先サーバ> [-l ユーザ名]
```

**パスワード認証**

```shell-session
ssh -XC <接続先サーバ> [-l ユーザ名]
```

たとえばssh公開鍵認証で`10.1.0.5`のホストに`opc`ユーザで接続するときは次のようになる。

```shell-session
ssh -XC -i $HOME/.ssh/id_rsa.pem 10.1.0.5 -l opc
```

### 2-3. GUIアプリ画面を転送する

接続先サーバに接続できたら、動作確認用の`xeyes`を起動する。

```shell-session```
xeyes &
```
以下のようにタイトルバーには転送元ホスト名（xeyesを実行したサーバ）が表示される。これを確認することで、接続先サーバからWindowsクライアントまで転送されたことがわかる。
![mh-ssh-xeyes.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/10138dc1-3933-aaf4-70b8-e5bcdf9ef50f.png)

# 3. 次回は？

連続ログイン方式はとても簡単なことを理解していただけただろうか。実は筆者自身VNCを使うことが多く、連続ログインは今回はじめて使ってみた。

また多段sshのことも書くつもりだったが想定以上に長くなったので、次回に繰り越すことにする。Windowsの多段sshは複数の方法があるだけに、どれにするか悩ましい。

* [Windowsクライアントを使って、クラウド上のLinuxサーバでGUIアプリを実行したい（4）](https://qiita.com/yamada-hakase/items/45922e8859283c44d7dc)