本文首发于我的个人网站: https://hewanyue.com/
本文作者: Hechao
本文链接: https://hewanyue.com/blog/4f0efae7.html
之前安装了最新版的mariadb10.4.8后,无论是二进制编译安装还是源码编译安装,设定完密码之后启动mysqld服务,结果都不需要密码就可以登陆进去,无论怎么执行mysql_secure_installation数据库初始化脚本或者mysql_secure_installation安全加固脚本,进入mysql都无需密码,用命令直接设置密码也无效,都是直接一敲mysql就可以进入数据库了。my.cnf配置文件查看了无数遍,也没发现任何蛛丝马迹。今天终于在无意中查看mysql数据库权限时意外有所收获,写出来与大家分享,让大家少走弯路。
当我进入mysql数据库,打开user表时,查看了下用户没有任何问题。
MariaDB [mysql]> select user,host,password from user;
±---------±-----------±----------------------------------------------------------+
| user | host | password |
±---------±-----------±----------------------------------------------------------+
| root | localhost | *54D9A58CB44735F80AC5AD29961814D6D12B8746 |
| root | 127.0.0.1 | *54D9A58CB44735F80AC5AD29961814D6D12B8746 |
| root | ::1 | *54D9A58CB44735F80AC5AD29961814D6D12B8746 |
±---------±-----------±----------------------------------------------------------+
3 rows in set (0.001 sec)
user | host | password |
---|---|---|
root | localhost | *54D9A58CB44735F80AC5AD29961814D6D12B8746 |
root | 127.0.0.1 | *54D9A58CB44735F80AC5AD29961814D6D12B8746 |
root | ::1 | *54D9A58CB44735F80AC5AD29961814D6D12B8746 |
可当我突发奇想打算看看他们这几个用户有什么权限上的区别时,就发现问题了:
MariaDB [mysql]> show grants for ‘root’@‘localhost’;
±--------------------------------------------------------------------------------------------------------------+
| Grants for root@localhost |
±--------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON . TO ‘root’@‘localhost’ IDENTIFIED VIA mysql_native_password USING ‘invalid’ OR unix_socket WITH GRANT OPTION |
| GRANT PROXY ON ‘’@’%’ TO ‘root’@‘localhost’ WITH GRANT OPTION |
±--------------------------------------------------------------------------------------------------------------+
2 rows in set (0.000 sec)
MariaDB [mysql]> show grants for ‘root’@‘127.0.0.1’;
ERROR 1141 (42000): There is no such grant defined for user ‘root’ on host ‘127.0.0.1’
MariaDB [mysql]> show grants for ‘root’@’::1’;
ERROR 1141 (42000): There is no such grant defined for user ‘root’ on host ‘::1’
MariaDB [mysql]>
root用户竟然查不到权限,这就很奇怪了。在之前的mariadb10.2.27上尝试了下,都是正常的,如下图所示:
于是我就尝试对那两个异常的用户账号授权。
竟然也无法授权。这种情况跟我之前尝试过的直接用insert命令向user表中加的user条目情况有点相似。当时我用
insert user set Host='192.168.32.7',User='root',Password='54D9A58CB44735F80AC5AD29961814D6D12B8746',ssl_cipher='',x509_subject='',x509_issuer='',authentication_string='';
命令在user表中创建了一个用户条目’root’@‘192.168.32.7’。
这个条目看起来和真正的用户一样,可等到授权时就发现没法授权了,且这个用户也没法远程在192.168.32.7主机登录,尝试insert了一个新的非root用户,也是同样的情况。说明create user 命令不单单只是在这个表上创建了新的用户条目,在其他关联的表上也有条目的增加。OK ,话题扯远了,继续说之前的无法加密的问题。
既然是同样的情况,我想到会不会是说明我这个新装好的mariadb上的这两个用户没有创建成功,是不是像上面提到的两个异常用户只是在这表中“徒有其表”呢?
那就尝试创建用户,并查看了下权限。
竟然创建用户成功了,而且权限也显示出来了(我记得我还没有授权呢啊!!!看来是root用户不用授权)。好像一切都恢复正常了。
赶紧退出看下是不是真的恢复正常了,结果失望的发现还是一敲mysql就可以登陆进去了!!!
不过又尝试了下 用127.0.0.1登陆,发现竟然需要密码验证了,且用之前设置的密码才可以登录。我好像发现了什么~
删除用户’root’@‘localhost’,不让删,需要至少一个有CREATE USER权限用户,看来之前的’root’@‘127.0.0.1’用户没有权限。
那就先给’root’@‘127.0.0.1’用户授权grant all on *.* to 'root'@'127.0.0.1';
,再删除用户’root’@‘localhost’,成功了,再重新创建’root’@‘localhost’用户并指定密码,再授权。OK,退出重新登陆一下。
果然数据库加密成功了~!问题解决!
-------------------------------------------(以上封存,警醒自己的无知~)--------------------------------------------
后记:
原来是mariadb10.4.8版本默认是可以本地使用使用unix_socket登陆无需密码,才导致密码无效,在上面的图片里显示得清清楚楚。
MariaDB [mysql]> show grants for ‘root’@‘localhost’;
±--------------------------------------------------------------------------------------------------------------+
| Grants for root@localhost |
±--------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON . TO ‘root’@‘localhost’ IDENTIFIED VIA mysql_native_password USING ‘invalid’ OR unix_socket WITH GRANT OPTION |
| GRANT PROXY ON ‘’@’%’ TO ‘root’@‘localhost’ WITH GRANT OPTION |
±--------------------------------------------------------------------------------------------------------------+
2 rows in set (0.000 sec)
MariaDB [mysql]> show grants for ‘root’@‘127.0.0.1’;
ERROR 1141 (42000): There is no such grant defined for user ‘root’ on host ‘127.0.0.1’
MariaDB [mysql]> show grants for ‘root’@’::1’;
ERROR 1141 (42000): There is no such grant defined for user ‘root’ on host ‘::1’
MariaDB [mysql]>
当然,也存在用户不存在,而user表中有条目的情况。所以想最终解决这个问题,实际上最直接的命令是:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED VIA mysql_native_password USING '*54D9A58CB44735F80AC5AD29961814D6D12B8746' WITH GRANT OPTION;
重新对root@localhost用户授权取消unix_sock登陆,并设置密码。
至此,问题才真正解决。
后记写于 2019.9.23。