LoginSignup
1
2

More than 5 years have passed since last update.

<SecureGatewayの勉強1>クラウドのBluemixアプリからオンプレミスのDBをセキュアにアクセス。(SecureGatewayクライアント:Docker編)

Last updated at Posted at 2017-10-29

1. はじめに

「SecureGateway」はBluemixで提供されるサービスです。
クラウド環境(Bluemix環境)とオンプレミス環境の間でトンネルを確立し、セキュアな接続を提供します。
これを使えば、クラウド上のBluemixアプリケーションからオンプレミスのDBをアクセスするようなシステムをセキュアに構築することが可能です。
今回は、BluemixでPHPプログラムを作成し、オンプレに見たてたBluemix Infrastructure(SoftLayer)インスタンスのMySQLにアクセスします。
尚、今回のSecureGatewayクライアントはDocker環境のパターンです。
また、基本的な内容を理解するという点に主眼を置いたため、今回TLS認証機能は省いています。
(ご注意) 実システムで構築・利用される際は、セキュリティ対策を十分ご検討の上、適用してください。

2. SecureGatewayについて

Bluemixアプリケーションからオンプレミス、クラウド上のデータにアクセスする際、セキュアな経路を提供。
01.png
(宛先タイプ:オンプレミス宛先の例)

2-1. 接続先の宛先タイプ

アクセスするアプリケーションプログラムとアクセスされるDBが、Bluemix環境(SecureGateway資料では「クラウドの宛先」と表記されています)にあるのか、オンプレミス環境にあるのかによって宛先タイプが異なります。

(1)クラウドの宛先
アプリケーションプログラムがオンプレミス、DBがBluemix環境。
02.png

(2)オンプレミスの宛先
アプリケーションプログラムがBluemix環境、DBがオンプレミス。
03.png

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

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

3. テスト構成について

今回は、SecureGateway宛先タイプ:「オンプレミスの宛先」の構成です。
(アプリケーションプログラムがBluemix環境、DBがオンプレミス。)
オンプレミス環境に見たてた、Blumix Infrastructure(SoftLayer)環境に。仮想インスタンスのCentOS7をデプロイします。
CentOS7には
① SecureGatewayクライアント用のDocker
② SecureGatewayクライアント
③ MySQL

機能をインストールします。

【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))】
■ 仮想インスタンス:
CentOS Linux release 7.4.1708 (Core)
プライベートIP:10.132.52.225
プライベートIPのみの設定ですが、インターネット環境にアクセスできるように設定してください。
■ Docker:Docker version 17.09.0-ce, build afdb6d4

4. テスト環境の構築

4-1. CentOS7初期作業

《 Blumix Infrastructure(SoftLayer)側での作業です 》

4-1-1. CentOS7ツールのインストール

ここではエディターのnanoと画面多重のためにscreenをインストールしました。

CentOS7ツールのインストール
# yum install -y nano
# yum install -y screen

4-1-2. CentOS7のアップデート

CentOS7のアップデート
# yum -y update

以上で「4-1. CentOS7初期作業」完了です。

4-2. Dockerのインストールと設定

《 Blumix Infrastructure(SoftLayer)側作業です 》
▼ Dockerがインストールされていたら、削除する

Dockerの削除
# yum remove docker docker-common docker-selinux docker-engine

▼ 必要なパッケージのインストール

必要なパッケージをインストール
# yum install -y yum-utils device-mapper-persistent-data lvm2

▼ レポジトリ追加

レポジトリ追加
# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

▼ yumのパッケージインデックスを更新

yumパッケージインデックス更新
# yum makecache fast

▼ Docker最新バージョンのインストール

Dockerインストール
# yum install -y docker-ce

▼ Dockerの起動

Dockerの起動
# systemctl start docker

▼ Dockerの動作確認
"Hello from Docker!"が表示されるか確認する

Dockerの動作確認
# docker run hello-world

04.png
"Hello from Docker!"が表示されたので、Dockerは正常動作した。

▼ 念のためdockerグループの登録
(すでにできているはずですが、念のため)

Dockerグループの登録
# groupadd docker

▼ 現在のユーザーをdockerグループに登録

ユーザーをdockerグループに登録
# usermod -aG docker $USER

▼ OS起動時にDockerを自動起動する

Dockerを自動起動設定
# systemctl enable docker

以上で「4-2. Dockerのインストールと設定」完了です。

4-3. MySQLのインストールと設定

<《 Blumix Infrastructure(SoftLayer)側作業です 》

▼ MariaDBの削除
CentOS7にはMySQLではなく、MariaDBが入っているので削除する

MariaDBの削除
# yum remove -y mariadb-libs.x86_64
# rm -rf /var/lib/mysql/

▼ MySQL yumリポジトリーの追加
今回インストールするMySQLは5.7。
下記アドレスにから関連情報を入手します。
https://dev.mysql.com/downloads/repo/yum/
05.png
”Red Hat Enterprise Linux 7 / Oracle Linux 7 "右の「Download」ボタンをクリック。
06.png
「No thanks, just start my download.」文字にポインターを合わせ、右クリックでリンクのコピー。
コピーの内容は下記でした。この内容でリポジトリー追加を行います。
https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm

