前言:
當連接數(shù)據(jù)庫失敗次數(shù)過多時,MySQL 是否會限制登錄呢邮利?數(shù)據(jù)庫服務端應該怎么應對暴力破解呢?本篇文章介紹下 MySQL 中的連接控制插件鲁冯,一起來學習下此插件的作用。
1.連接控制(connection_control)插件介紹
MySQL 服務端包含一個插件庫色查,可以自定義安裝各類插件薯演。connection_control 插件也是其中一種,主要用來控制客戶端在登錄操作連續(xù)失敗一定次數(shù)后的響應的延遲秧了。該插件可有效的防止客戶端暴力登錄的風險跨扮。該插件包含以下兩個組件:
- CONNECTION_CONTROL:用來控制登錄失敗的次數(shù)及延遲響應時間。
- CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS:將登錄失敗的操作記錄至 information_schema系統(tǒng)庫中验毡。
連接控制插件文件的基本名稱為 connection_control 衡创。每個平臺的文件名后綴有所不同(對于 Unix 和類 Unix 系統(tǒng)為 .so ,對于 Windows 為 .dll )晶通。下面以 Linux 系統(tǒng)為例來安裝下 connection_control 插件璃氢,Windows 系統(tǒng)只需要將 .so 改成 .dll 即可。
# 動態(tài)安裝 connection_control 插件
mysql> INSTALL PLUGIN CONNECTION_CONTROL SONAME 'connection_control.so';
Query OK, 0 rows affected (0.04 sec)
mysql> INSTALL PLUGIN CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS SONAME 'connection_control.so';
Query OK, 0 rows affected (0.01 sec)
# 驗證插件狀態(tài)
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 |
+------------------------------------------+---------------+
# 安裝完成后 可以看到相關系統(tǒng)變量
mysql> show 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 |
+-------------------------------------------------+------------+
可以看出狮辽,插件安裝還是很簡單的一也,不過這個插件具體有什么作用呢?我們先來解釋下相關系統(tǒng)變量:
- connection_control_failed_connections_threshold:允許帳戶進行的連續(xù)失敗嘗試的次數(shù)喉脖。默認為 3 塘秦,表示當連接失敗 3 次后啟用連接控制,0 表示不開啟动看。
- connection_control_max_connection_delay:超出閾值的連接失敗的最大延遲(以毫秒為單位)尊剔,默認 2147483647 毫秒,約 25 天菱皆。
- connection_control_min_connection_delay:超過閾值的連接失敗的最小延遲(以毫秒為單位)须误,默認 1000 毫秒,即 1 秒仇轻。
至此京痢,你可能明白了 connection_control 插件的作用,那就是當客戶端連接數(shù)據(jù)庫連續(xù)失敗到達一定次數(shù)后篷店,服務端會進行一段時間的響應延遲祭椰,連續(xù)失敗嘗試的次數(shù)越多,響應延遲時間越長疲陕。
2.連接控制實驗
我們來具體做下實驗方淤,為了實驗效果,這里將失敗次數(shù)閾值設為 10 蹄殃,延遲最小時間設為 1 分鐘携茂,即當連續(xù)連接失敗十次后,延遲響應時間最低為 1 分鐘诅岩,下面我們故意輸錯密碼來試試看:
# 初始狀態(tài)
mysql> show variables like 'connection_control%';
+-------------------------------------------------+------------+
| Variable_name | Value |
+-------------------------------------------------+------------+
| connection_control_failed_connections_threshold | 10 |
| connection_control_max_connection_delay | 2147483647 |
| connection_control_min_connection_delay | 60000 |
+-------------------------------------------------+------------+
3 rows in set (0.01 sec)
mysql> SELECT * FROM information_schema.CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS;
Empty set (0.00 sec)
# 故意輸錯密碼
[root@localhost ~]# mysql -utestuser -p123
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'testuser'@'localhost' (using password: YES)
# 查看失敗記錄
mysql> SELECT * FROM information_schema.CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS;
+----------------+-----------------+
| USERHOST | FAILED_ATTEMPTS |
+----------------+-----------------+
| 'testuser'@'%' | 1 |
+----------------+-----------------+
1 row in set (0.00 sec)
# 當連續(xù)失敗次數(shù)超過閾值后 再次進行連接會產(chǎn)生延遲 即延遲一定時間后才會返回密碼是否正確
mysql> SELECT * FROM information_schema.CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS;
+----------------+-----------------+
| USERHOST | FAILED_ATTEMPTS |
+----------------+-----------------+
| 'testuser'@'%' | 10 |
+----------------+-----------------+
mysql> show processlist;
+---------+----------+--------------------+--------------------+---------+-------+--------------------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+---------+----------+--------------------+--------------------+---------+-------+--------------------------------------+------------------+
| 1817003 | root | localhost | NULL | Query | 0 | starting | show processlist |
| 1817091 | testuser | localhost | NULL | Connect | 16 | Waiting in connection_control plugin | NULL |
+---------+----------+--------------------+--------------------+---------+-------+--------------------------------------+------------------+
正常情況下讳苦,輸錯密碼是即刻返回錯誤的带膜,當連續(xù)失敗次數(shù)達到閾值后,再次進行連接嘗試鸳谜,則會延遲響應膝藕,具體表現(xiàn)就是一直卡著,到延遲結(jié)束后才返回錯誤咐扭。information_schema 系統(tǒng)庫中的表會記錄登錄失敗的用戶名及失敗次數(shù)芭挽,當延遲發(fā)生時,從 processlist 中也可以查到正在延遲的連接草描。若輸入密碼正確览绿,則會取消延遲策严、重新計數(shù)穗慕。
于是乎,你應該理解了為什么此插件能防止客戶端暴力破解妻导,假設暴力破解每分鐘嘗試 120 次逛绵,現(xiàn)在啟用該插件后,連續(xù)失敗一定次數(shù)后就會響應延遲倔韭,并且隨著失敗次數(shù)的增加延遲時間也會增加术浪,原來能立即開始下次破解,現(xiàn)在只能到延遲時間后才能發(fā)起下次嘗試寿酌,所以能極大降低被暴力破解的風險胰苏。
不過啟用連接控制插件后要注意是否存在延遲的連接,因為正在延遲的連接也是占用連接數(shù)的醇疼,可能會引起連接積壓導致連接數(shù)不夠用硕并。所以當出現(xiàn)延遲的連接時,應盡快排查到底是那里在連接秧荆,確保密碼輸入正確倔毙。
若要啟用此插件,注意要配置合適的閾值及延遲時間乙濒,并記得將這些參數(shù)寫入配置文件陕赃。一般等保評測可能會有這項要求,這個時候連接控制插件會用得上颁股。