designetwork

ネットワークを軸としたIT技術メモ

SSH Piper w/DockerでSSH R-Proxyを構築する

f:id:daichi703n:20180430124255p:plain

FirewallなどによりサーバへのSSHアクセスが制限されている環境において、踏み台サーバではなく、SSH R-Proxyサーバ (Dockerコンテナ) によりバックエンドのサーバへのSSH Proxyアクセスを実装する。

HTTP Proxy経由でSSH接続をする方法もあるが、今回はHTTP Proxyを使用せず、シンプルなSSH R-Proxyを使用する。

SSH Piper

今回、SSH ProxyとしてこちらのSSH Piperを使用する。

github.com

READMEより
ここでは各個人用サーバ(コンテナ)へのユーザ名ベースでのSSH振り分けを想定している。

+---------+                      +------------------+          +-----------------+
|         |                      |                  |          |                 |
|   Bob   +----ssh -l bob----+   |   SSH Piper   +------------->   Bob' machine  |
|         |                  |   |               |  |          |                 |
+---------+                  |   |               |  |          +-----------------+
                             +---> pipe-by-name--+  |                             
+---------+                  |   |               |  |          +-----------------+
|         |                  |   |               |  |          |                 |
|  Alice  +----ssh -l alice--+   |               +------------->  Alice' machine |
|         |                      |                  |          |                 |
+---------+                      +------------------+          +-----------------+


 Downstream                         SSH Piper                       Upstream               

期待するのは、HTTPリバースプロキシのような動作だが、SSHではHTTPのようにhostヘッダでのルーティングはできないので、ログインユーザ名でのリバースプロキシ的な動作になる。

DockerでSSH Piperを構築する

SSH PiperはDocker Imageとして提供されている。これによりGo言語の実行環境セットアップなどをスキップできる。

ディレクトリ・ファイル構成

再利用性を考慮してdocker-composeを使用する。ディレクトリ、ファイル構成は以下の通り。

$ sudo tree -pug
.
├── [-rw-r--r-- root     root    ]  README.md
├── [drwxr-xr-x root     root    ]  config
│   └── [drwxr-xr-x root     root    ]  sshpiper
│       ├── [drwx------ root     root    ]  asa
│       │   └── [-rw------- root     root    ]  sshpiper_upstream
│       └── [drwx------ root     root    ]  centos7
│           └── [-rw------- root     root    ]  sshpiper_upstream
└── [-rw-r--r-- root     root    ]  docker-compose.yml

docker-compose.ymlはこのようになる。

$ cat ./docker-compose.yml
version: '2'

#https://github.com/tg123/sshpiper
services:

  external:
    image: farmer1992/sshpiperd
    container_name: sshpiper
    ports:
      - "2222:2222"
    volumes:
      - /etc/ssh/ssh_host_rsa_key:/etc/ssh/ssh_host_rsa_key:ro
      - ./config/sshpiper:/var/sshpiper

詳細表示している通り、ConfigのPermissionに気をつける必要がある。Configファイルは700/600とする。

$ sudo chmod 700 config/sshpiper/asa
$ sudo chmod 600 ./config/sshpiper/asa/sshpiper_upstream
$ sudo ls -la ./config/sshpiper/asa/
合計 4
drwx------. 2 root root 31  4月 30 10:57 .
drwxr-xr-x. 4 root root 28  4月 30 10:56 ..
-rw-------. 1 root root 36  4月 30 10:57 sshpiper_upstream

$ sudo cat ./config/sshpiper/asa/sshpiper_upstream
# Cisco ASA5505
dev@192.168.1.5:22

SSH Proxy動作確認

SSH Piper の Dockerコンテナを起動して動作確認する。

$ docker-compose up

<Another Terminal>
$ ssh 192.168.1.76 -p 2222 -l asa
asa@192.168.1.76's password:
Type help or '?' for a list of available commands.
ASA5505>

$ ssh 192.168.1.76 -p 2222 -l centos7
centos7@192.168.1.76's password:
[dev@CentOS7-01 ~]$

上記はLinuxからのログだが、TeraTerm等のターミナルからも同様にSSHアクセス可能。パスワード入力プロンプトではSSH Piperのものが表示されるが、接続に成功すると、アップストリームのサーバ(NW機器)に接続できている。

SSH Piperのアクセスログは以下の通り。ユーザ名とアップストリーム(バックエンド)のサーバがマッピングされている。

sshpiper    | 2018/04/30 02:03:09 sshpiperd started
sshpiper    | 2018/04/30 02:03:10 connection accepted: 192.168.1.111:60508
sshpiper    | 2018/04/30 02:03:10 mapping user [asa] to [dev@192.168.1.5:22]

Permissionが不適切だと使用不可

sshpiper_upstreamファイルのPermissionは.ssh同様に制限されている必要がある。Permissionが不適切だと以下のログのようにperm is too openのエラーでSSH接続に失敗する。

$ sudo docker-compose up
Creating network "sshpiper_default" with the default driver
Creating sshpiper ...
Creating sshpiper ... done
Attaching to sshpiper
sshpiper    | sshpiperd by Boshi Lian<farmer1992@gmail.com>
sshpiper    | https://github.com/tg123/sshpiper
sshpiper    |
<snip>
sshpiper    | 2018/04/30 01:59:23 sshpiperd started
sshpiper    | 2018/04/30 01:59:25 connection accepted: 192.168.1.111:60436
sshpiper    | 2018/04/30 01:59:25 connection from 192.168.1.111:60436 establishing failed reason: /var/sshpiper/asa/sshpiper_upstream's perm is too open

TODO

まとめ - SSH Piper w/DockerでSSH Proxyを構築する

SSH PiperによりSSH Proxyを構築できた。引き続きアクセス制御関連の検証が必要だが、シンプルにSSH Proxyとして使用することができるため、Firewall等の各種制約を回避するためには非常に有用と考えられる。