本節說明如何安裝連線控制外掛程式,CONNECTION_CONTROL
和 CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS
。如需關於安裝外掛程式的一般資訊,請參閱第 7.6.1 節,「安裝和解除安裝外掛程式」。
若要讓伺服器可使用外掛程式,外掛程式程式庫檔案必須位於 MySQL 外掛程式目錄中 (由 plugin_dir
系統變數命名的目錄)。如有必要,請在伺服器啟動時設定 plugin_dir
的值來設定外掛程式目錄位置。
外掛程式程式庫檔案基本名稱為 connection_control
。檔案名稱字尾會因平台而異 (例如,針對 Unix 和類 Unix 系統為 .so
,針對 Windows 為 .dll
)。
若要在伺服器啟動時載入外掛程式,請使用 --plugin-load-add
選項來命名包含它們的程式庫檔案。使用此外掛程式載入方法,每次伺服器啟動時都必須提供選項。例如,將這些行放入伺服器 my.cnf
檔案中,並根據您的平台需要調整 .so
字尾
[mysqld]
plugin-load-add=connection_control.so
修改 my.cnf
之後,重新啟動伺服器,使新設定生效。
或者,若要在執行階段載入外掛程式,請使用下列陳述式,並根據您的平台需要調整 .so
字尾
INSTALL PLUGIN CONNECTION_CONTROL
SONAME 'connection_control.so';
INSTALL PLUGIN CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS
SONAME 'connection_control.so';
INSTALL PLUGIN
會立即載入外掛程式,並將其註冊到 mysql.plugins
系統表格中,使伺服器在每次後續正常啟動時載入它,而不需要 --plugin-load-add
。
若要驗證外掛程式的安裝,請檢查 Information Schema 的 PLUGINS
表格,或使用 SHOW PLUGINS
陳述式(請參閱第 7.6.2 節,「取得伺服器外掛程式資訊」)。例如:
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 |
+------------------------------------------+---------------+
如果外掛程式初始化失敗,請檢查伺服器錯誤日誌以獲取診斷訊息。
如果外掛程式先前已使用 INSTALL PLUGIN
註冊,或使用 --plugin-load-add
載入,您可以在伺服器啟動時使用 --connection-control
和 --connection-control-failed-login-attempts
選項來控制外掛程式的啟用。例如,若要在啟動時載入外掛程式並防止它們在執行時被移除,請使用這些選項:
[mysqld]
plugin-load-add=connection_control.so
connection-control=FORCE_PLUS_PERMANENT
connection-control-failed-login-attempts=FORCE_PLUS_PERMANENT
如果希望防止伺服器在沒有指定連線控制外掛程式的情況下執行,請使用 FORCE
或 FORCE_PLUS_PERMANENT
選項值,以強制在該外掛程式初始化失敗時伺服器啟動失敗。
可以安裝其中一個外掛程式而不安裝另一個,但必須同時安裝這兩個外掛程式才能擁有完整的連線控制功能。特別是,僅安裝 CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS
外掛程式幾乎沒有用處,因為如果沒有 CONNECTION_CONTROL
外掛程式來提供資料以填充 CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS
表格,該表格將永遠為空。
為了啟用其運作的配置,CONNECTION_CONTROL
外掛程式公開了以下系統變數:
connection_control_failed_connections_threshold
:在伺服器為後續連線嘗試增加延遲之前,允許帳戶連續連線嘗試失敗的次數。若要停用失敗連線計數,請將connection_control_failed_connections_threshold
設定為零。connection_control_min_connection_delay
:超過閾值的連線失敗的最小延遲(以毫秒為單位)。connection_control_max_connection_delay
:超過閾值的連線失敗的最大延遲(以毫秒為單位)。
如果 connection_control_failed_connections_threshold
為非零值,則啟用失敗連線計數,並具有以下屬性:
在達到
connection_control_failed_connections_threshold
次連續連線嘗試失敗之前,延遲為零。之後,伺服器會為後續連續嘗試增加延遲,直到連線成功為止。初始未調整的延遲從 1000 毫秒(1 秒)開始,每次嘗試增加 1000 毫秒。也就是說,一旦帳戶啟用了延遲,後續失敗嘗試的未調整延遲為 1000 毫秒、2000 毫秒、3000 毫秒,依此類推。
客戶端體驗到的實際延遲是未調整的延遲,調整後使其位於
connection_control_min_connection_delay
和connection_control_max_connection_delay
系統變數的值(包括邊界值)範圍內。一旦帳戶啟用了延遲,該帳戶之後的第一次成功連線也會經歷延遲,但後續連線的失敗計數將會重置。
例如,使用預設的 connection_control_failed_connections_threshold
值 3,帳戶的前三次連續連線嘗試失敗不會有延遲。帳戶在第四次及後續連線失敗時體驗到的實際調整延遲取決於 connection_control_min_connection_delay
和 connection_control_max_connection_delay
的值。
如果
connection_control_min_connection_delay
和connection_control_max_connection_delay
分別為 1000 和 20000,則調整後的延遲與未調整的延遲相同,最大為 20000 毫秒。第四次及後續連線失敗將延遲 1000 毫秒、2000 毫秒、3000 毫秒,依此類推。如果
connection_control_min_connection_delay
和connection_control_max_connection_delay
分別為 1500 和 20000,則第四次及後續連線失敗的調整延遲為 1500 毫秒、2000 毫秒、3000 毫秒,依此類推,最大為 20000 毫秒。如果
connection_control_min_connection_delay
和connection_control_max_connection_delay
分別為 2000 和 3000,則第四次及後續連線失敗的調整延遲為 2000 毫秒、2000 毫秒和 3000 毫秒,所有後續連線失敗也會延遲 3000 毫秒。
您可以在伺服器啟動時或執行時設定 CONNECTION_CONTROL
系統變數。假設您希望在伺服器開始延遲其回應之前,允許四次連續連線嘗試失敗,最小延遲為 2000 毫秒。若要在伺服器啟動時設定相關變數,請將以下行放入伺服器的 my.cnf
檔案中:
[mysqld]
plugin-load-add=connection_control.so
connection_control_failed_connections_threshold=4
connection_control_min_connection_delay=2000
若要在執行時設定並持續保存變數,請使用以下陳述式:
SET PERSIST connection_control_failed_connections_threshold = 4;
SET PERSIST connection_control_min_connection_delay = 2000;
SET PERSIST
會為正在執行的 MySQL 實例設定值。它也會儲存該值,使其保留到後續伺服器重新啟動。若要變更正在執行之 MySQL 實例的值,而不要使其保留到後續重新啟動,請使用 GLOBAL
關鍵字而不是 PERSIST
。請參閱第 15.7.6.1 節,「SET 變數賦值語法」。
connection_control_min_connection_delay
和 connection_control_max_connection_delay
系統變數的最小值和最大值皆為 1000 和 2147483647。此外,每個變數允許的值範圍也取決於另一個變數的目前值:
因此,若要進行某些組態所需的變更,您可能需要按照特定順序設定變數。假設目前的最小和最大延遲為 1000 和 2000,而您希望將它們設定為 3000 和 5000。您不能先將 connection_control_min_connection_delay
設定為 3000,因為這大於目前的 connection_control_max_connection_delay
值 2000。相反地,請將 connection_control_max_connection_delay
設定為 5000,然後將 connection_control_min_connection_delay
設定為 3000。
當安裝 CONNECTION_CONTROL
外掛程式時,它會檢查連線嘗試並追蹤它們是失敗還是成功。就此而言,連線嘗試失敗是指客戶端使用者和主機與已知的 MySQL 帳戶相符,但提供的憑證不正確,或與任何已知帳戶不符。
失敗連線計數基於每次連線嘗試的使用者/主機組合。判斷適用的使用者名稱和主機名稱會將代理納入考量,並依以下方式進行:
如果客戶端使用者代理另一個使用者,則用於失敗連線計數的帳戶是代理使用者,而不是被代理的使用者。例如,如果
external_user@example.com
代理proxy_user@example.com
,則連線計數會使用代理使用者external_user@example.com
,而不是被代理的使用者proxy_user@example.com
。external_user@example.com
和proxy_user@example.com
都必須在mysql.user
系統表格中具有有效的項目,並且必須在mysql.proxies_priv
系統表格中定義它們之間的代理關係(請參閱第 8.2.19 節,「代理使用者」)。如果客戶端使用者不代理另一個使用者,但確實符合
mysql.user
項目,則計數會使用對應於該項目的CURRENT_USER()
值。例如,如果從主機host1.example.com
連線的使用者user1
符合user1@host1.example.com
項目,則計數會使用user1@host1.example.com
。如果該使用者改為符合user1@%.example.com
、user1@%.com
或user1@%
項目,則計數分別使用user1@%.example.com
、user1@%.com
或user1@%
。
對於剛才描述的案例,連線嘗試符合某些 mysql.user
項目,且要求成功或失敗取決於客戶端是否提供正確的驗證憑證。例如,如果客戶端提供的密碼不正確,則連線嘗試會失敗。
如果連線嘗試不符合任何 mysql.user
項目,則嘗試失敗。在這種情況下,沒有可用的 CURRENT_USER()
值,且失敗連線計數會使用客戶端提供的使用者名稱和伺服器判定的客戶端主機。例如,如果客戶端嘗試從主機 host2.example.com
以使用者 user2
的身分連線,則使用者名稱部分可在客戶端請求中取得,而伺服器會判斷主機資訊。用於計數的使用者/主機組合為 user2@host2.example.com
。
伺服器會維護有關哪些客戶端主機可能連線到伺服器的資訊(基本上是 mysql.user
項目的主機值聯集)。如果客戶端嘗試從任何其他主機連線,伺服器會在連線設定的早期階段拒絕嘗試。
ERROR 1130 (HY000): Host 'host_name' is not
allowed to connect to this MySQL server
由於這種拒絕發生得很早,因此 CONNECTION_CONTROL
看不到它,也不會對其進行計數。
若要監控失敗的連線,請使用以下資訊來源:
狀態變數
Connection_control_delay_generated
指示伺服器因連線嘗試失敗而對其回應加入延遲的次數。這不計入達到系統變數connection_control_failed_connections_threshold
所定義的閾值之前發生的嘗試。INFORMATION_SCHEMA
的CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS
表格提供每個帳戶(使用者/主機組合)目前連續連線嘗試失敗次數的相關資訊。無論這些嘗試是否延遲,都會計算所有失敗的嘗試。
在執行階段為 connection_control_failed_connections_threshold
賦值會有以下影響:
所有累積的連線失敗計數器都會重置為零。
狀態變數
Connection_control_delay_generated
會重置為零。