FirewallなどによりサーバへのSSHアクセスが制限されている環境において、踏み台サーバではなく、SSH R-Proxyサーバ (Dockerコンテナ) によりバックエンドのサーバへのSSH Proxyアクセスを実装する。
HTTP Proxy経由でSSH接続をする方法もあるが、今回はHTTP Proxyを使用せず、シンプルなSSH R-Proxyを使用する。
SSH Piper
今回、SSH ProxyとしてこちらのSSH Piperを使用する。
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
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等の各種制約を回避するためには非常に有用と考えられる。