1. はじめに
「SecureGateway」はBluemixで提供されるサービスです。
クラウド環境(Bluemix環境)とオンプレミス環境の間でトンネルを確立し、セキュアな接続を提供します。
これを使えば、クラウド上のBluemixアプリケーションからオンプレミスのDBをアクセスするようなシステムをセキュアに構築することが可能です。
今回は、BluemixでPHPプログラムを作成し、オンプレに見たてたBluemix Infrastructure(SoftLayer)インスタンスのMySQLにアクセスします。
尚、今回のSecureGatewayクライアントはLinux(ubuntu)環境のパターンです。
また、基本的な内容を理解するという点に主眼を置いたため、今回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)環境に。仮想インスタンスのubuntu1604をデプロイします。
Ubuntu1604には
① ubuntu用SecureGatewayクライアント
③ MySQL(LAMP)
機能をインストールします。
【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))】
■ 仮想インスタンス:
Ubuntu Linux 16.04 LTS Xenial Xerus Minimal Install (64 bit)
プライベートIP:10.132.52.225
プライベートIPのみの設定ですが、インターネット環境にアクセスできるように設定してください。
・Server version: Apache/2.4.18 (Ubuntu)
・mysql Ver 14.14 Distrib 5.7.20, for Linux (x86_64) using EditLine wrapp
4. テスト環境の構築
4-1. ubuntuの設定とMySQLのインストール、初期設定
<《 Blumix Infrastructure(SoftLayer)側作業です 》
▼ ubuntu関連
パッケージリストの更新
# apt-get update
ubuntuインストールされてるパッケージの更新
# apt-get -y upgrade
ubuntuインストールされてるカーネルの更新
# apt-get -y dist-upgrade
ubuntuを日本語環境にする
日本語関連のパッケージをインストール
# apt-get -y install language-pack-ja-base language-pack-ja ibus-mozc
システムの文字セットを日本語に変更
# localectl set-locale LANG=ja_JP.UTF-8 LANGUAGE="ja_JP:ja"
# source /etc/default/locale
▼ LAMPのインストール
LAMPはtaskselでインストールします。
taskselのインストール
# apt-get -y install tasksel
taskselでLAMPをインストールします。
途中で”root”のパスワードを聞いてきます。ここではパスワードを”root"としました。
# tasksel install lamp-server
▼ MySQLの構成設定
MySQLの構成ファイルは、一般的に「/etc/mysql/my.cnf」にあるはずですが、これを開くと、
「!includedir /etc/mysql/conf.d/」の指定があり、実体として「/etc/mysql/mysql.conf.d/mysqld.cnf」がMySQLの構成ファイルとなります。
# nano /etc/mysql/mysql.conf.d/mysqld.cnf
・文字コードをutf-8へ変更
mysqld.cnfへ下記内容を追加します。
ここでは、[client]セクションがなかったので、[client]も追加しました。
[client]
default-character-set = utf8
[mysqld]
skip-character-set-client-handshake
character-set-server = utf8
collation-server = utf8_general_ci
init-connect = SET NAMES utf8
・ネットワークの設定変更
デフォルト値は、bind-address=127.0.0.1 の設定で、自分自身からでないと接続できません。
ここでは、すべてのIPからアクセスできるように行の先頭に「#」をいれ、コメントアウトします。
・念のため、MySQLの再起動
/etc/init.d/mysql restart
・LAMPバージョン確認
# apache2 -v
# mysql --version
# php --version
以下のバージョンがインストールされました。
・Server version: Apache/2.4.18 (Ubuntu)
・mysql Ver 14.14 Distrib 5.7.20, for Linux (x86_64) using EditLine wrapp
・PHP 7.0.22-0ubuntu0.16.04.1 (cli) ( NTS )
以上で「4-1. ubuntuの設定とMySQLのインストール、初期設定」完了です。
4-2. MySQLユーザ作成
▼ 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-2. MySQLユーザ作成」完了です。
4-3. 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-3. MySQLテストデータの作成」完了です。
《 Blumix 側作業 》
4-4. Bluemix側のSecureGateway設定
▼ SecureGatewayサービスのオーダー
下記URLより、Bluemixにログインします。
https://console.bluemix.net/home/
ゲートウェイ名の入力。ここでは「muraGW」としました。
ここではゲートウェイ接続の際、セキュリテイトークンを確認しない設定にしますので、”クライアントを接続するためにセキュリティー・トークンを必要とする”と”トークン有効期限”のチェックをはずします。
「ゲートウェイの追加」をクリック。
▼ SecureGatewayクライアントの追加
「クライアントの接続」をクリック。
「IBMインストーラのアイコン」をクリック。
ここでは、Ubuntu14+版のSecureGatewayクライアント インストーラをダウンロードします。
”ibm-securegateway-client-1.8.0fp3+client_amd64.deb”
下記サイトからもダウンロードできます。
https://sgmanager.ng.bluemix.net/installers/ibm-securegateway-client-1.8.0fp3+client_amd64.deb
”×”をクリックしてウインドウを閉じます。
▼ 宛先の追加
「宛先」タブをクリック。
下の「+」マークをクリック。
MySQLが動作するオンプレミス側環境 (Blumix Infrastructure(SoftLayer))の仮想インスタンス・プライベートIP:「10.132.52.225」とMySQLのポート番号「3306」を入力。
「次へ」をクリック。
ここでは認証を行わないの設定の”TCP”を選びました。
”TCP”は証明書なしで、ゲートウェイと通信できます。
ユーザー/アプリケーションが宛先への接続に使用するプロトコル:「TCP」を選択。
「次へ」をクリック。
宛先で実施される認証の種類は、TLSのオプションです。
前の設定では”TCP”を選択したので、ここでは”None”を選択します。
今回、宛先を非公開にしないので、何も入力せず「次へ」をクリック。
ここでは、この宛先に付ける名前:「オンプレミスMySQL」を入力。
「宛先の追加」をクリック。
以上で「4-4. Bluemix側のSecureGateway設定」完了です。
4-5. Bluemix側のSecureGatewayクライアント インストール
《 Blumix Infrastructure(SoftLayer)側作業です 》
前の「4-4. Bluemix側のSecureGateway設定 ▼ SecureGatewayクライアントの追加」でダウンロードした
”ibm-securegateway-client-1.8.0fp3+client_amd64.deb”
を使用します。
ダウンロードをローカルPCで行った場合、WinSCPなどを使用して、ubuntu1604に
転送しておきます。
ここでは、ubuntu1604の/tmpディレクトリーに転送しました。
SecureGatewayクライアントパッケージをインストールします。
アーカイブ名:「ibm-securegateway-client-1.8.0fp3+client_amd64.deb」
パッケージ名:「ibm-securegateway-client」>
# dpkg -i ibm-securegateway-client-1.8.0fp3+client_amd64.deb
インストールの途中で下記内容を聞いてきます。
※入力タイムアウトで先に進んでいきますが、後で「/etc/ibm/sgenvironment.conf」で設定できます。
(1)プロセスの自動開始
アップグレード、再インストールの際、既存停止するか。
ここでは、”No"にし、手動で再始動の設定にしました。
(2)ゲートウェイID
【ゲートウェイIDの確認方法】
ゲートウェイIDは、BluemixポータルのSecureGatewayサービスの管理で確認できます。
ここでは、”oAhEVELREvJ_prod_ng”でした。
(3)セキュリティー・トークン
ここでは、セキュリティー・トークンを使用しないので「none」。
(4)ロギング・レベル
デフォルト値の「INFO」。
(5)アクセス制御リスト
後ほど設定しますので、入力なし。
root@ubuntu1604:/tmp# dpkg -i ibm-securegateway-client-1.8.0fp3+client_amd64.deb
以前に未選択のパッケージ ibm-securegateway-client を選択しています。
(データベースを読み込んでいます ... 現在 98719 個のファイルとディレクトリがインストールされています。)
ibm-securegateway-client-1.8.0fp3+client_amd64.deb を展開する準備をしています ...
[preinst] =============================================================================
[preinst] Started on: Thursday - November 09, 2017 - 01:45:50.988250135
[preinst] Running for userid: root with uid: 0
[preinst] The operation for this install is: install
[preinst] =============================================================================
[preinst] INFO: Performing install operation.
Stop and restart the client during install or upgrade? [y/n]?n
[preinst] INFO:
[preinst] INFO: Creating the secgwadmin GID for Secure Gateway client.
[preinst] INFO: The group secgwadmin does not exist, creating it...
[preinst] INFO: The group secgwadmin was created successfully.
[preinst] INFO: Checking to make sure the GID for secgwadmin was created.
[preinst] INFO: Creating the secgwadmin UID for Secure Gateway client.
[preinst] INFO: The user secgwadmin does not exist, creating it without a homedir...
[preinst] INFO: The user secgwadmin was created successfully.
[preinst] INFO: Checking to make sure the homedir for secgwadmin was created.
[preinst] =============================================================================
[preinst] Completed with SUCCESS
[preinst] Ended on: Thursday - November 09, 2017 - 01:45:52.365285823
[preinst] =============================================================================
[preinst]
[preinst]
ibm-securegateway-client (1.8.0fp3) を展開しています...
ibm-securegateway-client (1.8.0fp3) を設定しています ...
[postinst] =============================================================================
[postinst] Started on: Thursday - November 09, 2017 - 01:45:56.059521006
[postinst] Running for userid: root with uid: 0
[postinst] The operation for this install is: configure
[postinst] =============================================================================
[postinst] INFO: Performing configure operation
[postinst] INFO: Checking if /var/empty is in filesystem
[postinst] INFO: Checking if mail folder for /var/mail/securegateway is in filesystem
[postinst] INFO: Creating mail folder for /var/mail/securegateway
[postinst] INFO: Checking if /var/log/securegateway is in filesystem
[postinst] WARNING: /var/log/securegateway is NOT in filesystem, creating it
[postinst] INFO: Stop and restart the client during this installation: No
[postinst] WARNING: Either you entered No or the prompt to stop and restart the client lapsed!
[postinst] WARNING: The client will NOT be stopped and restarted during this installation.
[postinst] WARNING: You must stop and restart the client manually after the installation has completed.
Enter the gateway IDs, separated by spaces: oAhEVELREvJ_prod_ng
[postinst] INFO:
[postinst] INFO: The gateway ID for this install is: oAhEVELREvJ_prod_ng
Enter the gateway ID security tokens separated by spaces, enter 'none' for no security token: none
[postinst] INFO:
[postinst] INFO: The security token entered is: none
[postinst] INFO: Do you wish to change the startup logging level, values are INFO, DEBUG, ERROR or TRACE, default is INFO
Enter log level for each gateway separated by spaces. Enter 'none' or 'INFO' for default log level: INFO
[postinst] INFO:
[postinst] INFO: The logging level for this secure gateway instance is set to: INFO
[postinst] INFO: Supply ACL File for processing [optional].
Supply ACL File each gateway separated by spaces. Enter none if no ACL file: none
[postinst] INFO:
[postinst] INFO: The Access Control List (ACL) file is set to: none
Would you like to use the client UI (Y/N): y
Please provide the port the run client UI, default is 9003:
[postinst] WARNING: Invalid value provided, setting port to default 9003.
[postinst] INFO: Your responses have been saved in the /etc/ibm/sgenvironment.conf configuration file.
/sbin/init: unrecognized option '--version'
省略
以上で「4-5. Bluemix側のSecureGatewayクライアント インストール」完了です。
4-6. SecureGatewayクライアント設定
▼ アクセス制御リストの作成
アクセス制御リストは、オンプレミスのリソース(ここではMySQL)に対してのアクセス許可と拒否を定義します。
今回の例は、unbuntu1604のプライベートアドレス(10.132.52.225)、MySQLのポート(3306)への接続許可設定です。
設定方法は、
(1) ACLの登録
”/opt/ibm/securegateway/client/”のサンプル「SampleACLFile.txt」をコピーして登録します。
ここでは、”/opt/ibm/securegateway/client/ACLFile.txt”としました。
(2) ACLファイルの指定
”/etc/ibm/sgenvironment.conf”にACLファイルを絶対パスで指定します。
/opt/ibm/securegateway/client# cp SampleACLFile.txt ACLFile.txt
# nano /opt/ibm/securegateway/client/ACLFile.txt
サンプルのデータをすべて消して、「acl allow 10.132.52.225:3306」を登録します。
# nano /etc/ibm/sgenvironment.conf
▼ SecureGatewayクライアント自動起動の設定
起動の設定方法は色々ありますが、今回は”systemctl”で設定します。
# systemctl enable securegateway_client.service
システムを再起動して、正常に動作しているか確認してください。
尚、起動状況は下記ログで確認できます。
「/var/log/securegateway/client_console_xxxxxxx.log」(xxxxxxxは日付け)
【Bluemix側での接続確認】
BluemixポータルのSecureGatewayサービスの管理画面の右上に接続マークが表示されます。
以上で「4-6. SecureGatewayクライアント設定」完了です。
4-7. DBアクセス用情報の入手
テストプログラムは、PHPでデータアクセスにはPDOを使用します。
▼MySQLへの接続先のホスト名とポート番号入手
《 Blumix 側作業です 》
BluemixのSecureGateway管理画面から宛先情報を取得します。
クラウド・ホスト:ポートが、プログラムで指定するMySQLへの接続先のホスト名とポート番号です。
ここでは、「cap-sg-prd-2.integration.ibmcloud.com:17247」
情報を保存し、「×」でウィンドウを閉じます。
以上で「4-7. DBアクセス用情報の入手」完了です。
4-8. 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-2.integration.ibmcloud.com';
(04) $port = 17247;
(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-7. DBアクセス用情報の入手 ▼MySQLへの接続先のホスト名とポート番号入手」で入手した情報を設定。
MySQLへのログインID、パスワード
「4-2. 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 dbtest201711091
ここではプログラム名を「dbtest201711091」としました。
以上で「4-6. DBアクセス用テストプログラムの作成とBluemixにデプロイ」完了です。
5. テストプログラムの実行
▼ プログラムの実行
Bluemixダッシュボードでデプロイしたプログラム”dbtest201711091”の行にある
経路”dbtest201711091.mybluemix.net”をダブルクリックして実行します。
▼ 接続確認
データが正常に表示され、正常にDBアクセスできている事が確認できました。
6. おわりに
SecureGatewayクライアント側のパターンをDocker 、Windows(Windows2012R2)、Linux(Ubuntu 16.04)の3パターンで確認しました。
次は、SecureGatewayクライアントとDBサーバの分離について書く予定です。