IBM Bluemix が提供するサービスの1つである Secure Gateway を紹介します:
2017040501


IBM も提唱する「ハイブリッド・クラウド」環境では、パブリックなクラウドだけでなく、一部のデータベースがセキュアなプライベート環境やオンプレミス環境上に存在したままでシステムシステムを実現する必要があります。ではどのような仕組みでパブリッククラウドとセキュアなデータベース接続を実現することができるでしょうか?
2017040501


一般的には VPN などの仕組みを使うことも考えられますが、そのためのサーバー機器やソフトウェア、およびそれらの仕組みをプライベートネットワーク側にも用意する必要があり、運用・管理も含めた負担は軽いものではありません。 今回紹介する Secure Gateway はプライベートネットワークの Docker イメージとしてトンネリングクライアントを用意し、Bluemix 側のトンネリングサーバー(ゲートウェイ)との間で通信して、目的のプライベートデータベースとの接続をシームレスに実現する、というものです:
2017040501


この Secure Gateway を利用する場合、その環境構築は非常に簡単です。ゲートウェイサーバー側は SaaS のサービスをインスタンス化するだけ、クライアント側はソフトウェアを導入してゲートウェイサーバーと接続するコマンドを実行するだけですが、導入方法の1つとして専用の Docker イメージが用意されているので、そのコンテナを Docker から起動するだけで済みます。管理・運用の負担が非常に小さくなります。


また Secure Gateway には利用量に応じたいくつかのプランがあります。無料版である Essentials プランでは1つのゲートウェイにつき接続先は1つ(例えば1つのデータベース)だけですが、1ヶ月間に 500MB のトンネリング通信を行うことができます。Bluemix の画面からプランを選択して「作成」ボタンをクリックすると、このサービスが利用可能になります(この時点ではまだインスタンス化していません):
2017040502


この(サービスを作成した直後の)時点で Bluemix の Secure Gateway サービス画面を見ると以下のようになります。ダッシュボードから利用状況が確認できますが、まだゲートウェイインスタンス(上記図の Secure Gateway サーバー)が生成されていないので通信は行われていません。ゲートウェイサーバーを作成するには、画面左下の「ゲートウェイの作成」をクリックします:
2017040503


ゲートウェイの追加画面が表示されます。ここではゲートウェイの(つまりは接続先の)名称を指定します。必要に応じてセキュリティ・トークンの設定を行い(下図では設定していません)、最後に「ゲートウェイの追加」をクリックします:
2017040504


これでゲートウェイサーバーインスタンスが生成されました。が、まだゲートウェイクライアントが作られていないので、未接続状態です(画面右上のチェーンが赤)。そこで続いて「クライアントの接続」をクリックします:
2017040505


ゲートウェイクライアントを導入するにはプライベートネットワーク内に専用のソフトウェアをインストールする他にも、専用の Docker イメージを使う方法や IBM DataPower アプライアンスサーバーを使う方法があります。今回はゲートウェイクライアントを Docker イメージから作るものとします(プライベートネットワーク内に Docker が導入されたマシンが存在するものとして、以降「Docker ホストマシン」と表現します)。そして接続方法に "Docker" を選択します。すると、Docker ホストマシン上で実行するべきコマンドが表示されます。ここに書かれている "docker run -it" で始まるコマンドを、プライベートネットワーク内の Docker ホストマシンで実行します:
2017040506


多くの場合、ここで作成する Docker イメージを起動したまま Docker ホストマシンのコマンドを抜けることになると思うので、Docker ホストマシンでコマンドを実行する前に一度 screen などでターミナルを多重化しておくのがいいと思います:
$ screen

その上で上記コマンドを実行するとこのような画面になり、最後にプロンプトが表示されます。Secure Gateway クライアントが起動した状態で Docker イメージが起動し、コマンド待ち状態になっています:
$ docker run -it ibmcom/secure-gateway-client XXXXXXXX_prod_ng
IBM Bluemix Secure Gateway Client Version 1.7.0
************************************************************************************************
You  are running the  IBM Secure  Gateway Client for Bluemix. When you enter the provided docker
command the IBM Secure Gateway Client  for Bluemix automatically downloads as a Docker image and
is executed on your system/device. This is released under an IBM license. The  license agreement
for IBM  Secure Gateway Client for Bluemix is available at the following location:

http://www.ibm.com/software/sla/sladb.nsf/lilookup/986C7686F22D4D3585257E13004EA6CB?OpenDocument

Your use of the components of the package and  dependencies constitutes your acceptance  of this
license agreement. If you do  not want to accept the license, immediately quit  the container by
closing the  terminal  window or by  entering 'quit' followed by the ENTER key. Then, delete any
pulled Docker image from your device.

