本年4月から個人情報保護法が本格施行され,セキュリティに対する関心や必要性が高まっている。データベースは様々なデータを格納しており,重要なセキュリティ対策対象である。MySQLは,ネットワーク上の盗聴に対応するための暗号化接続をサポートしている。今回は,MySQL 5.0を使用した,SSLによる暗号化接続の設定方法を紹介する。

ネットワークの盗聴による情報流出

 MySQLをデフォルトの状態で使用するとサーバーとクライアント間の通信は,暗号化されずに送受信される。これらのパケットは,パケット・キャプチャ・ソフトを使用すれば,簡単に参照することができる。例えば,リスト1のような処理をクライアントで実行したとする。


リスト1●テーブル「member」の内容参照

mysql> select * from member;
+----+-------+------------------+----------+--------------+---------+------+
| No | Code  | Name             | Zip      | Tel          | Country | Job  |
+----+-------+------------------+----------+--------------+---------+------+
|  1 | A0001 | Satou Eiichi     | 100-0006 | 03-3284-7601 |       1 |    4 |
|  2 | A0002 | Suzuki Yoshiyuki | 100-0006 | 03-3284-7601 |       1 |    1 |
|  3 | B0001 | Zeev Suraski     | NULL     | NULL         |       4 |    2 |
|  4 | B0002 | Andi Gutmans     | NULL     | NULL         |       2 |    3 |
|  5 | C0005 | John Coggeshall  | NULL     | NULL         |       2 |    3 |
+----+-------+------------------+----------+--------------+---------+------+
5 rows in set (0.11 sec)
 するとネットワーク上では,リスト2のような内容のパケットがクライアントからサーバーに送られる。

リスト2●クライアントからサーバーへ送信されたパケットの内容

[パケット情報] (192.168.1.99(1061) -> 192.168.1.103(3306) 25 オクテット
 [ACK/PSH] seq=2119491 (next=2119516) ack=3737877293)
	取得時間 : 20:25:29
	パケットサイズ : 79 オクテット
 [データ] 25 (25 オクテット)
	00000000 : 15 00 00 00 03 73 65 6c 65 63 74 20 2a 20 66 72 .....select * fr
	00000001 : 6f 6d 20 6d 65 6d 62 65 72                      om member
 処理結果として,サーバーからクライアントにはリスト3のようなパケットが送信される。

リスト3●サーバーからクライアントへ送信されたパケットの内容

[パケット情報] (192.168.1.103(3306) -> 192.168.1.99(1061) 560 オクテット
 [ACK/PSH] seq=3737877293 (next=3737877853) ack=2119516)
	取得時間 : 20:25:29
	パケットサイズ : 614 オクテット
 [データ] 560 (560 オクテット)
	00000000 : 01 00 00 01 07 29 00 00 02 03 64 65 66 03 64 62 .....)....def.db
	00000001 : 31 06 6d 65 6d 62 65 72 06 6d 65 6d 62 65 72 02 1.member.member.
	00000002 : 4e 6f 02 4e 6f 0c 3f 00 0a 00 00 00 03 03 42 00 No.No.?.......B.
	00000003 : 00 00 2d 00 00 03 03 64 65 66 03 64 62 31 06 6d ..-....def.db1.m
(以下略,全体表示
 このようにネットワーク上のパケットを解析すれば,その通信内容が簡単に参照できる。その手軽さは,「盗聴」というよりも「立ち読み」といった感じだろう。

 SSLによる暗号化通信の場合には,リスト4のようになる。こうすればまったく読むことはできない。セキュリティを強化するにためはぜひとも導入したい。


リスト4●SSLにより暗号化されたパケットの内容

[パケット情報] (192.168.1.103(3306) -> 192.168.1.99(1173) 597 オクテット
 [ACK/PSH] seq=1199254064 (next=1199254661) ack=14939407)
	取得時間 : 23:59:12
	パケットサイズ : 651 オクテット
[データ] 597 (597 オクテット)
	00000000 : 17 03 01 02 50 7c 7f c9 f0 8e 82 69 32 a0 43 fb ....P|.....i2.C.
	00000001 : 24 68 2e 3e 4b a6 39 e8 03 74 e7 7b 17 8c 8e 3e $h.>K.9..t.{...>
	00000002 : 1d 0e b6 94 de 24 65 75 bc 65 6a 40 79 45 f4 b5 .....$eu.ej@yE..
	00000003 : b6 ec bd 03 e5 f9 a3 26 f1 b0 fb 4a 96 99 cb 5a .......&...J...Z
(以下略,全体表示
 なお,SSLによる暗号化通信を行う場合,サーバーおよびクライアントに暗号化および復調化のためのオーバーヘッドが生じる。そのため,処理速度を重要視する場合には,考慮する必要がある。

 それでは,MySQL 5.0によるSSL暗号化通信を実際に行ってみよう。

【訂正】
掲載時,リスト3のタイトルが「クライアントからサーバーへ送信されたパケットの内容」となっておりましたが,正しくは「サーバーからクライアントへ送信されたパケットの内容」です。お詫びして訂正いたします。