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


MySQL 9.0 參考手冊  /  ...  /  密碼管理

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

  • 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 選項,則會預設為 PASSWORD REQUIRE CURRENT DEFAULT

下表顯示每個帳戶的設定如何與 password_require_current 系統變數值互動,以判斷帳戶密碼是否需要驗證的原則。

表 8.10 密碼驗證原則

每個帳戶的設定 password_require_current 系統變數 變更密碼時是否需要目前密碼?
PASSWORD REQUIRE CURRENT 關閉
PASSWORD REQUIRE CURRENT 開啟
PASSWORD REQUIRE CURRENT OPTIONAL 關閉
PASSWORD REQUIRE CURRENT OPTIONAL 開啟
PASSWORD REQUIRE CURRENT DEFAULT 關閉
PASSWORD REQUIRE CURRENT DEFAULT 開啟

注意

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

若要全域建立密碼驗證原則,請使用 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 會丟棄次要密碼(如果存在)。該帳戶僅保留其主要密碼,且用戶端只能使用主要密碼連接到伺服器。

修改次要密碼的語句需要以下權限:

  • 使用 ALTER USERSET PASSWORD 語句的 RETAIN CURRENT PASSWORDDISCARD OLD PASSWORD 子句,且這些語句適用於您自己的帳戶時,需要 APPLICATION_PASSWORD_ADMIN 權限。操作您自己的次要密碼需要此權限,因為大多數使用者只需要一個密碼。

  • 如果要允許某個帳戶操作所有帳戶的次要密碼,則應授予該帳戶 CREATE USER 權限,而不是 APPLICATION_PASSWORD_ADMIN 權限。

隨機密碼產生

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 節「代理使用者」