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プラグインについて書いてみました。