＜SecureGatewayの勉強２＞クラウドのBluemixアプリからオンプレミスのDBをセキュアにアクセス。(SecureGatewayクライアント：Windows編)


# 1. はじめに
<font color="blue"><strong> 「SecureGateway」</strong></font>はBluemixで提供されるサービスです。
 クラウド環境（Bluemix環境）とオンプレミス環境の間でトンネルを確立し、セキュアな接続を提供します。
  これを使えば、クラウド上のBluemixアプリケーションからオンプレミスのDBをアクセスするようなシステムをセキュアに構築することが可能です。
 今回は、BluemixでPHPプログラムを作成し、オンプレに見たてたBluemix Infrastructure(SoftLayer)インスタンスのMySQLにアクセスします。
 尚、今回の<font color="blue">SecureGatewayクライアントはWindows環境のパターン</font>です。
 また、基本的な内容を理解するという点に主眼を置いたため、今回TLS認証機能は省いています。
 <font color="red">（ご注意) 実システムで構築・利用される際は、セキュリティ対策を十分ご検討の上、適用してください。</font>
 
# ２. SecureGatewayについて
 Bluemixアプリケーションからオンプレミス、クラウド上のデータにアクセスする際、セキュアな経路を提供。
![01.png](http://seahorse-inc.com/QIITA/SecureGateway-2/01.png)
（宛先タイプ：オンプレミス宛先の例）

## ２-1. 接続先の宛先タイプ
 アクセスするアプリケーションプログラムとアクセスされるDBが、Bluemix環境（SecureGateway資料では「クラウドの宛先」と表記されています）にあるのか、オンプレミス環境にあるのかによって宛先タイプが異なります。
 
<strong>（１）クラウドの宛先</strong>
アプリケーションプログラムがオンプレミス、DBがBluemix環境。
![02.png](http://seahorse-inc.com/QIITA/SecureGateway-2/02.png)

<strong>（２）オンプレミスの宛先</strong>
アプリケーションプログラムがBluemix環境、DBがオンプレミス。
![03.png](http://seahorse-inc.com/QIITA/SecureGateway-2/03.png)

この2つの宛先タイプを組み合わせることにより、双方向での通信処理が可能となります。

<font color="red">（注意）SecureGatewayの無償プラン（Essentials）では、宛先、クライアントそれぞれ1つまでです。
双方向での通信処理では宛先、クライアントが最低2つとなりますので、無償プランではなく有償プラン（ProffesionalまたはEnterprise）を選択する必要があります。</font>

# ３. テスト構成について
 今回は、SecureGateway宛先タイプ：「オンプレミスの宛先」の構成です。
（アプリケーションプログラムがBluemix環境、DBがオンプレミス。）
オンプレミス環境に見たてた、Blumix Infrastructure（SoftLayer）環境に。仮想インスタンスのWindows2012R2をデプロイします。
Windows2012R2には
<font color="blue">① Windows用SecureGatewayクライアント
③ MySQL(MAMP3.3)</font>
機能をインストールします。

<strong>【Bluemix側環境】</strong>
■ SecureGateway：Bluemix 2017年10月現在提供のバージョン
■ PHP：Bluemix Cloud Foundry 2017年10月現在提供のバージョン4.3.27
■ cfコマンド：PHPプログラムをBluemixにデプロイするために使用。
ここでは、”Windows10(32bit)環境 cf version 6.19.0+b29b4e0-2016-06-08”を使用しましたが、お使いのクライアントPC環境のOSに合わせてください。

<strong>【オンプレミス側環境 （Blumix Infrastructure（SoftLayer））】</strong>
■ 仮想インスタンス：
Windows2012R2
プライベートIP：10.132.52.225
プライベートIPのみの設定ですが、インターネット環境にアクセスできるように設定してください。



# ４. テスト環境の構築


## ４－1. MySQLのインストールと設定
<font color="orange"><《 Blumix Infrastructure（SoftLayer）側作業です 》</font>
MySQLにはMAMPを使用します。
MAMPはMySQL、Apache、PHPがパッケージが含まれ、インストールから構築が簡単にでます。
(MAMP:Macintosh Apache MySQL PHP)
尚、従来からのXAMPはバージョン5.6よりMySQLからMariaDBに移行されています。


▼ MAMPのインストール
下記サイトからMAMPをダウンロードします。
https://www.mamp.info/en/
MAMP Proは有償版です。ここではFREE版を使用します。

![04.png](http://seahorse-inc.com/QIITA/SecureGateway-2/04.png)
「DOWNLOAD」ボタンをクリック。

![05.png](http://seahorse-inc.com/QIITA/SecureGateway-2/05.png)
「Download」ボタンをクリック。

![06.png](http://seahorse-inc.com/QIITA/SecureGateway-2/06.png)
「Next」ボタンをクリック。

![07.png](http://seahorse-inc.com/QIITA/SecureGateway-2/07.png)
"MAMP PRO"のチェックを外す⇒「Next」ボタンをクリック。

![08.png](http://seahorse-inc.com/QIITA/SecureGateway-2/08.png)
"I accept the agreement"を選択⇒「Next」ボタンをクリック。

![09.png](http://seahorse-inc.com/QIITA/SecureGateway-2/09.png)
デフォルトのインストールフォルダーは"C:\MAMP"
ここではデフォルトフォルダーは"C:\MAMP"にインストール
「Next」ボタンをクリック。

![10.png](http://seahorse-inc.com/QIITA/SecureGateway-2/10.png)
「Next」ボタンをクリック。

![11.png](http://seahorse-inc.com/QIITA/SecureGateway-2/11.png)
"Create a desktop icon"をチェック
「Next」ボタンをクリック。

![12.png](http://seahorse-inc.com/QIITA/SecureGateway-2/12.png)
「Install」ボタンをクリック。

![13.png](http://seahorse-inc.com/QIITA/SecureGateway-2/13.png)
「Finish」ボタンをクリックしてインストール完了。

デスクトップにショートカットができていますので、クリックするとMAMPが起動します。
![14.png](http://seahorse-inc.com/QIITA/SecureGateway-2/14.png)
![15.png](http://seahorse-inc.com/QIITA/SecureGateway-2/15.png)


▼ パスの設定
MySQLモニタ起動のために、”c:\mamp\bin\mysql\bin”にパスを通します。
![16.png](http://seahorse-inc.com/QIITA/SecureGateway-2/16.png)

▼ 文字エンコーディングの設定
文字化けしないように、文字エンコーディングの設定を行います。
・DBデータをUTF-8
・MySQLモニタ用にcp932を設定。

c:\mamp\conf\mysql\my.iniをエディターで開いて
・[mysqld]セクションに
<font color="green">character-set-server = utf8</font>
・[mysql]セクションに
<font color="green">default-character-set = cp932</font>
を設定します。
![17.png](http://seahorse-inc.com/QIITA/SecureGateway-2/17.png)

MySQLを再起動します。
![15.png](http://seahorse-inc.com/QIITA/SecureGateway-2/15.png)
「Stop Servers」をクリック⇒「Start Servers」をクリック

▼ MySQLに新規ユーザ追加と権限の設定
MAMPのMySQL初期IDとパスワードは、
・ID： root
・パスワード：root  です。

コマンドプロンプトより、MySQLモニターを起動して
rootユーザ（パスワード：root）でMySQLにログイン。

```Command:rootユーザでMySQLにログイン
> mysql -u root -proot
```
![18.png](http://seahorse-inc.com/QIITA/SecureGateway-2/18.png)

今回のテストで使用するユーザを下記内容で作成します。
・ユーザー：「usermura」
・パスワード：「Mura3root@」
また、usermuraの権限をすべて操作できるように設定します。

```Command:MySQLに新規ユーザ追加と権限の設定
mysql> CREATE USER usermura IDENTIFIED BY 'Mura3root@';
mysql> GRANT ALL PRIVILEGES ON *.* TO usermura@'localhost' IDENTIFIED BY 'Mura3root@' WITH GRANT OPTION;
mysql> GRANT ALL PRIVILEGES ON *.* TO usermura@'%' IDENTIFIED BY 'Mura3root@' WITH GRANT OPTION; 
mysql> FLUSH PRIVILEGES;
```

usermuraで正常にログインできるか確認。
MySQLコマンドラインを”quit"で終了し、再度「usermura」でログインします。

```Command:MySQLを終了
mysql> quit
```
usermuraユーザ（パスワード：Mura3root@）でMySQLにログイン。

```Command:usermuraユーザでMySQLにログイン
> mysql -u usermura -pMura3root@
```

<font color="blue"><strong>以上で「４－1. MySQLのインストールと設定」完了です。</strong></font>


## ４－２. MySQLテストデータの作成

▼ データベースdb1作成
usermuraユーザでMySQLへログイン後、以降の操作を行います。

```Command:データベースdb1作成
mysql> create database db1;
mysql> use db1
```
▼ テーブルfish作成

```Command:テーブルfish作成
mysql> create table fish(id int ,name varchar(20),price varchar(10));
```
▼ データ登録

```Command:データ登録
insert into fish values(1, 'マアジ',120);
insert into fish values(2, 'カンパチ',270);
insert into fish values(3, 'カツオ',210);
insert into fish values(4, 'マダイ',320);
insert into fish values(5, 'クロダイ',290);
insert into fish values(6, 'メジナ',180);
insert into fish values(7, 'イサキ',310);
insert into fish values(8, 'ハタハタ',650);
insert into fish values(9, 'ムツ',380);
insert into fish values(10, 'カワハギ',150);
insert into fish values(11, 'カタクチイワシ',110);
insert into fish values(12, 'マコガレイ',360);
```

▼ 登録データ確認

```Command:登録データ確認
select * from fish;
```
![19.png](http://seahorse-inc.com/QIITA/SecureGateway-2/19.png)
確認したら、「quit」で終了してください。

以上で「４－２. MySQLテストデータの作成」完了です。


《 Blumix 側作業 》
## ４－３. Bluemix側のSecureGateway設定
▼ SecureGatewayサービスのオーダー
下記URLより、Bluemixにログインします。
https://console.bluemix.net/home/

![20.png](http://seahorse-inc.com/QIITA/SecureGateway-2/20.png)
「カタログ」より「SecureGateway」をクリック。

![21.png](http://seahorse-inc.com/QIITA/SecureGateway-2/21.png)
「作成」をクリック。

▼ ゲートウェイの追加
![22.png](http://seahorse-inc.com/QIITA/SecureGateway-2/22.png)
「ゲートウェイの追加」をクリック。

![23.png](http://seahorse-inc.com/QIITA/SecureGateway-2/23.png)
ゲートウェイ名の入力。ここでは「muraGW」としました。
ここではゲートウェイ接続の際、セキュリテイトークンを確認しない設定にしますので、”クライアントを接続するためにセキュリティー・トークンを必要とする”と”トークン有効期限”のチェックをはずします。
「ゲートウェイの追加」をクリック。

▼ SecureGatewayクライアントの追加
![24.png](http://seahorse-inc.com/QIITA/SecureGateway-2/24.png)
「クライアントの接続」をクリック。

![25.png](http://seahorse-inc.com/QIITA/SecureGateway-2/25.png)
「IBMインストーラのアイコン」をクリック。
ここでは、Windows版のSecureGatewayクライアント　インストーラをダウンロードします。
”ibm-securegateway-client-1.8.0fp3+client_windows.exe”

”×”をクリックしてウインドウを閉じます。

▼ 宛先の追加
![26.png](http://seahorse-inc.com/QIITA/SecureGateway-2/26.png)
「宛先」タブをクリック。
下の「＋」マークをクリック。

![27.png](http://seahorse-inc.com/QIITA/SecureGateway-2/27.png)
「オンプレミス」を選択。
「次へ」をクリック。

![28.png](http://seahorse-inc.com/QIITA/SecureGateway-2/28.png)
MySQLが動作するオンプレミス側環境 （Blumix Infrastructure（SoftLayer））の仮想インスタンス・プライベートIP：「10.132.52.225」とMySQLのポート番号「3306」を入力。
「次へ」をクリック。

![29.png](http://seahorse-inc.com/QIITA/SecureGateway-2/29.png)
ここでは認証を行わないの設定の”TCP”を選びました。
”TCP”は証明書なしで、ゲートウェイと通信できます。
ユーザー/アプリケーションが宛先への接続に使用するプロトコル：「TCP」を選択。
「次へ」をクリック。

![30.png](http://seahorse-inc.com/QIITA/SecureGateway-2/30.png)
宛先で実施される認証の種類は、TLSのオプションです。
前の設定では”TCP”を選択したので、ここでは”None”を選択します。

![31.png](http://seahorse-inc.com/QIITA/SecureGateway-2/31.png)
今回、宛先を非公開にしないので、何も入力せず「次へ」をクリック。

![32.png](http://seahorse-inc.com/QIITA/SecureGateway-2/32.png)
ここでは、この宛先に付ける名前：「オンプレミスMySQL」を入力。
「宛先の追加」をクリック。

<font color="blue"><strong>以上で「４－３. Bluemix側のSecureGateway設定」完了です。</strong></font>

## ４－４. Bluemix側のSecureGatewayクライアント インストール
<font color="orange">《 Blumix Infrastructure（SoftLayer）側作業です 》</font>

前の「４－３. Bluemix側のSecureGateway設定  ▼ SecureGatewayクライアントの追加」でダウンロードした
”ibm-securegateway-client-1.8.0fp3+client_windows.exe”
を使用します。

![33.png](http://seahorse-inc.com/QIITA/SecureGateway-2/33.png)

![34.png](http://seahorse-inc.com/QIITA/SecureGateway-2/34.png)
インストールフォルダーは初期値を使用しました。
「Next」をクリック。

![35.png](http://seahorse-inc.com/QIITA/SecureGateway-2/35.png)
「Japanese」選択 ⇒「Next」をクリック。

![36.png](http://seahorse-inc.com/QIITA/SecureGateway-2/36.png)
ここでは、サービスとして起動しないので、チェックを外す。
「Next」をクリック。

![37.png](http://seahorse-inc.com/QIITA/SecureGateway-2/37.png)
ゲートウェイIDを入力⇒「Next」をクリック。


>【ゲートウェイIDの確認方法】
ゲートウェイIDは、BluemixポータルのSecureGatewayサービスの管理で確認できます。
![38.png](http://seahorse-inc.com/QIITA/SecureGateway-2/38.png)
ここでは、”MJGrTKU2koe_prod_ng”でした。
>

![39.png](http://seahorse-inc.com/QIITA/SecureGateway-2/39.png)
port number(9003)がセットされているのでそのままで、「Install」ボタンをクリック。

<font color="blue"><strong>以上で「４－４. Bluemix側のSecureGatewayクライアント インストール」完了です。</strong></font>

## ４－４. SecureGatewayクライアント設定
SecureGatewayクライアントを起動し、接続を許可するリソースを指定（ここではMySQLへのアクセス許可を設定）します。
デフォルト値でインストールすると、ディレクトリーは
”C:\Program Files (x86)\Secure Gateway Client\ibm\securegateway\client”です。
起動コマンド：secgw.cmd
![40.png](http://seahorse-inc.com/QIITA/SecureGateway-2/40.png)

secgwで起動
![41.png](http://seahorse-inc.com/QIITA/SecureGateway-2/41.png)
configファイルの詳細値を使用して起動するか？との質問に対し、ここでは”Yes”で起動。
起動後、SecureGatewayのコマンドプロンプトが表示され、コマンド待ち受け状態になります。
![42.png](http://seahorse-inc.com/QIITA/SecureGateway-2/42.png)
これで、Bluemix側のSecureGatewayサービスと接続されました。


>【Bluemix側での接続確認】
BluemixポータルのSecureGatewayサービスの管理画面の右上に接続マークが表示されています。
![43.png](http://seahorse-inc.com/QIITA/SecureGateway-2/43.png)>

次に接続を許可するリソースを指定(MySQLへのアクセス許可を設定)します。

SecureGatewayクライアントCLIコマンドの”A”で指定します。
"A hostname:port workerID"
hostname：MySQLインスタンスのプライベートIPアドレス”10.132.52.225”
port：MySQLのポート番号"3306"
workerID：”1”

>【workerIDの確認方法】
>workerIDは、SecureGatewayクライアントCLIコマンドの”L”で確認できます。
![44.png](http://seahorse-inc.com/QIITA/SecureGateway-2/44.png)>

```Command:MySQLへのアクセス許可の設定
> A 10.132.52.225:3306 1
```
![45.png](http://seahorse-inc.com/QIITA/SecureGateway-2/45.png)>

<font color="blue"><strong>以上で「４－４. SecureGatewayクライアント設定」完了です。</strong></font>


## ４－５. DBアクセス用情報の入手
テストプログラムは、PHPでデータアクセスにはPDOを使用します。

▼MySQLへの接続先のホスト名とポート番号入手
<font color="orange">《 Blumix 側作業です 》</font>
BluemixのSecureGateway管理画面から宛先情報を取得します。

![46.png](http://seahorse-inc.com/QIITA/SecureGateway-2/46.png)
"宛先：オンプレミスMySQL"の歯車マークをクリック

![47.png](http://seahorse-inc.com/QIITA/SecureGateway-2/47.png)
クラウド・ホスト：ポートが、プログラムで指定するMySQLへの接続先のホスト名とポート番号です。
ここでは、「cap-sg-prd-1.integration.ibmcloud.com:17872」
情報を保存し、「×」でウィンドウを閉じます。

以上で「４－５. DBアクセス用情報の入手」完了です。


## ４－６. DBアクセス用テストプログラムの作成とBluemixにデプロイ
テストプログラム名称を”index.php”とします。
また、プログラムの保存場所はローカルPCの"c:\phppgm\"フォルダーです。Blumixへのデプロイはいくつかありますが、CloudFoundryの”cfコマンド”を使用しました。
尚、phpでPDOを使用しますので、その設定も合わせて記載しました。


▼ DBアクセス用テストプログラム
"c:\phppgm\index.php"で保存して下さい。
※説明しやすいように行番号(xx)をつけてます。

```Command:DBアクセス用テストプログラム(index.php)
(01)	<?php
(02)	// MySQLへの接続情報
(03)	$hostname = 'cap-sg-prd-1.integration.ibmcloud.com';
(04)	$port = 17872;
(05)	$dbname = 'db1';
(06)	$username = 'usermura';
(07)	$password = 'Mura3root@';
(08)	$dsn = 'mysql:dbname='.$dbname.';host='.$hostname.';port='.$port;
(09)	?>
(10)	
(11)	<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
(12)	<html>
(13)	<head>
(14)	<title>MySQL接続テスト</title>
(15)	<meta http-equiv="viewport" content="width=device-width, initial-scale=1" />
(16)	<meta http-equiv="apple-mobile-web-app-capable" content="yes" />
(17)	</head>
(18)	<body>
(19)	<h1>DBアクセス用テスト</h1>
(20)	<br/>
(21)	<table border="1">
(22)	<tr><th>id</th><th>name</th><th>price</th></tr>
(23)	
(24)	<?php
(25)	try{
(26)		$dbh = new PDO( $dsn, $username, $password );
(27)		if($dbh != null){
(28)			$sql = "SELECT id, name, price FROM fish";
(29)			print $sql;
(30)		$stmt = $dbh->query($sql);
(31)		while($row = $stmt -> fetch(PDO::FETCH_ASSOC)){
(32)		$id = $row['id'];
(33)		$name = $row['name'];
(34)		$price = $row['price'];
(35)		//rowデータ表示
(36)		$tr = "<tr><td>".$id."</td>"
(37)			. "<td>".$name."</td>"
(38)			. "<td>".$price."</td></tr>\n";
(39)		echo $tr;
(40)		}
(41)		$dbh = null;
(42)		}
(43)	}catch( PDOException $e){
(44)		print('Error: '.$e->getMessage());
(45)		die();
(46)	}
(47)	?>
(48)	</table>
(49)	</body>
(50)	</html>
```

<font color="blue"><strong>(03)(04)</strog></font> MySQLへの接続先ホスト名とポート番号
「４－５. DBアクセス用情報の入手　▼MySQLへの接続先のホスト名とポート番号入手」で入手した情報を設定。
<font color="blue"><strong(06)(07)</strog></font>MySQLへのログインID、パスワード
「４－１. MySQLのインストールと設定　▼ MySQLに新規ユーザ追加と権限の設定」で設定したログインID、パスワードを設定。
<font color="blue"><strong>(08))</strog></font> DSN情報を変数$dsnに代入
<font color="blue"><strong>(26))</strog></font> PDOクラスのオブジェクトを作成し、$dbh変数に代入
<font color="blue"><strong>(28))</strog></font> SQL文を変数$sqlへ代入
<font color="blue"><strong>(30))</strog></font> queryメソッドでSQL文を発行し、結果を$stmtオブジェクト変数に挿入
<font color="blue"><strong>(31)-(40))</strog></font> fetchメソッドで、配列変数$rowに代入し表示
データがなくなるまで繰り返し。
<font color="blue"><strong>(43)-(45))</strog></font> try範囲でエラーがあったら、エラーメッセージを表示して終了

▼ Bluemix PHPにPDO設定を拡張
PDOを使用するための設定を行います。
前で作成した”c:\phppgm”フォルダーの下に”.bp-config”を作成し、その中に”options.json”ファイルを作成します。
尚、”.bp-config”フォルダーはドットファイル（フォルダー）のため、コマンドプロンプトでは作成できません。エクスプローラで作成してください。
「c:\phppgm\.bp-config\options.json」

```Command:options.jsonの内容
{
    "PHP_EXTENSIONS": [ "bz2", "zlib", "curl", "mcrypt", "mbstring", "mysql", "pdo", "pdo_mysql", "fileinfo", "ftp", "zip" ]
}
```
PDO以外にも、便利な機能を拡張設定しています。

▼ CloudFoundry CLIツールのインストール
今回、テストプログラムをBluemixへデプロイするには、”CloudFoundry CLIツール”の”cfコマンド”を使用します。
下記URLにアクセスして、ローカルPCにCloudFoundry CLIツールをインストールします。
https://github.com/cloudfoundry/cli/releases
![48.png](http://seahorse-inc.com/QIITA/SecureGateway-2/48.png)
ローカルPCのOSに合ったインストーラーをダウンロードして、インストールしてください。

インストールが完了したら、cfコマンドでログインしてみます。
尚、BluemixのAPIエンドポイントは下記になります。
![49.png](http://seahorse-inc.com/QIITA/SecureGateway-2/49.png)

今回、Bluemixは米国南部地域を使用しますので、API endpointは”https://api.ng.bluemix.net” になります。
BluemixのID、パスワードを準備してください。

```Command:cfログイン
c:\cf login
```
![50.png](http://seahorse-inc.com/QIITA/SecureGateway-2/50.png)
ここではspaceを複数登録しているので、どのspaceかを聞いてきました。
また、次回ログインからはAPI endpointは登録されているので、入力する必要はありません。
一旦ログアウトします。

```Command:cfログアウト
c:\cf logout
```

▼ テストプログラムをBluemixへデプロイ
コマンドプロンプトから、cfコマンドでpushします。
今回は、テストプログラムの構成を記載するmanifest.ymlは指定しません。デフォルト値でデプロイします。

ログイン

```Command:cfログイン
c:\pgppgm\cf login
```
デプロイ

```Command:デプロイ
c:\pgppgm\cf push dbtest20171105
```
ここではプログラム名を「dbtest20171105」としました。

デプロイが正常に完了してプログラムが実行中です。
![51.png](http://seahorse-inc.com/QIITA/SecureGateway-2/51.png)

Bluemixのダッシュボードでも確認できます。
![52.png](http://seahorse-inc.com/QIITA/SecureGateway-2/52.png)

以上で「４－６. DBアクセス用テストプログラムの作成とBluemixにデプロイ」完了です。

# ５. テストプログラムの実行
▼ プログラムの実行
Bluemixダッシュボードでデプロイしたプログラム”dbtest20171105”の行にある
経路”dbtest20171105.mybluemix.net”をダブルクリックして実行します。
![52.png](http://seahorse-inc.com/QIITA/SecureGateway-2/52.png)

▼ 接続確認
![53.png](http://seahorse-inc.com/QIITA/SecureGateway-2/53.png)
データが正常に表示され、正常にDBアクセスできている事が確認できました。


# ６. おわりに
今回は、SecureGatewayクライアントがWindowsパターンでしたが、他のパターンでも書く予定です。