はじめまして&こんにちは。某外資系クラウド会社にて「ブルーなんとか(注 下に答が・・)」というサービスの洗脳活動エバンジェリストをしている木村と申します。前職を含めた IDCF 歴は3年、MORIO Dojoでは青帯を拝命しております。ご縁あって IDCF テックブログにデビューさせていただく機会を頂戴しました。よろしくお願いします。
お客様がクラウドを利用する場合、「特定の一社だけと契約する」というケースは珍しく、検証も含めて多くのケースでいわゆるマルチクラウド環境をご利用いただく機会が多いと実感しています。
今回はそんなマルチクラウド環境における相互ネットワーク間をセキュアに接続する例として、IBM Bluemix と IDCF クラウド環境間で Secure Gateway というサービスを利用した通信方法の実現について、その概要と具体的な手順を紹介します。
マルチクラウド間接続
複数のクラウド環境を併用する、いわゆる「マルチクラウド」環境は、各社の提供するサービスや機能のイイトコ取りをするようなケースでは珍しくないと思っています。その環境下では各社の提供するネットワーク条件やセキュリティ用件が全く同じということは考えにくく、それらを意識した上でマルチクラウド間の接続を実現する必要が出て来ることも考えられます。Secure Gatewayならこれらの課題をクリアするセキュアな接続が実現できます。その方法について本ブログで紹介します。
背景
マルチクラウド環境を利用していると、多くのケースでこのようなことを実現したくなることもあるでしょう:
![f:id:idcf-ambassador:20170629175213p:image f:id:idcf-ambassador:20170629175213p:image]()
▲図1 マルチクラウド間のセキュア接続
1つのクラウドはいわゆる「パブリッククラウド環境」として利用し、別のクラウドは「プライベートクラウド環境」として利用するようなケースです(後者は「オンプレミスの社内ネットワーク」を想定していただいても構いません)。この2つの環境ではネットワーク要件やセキュリティ要件は全く異なっているのですが、パブリックネットワーク側からプライベートネットワーク内のデータを利用したい(実際ありますよね)、という要件が出てきたようなケースです。
このようなケースでは「プライベートネットワーク内のデータを、どこまでセキュアな状態で/どれだけ他の環境に影響を与えずに/どれだけ簡単にパブリックネットワークのサーバーから接続させるか?」が鍵となります。今回は IBM Bluemix環境(パブリックネットワークと想定)と IDCF クラウド環境(プライベートネットワークと想定)を使い、この2つのネットワーク間を IBM Secure Gatewayでセキュアに接続する、という方法とその実現手順を紹介します:
![f:id:idcf-ambassador:20170629175209p:image f:id:idcf-ambassador:20170629175209p:image]()
▲図2 IBM Secure Gatewayによるセキュア接続イメージ
準備
IDCF クラウドのアカウント、および IBM Bluemix のアカウント
IDCF クラウド内の仮想サーバーインスタンス(グローバルIPアドレスは不要)
IBM Bluemix 内の PHP ランタイム(PHP でなくてもよいが、今回は PHP でサンプルアプリを用意)
2つの環境内にそれぞれサーバーが用意されている、という状態になっている所までが準備されているものとします(図3):
![f:id:idcf-ambassador:20170629175328p:image f:id:idcf-ambassador:20170629175328p:image]()
▲図3 両ネットワークに仮想マシン準備
Secure Gateway
今回は IBM Bluemix の Secure Gatewayサービスを使います。Secure Gateway は2つの異なるネットワーク間のデータおよびアプリケーションをセキュアに接続するトンネリングサービスです。特に IBM Bluemix で SaaS として用意されている Secure Gateway サービスには以下の特徴があります:
IBM Bluemix 上のアプリケーションとプライベートネットワーク内との通信を簡単に実現
トンネリング実現のための特別なハードウェアを用意する必要はなく、docker 環境または専用のソフトウェアをプライベートネットワーク内に用意するだけ
プライベートネットワーク内の接続先(IPアドレス+ポート番号)が1つであればSecure Gatewayサービスが無料で使える
環境設定手順
プライベートネットワーク(IDCF クラウド)側で docker 環境を用意
まずは IDCF クラウド内に 「プライベートネットワーク内のサーバー」に相当する仮想マシンを用意します。プライベートネットワーク想定なので、グローバル IP アドレスは 不要 です(light.S1 プランなら 500 円/月で作れます)。この例では個人的に使い慣れた CentOS 6 のサーバーを作りました:
![f:id:idcf-ambassador:20170629175216p:image f:id:idcf-ambassador:20170629175216p:image]()
▲図4 IDCFクラウドコンソール 仮想マシン詳細画面
IDCF クラウドの場合、Web画面からコンソールにアクセスしてコマンドを実行できる、という便利な機能が用意されています(これを使えば SSH などを使う必要もなく、グローバル IP アドレスがなくてもコマンドラインアクセスが可能になります)。今回の環境設定等はこのコンソールを使うことにします(図5):
![f:id:idcf-ambassador:20170629175220p:image f:id:idcf-ambassador:20170629175220p:image]()
▲図5 仮想マシン コンソールアクセス
こんな感じの画面(図6)が現れるので、ログインします。なお、ここで使用するパスワードは仮想マシン作成時にログインしているユーザーのメールアドレスに送付されるものを使います。:
![f:id:idcf-ambassador:20170629175223p:image f:id:idcf-ambassador:20170629175223p:image]()
▲図6 Webコンソール画面
普通に root でログインしちゃいました。良い子はマネしちゃだめよ:
![f:id:idcf-ambassador:20170629175226p:image f:id:idcf-ambassador:20170629175226p:image]()
▲図7 Webコンソール ログイン時
ここでネットワーク環境についてあらためて確認しておきます。
Secure Gateway をインストールする際には docker 環境または専用のソフトウェアがインストールされたサーバーがプライベートネットワーク内に必要になります(今回は前者を想定)。
またプライベートネットワーク上の1つのデータベースサーバーに対する外部からのセキュアな接続を実現する方法を紹介するのですが、今回はこのプライベートネットワークを1台のマシンで実現します。つまり docker 環境とデータベースサーバーを同じ仮想マシン上に構築します。
外部ネットワークからの接続先データベースが複数あるようなケース(この場合は有償版 Secure Gateway で対応)だったり、そもそも docker 環境とデータベース環境を分けて構築するようなケースで応用することも可能です。ただしその場合は docker の仮想マシンからデータベースに接続できるようなセキュリティ設定があらかじめなされていることが前提となることをご注意ください。
というわけで、改めて docker 環境を用意します(ちなみに CentOS 6.x の場合、6.6 以上である必要があります。また docker 1.8 以上は公式には CentOS 6.x では非サポート環境となるので、docker 1.7 を使うことになります)。こんな感じのコマンドを実行して docker 環境をインストール&起動します:
# yum -y --enablerepo=remi,epel,rpmforge install docker-io
# service docker start
![f:id:idcf-ambassador:20170629175233p:image f:id:idcf-ambassador:20170629175233p:image]()
▲図8 Webコンソール Docker起動
同様にしてプライベートネットワーク内にデータベースサーバーを構築します。今回は MySQL を使うことにします(ポート番号は3306)。今回は docker と同じ仮想マシン上に作成しますが、(docker の仮想マシンからアクセスできるサーバー上であれば)どこにあっても構いません。以下のコマンド等を実行して、MySQL サーバーが実際に動いている状態にします:
# yum -y install mysql-server
# service mysqld start
テーブルやデータ、ユーザーは適当に作っておきます。ただしこのユーザーは docker 環境からアクセスできる必要があります。MySQL と docker が異なる環境となる場合は外部接続を許可するよう設定しておいてください。
パブリックネットワーク(IBM Bluemix)側で Secure Gateway サービスをインスタンス化
次に IBM Bluemix 側で Secure Gateway サービスをインスタンス化します。まだアカウントをお持ちでない場合は 30 日間無料トライアルにお申込みください。
アカウントをお持ちの場合は IBM Bluemix にログイン後、カタログ一覧画面から Secure Gatewayサービスを検索して選択します:
![f:id:idcf-ambassador:20170629175305p:image f:id:idcf-ambassador:20170629175305p:image]()
▲図9 IBM Bluemixカタログ一覧
そしてプランを選択して「作成」します。"Essentials"プランであれば、接続先が1つに限られてしまい、通信量は月500MBまでとなりますが無料で提供されているサービスです(今回のケースはこれでもOKです):
![f:id:idcf-ambassador:20170629175314p:image f:id:idcf-ambassador:20170629175314p:image]()
▲図10 Essentialsプラン
作成後にダッシュボード画面を見ると “Secure Gateway-XX” と書かれたサービスがインスタンス化されていることが分かります。これをクリックして管理画面に移動します(図11):
![f:id:idcf-ambassador:20170629175317p:image f:id:idcf-ambassador:20170629175317p:image]()
▲図11 ダッシュボード画面
このような画面が表示されればパブリックネットワーク(IBM Bluemix)側の Secure Gateway は準備できたことになります。
ただ、この時点ではまだトンネリングの接続先がまだ存在していない、以下のような状態です(図12):
![f:id:idcf-ambassador:20170629175331p:image f:id:idcf-ambassador:20170629175331p:image]()
▲図12 IBM Bluesmix側 Secure Gateway準備
このまま続けてプライベートネットワーク(IDCF クラウド)側にも Secure Gateway クライアントを用意する手順に進むため、画面内の+マークをクリックします:
![f:id:idcf-ambassador:20170629175236p:image f:id:idcf-ambassador:20170629175236p:image]()
▲図13 Secure Gatewayダッシュボード
「ゲートウェイの追加」画面にて接続先を定義します。ここではとりあえず名称(図では「クララのゲートウェイ」)、セキュリティトークンの有無と期限を設定(図では使用せず)し、「ゲートウェイの追加」ボタンをクリックします:
![f:id:idcf-ambassador:20170629175240p:image f:id:idcf-ambassador:20170629175240p:image]()
▲図14 ゲートウェイ追加手続画面
「クララのゲートウェイ」という接続先が定義できました。この時点ではまだ実際の接続先が用意されていないので切断されています(図15:右上が赤くなっている):
最後に接続先を設定するための方法を確認しましょう。画面内の「クライアントの接続」と書かれた部分をクリックします:
![f:id:idcf-ambassador:20170629175243p:image f:id:idcf-ambassador:20170629175243p:image]()
▲図15 クライアントの接続
Secure Gateway をプライベートネットワーク側に導入する場合の手順が表示されます。
実際には3種類の方法で導入することができます(図の左から専用クライアントアプリ/docker イメージ/専用ハードウェア)。今回は docker を使うので docker アイコンをクリックし、その手順を確認します。
この Secure Gateway と接続するために docker 環境上で実行するコマンドが表示されるので、この内容をメモしておきます(図16):
![f:id:idcf-ambassador:20170629175246p:image f:id:idcf-ambassador:20170629175246p:image]()
▲図16 Secure Gateway接続方法
プライベートネットワーク(IDCF クラウド)側で Secure Gateway クライアントを導入
ここからはあらためてプライベートネットワーク側での作業になります。先程表示されたコマンドを docker 環境で実行します。
(注)実際にはホストモードで実行しないと接続できないケースがあるようなので、先程の画面に表示されたメッセージに --host=net
というオプションを追加して実行します。
初回のみ Secure Gateway のイメージがダウンロードされ、docker コンテナ上で実行され、コマンド待ちの状態で Secure Gateway が起動します:
![f:id:idcf-ambassador:20170629175250p:plain f:id:idcf-ambassador:20170629175250p:plain]()
▲図17 Secure Gateway起動画面
この時点でプライベートネットワーク側にも Secure Gateway のインスタンスが用意できました:
![f:id:idcf-ambassador:20170629175334p:image f:id:idcf-ambassador:20170629175334p:image]()
▲図18 プライベートネットワーク側 Secure Gateway準備
なお、この時点で IBM Bluemix 内の Secure Gateway サービス画面を確認すると、右上の先程まで赤くなっていた部分が緑色に変わり、クライアントとの接続ができたことが分かります。ここまで確認できたら Bluemix 側の Secure Gateway 画面は閉じてしまっても構いません(図19:右上の×をクリック):
![f:id:idcf-ambassador:20170629175254p:image f:id:idcf-ambassador:20170629175254p:image]()
▲図19 Secure Gatewayサービス画面
この時点でパブリックネットワークの Secure Gateway と、プライベートネットワークの Secure Gateway とが接続できている状態になりました。ただ実際のデータベースサーバーとはまだ繋がっていません。最後にそのための設定を行います。
まず、docker 上で稼働している Secure Gateway の Worker ID を確認します。Secure Gateway のコマンドで “L”を実行し Worker ID (図20では 1)を確認します:
![f:id:idcf-ambassador:20170629175257p:image f:id:idcf-ambassador:20170629175257p:image]()
▲図20 Worker ID確認
Worker ID がわかったら、アクセスを許可するリソースを IP アドレスとポート番号、そして Worker ID のセットで “A”コマンドで指定します。今回は MySQL サーバーへのアクセスを許可するので、以下のようなコマンドを実行します:
> A (MySQL サーバーのIPアドレス):3306 1
(注) MySQL サーバーが docker 環境と異なるホストの場合は、MySQL サーバーの設定で docker ホストからのリモート接続を許可するような設定が別途必要です。
![f:id:idcf-ambassador:20170629175302p:image f:id:idcf-ambassador:20170629175302p:image]()
▲図21 MySQLへのアクセス許可
これでパブリックネットワーク(IBM Bluemix)とプライベートネットワーク(IDCF クラウド)とが Secure Gateway を介して接続され、パブリックネットワーク側からプライベートネットワーク内の MySQL サーバーへの接続が許可された状態になりました。
パブリックネットワーク(IBM Bluemix)側からプライベートネットワーク(IDCF クラウド)のデータベースにアクセスする
ここまでの手順でパブリックネットワーク側からプライベートネットワーク内の MySQL サーバーにアクセスを許可する設定が完了しました(この時点では許可までが完了しただけであって、まだ接続設定はできていない)。では最後にパブリックネットワーク側からプライベートネットワーク内の MySQL サーバーに接続する設定を行います。
再度 IBM Bluemix のダッシュボード画面から Secure Gateway サービスの管理画面を開き、宛先タブの+印をクリックします:
![f:id:idcf-ambassador:20170629175340p:image f:id:idcf-ambassador:20170629175340p:image]()
▲図22 Secure Gatewayサービス画面
今回はパブリックネットワークのクラウドから、プライベートネットワーク(オンプレミス)ネットワーク内の MySQL へのアクセスを行いたいので、リソースはオンプレミス側にあることになります。というわけでリソースの場所に「オンプレミス」を指定します:
![f:id:idcf-ambassador:20170629175344p:image f:id:idcf-ambassador:20170629175344p:image]()
▲図23 リソース選択
オンプレミス側の MySQL リソースの IP アドレスとポート番号を指定します。ここで指定する IP アドレスは当然プライベートネットワーク内の IP アドレスになります:
![f:id:idcf-ambassador:20170629175347p:image f:id:idcf-ambassador:20170629175347p:image]()
▲図24 宛先ホスト、ポート設定
通信プロトコルを指定します。今回は MySQL のネイティブプロトコルで、特に認証も行わないので “TCP”を選択します:
![f:id:idcf-ambassador:20170629175351p:image f:id:idcf-ambassador:20170629175351p:image]()
▲図25 通信プロトコル選択
認証の種類を指定します(今回は “None"):
![f:id:idcf-ambassador:20170629175356p:image f:id:idcf-ambassador:20170629175356p:image]()
▲図26 宛先での認証方法選択
更にリクエスト元の IP アドレスを絞る場合はこの画面で指定します(今回は空白のまま):
![f:id:idcf-ambassador:20170629175155p:image f:id:idcf-ambassador:20170629175155p:image]()
▲図27 リクエスト元IPアドレス指定
最後にこの接続に名前(下図では「プライベート MySQL」)を付けて「宛先の追加」をクリックします:
![f:id:idcf-ambassador:20170629175158p:image f:id:idcf-ambassador:20170629175158p:image]()
▲図28 宛先追加
ここまでの手順で、プライベートネットワーク内の MySQL に接続するための設定が完了しました:
![f:id:idcf-ambassador:20170629175209p:image f:id:idcf-ambassador:20170629175209p:image]()
▲図2 IBM Secure Gatewayによるセキュア接続イメージ(再掲)
管理画面にも宛先が追加されています。
この宛先の右下にある歯車部分をクリックします(図29):
![f:id:idcf-ambassador:20170629175202p:image f:id:idcf-ambassador:20170629175202p:image]()
▲図29 Secure Gateway管理画面
するとこのようなダイアログが表示されます(図30)。 クラウド・ホスト:ポートと書かれた部分に注目してください。これが パブリッククラウド(IBM Bluemix)側からみた MySQL サーバーの接続先となる情報です:
![f:id:idcf-ambassador:20170629175205p:image f:id:idcf-ambassador:20170629175205p:image]()
▲図30 MySQLサーバー接続先情報
接続アプリを作ってパブリックネットワーク上で動かす
あとは上記で作成した環境を使ったアプリケーションをパブリックネットワーク上の(IBM Bluemix 上の)サーバーで実行するだけです。試しにこんな PHP アプリを作って、サーバー上に配置してみました:
![f:id:idcf-ambassador:20170629175337p:image f:id:idcf-ambassador:20170629175337p:image]()
▲図31 構築したマルチクラウド間のセキュア接続
<?php
// プライベートMySQLへの接続
$hostname = 'XXXXX.integration.ibmcloud.com';
$port = NNNNN;
$dbname = 'mydb';
$username = 'username';
$password = 'password';
// ここは編集不要
$dsn = 'mysql:dbname='.$dbname.';host='.$hostname.';port='.$port;
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>MySQL 接続テスト</title>
<meta http-equiv="viewport" content="width=device-width, initial-scale=1" />
<meta http-equiv="apple-mobile-web-app-capable" content="yes" />
</head>
<body>
<h1>MySQL 接続テスト</h1>
<br/>
<table border="1">
<tr><th>#</th><th>名前</th><th>年齢</th></tr>
<?php
try{
$dbh = new PDO( $dsn, $username, $password );
if( $dbh != null ){
$sql = "select id, name, age from people order by id limit 10";
$stmt = $dbh->query( $sql );
while( $row = $stmt -> fetch( PDO::FETCH_ASSOC ) ){
$id = $row['id'];
$name = $row['name'];
$age = $row['age'];
$tr = "<tr><td>" . $id . "</td>"
. "<td>" . $name . "</td>"
. "<td>" . $age . "</td></tr>\n";
echo $tr;
}
$dbh = null;
}
}catch( PDOException $e ){
print( 'Error: ' . $e->getMessage() );
die();
}
?>
</table>
</body>
</html>
このアプリケーションにアクセスするとこのようになります(図32)。無事にパブリックネットワーク上のアプリケーションから、プライベートネットワーク内の MySQL データベースサーバーにアクセスして動いていることがわかります:
![f:id:idcf-ambassador:20170629175323p:image f:id:idcf-ambassador:20170629175323p:image]()
▲図32 MySQL接続確認
感想
パブリックネットワークとプライベートネットワークとの間をセキュアで簡単に接続できる Secure Gateway を紹介し、実際に接続環境を作るまでを説明しました。
今回の紹介の中では専用のハードウェアやトンネリングのための設定を用意する必要もなく、ファイアウォールを通す必要もなく、そしてプライベートネットワーク側にはグローバル IP アドレスも用意していないことを改めて思い出してください。
そうして作成したプライベートネットワーク内の MySQL サーバーにここで書かれている情報を使ってセキュアにアクセスできるようになっている、ということを意味しています。
今回は IBM Bluemix と IDCF クラウドという2つの異なるネットワークの間をセキュアに接続する、というケースで紹介しましたが、この Secure Gateway を使えば同様のトンネリングネットワークを簡単に作成することができます。
マルチクラウド時代における、クラウドネットワーク間の接続ツールとして紹介させていただきました。
この記事を作成するにあたり、IDCF クラウドを「プライベートクラウド環境」と位置付けて紹介させていただきました。他の多くのクラウドベンダー環境と異なり、専用のWebコンソールが用意されていることで、グローバルIPアドレスを付与したり、SSHなどを利用することなく外部からホストにアクセスして利用することができました。プライベートネットワークを実現したり、あるいはプライベートネットワークをエミュレートする環境として非常にユニークであり、簡単でかつ使いやすいと感じました。
今回紹介したメイン機能である Secure Gateway は IBM Bluemix からは SaaS として提供しており、これを各クラウドから外部利用いただくことも可能ですが、「自分のクラウド環境の中に Secure Gateway インスタンスを作りたい」という要望もあると思います。その場合はソフトウェア製品版である WebSphere CastIronをお使いください。