文件首頁
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.2.15 密碼管理

MySQL 支援下列密碼管理功能

  • 密碼到期,要求定期變更密碼。

  • 密碼重複使用限制,以防止再次選擇舊密碼。

  • 密碼驗證,要求密碼變更也必須指定要替換的目前密碼。

  • 雙重密碼,讓用戶端可以使用主要密碼或次要密碼連線。

  • 密碼強度評估,要求強式密碼。

  • 隨機密碼產生,作為要求明確管理員指定文字密碼的替代方案。

  • 密碼失敗追蹤,讓連續多次錯誤密碼登入失敗後,能夠暫時鎖定帳戶。

下列章節說明這些功能,除了密碼強度評估外,該評估是使用 validate_password 元件實作,並在第 8.4.3 節,「密碼驗證元件」中說明。

重要

MySQL 使用 mysql 系統資料庫中的表格實作密碼管理功能。如果您從較早版本升級 MySQL,您的系統表格可能不是最新的。在這種情況下,伺服器會在啟動過程中將類似以下的訊息寫入錯誤記錄(確切數字可能會有所不同)

[ERROR] Column count of mysql.user is wrong. Expected
49, found 47. The table is probably corrupted
[Warning] ACL table mysql.password_history missing.
Some operations may fail.

若要修正此問題,請執行 MySQL 升級程序。請參閱第 3 章,升級 MySQL。在完成此動作之前,無法變更密碼。

內部與外部認證儲存

有些驗證外掛程式會將帳戶認證內部儲存至 MySQL,在 mysql.user 系統表格中

  • caching_sha2_password

  • mysql_native_password (已棄用)

  • sha256_password (已棄用)

本節中的大多數討論適用於這類驗證外掛程式,因為此處說明的大多數密碼管理功能都基於 MySQL 本身處理的內部認證儲存。其他驗證外掛程式會將帳戶認證儲存在 MySQL 的外部。對於使用針對外部認證系統執行驗證的外掛程式的帳戶,密碼管理也必須在該系統外部處理。

例外情況是,失敗登入追蹤和暫時帳戶鎖定的選項適用於所有帳戶,而不僅僅是使用內部認證儲存的帳戶,因為無論帳戶使用內部或外部認證儲存,MySQL 都能夠評估任何帳戶的登入嘗試狀態。

如需個別驗證外掛程式的資訊,請參閱第 8.4.1 節,「驗證外掛程式」

密碼到期原則

MySQL 讓資料庫管理員能夠手動使帳戶密碼到期,並建立自動密碼到期的原則。可以全域建立到期原則,並且可以將個別帳戶設定為遵循全域原則,或使用特定的每個帳戶行為覆寫全域原則。

若要手動使帳戶密碼到期,請使用 ALTER USER 陳述式

ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE;

此操作會將 mysql.user 系統資料表中對應列的密碼標記為已過期。

根據策略,密碼過期是自動的,並基於密碼的使用期限。對於給定的帳戶,其使用期限是從最近一次密碼變更的日期和時間開始計算的。 mysql.user 系統資料表會指示每個帳戶上次變更密碼的時間。如果密碼的使用期限超過其允許的生命週期,伺服器會在客戶端連線時自動將密碼視為已過期。這無需手動設定密碼過期。

若要全域設定自動密碼過期策略,請使用 default_password_lifetime 系統變數。其預設值為 0,這會停用自動密碼過期。如果 default_password_lifetime 的值為正整數 N,則表示允許的密碼生命週期,密碼必須每 N 天變更一次。

