MySQL 5.7.17で追加されたあのプラグインについて

この記事は MySQL Casual Advent Calendar 2016 の13日目の記事です!

MySQL 5.7.17がリリースされたわけですが、みなさん待望のあの機能がついに追加されました。なので早速試してみましょう。

プラグインとしての機能追加なので、まずはプラグインをインストールします。
 http://dev.mysql.com/doc/refman/5.7/en/connection-control-plugin-installation.html

mysql> INSTALL PLUGIN connection_control SONAME 'connection_control.so';
Query OK, 0 rows affected (0.02 sec)

mysql> INSTALL PLUGIN connection_control_failed_login_attempts SONAME 'connection_control.so';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS
    ->        WHERE PLUGIN_NAME LIKE 'connection%';
+------------------------------------------+---------------+
| PLUGIN_NAME                              | PLUGIN_STATUS |
+------------------------------------------+---------------+
| CONNECTION_CONTROL                       | ACTIVE        |
| CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS | ACTIVE        |
+------------------------------------------+---------------+
2 rows in set (0.00 sec)

プラグインのインストール時にシステム変数ならびにステータス変数が追加されます。

mysql> SHOW GLOBAL VARIABLES LIKE 'connection_control%';
+-------------------------------------------------+------------+
| Variable_name                                   | Value      |
+-------------------------------------------------+------------+
| connection_control_failed_connections_threshold | 3          |
| connection_control_max_connection_delay         | 2147483647 |
| connection_control_min_connection_delay         | 1000       |
+-------------------------------------------------+------------+
3 rows in set (0.01 sec)

mysql> SHOW GLOBAL STATUS LIKE 'connection_control%';
+------------------------------------+-------+
| Variable_name                      | Value |
+------------------------------------+-------+
| Connection_control_delay_generated | 0     |
+------------------------------------+-------+
1 row in set (0.01 sec)

システム変数については以下の通りです。

connection_control_failed_connections_threshold 接続に失敗した場合に遅延を適用するまでの回数の閾値
connection_control_min_connection_delay 当初の遅延時間(ミリ秒)
connection_control_max_connection_delay 最大の遅延時間(ミリ秒)

閾値を超えて接続に失敗するたびにconnection_control_min_connection_delay分の遅延が追加されます。
ではデフォルト値のまま試してみましょう。

$ while true; do time ./mysql -uscott -ptiger; done
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'scott'@'localhost' (using password: YES)

real	0m0.014s
user	0m0.007s
sys	0m0.004s
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'scott'@'localhost' (using password: YES)

real	0m0.014s
user	0m0.007s
sys	0m0.003s
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'scott'@'localhost' (using password: YES)

real	0m0.010s
user	0m0.006s
sys	0m0.003s
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'scott'@'localhost' (using password: YES)

real	0m1.017s
user	0m0.006s
sys	0m0.003s
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'scott'@'localhost' (using password: YES)

real	0m2.015s
user	0m0.007s
sys	0m0.004s
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'scott'@'localhost' (using password: YES)

real	0m3.017s
user	0m0.007s
sys	0m0.004s
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'scott'@'localhost' (using password: YES)

real	0m4.018s
user	0m0.006s
sys	0m0.005s
mysql: [Warning] Using a password on the command line interface can be insecure.

4回目の失敗から遅延が1秒ずつ追加されているのが分かります。
このConnection-Controlプラグインによって総当たり攻撃(ブルートフォースアタック)などの対策とすることができそうです。

MySQL 5.7.17ではマルチマスター型レプリケーショングループレプリケーション プラグインがGAになるという大きな機能追加がありました。グループレプリケーションと類似するGalera Clusterとの機能の比較性能比較も公開されています。グループレプリケーションはきっと誰かが書いてくれると思うので、気づいていない人も多そうなConnection-Controlプラグインについて書いてみました。