レンタルサーバー・自宅サーバー設定・構築のヒント
レンタルサーバー・自宅サーバー設定・構築のヒント - レンタルサーバー・自宅サーバーの設定・構築情報を公開しています。

mysqlでSSL接続する

2013年3月26日 2015年5月15日
mysql security

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 -uroot -p mysqlreturn
Enter password:return   # パスワードを入力しEnter
...
# 外部ホストからアクセスできるユーザを作成します。
# -- ユーザ名: hoge , パスワード:hogehoge , 外部ホスト:% (全ての外部ホスト)
mysql> insert into user set user="hoge", password=password("hogehoge"), host="%";
Query OK, 1 row affected, 3 warnings (0.00 sec)

# サンプル用のデータベース(exdb)を作成します。
mysql> create database exdb;
Query OK, 0 rows affected (0.00 sec)

# ユーザ hoge がアクセスできるデータベースを サンプル用のデータベース(exdb) とします。
mysql> grant all privileges on exdb.* to hoge@'%';
Query OK, 0 rows affected (0.00 sec)

# 変更した情報をすぐに反映します。
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

# 終了します。
mysql> exit
Bye
mysqlのデフォルトで作成されているデータベース test は、誰でもアクセスできるので、ここでは、テスト用にexdbという名前でデータベースを作成しました。

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.crtreturn
Enter password:return   # パスワードを入力しEnter

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.crtreturn
Enter password:return   # パスワードを入力しEnter
ERROR 2026 (HY000): SSL connection error

上記のようにERROR出力され、SSL接続できない場合は、mysqlでSSL接続ができない場合の原因と対処 を参照し、見直しを行ってみてください。


ここまでの設定では、SSL接続してもしなくてもクライアント側の意思で選択可能でした。
以下のように –ssl-ca を指定せずに SSL接続でなくてもログインできます。
$ mysql -hmysql.example.com  -uhoge -preturn
Enter password:return   # パスワードを入力しEnter
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.$...&lt;...#.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~..?..&lt;...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.&gt;.;.H. .74_...... n...$.%o...f....../.._.............b}I.w............~.H..".ys|.5......y.@,3....sN..&gt;.S.Fx..C.sU......s.._5......}...\.dG4..g..:.\n
                                             .....5..:S.P..E.NJ....m......\...L(.P.~.)..............@.X&lt;..."....uoL...K.3.........D..WFP.i..).v'k..........L...&gt;|Gt.3....@!*..Qo..........Co+.=6.fv.VO...Xo...9.^b].[&..&gt;?|.f..2...&gt;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&lt;.......iJzd....8...h..&lt;..........0%.A...}h...U..5Q.s9&lt;.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..&lt;..
