共计 3407 个字符,预计需要花费 9 分钟才能阅读完成。
作者:杨涛涛
资深数据库专家,专研 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 数据库在这块畛域的有余。