文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  連線控制外掛程式安裝

8.4.2.1 連線控制外掛程式安裝

本節說明如何安裝連線控制外掛程式,CONNECTION_CONTROLCONNECTION_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

如果希望防止伺服器在沒有指定連線控制外掛程式的情況下執行,請使用 FORCEFORCE_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 次連續連線嘗試失敗之前,延遲為零。

  • 之後,伺服器會為後續連續嘗試增加延遲,直到連線成功為止。初始未調整的延遲從 1000 毫秒(1 秒)開始,每次嘗試增加 1000 毫秒。也就是說,一旦帳戶啟用了延遲,後續失敗嘗試的未調整延遲為 1000 毫秒、2000 毫秒、3000 毫秒,依此類推。

  • 客戶端體驗到的實際延遲是未調整的延遲,調整後使其位於 connection_control_min_connection_delayconnection_control_max_connection_delay 系統變數的值(包括邊界值)範圍內。

  • 一旦帳戶啟用了延遲,該帳戶之後的第一次成功連線也會經歷延遲,但後續連線的失敗計數將會重置。

例如,使用預設的 connection_control_failed_connections_threshold 值 3,帳戶的前三次連續連線嘗試失敗不會有延遲。帳戶在第四次及後續連線失敗時體驗到的實際調整延遲取決於 connection_control_min_connection_delayconnection_control_max_connection_delay 的值。

您可以在伺服器啟動時或執行時設定 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_delayconnection_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.comexternal_user@example.comproxy_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.comuser1@%.comuser1@% 項目,則計數分別使用 user1@%.example.comuser1@%.comuser1@%

對於剛才描述的案例,連線嘗試符合某些 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_failed_connections_threshold 賦值會有以下影響: