新特性解讀 | MySQL 8.0 新密碼策略(終篇)

愛可生雲資料庫發表於2022-02-01

作者:楊濤濤

資深資料庫專家,專研 MySQL 十餘年。擅長 MySQL、PostgreSQL、MongoDB 等開源資料庫相關的備份恢復、SQL 調優、監控運維、高可用架構設計等。目前任職於愛可生,為各大運營商及銀行金融企業提供 MySQL 相關技術支援、MySQL 相關課程培訓等工作。

本文來源:原創投稿

*愛可生開源社群出品,原創內容未經授權不得隨意使用,轉載請聯絡小編並註明來源。


我們時常會遇到的場景: 用銀行卡在 ATM 機取款、在 APP 上轉賬、網購付款等等環節,因密碼連續輸錯一定的次數,銀行卡即被鎖定而無法使用,除非拿著有效證件去銀行櫃檯人工解鎖才可正常使用。

隨著MySQL 資料庫被越來越多的金融場景使用,類似連續輸錯銀行卡密碼而導致的鎖卡功能呼之欲出。MySQL 從 8.0.19 開始,就推出了類似策略:Failed-Login Tracking and Temporary Account Locking 。 翻譯過來就是 失敗登入追蹤和臨時密碼鎖定,後面我們簡稱為:FLTTAL 。

和之前幾個密碼策略不同,FLTTAL 沒有全域性引數匹配,只能在建立使用者或者是更改使用者屬性時被匹配。 有兩個選項:

FLTTAL 有以下幾個需要注意的點:
  1. failed_login_attempts 和 password_lock_time 必須同時不為 0 ,FLTTAL 才能生效。
  2. 建立新使用者不指定 failed_login_attempts 和 password_lock_time ,則預設關閉 FLTTAL 。
  3. 已使用FLTTAL的使用者,管理員對其 alter user 後不改變原有密碼驗證策略。
  4. 一旦賬戶被鎖定,即使輸入正確密碼也無法登入。
  5. 還有最重要的一點:由於 FLTTAL 對密碼驗證正確與否的連續性,任意一次成功登入,FLTTAL 計數器重置。例如 failed_login_attempts 設定為 3 ,前兩次密碼連續輸錯,第三次輸入正確的密碼,FLTTAL 計數器重置。
那接下來我們來看下如何具體使用這個密碼驗證策略:
  1. 對於普通使用者的使用方法

管理員建立使用者 test1@'localhost' ,並且設定 FLTTAL 策略:失敗重試次數為 3 ,密碼鎖定時間為 3 天。

   mysql:(none)>create user test1@'localhost' identified by 'test' failed_login_attempts 3 password_lock_time 3;
   Query OK, 0 rows affected (0.14 sec)

密碼連續輸錯 3 次,test1@'localhost' 賬號被鎖定:

   root@ytt-ubuntu:/home/ytt# mysql -utest1  -p -S /opt/mysql/mysqld.sock
   Enter password: 
   ERROR 1045 (28000): Access denied for user 'test1'@'localhost' (using password: NO)
   root@ytt-ubuntu:/home/ytt# mysql -utest1  -p -S /opt/mysql/mysqld.sock
   Enter password: 
   ERROR 1045 (28000): Access denied for user 'test1'@'localhost' (using password: NO)
   root@ytt-ubuntu:/home/ytt# mysql -utest1  -p -S /opt/mysql/mysqld.sock
   Enter password: 
   ERROR 3955 (HY000): Access denied for user 'test1'@'localhost'. Account is blocked for 3 day(s) (3 day(s) remaining) due to 3 consecutive failed logins.

管理員解鎖賬戶方能正常使用:(或者忘記密碼,讓管理員解鎖賬號並且重置新密碼。)

   mysql:(none)>alter user test1@'localhost' account unlock;
   Query OK, 0 rows affected (0.00 sec)

用正確密碼再次登入: 登入成功。

   root@ytt-ubuntu:/home/ytt# mysql -utest1  -p -S /opt/mysql/mysqld.sock -e "select 'hello world\!'"
   Enter password: 
   +--------------+
   | hello world! |
   +--------------+
   | hello world! |
   +--------------+
  1. 對於代理使用者的使用方法:

對於代理使用者來講,FLTTAL 隻影響代理使用者本身,並不影響隱藏的真實使用者。

代理使用者介紹詳見我之前的文章:https://mp.weixin.qq.com/s/gw...

之前建立的代理使用者:

   mysql:(none)>show grants for ytt_fake;
   +-------------------------------------------------+
   | Grants for ytt_fake@%                           |
   +-------------------------------------------------+
   | GRANT USAGE ON *.* TO `ytt_fake`@`%`            |
   | GRANT PROXY ON `ytt_real`@`%` TO `ytt_fake`@`%` |
   +-------------------------------------------------+
   2 rows in set (0.00 sec)

把真實使用者外掛改為mysql_native_password 讓其可以正常登入:

   mysql:(none)>alter user ytt_real identified with mysql_native_password;
   Query OK, 0 rows affected (0.10 sec)

給代理使用者 ytt_fake 設定 FLTTAL 策略:失敗重試次數為 2 ,密碼鎖定時間為 7 天。

   mysql:(none)>alter user ytt_fake failed_login_attempts 2 password_lock_time 7;
   Query OK, 0 rows affected (0.14 sec)

代理使用者連續輸錯兩次密碼,賬號被鎖住:

   root@ytt-ubuntu:/home/ytt# mysql -u ytt_fake -p -hytt-ubuntu
   Enter password: 
   ERROR 1045 (28000): Access denied for user 'ytt_fake'@'ytt-ubuntu' (using password: YES)
   root@ytt-ubuntu:/home/ytt# mysql -u ytt_fake -p -hytt-ubuntu
   Enter password: 
   ERROR 3955 (HY000): Access denied for user 'ytt_fake'@'ytt-ubuntu'. Account is blocked for 7 day(s) (7 day(s) remaining) due to 2 consecutive failed logins.

使用真實使用者登入,不受代理使用者影響: 真實使用者可以正常登入。

   root@ytt-ubuntu:/home/ytt# mysql -u ytt_real -p -hytt-ubuntu -e "select 'hello world\!'";
   Enter password: 
   +--------------+
   | hello world! |
   +--------------+
   | hello world! |
   +--------------+
使用者賬號被鎖定並且禁止登入後,除了管理員通過手動解鎖重置計數器外,還可以有以下幾種方法重置計數器:
  1. MySQLD 服務重啟。
  2. 執行 FLUSH PRIVILEGES,對使用者許可權資料刷盤。
  3. 一次成功的賬戶登入。
  4. 鎖定時間過期。 例如鎖定時間為 7 天,7 天內管理員沒做任何處理,FLTTAL 計數器重置。
  5. 管理員重新更改 failed_login_attempts 或者 password_lock_time 選項,FLTTAL 計數器重置。
總結:

這裡講解了 MySQL 8.0 的失敗登入追蹤和臨時密碼鎖定策略, 結合之前介紹過的其他密碼驗證策略一起使用,可以彌補 MySQL 資料庫在這塊領域的不足。

相關文章