MYSQL数据库误赋权引发的血案
赋权操作是DB最常规操作,只增加一个赋权,这都有坑吗?
帮同事处理mysql赋权引发的故障案例,有代表性,避坑!!!
11:03 接到求助,系统完全打不开了。
信息获取。
Q1:哪个系统?
xxx系统。
Q2:什么报错?
Access denied by for user ‘pqc_doa_up’@’172.26.154.68’(using password:YES)
Q3:功能之前可以吗?
功能之前一直都可以
Q4:什么时候出现异常?
大概今天早上11:00
Q5:做了哪些变更或者操作?
没有做变更,…就早上给用户赋了一个权限
grant select on help_topic to 'pqc_doa_up'@'172.26.154.%';
定位根本原因,删除异常用户,系统恢复正常!
排查过程回顾:
#查看报错用户
# 查看报错用户权限
# 把同名账号 pqc_doa_up@'172.26.154.%' 删除 (这里用户删除后,系统本应立即恢复正常,但怕权限遗漏,又把删除的用户权限全部重新赋权给保留用户,这导致又一次触发bug,GRANT SELECT ON `mysql`.`help_topic` TO 'pqc_doa_up'@'172.26.154.%' )
mysql> drop user pqc_doa_up@'172.26.154.%';Query OK, 0 rows affected (0.13 sec)
#怕权限可能遗漏,把提前备份的同名账号 pqc_doa_up@'172.26.154.%'备份的权限赋权给'pqc_doa_up'@'%'。(居然隐藏着一条 GRANT SELECT ON `mysql`.`help_topic` TO 'pqc_doa_up'@'172.26.154.%')
#至此,第一次通知检点,系统依旧无法访问,相同报错
# 再次查看pqc_doa_up用户的情况(奇怪之前明明删除了 pqc_doa_up@'172.26.154.%',这个用户怎么又出现了,思考片刻后,再次删除pqc_doa_up@'172.26.154.%')
mysql> drop user pqc_doa_up@'172.26.154.%';
Query OK, 0 rows affected (0.01 sec)
# 再次确认用户情况,确认删除成功,再次通知系统检点,反馈系统恢复正常
mysql> select User,Host,authentication_string,password from mysql.user where user='pqc_doa_up';
异常原因
原理扩展
总结
1、mysql版本8.x以下在用户新增授权时,需明确授权对象(user,host),不可出现对不存在的用户(user,host)授权,否则可能出现系统业务用户无法通过登录认证,引发异常。 2、不同版本mysql对于赋权不存在在用户(user,host)处理机制不同
5.6版本赋权执行成功,默认创建密码为空在用户(user,host) 5.7版本赋权执行成功,默认创建密码为空在用户(user,host),抛出告警 8.x版本授权执行失败,不会创建用户(user,host)
|