1. はじめに
「SecureGateway」はBluemixで提供されるサービスです。
クラウド環境(Bluemix環境)とオンプレミス環境の間でトンネルを確立し、セキュアな接続を提供します。
これを使えば、クラウド上のBluemixアプリケーションからオンプレミスのDBをアクセスするようなシステムをセキュアに構築することが可能です。
今回は、BluemixでPHPプログラムを作成し、オンプレに見たてたBluemix Infrastructure(SoftLayer)インスタンスのMySQLにアクセスします。
尚、今回のSecureGatewayクライアントはWindows環境のパターンです。
また、基本的な内容を理解するという点に主眼を置いたため、今回TLS認証機能は省いています。
(ご注意) 実システムで構築・利用される際は、セキュリティ対策を十分ご検討の上、適用してください。
2. SecureGatewayについて
Bluemixアプリケーションからオンプレミス、クラウド上のデータにアクセスする際、セキュアな経路を提供。
(宛先タイプ:オンプレミス宛先の例)
2-1. 接続先の宛先タイプ
アクセスするアプリケーションプログラムとアクセスされるDBが、Bluemix環境(SecureGateway資料では「クラウドの宛先」と表記されています)にあるのか、オンプレミス環境にあるのかによって宛先タイプが異なります。
(1)クラウドの宛先
アプリケーションプログラムがオンプレミス、DBがBluemix環境。
(2)オンプレミスの宛先
アプリケーションプログラムがBluemix環境、DBがオンプレミス。
この2つの宛先タイプを組み合わせることにより、双方向での通信処理が可能となります。
(注意)SecureGatewayの無償プラン(Essentials)では、宛先、クライアントそれぞれ1つまでです。
双方向での通信処理では宛先、クライアントが最低2つとなりますので、無償プランではなく有償プラン(ProffesionalまたはEnterprise)を選択する必要があります。
3. テスト構成について
今回は、SecureGateway宛先タイプ:「オンプレミスの宛先」の構成です。
(アプリケーションプログラムがBluemix環境、DBがオンプレミス。)
オンプレミス環境に見たてた、Blumix Infrastructure(SoftLayer)環境に。仮想インスタンスのWindows2012R2をデプロイします。
Windows2012R2には
① Windows用SecureGatewayクライアント
③ MySQL(MAMP3.3)
機能をインストールします。
【Bluemix側環境】
■ 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に合わせてください。
【オンプレミス側環境 (Blumix Infrastructure(SoftLayer))】
■ 仮想インスタンス:
Windows2012R2
プライベートIP:10.132.52.225
プライベートIPのみの設定ですが、インターネット環境にアクセスできるように設定してください。
4. テスト環境の構築
4-1. MySQLのインストールと設定
<《 Blumix Infrastructure(SoftLayer)側作業です 》
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版を使用します。
"MAMP PRO"のチェックを外す⇒「Next」ボタンをクリック。
"I accept the agreement"を選択⇒「Next」ボタンをクリック。
デフォルトのインストールフォルダーは"C:\MAMP"
ここではデフォルトフォルダーは"C:\MAMP"にインストール
「Next」ボタンをクリック。
"Create a desktop icon"をチェック
「Next」ボタンをクリック。
デスクトップにショートカットができていますので、クリックするとMAMPが起動します。
▼ パスの設定
MySQLモニタ起動のために、”c:\mamp\bin\mysql\bin”にパスを通します。
▼ 文字エンコーディングの設定
文字化けしないように、文字エンコーディングの設定を行います。
・DBデータをUTF-8
・MySQLモニタ用にcp932を設定。
c:\mamp\conf\mysql\my.iniをエディターで開いて
・[mysqld]セクションに
character-set-server = utf8
・[mysql]セクションに
default-character-set = cp932
を設定します。
MySQLを再起動します。
「Stop Servers」をクリック⇒「Start Servers」をクリック
▼ MySQLに新規ユーザ追加と権限の設定
MAMPのMySQL初期IDとパスワードは、
・ID: root
・パスワード:root です。
コマンドプロンプトより、MySQLモニターを起動して
rootユーザ(パスワード:root)でMySQLにログイン。
> mysql -u root -proot
今回のテストで使用するユーザを下記内容で作成します。
・ユーザー:「usermura」
・パスワード:「Mura3root@」
また、usermuraの権限をすべて操作できるように設定します。
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」でログインします。
mysql> quit
usermuraユーザ(パスワード:Mura3root@)でMySQLにログイン。
> mysql -u usermura -pMura3root@
以上で「4-1. MySQLのインストールと設定」完了です。
4-2. MySQLテストデータの作成
▼ データベースdb1作成
usermuraユーザでMySQLへログイン後、以降の操作を行います。
mysql> create database db1;
mysql> use db1
▼ テーブルfish作成
mysql> create table fish(id int ,name varchar(20),price varchar(10));
▼ データ登録
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);
▼ 登録データ確認
select * from fish;
以上で「4-2. MySQLテストデータの作成」完了です。
《 Blumix 側作業 》
4-3. Bluemix側のSecureGateway設定
▼ SecureGatewayサービスのオーダー
下記URLより、Bluemixにログインします。
https://console.bluemix.net/home/
ゲートウェイ名の入力。ここでは「muraGW」としました。
ここではゲートウェイ接続の際、セキュリテイトークンを確認しない設定にしますので、”クライアントを接続するためにセキュリティー・トークンを必要とする”と”トークン有効期限”のチェックをはずします。
「ゲートウェイの追加」をクリック。
▼ SecureGatewayクライアントの追加
「クライアントの接続」をクリック。
「IBMインストーラのアイコン」をクリック。
ここでは、Windows版のSecureGatewayクライアント インストーラをダウンロードします。
”ibm-securegateway-client-1.8.0fp3+client_windows.exe”
”×”をクリックしてウインドウを閉じます。
▼ 宛先の追加
「宛先」タブをクリック。
下の「+」マークをクリック。
MySQLが動作するオンプレミス側環境 (Blumix Infrastructure(SoftLayer))の仮想インスタンス・プライベートIP:「10.132.52.225」とMySQLのポート番号「3306」を入力。
「次へ」をクリック。
ここでは認証を行わないの設定の”TCP”を選びました。
”TCP”は証明書なしで、ゲートウェイと通信できます。
ユーザー/アプリケーションが宛先への接続に使用するプロトコル:「TCP」を選択。
「次へ」をクリック。
宛先で実施される認証の種類は、TLSのオプションです。
前の設定では”TCP”を選択したので、ここでは”None”を選択します。
今回、宛先を非公開にしないので、何も入力せず「次へ」をクリック。
ここでは、この宛先に付ける名前:「オンプレミスMySQL」を入力。
「宛先の追加」をクリック。
以上で「4-3. Bluemix側のSecureGateway設定」完了です。
4-4. Bluemix側のSecureGatewayクライアント インストール
《 Blumix Infrastructure(SoftLayer)側作業です 》
前の「4-3. Bluemix側のSecureGateway設定 ▼ SecureGatewayクライアントの追加」でダウンロードした
”ibm-securegateway-client-1.8.0fp3+client_windows.exe”
を使用します。
インストールフォルダーは初期値を使用しました。
「Next」をクリック。
ここでは、サービスとして起動しないので、チェックを外す。
「Next」をクリック。
【ゲートウェイIDの確認方法】
ゲートウェイIDは、BluemixポータルのSecureGatewayサービスの管理で確認できます。
ここでは、”MJGrTKU2koe_prod_ng”でした。
port number(9003)がセットされているのでそのままで、「Install」ボタンをクリック。
以上で「4-4. Bluemix側のSecureGatewayクライアント インストール」完了です。
4-4. SecureGatewayクライアント設定
SecureGatewayクライアントを起動し、接続を許可するリソースを指定(ここではMySQLへのアクセス許可を設定)します。
デフォルト値でインストールすると、ディレクトリーは
”C:\Program Files (x86)\Secure Gateway Client\ibm\securegateway\client”です。
起動コマンド:secgw.cmd
secgwで起動
configファイルの詳細値を使用して起動するか?との質問に対し、ここでは”Yes”で起動。
起動後、SecureGatewayのコマンドプロンプトが表示され、コマンド待ち受け状態になります。
これで、Bluemix側のSecureGatewayサービスと接続されました。
【Bluemix側での接続確認】
BluemixポータルのSecureGatewayサービスの管理画面の右上に接続マークが表示されています。
>
次に接続を許可するリソースを指定(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”で確認できます。
>
> A 10.132.52.225:3306 1
以上で「4-4. SecureGatewayクライアント設定」完了です。
4-5. DBアクセス用情報の入手
テストプログラムは、PHPでデータアクセスにはPDOを使用します。
▼MySQLへの接続先のホスト名とポート番号入手
《 Blumix 側作業です 》
BluemixのSecureGateway管理画面から宛先情報を取得します。
クラウド・ホスト:ポートが、プログラムで指定するMySQLへの接続先のホスト名とポート番号です。
ここでは、「cap-sg-prd-1.integration.ibmcloud.com:17872」
情報を保存し、「×」でウィンドウを閉じます。
以上で「4-5. DBアクセス用情報の入手」完了です。
4-6. DBアクセス用テストプログラムの作成とBluemixにデプロイ
テストプログラム名称を”index.php”とします。
また、プログラムの保存場所はローカルPCの"c:\phppgm\"フォルダーです。Blumixへのデプロイはいくつかありますが、CloudFoundryの”cfコマンド”を使用しました。
尚、phpでPDOを使用しますので、その設定も合わせて記載しました。
▼ DBアクセス用テストプログラム
"c:\phppgm\index.php"で保存して下さい。
※説明しやすいように行番号(xx)をつけてます。
(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>
(03)(04) MySQLへの接続先ホスト名とポート番号
「4-5. DBアクセス用情報の入手 ▼MySQLへの接続先のホスト名とポート番号入手」で入手した情報を設定。
MySQLへのログインID、パスワード
「4-1. MySQLのインストールと設定 ▼ MySQLに新規ユーザ追加と権限の設定」で設定したログインID、パスワードを設定。
(08)) DSN情報を変数$dsnに代入
(26)) PDOクラスのオブジェクトを作成し、$dbh変数に代入
(28)) SQL文を変数$sqlへ代入
(30)) queryメソッドでSQL文を発行し、結果を$stmtオブジェクト変数に挿入
(31)-(40)) fetchメソッドで、配列変数$rowに代入し表示
データがなくなるまで繰り返し。
(43)-(45)) try範囲でエラーがあったら、エラーメッセージを表示して終了
▼ Bluemix PHPにPDO設定を拡張
PDOを使用するための設定を行います。
前で作成した”c:\phppgm”フォルダーの下に”.bp-config”を作成し、その中に”options.json”ファイルを作成します。
尚、”.bp-config”フォルダーはドットファイル(フォルダー)のため、コマンドプロンプトでは作成できません。エクスプローラで作成してください。
「c:\phppgm.bp-config\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
ローカルPCのOSに合ったインストーラーをダウンロードして、インストールしてください。
インストールが完了したら、cfコマンドでログインしてみます。
尚、BluemixのAPIエンドポイントは下記になります。
今回、Bluemixは米国南部地域を使用しますので、API endpointは”https://api.ng.bluemix.net” になります。
BluemixのID、パスワードを準備してください。
c:\cf login
ここではspaceを複数登録しているので、どのspaceかを聞いてきました。
また、次回ログインからはAPI endpointは登録されているので、入力する必要はありません。
一旦ログアウトします。
c:\cf logout
▼ テストプログラムをBluemixへデプロイ
コマンドプロンプトから、cfコマンドでpushします。
今回は、テストプログラムの構成を記載するmanifest.ymlは指定しません。デフォルト値でデプロイします。
ログイン
c:\pgppgm\cf login
デプロイ
c:\pgppgm\cf push dbtest20171105
ここではプログラム名を「dbtest20171105」としました。
以上で「4-6. DBアクセス用テストプログラムの作成とBluemixにデプロイ」完了です。
5. テストプログラムの実行
▼ プログラムの実行
Bluemixダッシュボードでデプロイしたプログラム”dbtest20171105”の行にある
経路”dbtest20171105.mybluemix.net”をダブルクリックして実行します。
▼ 接続確認
データが正常に表示され、正常にDBアクセスできている事が確認できました。
6. おわりに
今回は、SecureGatewayクライアントがWindowsパターンでしたが、他のパターンでも書く予定です。