本年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のタイトルが「クライアントからサーバーへ送信されたパケットの内容」となっておりましたが,正しくは「サーバーからクライアントへ送信されたパケットの内容」です。お詫びして訂正いたします。