192.168.001.089.58438-192.168.001.099.03306: .... .%N.&\n...z)....H....b.e.[.#.........P...._.......=pl'q.w{...5..x.]..{....{5........F57..&lt;.\..&lt;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..&gt;.Xk.uT.y.wE..1.]{)..}.,....A.T...pi)H._..sw...%..r...d(...\n.....p....p.6...Y.;.jr.3&lt;.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[.&lt;...i+...;s.........C
CA証明書は、そのまま流れていますが、以降の情報は何がなんだかわからないように暗号化されているのがよくわかると思います。
(わかりやすいように改行位置、データ位置を編集しています。)

クライアントに、CA証明書の提示を求めるには

ここまでの設定では、mysqlのクライアントは、CA証明書を提示してSSL接続しても、CA証明書を提示せずに非SSL接続しても OKでした。 これでは、必ず暗号化されるかどうかわかりませんから、ここでは、最低限、SSL接続でないログイン要求は拒否するようにしてみます。

この接続条件については、すべてmysqlのユーザ管理で行われます。

$ mysql -uroot -p mysqlreturn
Enter password:return   # パスワードを入力しEnter
...
# ユーザ hoge がアクセスできるデータベースを サンプル用のデータベース(exdb) とします。
mysql> grant all privileges on exdb.* to hoge@'%' REQUIRE SSL;
Query OK, 0 rows affected (0.00 sec)

# 変更した情報をすぐに反映します。
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

# 終了します。
mysql> exit
Bye
grant でアクセス権を付与する際に、REQUIRE SSL と付加します。
これは、SSL接続を要求するという意味になります。

これで、mysqlクライアントからアクセスしてみましょう。

# まずは、SSL接続なしでアクセスしてみます。
$ mysql -hmysql.example.com  -uhoge -preturn
Enter password:return   # パスワードを入力しEnter
ERROR 1045 (28000): Access denied for user 'hoge'@'mysql.example.com' (using password: YES)

# ちゃんとエラーになりましたね。
# 次に、SSL接続でアクセスしてみます。
$ mysql -hmysql.example.com  -uhoge -p --ssl-ca=mysql.example.com.crtreturn
Enter password:return   # パスワードを入力しEnter

Welcome to the MySQL monitor.  Commands end with ; or \g.
...
mysql> 


クライアントに、CA証明書およびクライアント証明書の提示を求めるには

先の設定でCA証明書の提示までは、必須になりました。
ここでは、クライアント証明書までの提示を必須とする設定を行ってみます。

この接続条件については、先と同様、すべてmysqlのユーザ管理で行われます。

$ mysql -uroot -p mysqlreturn
Enter password:return   # パスワードを入力しEnter
...
# ユーザ hoge がアクセスできるデータベースを サンプル用のデータベース(exdb) とします。
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クライアントからアクセスしてみましょう。

# まずは、SSL接続なしでアクセスしてみます。
$ mysql -hmysql.example.com  -uhoge -preturn
Enter password:return   # パスワードを入力しEnter
ERROR 1045 (28000): Access denied for user 'hoge'@'mysql.example.com' (using password: YES)

# ちゃんとエラーになりましたね。
# 次に、CA証明書のみを指定して SSL接続でアクセスしてみます。
$ mysql -hmysql.example.com  -uhoge -p --ssl-ca=mysql.example.com.crtreturn
Enter password:return   # パスワードを入力しEnter
ERROR 1045 (28000): Access denied for user 'hoge'@'mysql.example.com' (using password: YES)

# ちゃんとエラーになりましたね。
# 次に、CA証明書、クライアント証明書、クライアント秘密鍵を指定して SSL接続でアクセスしてみます。
$ 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.keyreturn
Enter password:return   # パスワードを入力しEnter
Enter PEM pass phrase:return   # クライアント証明書を作成する際に設定したパスフレーズ(パスワード)を入力しEnter

Welcome to the MySQL monitor.  Commands end with ; or \g.
...
mysql> 


このように MySQLのSSL接続方法は非常に簡単ですので、セキュリティを考慮するなら、やっておくに越したことはありません。
(SSL接続できない場合は、mysqlでSSL接続ができない場合の原因と対処 を参照し、見直しを行ってみてください。 )

最低限のCA証明書のみでも暗号化を図ることをおすすめします。
ご利用のブラウザは、広告ブロック(AdBlockなど) が適用となっていませんか?
このサイトでは、コンテンツの一部が非表示、あるいは、コメント、お問い合わせの投稿ができない検索ができないことがあります。


関連記事 :

FreeBSDでmysqlをインストール

とりあえず、前回までで、サーバーのインストールの準備ができました。ここから、各サーバーをインストールしていきます。 データベース(my ...

Debian (Ubuntu 12) で Dotdeb から最新のPHP , MySQL をインストールする

DebianにもRedHat系と同じようにバイナリパッケージを提供するためのリポジトリがあります。 ただ、CentOSなどと同じように一般的に ...

評判のKDDI クラウドコア(CloudCore) VPS にapache , php , mysql をインストールし、Wordpressを使ってみる (CentOS編)

評判のCloudCore VPSを使うときに最初にやっておきたいこと(CentOS編) の続き・・・で、今回は、評判のKDDI CP ...

mysql5.5系の最新版をインストールする

CentOS 5 の場合、yumを使って デフォルトでインストールされるのは、MySQL5.0系です。 また、CentOS 6 Sc ...

mysqlのレプリケーションを使う

今回は、mysqlのレプリケーション(replication)です。 レプリケーション(replication)とは、 直訳 ...



コメントを投稿 :

お名前 *

メールアドレス *
( メールアドレスが公開されることはありません。)

サイトアドレス

コメント *

* 印の項目は、入力が必要な項目です。




最近投稿の記事

[ 画像提供元 : Amazon ] 先日、1TBのディスクの入れ替え時にバックアップをとろうとディスクコピーを行いました。 その際 ...

Windows で Linux ファイルシステム Ext4 のディスクをマウントするには? Ext3Fsd が、おそらく、最も簡単なツール ...

今回は、Windows で Compass を使ってみました。 Compass とは、 Sass(サス、Syntactica ...

今回は、Anti Adblock を使ってみました。 Anti Adblock とは、 そもそも Adblock という ウェブ ...

デスクトップ環境でない サーバーで、Webページのキャプチャー画像をコマンドで撮る には、wkhtmltoimage, CutyCapt ...


さくらのVPS 全プラン リニューアルです。(石狩(北海道)も選択可)


root権限ありで ¥685 / 月 ~ と非常にリーズナブルな CPU 1(core)の 512 プランから、 最高 CPU 10(core), メモリ 32(GB), SSD容量 800(GB) までとプランが充実。
ディスクは、SSDとHDDの選択が可能になった他、データセンターは人気の東京、石狩(北海道)となりました。

また、どのプランでも好きなOSが選べます
( CentOS, Fedora, Scientific Linux, FreeBSD, Ubutu, Debian )

管理人もおすすめのVPSです。
試用期間がありますから、一度、お試しを!!

詳しくは、http://vps.sakura.ad.jp/さくらのVPSのサイトへ へどうぞ!!

カテゴリ


Serverman@VPS 完全1ヶ月無料 キャンペーン実施中です。


Serverman@VPS 完全1ヶ月無料 キャンペーン実施中です。
最近、スワップにも対応した Serverman@VPS は、かなりリーズナブルかもです。

  • メモリ1GB~2GBのEntryプラン :月額:490円
  • メモリ2MB~4GBのStandardプラン :月額:980円
  • メモリ4GB~8GBのProプラン :月額:1,980円

新規申し込みで1ヶ月間完全無料となるキャンペーンを実施中です。
Serverman@VPSの特徴は、安さとIPv6対応です。また、初期設定費0円もポイントです。

IPv6でちょっと遊んでみたい方には、おすすめかもしれませんね。最低利用期間もありませんから、気に入らないときは即解約もできます。

Serverman@VPSの詳細については、 http://dream.jp/vps/ Serverman@VPSのサイトへへどうぞ。



KVM採用 ConoHa VPSは、時間単位で借りれる便利なVPSです。


ConoHa VPS は、初期設定費0円最低利用期間無し時間単位で清算可能、 さらに、Web APIを使って自動化を図ることもできる便利なVPSです。

海外サーバー設置も可能で、ローカル接続にも対応と、かなり、機能豊富なサーバーです。

新規ユーザ登録で、クーポンもらえますから、まずは、お試しですね。

ConoHa VPSの詳細については、
http://www.conoha.jp/ へどうぞ。

KVM採用 お名前.com VPS(KVM) 2G プラン 初期設定費無料 キャンペーン 実施です。


メモリ2GBプラン CPU:3core、Disk:200GB
月額:1,153円から (初期設定:1,680円0円)

さくらのVPSがリニューアルされてもなんのその。
1GBメモリ / 2Core を ¥834 – の格安価格で提供中です!
間違いなくスペックからすると割安感ありです。
年間割引時の途中解約で返金がないのは、 ちょっと残念ですが、それでもこの割安感は魅力です。

まずは、お試しですね。

お名前.com VPS(KVM)の詳細については、
http://www.onamae-server.com/vps/ へどうぞ。(お試し期間が15日あります。)



  • ソーシャルブックマーク

  • はてなブックマークへ追加するはてな登録数
ページトップへ
Time : 0.2799 [s]