新特性解读 | MySQL 8.0 新密码策略(终篇)

 作者:杨涛涛

资深数据库专家,专研 MySQL 十余年。擅长 MySQL、PostgreSQL、MongoDB 等开源数据库相关的备份恢复、SQL 调优、监控运维、高可用架构设计等。目前任职于爱可生,为各大运营商及银行金融企业提供 MySQL 相关技术支持、MySQL 相关课程培训等工作。

本文来源:原创投稿

* 爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。


我们时常会遇到的场景:用银行卡在 ATM 机取款、在 APP 上转账、网购付款等等环节,因密码连续输错一定的次数,银行卡即被锁定而无法使用,除非拿着有效证件去银行柜台人工解锁才可正常使用。

随着 MySQL 数据库被越来越多的金融场景使用,类似连续输错银行卡密码而导致的锁卡功能呼之欲出。MySQL 从 8.0.19 开始,就推出了类似策略:Failed-Login Tracking and Temporary Account Locking 。翻译过来就是 失败登录追踪和临时密码锁定,后面我们简称为:FLTTAL 。

和之前几个密码策略不同,FLTTAL 没有全局参数匹配,只能在创建用户或者是更改用户属性时被匹配。有两个选项:

1. FAILED_LOGIN_ATTEMPTS N :代表密码失败重试次数。

2. PASSWORD_LOCK_TIMEN | UNBOUNDED:代表密码连续“FAILED_LOGIN_ATTEMPTS”次验证失败后被锁定的天数

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 只影响代理用户本身,并不影响隐藏的真实用户。

代理用户介绍详见我之前的文章:MySQL 8.0 代理用户使用

之前创建的代理用户:

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 数据库在这块领域的不足。


文章推荐:

新特性解读 | MySQL 8.0 新密码策略(下)

新特性解读 | MySQL 8.0 新密码策略(中)

新特性解读 | MySQL 8.0 新密码策略(上)


47cc45878d5cec0581b81626679ad176.png

社区近期动态

ed7dcb14ad44cdb41a850289ca42c9af.png

本文关键字:#MySQL 8.0# #密码验证策略#

809a6c8e1638de1b0c8c67ba82d1e740.gif 点一下“阅读原文”了解更多资讯

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值