範例

  • 若要設定全域策略,使密碼的生命週期約為六個月,請在伺服器的 my.cnf 檔案中使用以下行來啟動伺服器:

    [mysqld]
    default_password_lifetime=180
  • 若要設定全域策略,使密碼永不過期,請將 default_password_lifetime 設定為 0:

    [mysqld]
    default_password_lifetime=0
  • default_password_lifetime 也可以在執行階段設定並保留:

    SET PERSIST default_password_lifetime = 180;
    SET PERSIST default_password_lifetime = 0;

    SET PERSIST 會設定執行中 MySQL 執行個體的值。它也會儲存該值,以便在後續伺服器重新啟動時繼續使用;請參閱 第 15.7.6.1 節,「SET 變數指派語法」。若要在執行中的 MySQL 執行個體中變更該值,但不希望在後續重新啟動時繼續使用,請使用 GLOBAL 關鍵字,而非 PERSIST

全域密碼過期策略適用於所有未設定為覆寫它的帳戶。若要為個別帳戶設定策略,請使用 CREATE USERALTER USER 陳述式的 PASSWORD EXPIRE 選項。請參閱 第 15.7.1.3 節,「CREATE USER 陳述式」第 15.7.1.1 節,「ALTER USER 陳述式」

特定於帳戶的陳述式範例

  • 要求密碼每 90 天變更一次

    CREATE USER 'jeffrey'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY;
    ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY;

    此過期選項會覆寫陳述式中所命名之所有帳戶的全域策略。

  • 停用密碼過期

    CREATE USER 'jeffrey'@'localhost' PASSWORD EXPIRE NEVER;
    ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE NEVER;

    此過期選項會覆寫陳述式中所命名之所有帳戶的全域策略。

  • 對於陳述式中所命名之所有帳戶,延遲到全域過期策略

    CREATE USER 'jeffrey'@'localhost' PASSWORD EXPIRE DEFAULT;
    ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE DEFAULT;

當客戶端成功連線時,伺服器會判斷帳戶密碼是否已過期

  • 伺服器會檢查密碼是否已手動過期。

  • 否則,伺服器會檢查密碼的使用期限是否大於根據自動密碼過期策略所允許的生命週期。如果是,則伺服器會將密碼視為已過期。

如果密碼已過期(無論是手動還是自動),伺服器會中斷客戶端的連線或限制允許對其執行的操作(請參閱 第 8.2.16 節,「伺服器處理過期密碼」)。受限制的客戶端執行的操作會導致錯誤,直到使用者建立新的帳戶密碼為止

mysql> SELECT 1;
ERROR 1820 (HY000): You must reset your password using ALTER USER
statement before executing this statement.

mysql> ALTER USER USER() IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.01 sec)

mysql> SELECT 1;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.00 sec)

在客戶端重設密碼後,伺服器會還原工作階段的正常存取權限,以及後續使用該帳戶的連線。管理使用者也可以重設帳戶密碼,但該帳戶的任何現有受限工作階段仍會保持受限。使用該帳戶的客戶端必須中斷連線並重新連線,才能成功執行陳述式。

注意

儘管可以將過期的密碼設定為其目前的值來「重設」它,但作為良好的策略,最好選擇不同的密碼。DBA 可以透過建立適當的密碼重複使用策略來強制禁止重複使用。請參閱 密碼重複使用策略

密碼重複使用策略

MySQL 允許對先前密碼的重複使用設定限制。重複使用限制可以根據密碼變更的次數、經過的時間或兩者來建立。重複使用策略可以全域建立,並且可以將個別帳戶設定為延遲到全域策略,或使用特定於每個帳戶的行為來覆寫全域策略。

帳戶的密碼記錄包含過去已指派給它的密碼。MySQL 可以限制從此記錄中選擇新的密碼

  • 如果帳戶根據密碼變更的次數受到限制,則無法從指定次數的最近密碼中選擇新密碼。例如,如果密碼變更的最小次數設定為 3,則新密碼不能與最近的 3 個密碼中的任何一個相同。

  • 如果帳戶根據經過的時間受到限制,則無法從記錄中選擇比指定天數新的密碼。例如,如果密碼重複使用間隔設定為 60,則新密碼不得是過去 60 天內先前選擇的密碼。