MySQLyumリポジトリーの追加
# yum -y localinstall https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm

▼ MySQLのバージョンを確認

MySQLバージョン確認
# yum info mysql-community-server

07.png

▼ MySQL5.7のインストール

MySQL5.7のインストール
# yum -y install mysql-community-server

▼ MySQL5.7のインストール確認

MySQL5.7のインストール確認
# mysql --version

”mysql Ver 14.14 Distrib 5.7.20, for Linux (x86_64) using EditLine wrapper”

▼ MySQL自動起動の設定

MySQL自動起動の設定
#systemctl enable mysqld.service

▼ MySQLのroot初期パスワードの確認
初期パスワードは、”/var/log/mysqld.log”に書かれているので、MySQLを起動してパスワードを確認する。

MySQL初期パスワードの確認
# systemctl start mysqld.service
# cat /var/log/mysqld.log | grep root 

"2017-10-23T22:32:48.184856Z 1 [Note] A temporary password is generated for root@localhost: hleHXtMPr5+E"
初期パスワードは「hleHXtMPr5+E」でした。

▼ MySQLの初期設定
「mysql_secure_installation」コマンドで、対話形式にrootパスワード変更や、その他初期設定を行う。
ここで設定したのは、
・rootパスワード変更 ⇒ "Mura3root@"
・匿名ユーザーの削除 ⇒ "No"
・リモートホストからrootログイン禁止 ⇒ "No"
・テスト用データベース削除 ⇒ "No"
・ユーザー権限が保存されているテーブルをリロード ⇒ "Yes"
です。
尚、新しく設定するパスワードは「8文字以上かつ英大文字・小文字・数字・記号」を含む必要があります。
(ここでは設定しませんが、パスワードを制限なく自由に決める場合は、「/etc/my.cnf」に”validate_password_policy=LOW”を追加し、MySQLを再起動します。)

MySQLの初期設定
# mysql_secure_installation

08.png

▼ MySQL文字コードをUTF-8にセット
「/etc/my.cnf」に次の2行を追記して再起動。
character_set_server=utf8
skip-character-set-client-handshake

MySQL文字コードをUTF-8にセット
# nano /etc/my.cnf
# systemctl restart mysqld.service

▼ MySQLに新規ユーザ追加と権限の設定
rootユーザ(パスワード:Mura3root@)でMySQLにログイン

rootユーザでMySQLにログイン
# mysql -u root -pMura3root@

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

MySQLに新規ユーザ追加と権限の設定
mysql> CREATE USER usermura IDENTIFIED BY 'Mura3root@';
mysql> grant all privileges on *.* to usermura@"%"  with grant option ;

MySQLコマンドラインを終了し、再度「usermura」でログインします。

MySQLにusermuraで再ログイン
mysql> quit
# mysql -u uasermura -pMura3root@

正常にログインできるか確認してください。

以上で「4-3. MySQLのインストールと設定」完了です。

4-4. MySQLテストデータの作成

《 Blumix Infrastructure(SoftLayer)側作業です 》
usermuraでログインします。
ここでは、下記内容でデータを作成します。
データベース名:「db1」
テーブル名:「fish」
カラム:id 数値 , name 可変長文字列, price 可変長文字列

▼ データベースdb1作成

データベースdb1作成
mysql> create database db1;
mysql> use db1

▼ テーブルfish作成

テーブル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;

09.png
確認したら、「quit」で終了してください。

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

《 Blumix 側作業 》

4-5. Bluemix側のSecureGateway設定

▼ SecureGatewayサービスのオーダー
下記URLより、Bluemixにログインします。
https://console.bluemix.net/home/

10.png
「カタログ」より「SecureGateway」をクリック。

11.png
「作成」をクリック。

▼ ゲートウェイの追加
12.png
「ゲートウェイの追加」をクリック。

13.png
ゲートウェイ名の入力。ここでは「muraGW」としました。
ここではゲートウェイ接続の際、セキュリテイトークンを確認しない設定にしますので、”クライアントを接続するためにセキュリティー・トークンを必要とする”と”トークン有効期限”のチェックをはずします。
「ゲートウェイの追加」をクリック。

▼ SecureGatewayクライアントの追加
14.png
「クライアントの接続」をクリック。

15.png
「Dockerのアイコン」をクリック。

16.png
"docker run -it ibmcom/secure-gateway-client TDhz3N9U1Gb_prod_ng"をコピーして保存します。後程、SecureGatewayクライアントのインストールで使用します。
”×”をクリックしてウインドウを閉じます。

▼ 宛先の追加
17.png
「宛先」タブをクリック。
下の「+」マークをクリック。

18.png
「オンプレミス」を選択。
「次へ」をクリック。

19.png
MySQLが動作するオンプレミス側環境 (Blumix Infrastructure(SoftLayer))の仮想インスタンス・プライベートIP:「10.132.52.225」とMySQLのポート番号「3306」を入力。
「次へ」をクリック。

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

21.png
宛先で実施される認証の種類は、TLSのオプションです。
前の設定では”TCP”を選択したので、ここでは”None”を選択します。

22.png
今回、宛先を非公開にしないので、何も入力せず「次へ」をクリック。

23.png
ここでは、この宛先に付ける名前:「オンプレミスMySQL」を入力。
「宛先の追加」をクリック。

以上で「4-5. Bluemix側のSecureGateway設定」完了です。

4-6. Bluemix側のSecureGatewayクライアント設定

《 Blumix Infrastructure(SoftLayer)側作業です 》

前の「4-2. Dockerのインストールと設定」でDockerを設定したインスタンスに、「4-5. Bluemix側のSecureGateway設定 ▼ SecureGatewayクライアントの追加」で取得した、"docker run -it ibmcom/secure-gateway-client TDhz3N9U1Gb_prod_ng"でSecureGatewayクライアントを設定します。
尚、Deckerのディフォルトネットワークモードは”ブリッジモード”ですが、”ホストモード”でないと接続できない場合がある為、「--net=host」パラメータを付加して実行します。

SecureGatewayクライアントの起動
docker run -it --net=host ibmcom/secure-gateway-client TDhz3N9U1Gb_prod_ng

24.png
Bluemix側のSecureGateway管理画面で接続が確認できます。
25.png
26.png

以上で「4-6. Bluemix側のSecureGatewayクライアント設定」完了です。

4-7. DBアクセス用テストプログラムの作成と登録

テストプログラムは、PHPでデータアクセスにはPDOを使用します。
また、プログラムで指定するMySQLへの接続先の、ホスト名、ポート番号情報は、
「4-5. Bluemix側のSecureGateway設定 ▼宛先の追加」に登録されています。

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

27.png
"宛先:オンプレミスMySQL"の歯車マークをクリック

28.png
クラウド・ホスト:ポートが、プログラムで指定するMySQLへの接続先のホスト名とポート番号です。
ここでは、「cap-sg-prd-1.integration.ibmcloud.com:15758」
情報を保存し、「×」でウィンドウを閉じます。

以上で「4-7. DBアクセス用テストプログラムの作成と登録」完了です。

4-8. DBアクセス用テストプログラムの作成とBluemixにデプロイ

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

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

DBアクセス用テストプログラム(index.php)
(01)    <?php
(02)    // MySQLへの接続情報
(03)    $hostname = 'cap-sg-prd-1.integration.ibmcloud.com';
(04)    $port = 15758;
(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-3. 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」

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
29.png
ローカルPCのOSに合ったインストーラーをダウンロードして、インストールしてください。

インストールが完了したら、cfコマンドでログインしてみます。
尚、BluemixのAPIエンドポイントは下記になります。
30.png
今回、Bluemixは米国南部地域を使用しますので、API endpointは”https://api.ng.bluemix.net” になります。
BluemixのID、パスワードを準備してください。

cfログイン
c:\cf login

31.png
ここではspaceを複数登録しているので、どのspaceかを聞いてきました。
また、次回ログインからはAPI endpointは登録されているので、入力する必要はありません。
一旦ログアウトします。

cfログアウト
c:\cf logout

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

ログイン

cfログイン
c:\pgppgm\cf login

デプロイ

デプロイ
c:\pgppgm\cf push dbtest20171001

ここではプログラム名を「dbtest20171001」としました。

デプロイが正常に完了してプログラムが実行中です。
32.png

Bluemixのダッシュボードでも確認できます。
33.png

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

5. テストプログラムの実行

DockerのSecuregatewayクラインとが起動していない場合、起動します。

SecureGatewayクライアントの起動
docker run -it --net=host ibmcom/secure-gateway-client TDhz3N9U1Gb_prod_ng

▼ 接続を許可するリソースを指定
SecureGatewayクライアントCLIコマンドの”A”で指定します。
"A hostname:port workerID"
hostname:MySQLインスタンスのプライベートIPアドレス”10.132.52.225”
port:MySQLのポート番号"3306"
workID:”1” SecureGatewayクライアントCLIコマンドの”L”で確認できます。
34.png

アクセス制御リストの許可設定
> A 10.132.235.118:3306 1

35.png

▼ プログラムの実行
Bluemixダッシュボードでデプロイしたプログラム”dbtest20171001”の行にある
経路”dbtest20171001.mybluemix.net”をダブルクリックして実行します。
36.png

▼ 接続確認
37.png
データが正常に表示され、正常にDBアクセスできている事が確認できました。

6. おわりに

MySQLやPHPプログラム、デプロイ操作など、詳細に記載したため多少長くなってしましました。
今回は、SecureGatewayクライアントがDockerパターンでしたが、他のパターンでも書く予定です。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2