改めて
こちらの続きです。
RDS の MySQL や Aurora はデフォルトで SSL 接続が有効になっている。
mysql> SHOW VARIABLES LIKE '%ssl%'; +---------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Variable_name | Value | +---------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | have_openssl | YES | | have_ssl | YES | | ssl_ca | /rdsdbdata/rds-metadata/ca-cert.pem | | ssl_capath | | | ssl_cert | /rdsdbdata/rds-metadata/server-cert.pem | | ssl_cipher | EXP1024-RC4-SHA:EXP1024-DES-CBC-SHA:AES256-SHA:AES128-SHA:DES-CBC3-SHA:DES-CBC-SHA:EXP-DES-CBC-SHA:EXP-RC2-CBC-MD5:RC4-SHA:RC4-MD5:EXP-RC4-MD5:NULL-SHA:NULL-MD5:DES-CBC3-MD5:DES-CBC-MD5:EXP-RC2-CBC-MD5:RC2-CBC-MD5:EXP-RC4-MD5:RC4-MD5:KRB5-DES-CBC3-MD5:KRB5-DES-CBC3-SHA:ADH-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:EDH-DSS-DES-CBC3-SHA:ADH-AES256-SHA:DHE-RSA-AES256-SHA:DHE-DSS-AES256-SHA:ADH-AES128-SHA:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA:EXP-KRB5-RC4-MD5:EXP-KRB5-RC2-CBC-MD5:EXP-KRB5-DES-CBC-MD5:KRB5-RC4-MD5:KRB5-DES-CBC-MD5:ADH-RC4-MD5:EXP-ADH-RC4-MD5:DHE-DSS-RC4-SHA:EXP1024-DHE-DSS-RC4-SHA:EXP1024-DHE-DSS-DES-CBC-SHA:EXP-KRB5-RC4-SHA:EXP-KRB5-RC2-CBC-SHA:EXP-KRB5-DES-CBC-SHA:KRB5-RC4-SHA:KRB5-DES-CBC-SHA:ADH-DES-CBC-SHA:EXP-ADH-DES-CBC-SHA:EDH-RSA-DES-CBC-SHA:EXP-EDH-RSA-DES-CBC-SHA:EDH-DSS-DES-CBC-SHA:EXP-EDH-DSS-DES-CBC-SHA | | ssl_crl | | | ssl_crlpath | | | ssl_key | /rdsdbdata/rds-metadata/server-key.pem | +---------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 9 rows in set (0.10 sec)
ということは、SSL 接続の可否はクライアントに依存することになる。
例えば MacOS X の MySQL クライアントから接続する場合
環境
$ sw_vers ProductName: Mac OS X ProductVersion: 10.11.6 BuildVersion: 15G1421 $ mysql --version mysql Ver 14.14 Distrib 5.7.10, for osx10.11 (x86_64) using EditLine wrapper
Aurora への接続例
以下のように特にオプションを指定しなくても SSL を利用して接続している。
$ mysql -u${DB_USER} -hdemo-aurora.cluster-xxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 407 Server version: 5.6.10 MySQL Community Server (GPL) Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> SHOW STATUS LIKE 'Ssl_cipher'; +---------------+--------------------+ | Variable_name | Value | +---------------+--------------------+ | Ssl_cipher | DHE-RSA-AES128-SHA | +---------------+--------------------+ 1 row in set (0.29 sec)
以下のように Wireshark でパケットキャプチャしてみてもクエリの内容は暗号化されていて解読は出来ない。
SSL を利用しな場合どうするのか
以下のように --ssl=0
オプションを利用する。
$ mysql -u${DB_USER} -hdemo-aurora.cluster-xxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com -p --ssl=0 Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 413 Server version: 5.6.10 MySQL Community Server (GPL) Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> SHOW STATUS LIKE 'Ssl_cipher'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | Ssl_cipher | | +---------------+-------+ 1 row in set (0.06 sec)
Ssl_cipher
の値に何も設定されていないのが肝。
以下のようにパケットキャプチャしてみてもクエリ丸見え。
これはアカン。
色んな言語のライブラリで接続する場合
Node.js で MySQL を操作する
環境
MySQL パッケージ。
導入は簡単。
$ npm install mysql
以下のような環境で実験する。
$ node --version v8.1.0 $ npm ls -a mysql /path/to/project └── mysql@2.14.1
デフォルト
以下のように SHOW STATUS LIKE 'Ssl_cipher';
するだけのコード。
var mysql = require('mysql'); var fs = require('fs'); var connection = mysql.createConnection({ host : 'demo-aurora.cluster-xxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com', user : 'xxxxxx', password : 'xxxxxxxxx', database : 'xxxxxxxx', }); connection.connect(); connection.query('SHOW STATUS LIKE "Ssl_cipher";', function (error, results, fields) { if (error) throw error; console.log(results); }); connection.end();
実行すると以下のようになる。
$ node demo.js [ RowDataPacket { Variable_name: 'Ssl_cipher', Value: '' } ]
パケットキャプチャしてみると…
パッチリクエリも確認出来るという。
SSL 接続
デフォルトが SSL 接続を行わないことが判ったので、以下のように修正して SSL 接続してみる。
--- test2.js.bk 2017-08-18 00:09:10.000000000 +0900 +++ test2.js 2017-08-18 00:07:17.000000000 +0900 @@ -5,6 +5,9 @@ user : 'xxxxxx', password : 'xxxxxxxxx', database : 'xxxxxxxx', + ssl : { + ca : fs.readFileSync('rds-combined-ca-bundle.pem') + } });
証明書をダウンロードしてきて、ssl オプションに証明書ファイルへのファイルパスを指定してあげるだけ。
実行すると以下のように出力される。
$ node demo.js [ RowDataPacket { Variable_name: 'Ssl_cipher', Value: 'DHE-RSA-AES256-SHA' } ]
パケットキャプチャしてみると以下のようにクエリが暗号化されている。
以上
まとめ
- RDS の MySQL と Aurora に対して MySQL クライアントで接続する場合、基本的には SSL 接続している(バージョンによってはこの限りでは無いかも)
- 各種言語のライブラリについては、確認が必要になるが、Node.js はデフォルトでは非 SSL 接続になっている
- 非 SSL 接続なライブラリを利用して SSL 接続する場合には証明書ファイルを指定する必要がある
お疲れさまでした
https://dev.mysql.com/doc/refman/5.6/ja/ssl-connections.html
ドキュメントをしっかり読むべし。