注意

空密碼不計入密碼記錄中,並且可以隨時重複使用。

若要全域建立密碼重複使用策略,請使用 password_historypassword_reuse_interval 系統變數。

範例

  • 若要禁止重複使用最近的 6 個密碼或比 365 天新的密碼,請將以下行放入伺服器的 my.cnf 檔案中:

    [mysqld]
    password_history=6
    password_reuse_interval=365
  • 若要在執行階段設定和保留變數,請使用如下的陳述式:

    SET PERSIST password_history = 6;
    SET PERSIST password_reuse_interval = 365;

    SET PERSIST 會設定執行中 MySQL 執行個體的值。它也會儲存該值,以便在後續伺服器重新啟動時繼續使用;請參閱 第 15.7.6.1 節,「SET 變數指派語法」。若要在執行中的 MySQL 執行個體中變更該值,但不希望在後續重新啟動時繼續使用,請使用 GLOBAL 關鍵字,而非 PERSIST

全域密碼重複使用策略適用於所有未設定為覆寫它的帳戶。若要為個別帳戶設定策略,請使用 CREATE USERALTER USER 陳述式的 PASSWORD HISTORYPASSWORD REUSE INTERVAL 選項。請參閱 第 15.7.1.3 節,「CREATE USER 陳述式」第 15.7.1.1 節,「ALTER USER 陳述式」

特定於帳戶的陳述式範例

  • 要求至少變更 5 次密碼,然後才允許重複使用

    CREATE USER 'jeffrey'@'localhost' PASSWORD HISTORY 5;
    ALTER USER 'jeffrey'@'localhost' PASSWORD HISTORY 5;

    此記錄長度選項會覆寫陳述式中所命名之所有帳戶的全域策略。

  • 要求至少經過 365 天,然後才允許重複使用

    CREATE USER 'jeffrey'@'localhost' PASSWORD REUSE INTERVAL 365 DAY;
    ALTER USER 'jeffrey'@'localhost' PASSWORD REUSE INTERVAL 365 DAY;

    此經過時間選項會覆寫陳述式中所命名之所有帳戶的全域策略。

  • 若要結合兩種重複使用限制類型,請一起使用 PASSWORD HISTORYPASSWORD REUSE INTERVAL

    CREATE USER 'jeffrey'@'localhost'
      PASSWORD HISTORY 5
      PASSWORD REUSE INTERVAL 365 DAY;
    ALTER USER 'jeffrey'@'localhost'
      PASSWORD HISTORY 5
      PASSWORD REUSE INTERVAL 365 DAY;

    這些選項會覆寫陳述式中所命名之所有帳戶的兩個全域策略重複使用限制。

  • 延遲到兩種重複使用限制類型的全域策略

    CREATE USER 'jeffrey'@'localhost'
      PASSWORD HISTORY DEFAULT
      PASSWORD REUSE INTERVAL DEFAULT;
    ALTER USER 'jeffrey'@'localhost'
      PASSWORD HISTORY DEFAULT
      PASSWORD REUSE INTERVAL DEFAULT;

密碼驗證需求策略

可以要求嘗試變更帳戶密碼時,必須指定要取代的目前密碼來驗證。這讓 DBA 能夠防止使用者在不證明他們知道目前密碼的情況下變更密碼。否則,可能會發生這種情況,例如,如果某個使用者在未登出的情況下暫時離開終端機工作階段,而惡意使用者使用該工作階段變更原始使用者的 MySQL 密碼。這可能會產生不幸的後果

  • 原始使用者將無法存取 MySQL,直到管理員重設帳戶密碼為止。

  • 在重設密碼之前,惡意使用者可以使用良性使用者變更的認證來存取 MySQL。

密碼驗證策略可以全域建立,並且可以將個別帳戶設定為延遲到全域策略,或使用特定於每個帳戶的行為來覆寫全域策略。

