作者:楊濤濤
資深資料庫專家,專研 MySQL 十餘年。擅長 MySQL、PostgreSQL、MongoDB 等開源資料庫相關的備份恢復、SQL 調優、監控運維、高可用架構設計等。目前任職於愛可生,為各大運營商及銀行金融企業提供 MySQL 相關技術支援、MySQL 相關課程培訓等工作。
本文來源:原創投稿
*愛可生開源社群出品,原創內容未經授權不得隨意使用,轉載請聯絡小編並註明來源。
我們時常會遇到的場景: 用銀行卡在 ATM 機取款、在 APP 上轉賬、網購付款等等環節,因密碼連續輸錯一定的次數,銀行卡即被鎖定而無法使用,除非拿著有效證件去銀行櫃檯人工解鎖才可正常使用。
隨著MySQL 資料庫被越來越多的金融場景使用,類似連續輸錯銀行卡密碼而導致的鎖卡功能呼之欲出。MySQL 從 8.0.19 開始,就推出了類似策略:Failed-Login Tracking and Temporary Account Locking 。 翻譯過來就是 失敗登入追蹤和臨時密碼鎖定,後面我們簡稱為:FLTTAL 。
和之前幾個密碼策略不同,FLTTAL 沒有全域性引數匹配,只能在建立使用者或者是更改使用者屬性時被匹配。 有兩個選項:
FLTTAL 有以下幾個需要注意的點:
failed_login_attempts 和 password_lock_time 必須同時不為 0 ,FLTTAL 才能生效。
建立新使用者不指定 failed_login_attempts 和 password_lock_time ,則預設關閉 FLTTAL 。
已使用FLTTAL的使用者,管理員對其 alter user 後不改變原有密碼驗證策略。
一旦賬戶被鎖定,即使輸入正確密碼也無法登入。
還有最重要的一點:由於 FLTTAL 對密碼驗證正確與否的連續性,任意一次成功登入,FLTTAL 計數器重置。例如 failed_login_attempts 設定為 3 ,前兩次密碼連續輸錯,第三次輸入正確的密碼,FLTTAL 計數器重置。
那接下來我們來看下如何具體使用這個密碼驗證策略:
對於普通使用者的使用方法:
管理員建立使用者 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! |
+--------------+
對於代理使用者的使用方法:
對於代理使用者來講,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! |
+--------------+
使用者賬號被鎖定並且禁止登入後,除了管理員通過手動解鎖重置計數器外,還可以有以下幾種方法重置計數器:
- MySQLD 服務重啟。
- 執行 FLUSH PRIVILEGES,對使用者許可權資料刷盤。
- 一次成功的賬戶登入。
- 鎖定時間過期。 例如鎖定時間為 7 天,7 天內管理員沒做任何處理,FLTTAL 計數器重置。
- 管理員重新更改 failed_login_attempts 或者 password_lock_time 選項,FLTTAL 計數器重置。
總結:
這裡講解了 MySQL 8.0 的失敗登入追蹤和臨時密碼鎖定策略, 結合之前介紹過的其他密碼驗證策略一起使用,可以彌補 MySQL 資料庫在這塊領域的不足。