前言:
近期反馈有多次出现MySQL空密码问题,会导致用户无需密码就可直接访问数据。因安全无小事,对该问题进行了一定分析。
问题原因:
执行用户创建语句时不规范没有设置密码导致密码为空且MySQL版本过低。
问题分析:
1、创建用户语句不规范
创建用户操作时使用grant创建,在MySQL 5.7.7版本之前,可以直接使用grant语法来创建用户和授权 // grant 权限 on 数据库对象 to 用户 ; 。但是因为命令缺少密码设置导致空密码情况,从而引发安全问题。
2、MySQL服务版本过低
在MySQL 5.7.7版本之后,仍然可以使用grant语法来创建用户,但是为了限制创建用户引发的空密码问题,加入了 NO_AUTO_CREATE_USER 的sql模式。在grant语句中禁止创建空密码的账户,使用grant语法创建用户必须带上 identified by 密码,否则就被认为是非法语句,从而规避掉空密码情况的发生。
在MySQL 8.0.11版本之后,官方遵循使用create user语法来创建用户,认为grant创建用户的语法无关紧要就将其删除了。既然grant语法创建用户都不允许了,那么NO_AUTO_CREATE_USER模式自然也就无效了,所以将该模式删除,以后也不再支持。
处理建议:
1、使用最新稳定版本MySQL服务使用,不仅可规避空密码问题,且对其他问题漏洞也有一定安全防护措施。
2、如必要使用低版本MySQL服务,则:
①添加密码设置后附权并创建。
// grant 权限 on 数据库对象 to 用户 identified by 密码 with grant option;
②先创建用户再进行附权操作。
// create user 用户 identified by 密码;
// grant 权限 on 数据库对象 to 用户;
3、模式验证。
// select@@sql_mode;

总结:
对服务组件的部署、用户的创建保持警惕之心,恪尽安全防控之责。务必关注组件部署安全和弱密码问题,不要在研发测试环境、生产环境随意部署组件,遵守“组件安全风险规范”,安全无小事,平安靠大家!