對於每個帳戶,其 mysql.user 列會指出是否有特定於帳戶的設定要求驗證目前密碼以進行密碼變更嘗試。此設定是由 CREATE USERALTER USER 陳述式的 PASSWORD REQUIRE 選項所建立的

  • 如果帳戶設定為 PASSWORD REQUIRE CURRENT,則密碼變更必須指定目前的密碼。

  • 如果帳戶設定為 PASSWORD REQUIRE CURRENT OPTIONAL,則密碼變更可以選擇性地指定目前的密碼。

  • 如果帳戶設定為 PASSWORD REQUIRE CURRENT DEFAULT,則 password_require_current 系統變數會決定帳戶的驗證需求策略

換句話說,如果帳戶設定不是 PASSWORD REQUIRE CURRENT DEFAULT,則帳戶設定會優先於 password_require_current 系統變數所建立的全域策略。否則,帳戶會延遲到 password_require_current 設定。

預設情況下,密碼驗證是選用的:停用 password_require_current,並且使用預設為 PASSWORD REQUIRE CURRENT DEFAULTPASSWORD REQUIRE 選項建立的帳戶。

下表顯示每個帳戶的設定如何與 password_require_current 系統變數值互動,以決定帳戶密碼驗證需求策略。

表 8.10 密碼驗證策略

每個帳戶的設定 password_require_current 系統變數 密碼變更是否需要目前密碼?
PASSWORD REQUIRE CURRENT OFF
PASSWORD REQUIRE CURRENT ON
PASSWORD REQUIRE CURRENT OPTIONAL OFF
PASSWORD REQUIRE CURRENT OPTIONAL ON
PASSWORD REQUIRE CURRENT DEFAULT OFF
PASSWORD REQUIRE CURRENT DEFAULT ON

注意

具有特權的使用者可以變更任何帳戶密碼,而無需指定目前的密碼,無論是否需要驗證政策。具有特權的使用者是指擁有全域 CREATE USER 權限或 UPDATE 權限給 mysql 系統資料庫的使用者。

若要設定全域密碼驗證政策,請使用 password_require_current 系統變數。其預設值為 OFF,因此變更帳戶密碼時不需要指定目前的密碼。

範例

  • 若要設定全域政策,規定密碼變更必須指定目前的密碼,請在伺服器的 my.cnf 檔案中,使用以下幾行來啟動伺服器

    [mysqld]
    password_require_current=ON
  • 若要在執行階段設定並持久化 password_require_current,請使用如下的陳述式

    SET PERSIST password_require_current = ON;
    SET PERSIST password_require_current = OFF;

    SET PERSIST 會設定執行中 MySQL 執行個體的值。它也會儲存該值,以便在後續伺服器重新啟動時繼續使用;請參閱 第 15.7.6.1 節,「SET 變數指派語法」。若要在執行中的 MySQL 執行個體中變更該值,但不希望在後續重新啟動時繼續使用,請使用 GLOBAL 關鍵字,而非 PERSIST

全域密碼驗證需求政策適用於所有未設定覆寫此政策的帳戶。若要設定個別帳戶的政策,請使用 CREATE USERALTER USER 陳述式的 PASSWORD REQUIRE 選項。請參閱 第 15.7.1.3 節「CREATE USER 陳述式」,和 第 15.7.1.1 節「ALTER USER 陳述式」

特定於帳戶的陳述式範例

  • 要求密碼變更時必須指定目前的密碼

    CREATE USER 'jeffrey'@'localhost' PASSWORD REQUIRE CURRENT;
    ALTER USER 'jeffrey'@'localhost' PASSWORD REQUIRE CURRENT;

    此驗證選項會覆寫陳述式中所有命名帳戶的全域政策。

  • 不要求密碼變更時必須指定目前的密碼(目前的密碼可以選擇性地提供)

    CREATE USER 'jeffrey'@'localhost' PASSWORD REQUIRE CURRENT OPTIONAL;
    ALTER USER 'jeffrey'@'localhost' PASSWORD REQUIRE CURRENT OPTIONAL;

    此驗證選項會覆寫陳述式中所有命名帳戶的全域政策。

  • 針對陳述式中所有命名帳戶,延用全域密碼驗證需求政策

    CREATE USER 'jeffrey'@'localhost' PASSWORD REQUIRE CURRENT DEFAULT;
    ALTER USER 'jeffrey'@'localhost' PASSWORD REQUIRE CURRENT DEFAULT;

