废了九牛二虎之力终于修改了MySQL8.0的root密码

前言

上次说到在Ubuntu系统上安装MySQL8.0之后默认是没有密码的,如果想设置密码需要写成ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'xxx'; 的形式,其实在用这种方式之前,我还使用功能了mysql_secure_installation这个MySQL自带的程序来设置密码,但是没生效,为什么这个看起来很正规的方式不生效的呢?接下来一起找找原因。

使用mysql_secure_installation

使用步骤比较简单,就按照提示来输入就可以了,这是我第二次运行,第一次运行时还要加个 ‘Would you like to setup VALIDATE PASSWORD component?’ 步骤

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
root@w-dev:~# mysql_secure_installation

Securing the MySQL server deployment.

Enter password for user root:
The 'validate_password' component is installed on the server.
The subsequent steps will run with the existing configuration
of the component.
Using existing password for root.

Estimated strength of the password: 50
Change the password for root ? ((Press y|Y for Yes, any other key for No) : y

New password:

Re-enter new password:

Estimated strength of the password: 50
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
Success.


Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
Success.

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.


Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
- Dropping test database...
Success.

- Removing privileges on test database...
Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
Success.

All done!

那么这个程序具体干了哪些事呢,下面来解释一下。

mysql_secure_installation 是一个 MySQL 提供的命令行工具,用于帮助加强和改善 MySQL 服务器的安全性。当首次安装 MySQL 后,运行此工具可以执行一系列的操作来提高 MySQL 服务器的安全性,并确保默认设置不会导致潜在的安全漏洞。以下是 mysql_secure_installation 工具执行的主要任务:

设置 root 密码: 如果您在安装 MySQL 时没有为 root 用户设置密码,mysql_secure_installation 会提示您设置 root 密码。设置 root 密码是非常重要的,因为 root 用户具有最高的权限,拥有对 MySQL 服务器的完全控制。

删除匿名用户: mysql_secure_installation 会删除默认情况下存在的匿名用户。匿名用户是指没有用户名和密码就能访问 MySQL 服务器的用户。删除这些用户可以减少潜在的安全风险。

禁止远程 root 登录: 默认情况下,MySQL 允许 root 用户从任何主机登录。mysql_secure_installation 会提示您是否禁止 root 用户从远程主机登录,以减少潜在的远程攻击风险。

删除测试数据库: 默认情况下,MySQL 安装包含一个名为 “test” 的测试数据库,这个数据库可能会成为潜在的攻击目标。mysql_secure_installation 会提示您是否删除测试数据库。

刷新权限: 完成上述任务后,mysql_secure_installation 会刷新 MySQL 权限表,以确保更改生效。

mysql_secure_installation 工具有助于在 MySQL 安装完成后采取一些基本的安全措施,以减少潜在的风险和攻击。然而,这只是开始,为了更好地保护 MySQL 服务器和数据,您还应该采取其他安全措施,如定期备份、限制用户权限、监控数据库活动等。

mysql_secure_installation 为什么设置root密码无效

看上面的描述这个程序挺靠谱的,为啥设置密码不好使呢?遵循着网络大神们的脚本,我找到了一个 mysql_secure_installation.sh脚本,来自[twitter-forks/mysql]开源库,其中包含这样一段代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
esc_pass=`basic_single_escape "$password1"`
do_query "UPDATE mysql.user SET Password=PASSWORD('$esc_pass') WHERE User='root';"
if [ $? -eq 0 ]; then
echo "Password updated successfully!"
echo "Reloading privilege tables.."
reload_privilege_tables
if [ $? -eq 1 ]; then
clean_and_exit
fi
echo
rootpass=$password1
make_config
else
echo "Password update failed!"
clean_and_exit
fi

"UPDATE mysql.user SET Password=PASSWORD('$esc_pass') WHERE User='root';" 这个脚本里居然用了我们之前提到的已经失效的更新方式,但是我发现我在Ubuntu系统下安装的mysql_secure_installation是一个二进制程序,不是shell脚本,所以我又找到了mysql的源码程序,其中包含这样一段:

1
2
3
4
5
6
7
8
9
10
11
  query =
(char *)my_malloc(PSI_NOT_INSTRUMENTED, password_len + 50, MYF(MY_WME));
end = my_stpmov(query, "SET PASSWORD=");
*end++ = '\'';
end += mysql_real_escape_string_quote(mysql, end, password,
(ulong)password_len, '\'');
*end++ = '\'';
if (mysql_real_query(mysql, query, (ulong)(end - query))) {
my_free(query);
return false;
}

里面包含了"SET PASSWORD="的字样,看起来不太靠谱的样子,需要注意的是,在 MySQL 5.7 版本之后,SET PASSWORD 命令已被弃用,推荐使用 ALTER USER 命令来修改密码。例如:

1
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';

这个命令更加直观,并且与最新版本的 MySQL 兼容。同样,将 '新密码' 替换为您希望设置的新密码。

难道是MySQL 8.0没有更新工具的代码?暂时不得而知,这或许就是mysql_secure_installation设置密码不生效的原因。

ALTER USER再生事端

前文提到了一种更加直观的设置新密码的方式 ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';,但是在我这行不通,不仅我这行不通,网上也有很多人说设置不了,需要加上插件名称 WITH mysql_native_password,改为 ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码'; 才可以,这又是为什么呢?

执行 select host,user,plugin,authentication_string from mysql.user; 语句查看发现:

1
2
3
4
5
6
7
8
9
10
11
mysql> select host,user,plugin,authentication_string from mysql.user;
+-----------+------------------+-----------------------+------------------------------------------------------------------------+
| host | user | plugin | authentication_string |
+-----------+------------------+-----------------------+------------------------------------------------------------------------+
| localhost | zone1 | mysql_native_password | *4C7684A2CD28A1C3C55CC832E6O817FCE3C5B5DB |
| localhost | mysql.infoschema | caching_sha2_password | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| localhost | mysql.session | caching_sha2_password | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| localhost | mysql.sys | caching_sha2_password | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| localhost | root | auth_socket | |
| localhost | admin | mysql_native_password | *F52COBE5FFB5FFCCD5BFD976OADEB81081AE4787 |
+-----------+------------------+-----------------------+------------------------------------------------------------------------+

原来每个账户还有默认的不同的密码管理插件,用于验证和管理用户密码,mysql_native_password、auth_socket和caching_sha2_password这三种插件的含义如下:

mysql_native_password

  • 加密算法: 使用较旧的哈希算法,如SHA-1或SHA-256,取决于 MySQL 版本。
  • 认证方式: 用户密码以哈希形式存储在系统表中,服务器在用户登录时将明文密码哈希并与数据库中存储的哈希进行比较。
  • 支持远程登录: 支持远程密码登录,可以从远程主机登录 MySQL。
  • 适用场景: 适用于需要与旧版 MySQL 兼容或需要与其他应用程序或系统进行集成的情况。

caching_sha2_password

  • 加密算法: 使用 SHA-256 进行加密,提供更高级别的安全性。
  • 支持版本: 从 MySQL 5.7.4 开始,caching_sha2_password 成为默认的密码插件。
  • 认证方式: 用户密码以加密形式存储在系统表中,并且在用户登录时,服务器将明文密码哈希并与数据库中存储的哈希进行比较。
  • 支持远程登录: 支持远程密码登录,可以从远程主机登录 MySQL。

auth_socket

  • 认证方式: 不存储密码哈希,而是依赖于操作系统(Linux)的用户认证机制。只有与操作系统用户账户关联的 MySQL 用户可以登录,而不需要密码。
  • 适用场景: 通常用于本地连接,因为它要求数据库用户和操作系统用户名称一致。
  • 安全性: 提供了一定的安全性,因为不需要存储密码哈希,但需要确保服务器的用户账户和 MySQL 用户账户的一致性。

总结来说,这些密码插件之间的区别主要涉及到加密算法、认证方式以及适用场景。caching_sha2_password 提供更高级别的安全性,而 auth_socket 依赖于操作系统用户认证机制,mysql_native_password 则提供与旧版 MySQL 兼容性。使用前应根据安全性需求、用户管理和应用程序集成的要求来选择合适的密码插件。一般来说,推荐使用较新且安全性更高的密码插件,如caching_sha2_password。

测试后发现,MySQL8.0默认安装后root用户的默认插件是 auth_socket,这种插件没办法设置密码,所以指定插件为 mysql_native_password 时就可以设置密码了,但是根据建议,我们应该选择 caching_sha2_password插件。

肯定好使的MySQL初始化方法

  • apt install mysql-server
  • mysql
  • ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY '新密码';
  • flush privileges;
  • exit;

总结

  • 安装MySQL8.0后使用ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'xxx';设置密码
  • mysql_secure_installation工具不好使的原因目前来看是源代码没有工具的源代码没有及时更新,与MySQL版本不匹配
  • mysql_secure_installation另外的几项功能,比如删除匿名用户、删除测试数据库、禁止远程登录在安装完貌似都处理好了
  • 综上来看,难道mysql_secure_installation工具已经被废弃了?

==>> 反爬链接,请勿点击,原地爆炸,概不负责!<<==

你们的一切都是我的,只要留心你将获得无穷的助力,很多东西不必从头开始,既然做不成巨人,就从巨人的肩膀上出发吧~

证件照尺寸查询
一寸 295413px | 2535mm
二寸 413579px | 3549mm
小一寸 260378px | 2232mm
大一寸 390567px | 3348mm
小二寸 413531px | 3545mm
大二寸 413626px | 3553mm
三寸 650992px | 5584mm
四寸 8981181px | 76100mm
五寸 10501500px | 89127mm

2023-10-8 20:56:28

Albert Shi wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客