上次说到在Ubuntu系统上安装MySQL8.0之后默认是没有密码的,如果想设置密码需要写成ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'xxx';
的形式,其实在用这种方式之前,我还使用功能了mysql_secure_installation这个MySQL自带的程序来设置密码,但是没生效,为什么这个看起来很正规的方式不生效的呢?接下来一起找找原因。
使用步骤比较简单,就按照提示来输入就可以了,这是我第二次运行,第一次运行时还要加个 ‘Would you like to setup VALIDATE PASSWORD component?’ 步骤
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.sh脚本,来自[twitter-forks/mysql]开源库,其中包含这样一段代码:
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的源码程序,其中包含这样一段:
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
命令来修改密码。例如:
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';
这个命令更加直观,并且与最新版本的 MySQL 兼容。同样,将 '新密码'
替换为您希望设置的新密码。
难道是MySQL 8.0没有更新工具的代码?暂时不得而知,这或许就是mysql_secure_installation设置密码不生效的原因。
前文提到了一种更加直观的设置新密码的方式 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;
语句查看发现:
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这三种插件的含义如下:
总结来说,这些密码插件之间的区别主要涉及到加密算法、认证方式以及适用场景。caching_sha2_password 提供更高级别的安全性,而 auth_socket 依赖于操作系统用户认证机制,mysql_native_password 则提供与旧版 MySQL 兼容性。使用前应根据安全性需求、用户管理和应用程序集成的要求来选择合适的密码插件。一般来说,推荐使用较新且安全性更高的密码插件,如caching_sha2_password。
测试后发现,MySQL8.0默认安装后root用户的默认插件是 auth_socket
,这种插件没办法设置密码,所以指定插件为 mysql_native_password
时就可以设置密码了,但是根据建议,我们应该选择 caching_sha2_password
插件。
apt install mysql-server
mysql
ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY '新密码';
flush privileges;
exit;
ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'xxx';
设置密码你们的一切都是我的,只要留心你将获得无穷的助力,很多东西不必从头开始,既然做不成巨人,就从巨人的肩膀上出发吧~
证件照尺寸查询
一寸 295413px | 2535mm
二寸 413579px | 3549mm
小一寸 260378px | 2232mm
大一寸 390567px | 3348mm
小二寸 413531px | 3545mm
大二寸 413626px | 3553mm
三寸 650992px | 5584mm
四寸 8981181px | 76100mm
五寸 10501500px | 89127mm