當使用者使用 ALTER USERSET PASSWORD 陳述式變更密碼時,目前的密碼驗證才會生效。範例使用 ALTER USER,這是優先於 SET PASSWORD 的方式,但此處描述的原則對於這兩個陳述式是相同的。

在密碼變更陳述式中,REPLACE 子句指定要取代的目前密碼。範例:

  • 變更目前使用者的密碼

    ALTER USER USER() IDENTIFIED BY 'auth_string' REPLACE 'current_auth_string';
  • 變更指定使用者的密碼

    ALTER USER 'jeffrey'@'localhost'
      IDENTIFIED BY 'auth_string'
      REPLACE 'current_auth_string';
  • 變更指定使用者的驗證外掛程式和密碼

    ALTER USER 'jeffrey'@'localhost'
      IDENTIFIED WITH caching_sha2_password BY 'auth_string'
      REPLACE 'current_auth_string';

REPLACE 子句的運作方式如下:

  • 如果帳戶的密碼變更需要指定目前的密碼,則必須提供 REPLACE,以驗證嘗試變更的使用者確實知道目前的密碼。

  • 如果帳戶的密碼變更可以選擇性地指定目前的密碼,則 REPLACE 是可選的。

  • 如果指定了 REPLACE,則必須指定正確的目前密碼,否則會發生錯誤。即使 REPLACE 是可選的,也是如此。

  • 只有在變更目前使用者的帳戶密碼時,才能指定 REPLACE。(這表示在剛剛顯示的範例中,明確指定 jeffrey 帳戶的陳述式,除非目前使用者是 jeffrey,否則會失敗。)即使具有特權的使用者嘗試為另一個使用者變更密碼,也是如此;但是,此類使用者可以在不指定 REPLACE 的情況下變更任何密碼。

  • REPLACE 會從二進位日誌中省略,以避免將明文密碼寫入其中。

雙重密碼支援

使用者帳戶允許擁有雙重密碼,分別指定為主密碼和次要密碼。雙重密碼功能使得在以下情境中可以無縫執行憑證變更:

  • 系統具有大量的 MySQL 伺服器,可能涉及複製。

  • 多個應用程式連線到不同的 MySQL 伺服器。

  • 必須定期變更應用程式用來連線到伺服器的帳戶或多個帳戶的憑證。

考量當帳戶僅允許單一密碼時,在上述類型的情境中必須如何執行憑證變更。在這種情況下,必須密切合作,協調帳戶密碼變更的時間,並在所有伺服器中傳播,以及何時將所有使用該帳戶的應用程式更新為使用新密碼。此過程可能涉及停機時間,在此期間伺服器或應用程式無法使用。

使用雙重密碼,可以更輕鬆、分階段地進行憑證變更,而無需密切合作,並且無需停機時間

  1. 對於每個受影響的帳戶,在伺服器上建立新的主密碼,並將目前的密碼保留為次要密碼。這使得伺服器能夠識別每個帳戶的主密碼或次要密碼,同時應用程式可以使用與之前相同的密碼(現在是次要密碼)繼續連線到伺服器。

  2. 在密碼變更傳播到所有伺服器後,修改使用任何受影響帳戶的應用程式,以使用帳戶主密碼進行連線。

  3. 在所有應用程式都從次要密碼移轉到主密碼之後,就不再需要次要密碼,可以將其捨棄。在此變更傳播到所有伺服器後,每個帳戶只能使用主密碼進行連線。憑證變更現在已完成。

