本節說明如何安裝連線控制外掛程式 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 帳戶,但提供的認證不正確,或者與任何已知的帳戶都不符。
連線失敗計數是以每次連線嘗試的使用者/主機組合為基礎。適用使用者名稱和主機名稱的判斷會考量到 Proxy,並按照以下方式進行:
如果用戶端使用者代理了其他使用者,則連線失敗計數的帳戶是代理使用者,而不是被代理的使用者。例如,如果
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,「Proxy 使用者」)。如果用戶端使用者沒有代理其他使用者,但確實符合
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
狀態變數會重設為零。