For client documentation, please view the ReadMe located at:
.rpm and .deb installers: /opt/ibm/securegateway/docs/
.dmg installer:           <installation location>/ibm/securegateway/docs/
.exe installer:           <installation location>\Secure Gateway Client\ibm\securegateway\docs\
************************************************************************************************


<press enter for the command line>
[2017-04-04 11:20:59.269] [INFO] (Client ID 1) No password provided. The UI will not require a password for access
[2017-04-04 11:20:59.278] [WARN] (Client ID 1) UI Server started. The UI is not currently password protected
[2017-04-04 11:20:59.279] [INFO] (Client ID 1) Visit localhost:9003/dashboard to view the UI.
[2017-04-04 11:20:59.521] [INFO] (Client ID 15) Setting log level to INFO
[2017-04-04 11:21:01.562] [INFO] (Client ID 15) The Secure Gateway tunnel is connected
[2017-04-04 11:21:01.752] [INFO] (Client ID XXXXXXXX_eoF) Your Client ID is XXXXXXXX_eoF
XXXXXXXX_eoF>

(追記)
ダッシュボード画面に表示されている Docker コマンドは上記(docker run -it ****)なのですが、実際にはネットワークモードをデフォルトのブリッジではなくホストモードで起動しないとエラーが発生する、という症状が出ることもあるので、その場合はホストモード(docker run --net=host -it ****)での起動を試みてください。自分はホストモードで起動しています。
(追記終わり)


このクライアントのワーカー ID (Essentials プランの場合は大抵1だと思いますが)を後で使うので確認しておきます。このプロンプトにおいて "L" という List の短縮コマンドを実行して、Worker ID を確認します:
XXXXXXXX_eoF> L
----------------------------------------
-- Current Secure Gateway Client Connections --

 Worker ID   Client ID     Description
      1     XXXXXXXX_eoF          木村家GW
----------------------------------------
XXXXXXXX_eoF>

もしもここでワーカー ID が確認できなかった場合は、何らかの原因でゲートウェイサーバーとの接続がうまく行ってないことになります。その場合は手動でゲートウェイ ID を指定して接続する必要があります。ゲートウェイ ID を確認するには Secure Gateway ダッシュボードで接続名(下図の場合は「木村家GW」)の右にある歯車マークをクリックします:
2017040502


すると以下のような画面が表示され、ゲートウェイ ID が表示されるので、この値をコピーしておきます:
2017040508


改めてゲートウェイクライアントのプロンプトで、以下のように指定してゲートウェイサーバーと接続します:
XXXXXXXX_eoF> c (ゲートウェイID)

その後、上記の L コマンドで接続を再確認してください。


ではここで確認したワーカー ID を使って、接続を許可するリソースを指定します。例えばプライベートネットワーク内のデータベースサーバーの IP アドレスが 192.168.0.101 で、データベースシステムが MySQL (ポート番号 3306)だった場合、以下のコマンドを実行して、Secure Gateway による接続を許可します:
XXXXXXXX_eoF> A 192.168.0.101:3306 1

  ↑最後の1はワーカーID


なお、上記で触れたようにゲートウェイクライアントで screen を実行してから Docker イメージを起動していた場合、キーボード操作で Ctrl + A, D (Ctrl を押しながら A 、続いて Ctrl を離して D)を実行すると Docker イメージを起動したまま screen を抜ける(デタッチする)ことができます:
XXXXXXXX_eoF> (Ctrl + A, D を実行)
$ 

こうしてデタッチした screen に再び接続(アタッチ)するには screen -r コマンドを実行します:
$ screen -r

XXXXXXXX_eoF>


これだけで Bluemix のランタイム(アプリケーションサーバー)などから、Secure Gateway を経由してプライベートネットワークのデータベース等に接続することができるようになります。 実際に接続する場合にランタイム側からどのようなサーバーとポートに対して接続すればよいのかを確認します。


先程の Secure Gateway のダッシュボード画面の、作成したゲートウェイの画面において、「宛先」タブを選び、上記で定義済みの宛先の設定ボタン(右下の歯車アイコン)を選択します:
2017040701


すると以下のような画面になります。ここで「リソース・ホスト:ポート」にはオンプレミス上の接続先リソースの情報が表示されますが、「クラウド・ホスト・ポート」に表示されているホスト名とポート番号の組み合わせをコピーしてください。そして実際のアプリケーションランタイムからは、このホスト名とポート番号に対して接続することでハイブリッドなクラウド環境が実現できます:
2017040702