MySQL 使用儲存和捨棄次要密碼的語法來實作雙重密碼功能

  • 當您指派新的主密碼時,ALTER USERSET PASSWORD 陳述式的 RETAIN CURRENT PASSWORD 子句會將帳戶目前的密碼儲存為其次要密碼。

  • ALTER USERDISCARD OLD PASSWORD 子句會捨棄帳戶的次要密碼,僅保留主密碼。

假設,對於先前描述的憑證變更情境,應用程式使用名為 'appuser1'@'host1.example.com' 的帳戶連線到伺服器,並且帳戶密碼將從 'password_a' 變更為 'password_b'

若要執行此憑證變更,請使用 ALTER USER,如下所示:

  1. 在每個非複本的伺服器上,將 'password_b' 建立為新的 appuser1 主密碼,並將目前的密碼保留為次要密碼

    ALTER USER 'appuser1'@'host1.example.com'
      IDENTIFIED BY 'password_b'
      RETAIN CURRENT PASSWORD;
  2. 等待密碼變更在整個系統中複製到所有複本。

  3. 修改每個使用 appuser1 帳戶的應用程式,使其使用 'password_b' 的密碼而不是 'password_a' 連線到伺服器。

  4. 此時,不再需要次要密碼。在每個非複本的伺服器上,捨棄次要密碼

    ALTER USER 'appuser1'@'host1.example.com'
      DISCARD OLD PASSWORD;
  5. 在捨棄密碼變更複製到所有複本後,憑證變更即完成。

RETAIN CURRENT PASSWORDDISCARD OLD PASSWORD 子句具有以下效果:

  • RETAIN CURRENT PASSWORD 會將帳戶目前的密碼保留為其次要密碼,取代任何現有的次要密碼。新的密碼會成為主密碼,但用戶端可以使用該帳戶以主密碼或次要密碼連線到伺服器。(例外情況:如果 ALTER USERSET PASSWORD 陳述式指定的新密碼為空,則即使提供了 RETAIN CURRENT PASSWORD,次要密碼也會變為空。)

  • 如果您為具有空主密碼的帳戶指定 RETAIN CURRENT PASSWORD,則陳述式會失敗。

  • 如果帳戶具有次要密碼,並且您在未指定 RETAIN CURRENT PASSWORD 的情況下變更其主密碼,則次要密碼會保持不變。

  • 對於 ALTER USER,如果您變更指派給帳戶的驗證外掛程式,則會捨棄次要密碼。如果您變更驗證外掛程式,並同時指定 RETAIN CURRENT PASSWORD,則陳述式會失敗。

  • 對於 ALTER USERDISCARD OLD PASSWORD 會捨棄次要密碼(如果存在)。該帳戶僅保留其主密碼,並且用戶端只能使用主密碼連線到伺服器。

修改次要密碼的陳述式需要以下權限:

隨機密碼產生

CREATE USERALTER USERSET PASSWORD 陳述式能夠為使用者帳戶產生隨機密碼,作為要求明確管理員指定文字密碼的替代方案。請參閱每個陳述式的說明,以了解語法的詳細資訊。本節說明產生隨機密碼的共同特性。

依預設,產生的隨機密碼長度為 20 個字元。此長度由 generated_random_password_length 系統變數控制,其範圍從 5 到 255。

對於陳述式產生隨機密碼的每個帳戶,陳述式會將密碼儲存在 mysql.user 系統表中,並針對帳戶驗證外掛程式進行適當的雜湊處理。陳述式也會在結果集中傳回明文密碼,以使其可供執行陳述式的使用者或應用程式使用。結果集資料行的名稱為 userhostgenerated passwordauth_factor,表示識別 mysql.user 系統表中受影響資料列的使用者名稱和主機名稱值、產生的明文密碼,以及顯示的密碼值所套用的驗證因素。

