ようへいの日々精進XP

よかろうもん

RDS の MySQL と Aurora で SSL 接続するメモ(2)

改めて

inokara.hateblo.jp

こちらの続きです。

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 XMySQL クライアントから接続する場合

環境

$ 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 でパケットキャプチャしてみてもクエリの内容は暗号化されていて解読は出来ない。

f:id:inokara:20170817234612p:plain

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 の値に何も設定されていないのが肝。

以下のようにパケットキャプチャしてみてもクエリ丸見え。

f:id:inokara:20170817235417p:plain

これはアカン。

色んな言語のライブラリで接続する場合

Node.js で MySQL を操作する

環境

MySQL パッケージ。

github.com

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: '' } ]

パケットキャプチャしてみると…

f:id:inokara:20170818001631p:plain

パッチリクエリも確認出来るという。

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' } ]

パケットキャプチャしてみると以下のようにクエリが暗号化されている。

f:id:inokara:20170818001418p:plain

以上

まとめ

  • RDS の MySQL と Aurora に対して MySQL クライアントで接続する場合、基本的には SSL 接続している(バージョンによってはこの限りでは無いかも)
  • 各種言語のライブラリについては、確認が必要になるが、Node.js はデフォルトでは非 SSL 接続になっている
  • SSL 接続なライブラリを利用して SSL 接続する場合には証明書ファイルを指定する必要がある

お疲れさまでした

https://dev.mysql.com/doc/refman/5.6/ja/ssl-connections.html

ドキュメントをしっかり読むべし。