ご利用のブラウザは、JavaScript が無効 となっていませんか?
このサイトでは、コンテンツの一部が非表示 、あるいは、コメント、お問い合わせの投稿ができない 、検索ができない ことがあります。
mysqlでは、SSL接続にて情報を暗号化することができます。
少なくとも、CentOS,ScientificLinux,Debian,Ubuntu,Windowsで提供されているバイナリーパッケージでは、デフォルトでSSL接続に対応しています。
サーバーの設定は必要ですが、その認証局(CA)の証明書だけでも、以下のようなコマンドイメージで簡単にSSL接続(暗号化)できるようになります。
$ mysql - h mysql. example. com - u hoge - p hogehoge exdb -- ssl- ca= example. crt
ホスト名 : → 上記例では mysql.example.com
データベース名 : → 上記例では exdb
証明書ファイル名 : → 上記例では example.crt
今回は、mysqlでSSL接続について簡単に解説してみたいと思います。
mysqlでSSL接続する
mysqlは、既にインストールされているものとします。
ここでは、他のホストからSSL接続を想定してmysqlサーバーの設定、mysqlクライアントの接続オプションについて簡単に解説してみます。
認証局(CA)の証明書、サーバーの証明書を作成します
まず、SSL接続に最低限必要な証明書として、以下のものを作成します。
プライベート認証局のCA証明書 : こちらの記事 を参照の上、CA証明書を作成します。
→ ここでは、/etc/pki/CA /cacert.pem というファイル名で作成したものとして以降解説します。
サーバー用の証明書 : こちらの記事 を参照の上、サーバー用の証明書を作成します。
→ ここでは、/etc/pki/CA/certs /mysql.example.com.crt というファイル名で作成したものとして以降解説します。
サーバー用の秘密鍵 : こちらの記事 を参照の上、サーバー用の証明書を作成します。
→ ここでは、/etc/pki/CA/private /mysql.example.com.key というファイル名で作成したものとして以降解説します。
クライアント用の証明書 : こちらの記事 を参照の上、サーバー用の証明書を作成します。
→ ここでは、/etc/pki/CA/client/certs /taro.yamada.example.com.crt というファイル名で作成したものとして以降解説します。
(クライアントに、CA証明書およびクライアント証明書の提示を求めるには で使用します。)
クライアント用の秘密鍵 : こちらの記事 を参照の上、サーバー用の証明書を作成します。
→ ここでは、/etc/pki/CA/client/private /taro.yamada.example.com.key というファイル名で作成したものとして以降解説します。
(クライアントに、CA証明書およびクライアント証明書の提示を求めるには で使用します。)
クライアントからの接続時にクライアント証明書を提示するようにしたい場合は、クライアント用の証明書、秘密鍵が必要になります。
少なくともCA証明書、サーバー用の証明書、秘密鍵は、必須になります。
mysqlサーバーの設定を行います
mysqlサーバーの設定ファイル(my.cnf)で SSL接続で使用する証明書の設定を行います。
各ディストリビューションにてファイルパスが異なるので注意してください。
CentOS ScientificLinux : /etc/my.cnf
Debian Ubuntu : /etc/mysql/my.cnf
...
[ mysqld]
...
ssl-ca = /etc/pki/CA /cacert.pem
ssl-cert = /etc/pki/CA/certs /mysql.example.com.crt
ssl-key = /etc/pki/CA/private /mysql.example.com.key
...
編集を終えたら、mysqlを再起動します。(再読み込みではNG)
CentOS ScientificLinux
$ /etc/init.d/mysqld restart
...
Debian Ubuntu
$ /etc/init.d/mysql restart
...
mysqlサーバーにユーザを追加します
mysqlクライアントからログインします
mysqlサーバーの設定を終えたら、外部ホストからmysqlクライアントとしてmysqlサーバーへログインしてみます。
以下の例では、mysqlサーバー名を
mysql.example.com としています。
また、あらかじめ
認証局(CA)の証明書、サーバーの証明書を作成します で作成した
CA証明書 をダウンロードしておく必要があります。
ここでは、カレントディレクトリに
mysql.example.com.crt という名前でダウンロードされているものとして解説します。
$ mysql - hmysql. example. com - uhoge - p -- ssl- ca= mysql. example. com. crt
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
...
mysql>
上記のようにmysqlのプロンプトが表示されればOKです。
続けて、データベース exdbを使ってみましょう。
mysql> use exdb;
Database changed
mysql> create table extable( id int, caption text);
Query OK, 0 rows affected (0.03 sec)
mysql> insert into extable values( 1, 'テスト');
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> select * from extable;
+------+---------+
| id | caption |
+------+---------+
| 1 | テスト |
+------+---------+
1 row in set (0.00 sec)
このように、テーブル操作が一式できます。
また、以下のように 基本データベースである mysql へのアクセスは規制されています。
mysql> use mysql;
ERROR 1044 (42000): Access denied for user 'hoge'@'%' to database 'mysql'
$ mysql - hmysql. example. com - uhoge - p -- ssl- ca= mysql. example. com. crt
Enter password:
ERROR 2026 (HY000): SSL connection error
上記のようにERROR出力され、SSL接続できない場合は、mysqlでSSL接続ができない場合の原因と対処 を参照し、見直しを行ってみてください。
ここまでの設定では、SSL接続してもしなくてもクライアント側の意思で選択可能でした。
以下のように
–ssl-ca を指定せずに SSL接続でなくてもログインできます。
$ mysql - hmysql. example. com - uhoge - p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
...
mysql>
このSSL接続をするか否かで流れるパケットの中身を
tcpflow を使ってダンプしてみました。
[非SSL接続の場合]
$ tcpflow -c port 3306
tcpflow[17656]: listening on eth0
192.168.001.099.03306-192.168.001.089.58442: 8...\n5.1.67-log.8...m+).JhM(...................{Z0}H0S2?'D_.
192.168.001.089.58442-192.168.001.099.03306: :...........!.......................hoge...g<o.s...7t.........
192.168.001.099.03306-192.168.001.089.58442: ...........
192.168.001.089.58442-192.168.001.099.03306: !....select @@version_comment limit 1
192.168.001.099.03306-192.168.001.089.58442: .....'....def....@@version_comment..!.9.......................Source distribution.........'
192.168.001.089.58442-192.168.001.099.03306: .....
先頭の ‘192.168.001.099’および’192.168.001.089’および数値情報は、パケットの送受信IPアドレス および ポート番号になります。
それ以降のデータが実際に送受信されたデータで、文字列変換されて出力されます。
上記のようにユーザ名(‘hoge’)もそのまま流れているのがよくわかりますね。
[SSL接続の場合]
tcpflow[17651]: listening on eth0
192.168.001.099.03306-192.168.001.089.58438: 8...\n5.1.67-log.7...~Ds8^NLq...................ttj8s^^;LMzB.
192.168.001.089.58438-192.168.001.099.03306: ...........!.......................
192.168.001.089.58438-192.168.001.099.03306: ....Z...V..QN.`1.....>...h.t7..wBlz...Y.4DU..(.9.8.5.....\n.3.2./............................#..
192.168.001.099.03306-192.168.001.089.58438: ....5...1..QO.-;*J.....:..a`~/..k.".....0{1.0...U....JP1.0...U....Tokyo1.0...U....Shibuyaku1.0\n
..U.\n151210220002Z0|1.0...U....JP1.0...U....Tokyo1.0...U....Shibuyaku1.0\n..U...........0..r@exmaple.com0.."0"..*.H..\n
......2.$...<...#.fk].....t.........1...`@......?...p.].&.....t....&D.........L.,PC`K....nH..........4.o.2..O..O........+.:...h.7.\.........v.`......q..%\n
.EP.2..}..z..;qL..~...1..6.. #..\.h....Y.o...22M.l.Vp.E,...o6.l......jwp...._.............qy7.g..V....4...d...5Y..F.n........v..&..8...t.....Y~..S..........V..C_\n
......h.E.=.UL#.?WW...1..Ee.....i&S......S=G.....6.:.A.'KN.f..$**z.Y.qp....|...g..l....8b.g}~..x9..i..jU.7....x...z..2.R.L..Y4.(...=7.=....T\n
.....0{1.0...U....JP1.0...U....Tokyo1.0...U....Shibuyaku1.0....M.E./.#0\n..U.\n151210215910Z0{1.0...U....JP1.0...U....Tokyo1.0...U....Shibuyaku1.0\n..U.\n..........0..r@exmaple.com0.."0..*.H..\n
......'.?9.Y...q."..........v.kS.p...N.8~..?..<...JQ..O.u.]w..........2.Y....B..]...K.....O.G(=V/..`.YJZ..o.(..4...p2..E.(J8.....8.............U\n
192.168.001.099.03306-192.168.001.089.58438: .8....=w.&.~....Y;.G.".+...c_].. *S...M..!...E.f!.q[9c...J..0.e..".j.....b.\n
M.....:...}..j.9.......P0N0...U.........Z.......?....I..I0...U.#..0......Z................m.1.... @.QN.....0._dX.....v:....F........4.^...X..P.x.>.;.H. .74_...... n...$.%o...f....../.._.............b}I.w............~.H..".ys|.5......y.@,3....sN..>.S.Fx..C.sU......s.._5......}...\.dG4..g..:.\n
.....5..:S.P..E.NJ....m......\...L(.P.~.)..............@.X<..."....uoL...K.3.........D..WFP.i..).v'k..........L...>|Gt.3....@!*..Qo..........Co+.=6.fv.VO...Xo...9.^b].[&..>?|.f..2...>t ^.h#..K....\.#.........I.......6..SbF9..;.....S3....&..B..w. 'C.:.....\n
.]......7.....a.}SL..P#!...i..R.t_.o..)N...w.....r...K...=5...%.;..........z...........im......C..I.)..j[.P....5.7.....Z....k"...{.Q...Q..T8...L]C....Qs.".m.~.4..................\n
192.168.001.089.58438-192.168.001.099.03306: ................F...B.@Z..d.....P....$.....&_zT.........{\n<.......iJzd....8...h..<..........0%.A...}h...U..5Q.s9<.8...[..T.=...B.....\......4
192.168.001.099.03306-192.168.001.089.58438: .................\n^2..G.....Q....$.J hm.S.*.y..i......N..#......G..X..."...(.a.!.c..'.I..:D ..JF2.G)g...j..k..LX$.e.M..#6....z}...Rz.p@..-...%.q.!w...b......M.....\n...k1.'.p.N..........07...M.]......#.........k]_I.2zI.+m..f*.4..T..<..
192.168.001.089.58438-192.168.001.099.03306: .... .%N.&\n...z)....H....b.e.[.#.........P...._.......=pl'q.w{...5..x.]..{....{5........F57..<.\..<y.*0...4..n,.G........f
192.168.001.099.03306-192.168.001.089.58438: .... t)!!.N...j...q.6..l.H....`g-%SV.....0...1..^G..B.p.....U.z.O..A..9..[..?....{d.`"&...
192.168.001.089.58438-192.168.001.099.03306: .... &....O).A.....[.-.H..."u..M..JP.....@..v..>.Xk.uT.y.wE..1.]{)..}.,....A.T...pi)H._..sw...%..r...d(...\n.....p....p.6...Y.;.jr.3<.D...p?....F8v.=F%+7.0.....W....LQ..@..h.....Lt. .......G...7lh..g..8.;D...E._....-..(...;E..
192.168.001.089.58438-192.168.001.099.03306: .... ..;.BF.e.....S.@...w.I.......,\..... :..\nhl..x[.<...i+...;s.........C
CA証明書は、そのまま流れていますが、以降の情報は何がなんだかわからないように暗号化されているのがよくわかると思います。
(わかりやすいように改行位置、データ位置を編集しています。)
クライアントに、CA証明書の提示を求めるには
クライアントに、CA証明書およびクライアント証明書の提示を求めるには
先の設定でCA証明書の提示までは、必須になりました。
ここでは、クライアント証明書までの提示を必須とする設定を行ってみます。
この接続条件については、先と同様、すべてmysqlのユーザ管理で行われます。
$ mysql - uroot - p mysql
Enter password:
...
mysql> grant all privileges on exdb.* to hoge@'% ' REQUIRE X509 ;
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> exit
Bye
grant でアクセス権を付与する際に、
REQUIRE X509 と付加します。
これは、SSL接続で、(CA 証明にサインされた)クライアント証明書を要求するという意味になります。
クライアント証明書を要求するオプションは、これ以外に以下のようなものがあります。
REQUIRE ISSUER ‘issuer’
これは、クライアント証明書が署名されているCAの内容を指定するオプションです。
REQUIRE ISSUER '/C=FI/ST=Some-State/L=Helsinki/
O=MySQL Finland AB/CN=Tonu Samuel/Email=tonu@example.com'
のように指定します。
REQUIRE SUBJECT ‘subject’
これは、クライアント証明書の内容を指定するオプションです。
REQUIRE SUBJECT '/C=EE/ST=Some-State/L=Tallinn/
O=MySQL demo client certificate/
CN=Tonu Samuel/Email=tonu@example.com'
のように指定します。
( REQUIRE CIPHER ‘cipher’ )
これは、先のオプションとは異なり、暗号方法を指定するオプションです。
REQUIRE CIPHER 'EDH-RSA-DES-CBC3-SHA'
のように指定します。
これで、mysqlクライアントからアクセスしてみましょう。
$ mysql - hmysql. example. com - uhoge - p
Enter password:
ERROR 1045 (28000): Access denied for user 'hoge'@'mysql.example.com' (using password: YES)
$ mysql - hmysql. example. com - uhoge - p -- ssl- ca= mysql. example. com. crt
Enter password:
ERROR 1045 (28000): Access denied for user 'hoge'@'mysql.example.com' (using password: YES)
$ mysql - hmysql. example. com - uhoge - p -- ssl- ca= mysql. example. com. crt -- ssl- cert= taro. yamada. example. com. crt -- ssl- key= taro. yamada. example. com. key< img src= "/ images/ return. png" alt= "return" title= "return" />
Enter password:
Enter PEM pass phrase:
Welcome to the MySQL monitor. Commands end with ; or \g.
...
mysql>
このように MySQLのSSL接続方法は非常に簡単ですので、セキュリティを考慮するなら、やっておくに越したことはありません。
(SSL接続できない場合は、
mysqlでSSL接続ができない場合の原因と対処 を参照し、見直しを行ってみてください。 )
最低限のCA証明書のみでも暗号化を図ることをおすすめします。
ご利用のブラウザは、広告ブロック(AdBlockなど) が適用 となっていませんか?
このサイトでは、コンテンツの一部が非表示 、あるいは、コメント、お問い合わせの投稿ができない 、検索ができない ことがあります。
関連記事 :
コメントを投稿 :