mysql> CREATE USER
       'u1'@'localhost' IDENTIFIED BY RANDOM PASSWORD,
       'u2'@'%.example.com' IDENTIFIED BY RANDOM PASSWORD,
       'u3'@'%.org' IDENTIFIED BY RANDOM PASSWORD;
+------+---------------+----------------------+-------------+
| user | host          | generated password   | auth_factor |
+------+---------------+----------------------+-------------+
| u1   | localhost     | iOeqf>Mh9:;XD&qn(Hl} |           1 |
| u2   | %.example.com | sXTSAEvw3St-R+_-C3Vb |           1 |
| u3   | %.org         | nEVe%Ctw/U/*Md)Exc7& |           1 |
+------+---------------+----------------------+-------------+
mysql> ALTER USER
       'u1'@'localhost' IDENTIFIED BY RANDOM PASSWORD,
       'u2'@'%.example.com' IDENTIFIED BY RANDOM PASSWORD;
+------+---------------+----------------------+-------------+
| user | host          | generated password   | auth_factor |
+------+---------------+----------------------+-------------+
| u1   | localhost     | Seiei:&cw}8]@3OA64vh |           1 |
| u2   | %.example.com | j@&diTX80l8}(NiHXSae |           1 |
+------+---------------+----------------------+-------------+
mysql> SET PASSWORD FOR 'u3'@'%.org' TO RANDOM;
+------+-------+----------------------+-------------+
| user | host  | generated password   | auth_factor |
+------+-------+----------------------+-------------+
| u3   | %.org | n&cz2xF;P3!U)+]Vw52H |           1 |
+------+-------+----------------------+-------------+

為帳戶產生隨機密碼的 CREATE USERALTER USERSET PASSWORD 陳述式,會以 CREATE USERALTER USER 陳述式寫入二進制日誌,並帶有 IDENTIFIED WITH auth_plugin AS 'auth_string' 子句,其中 auth_plugin 是帳戶驗證外掛程式,而 'auth_string' 是帳戶雜湊後的密碼值。

如果安裝了 validate_password 元件,它所實作的政策對產生的密碼沒有影響。(密碼驗證的目的是幫助人們建立更好的密碼。)

失敗登入追蹤與暫時帳戶鎖定

管理員可以設定使用者帳戶,使其在連續登入失敗次數過多時導致帳戶暫時鎖定。

在此上下文中,登入失敗是指用戶端在連線嘗試期間未能提供正確密碼。它不包括因不明使用者或網路問題等原因導致的連線失敗。對於具有雙重密碼的帳戶 (請參閱 雙重密碼支援),任一帳戶密碼都算作正確。

所需的登入失敗次數和鎖定時間可以針對每個帳戶進行設定,使用 CREATE USERALTER USER 陳述式的 FAILED_LOGIN_ATTEMPTSPASSWORD_LOCK_TIME 選項。範例:

CREATE USER 'u1'@'localhost' IDENTIFIED BY 'password'
  FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME 3;

ALTER USER 'u2'@'localhost'
  FAILED_LOGIN_ATTEMPTS 4 PASSWORD_LOCK_TIME UNBOUNDED;

當連續登入失敗次數過多時,客戶端會收到類似以下的錯誤訊息:

ERROR 3957 (HY000): Access denied for user user.
Account is blocked for D day(s) (R day(s) remaining)
due to N consecutive failed logins.

請如下使用這些選項:

  • FAILED_LOGIN_ATTEMPTS N

    此選項表示是否追蹤指定不正確密碼的帳戶登入嘗試次數。數字 N 指定多少次連續不正確密碼會導致帳戶暫時鎖定。

  • PASSWORD_LOCK_TIME {N | UNBOUNDED}

    此選項表示在連續登入嘗試次數過多並提供不正確密碼後,帳戶鎖定的時間長度。值是一個數字 N,用於指定帳戶保持鎖定的天數,或者 UNBOUNDED,用於指定當帳戶進入暫時鎖定狀態時,該狀態的持續時間是無限的,直到帳戶被解除鎖定才會結束。稍後將說明解除鎖定發生的條件。

每個選項的 N 允許值範圍為 0 到 32767。值為 0 會停用該選項。

失敗登入追蹤和暫時帳戶鎖定具有以下特徵:

  • 若要使帳戶發生失敗登入追蹤和暫時鎖定,其 FAILED_LOGIN_ATTEMPTSPASSWORD_LOCK_TIME 選項都必須是非零值。

  • 對於 CREATE USER,如果未指定 FAILED_LOGIN_ATTEMPTSPASSWORD_LOCK_TIME,則該陳述式中命名的所有帳戶的隱含預設值為 0。這表示已停用失敗登入追蹤和暫時帳戶鎖定。

  • 對於 ALTER USER,如果未指定 FAILED_LOGIN_ATTEMPTSPASSWORD_LOCK_TIME,則該陳述式中命名的所有帳戶的值保持不變。

  • 若要發生暫時帳戶鎖定,密碼失敗必須是連續的。在達到失敗登入的 FAILED_LOGIN_ATTEMPTS 值之前發生的任何成功登入都會導致失敗計數重置。例如,如果 FAILED_LOGIN_ATTEMPTS 為 4 且發生了三次連續密碼失敗,則還需要一次失敗才會開始鎖定。但是,如果下一次登入成功,則該帳戶的失敗登入計數會重置,因此再次需要四次連續失敗才會鎖定。

  • 一旦開始暫時鎖定,即使使用正確的密碼也無法成功登入,直到鎖定持續時間過去或帳戶透過以下討論中列出的帳戶重置方法之一解除鎖定為止。

當伺服器讀取授權表時,它會初始化每個帳戶的狀態資訊,包括是否啟用失敗登入追蹤、帳戶目前是否暫時鎖定以及如果是,則鎖定何時開始,以及如果帳戶未鎖定,則暫時鎖定之前失敗的次數。

帳戶的狀態資訊可以重置,這表示失敗登入計數會重置,並且如果帳戶目前暫時鎖定,則會解除鎖定。帳戶重置可以是所有帳戶的全域重置,也可以是每個帳戶的重置。

  • 在以下任何情況下,所有帳戶都會發生全域重置:

    • 重新啟動伺服器。

    • 執行 FLUSH PRIVILEGES。(使用 --skip-grant-tables 啟動伺服器會導致不讀取授權表,這會停用失敗登入追蹤。在這種情況下,第一次執行 FLUSH PRIVILEGES 會導致伺服器讀取授權表並啟用失敗登入追蹤,此外還會重置所有帳戶。)

  • 在以下任何情況下,會發生每個帳戶的重置:

    • 該帳戶的成功登入。

    • 鎖定持續時間過去。在這種情況下,失敗登入計數會在下次登入嘗試時重置。

    • 針對該帳戶執行 ALTER USER 陳述式,將 FAILED_LOGIN_ATTEMPTSPASSWORD_LOCK_TIME (或兩者) 設定為任何值 (包括目前選項值),或者針對該帳戶執行 ALTER USER ... UNLOCK 陳述式。

      其他針對該帳戶的 ALTER USER 陳述式不會對其目前的失敗登入計數或鎖定狀態產生任何影響。

失敗登入追蹤與用於檢查憑證的登入帳戶相關聯。如果正在使用使用者代理,則追蹤發生在代理使用者上,而不是被代理的使用者。也就是說,追蹤與 USER() 指示的帳戶相關聯,而不是與 CURRENT_USER() 指示的帳戶相關聯。如需有關代理使用者與被代理使用者之間區別的資訊,請參閱 第 8.2.19 節「代理使用者」