MySQL 账户管理

发布时间 2023-12-13 01:33:51作者: 背对背依靠

MySQL 账号管理

MySQL账号由 主机名 和 用户名两部分组成,通过 @ 符号 进行分隔。 user_name@host_name

1、用户名相同但是主机名不同,被视为完全不同的账户。

2、可以限制某个用户只能从特定的主机或一组主机进行连接,加强安全控制。


说明:

MySQL的账号、权限信息、系统配置等关键数据都是存储在mysql这个数据库中的, 如果我们要备份一个数据库中的用户信息,备份mysql这个数据库,直接备份 mysql 数据库可能包括其他系统信息。所以可以通过mysqldump备份用户和权限信息。

创建账号

在MySQL中,可以通过 以下语句来创建MySQL用户。

CREATE USER user_name@"host_name" IDENTIFIED BY 'password';

说明:

  1. 创建用户的时候需要使用引号将用户名以及主机名部分括起来,确保 MySQL 正确解析这些字符串

  2. 主机名可以指定为一个具体的IP地址或者一个网段

  3. 主机名部分支持标准SQL常用的两个通配符 _ 和 %


例如:创建一个名为ehigh的用户,主机名设置为任意主机都可以连接,密码设置为Abc123

CREATE USER ehigh@'%' IDENTIFIED BY 'Abc123';

修改账号

RENAME user@'host' new_user@'host'

删除账号

DROP USER username@'host';

MysSQL 密码管理

不同版本的MySQL修改密码的方式有所不同。

修改密码

MySQL 5.6

可以通过两种方式修改密码:使用 SET PASSWORD 命令或直接更新 mysql.user 表。


使用 SET PASSWORD:

SET PASSWORD FOR 'username'@'hostname' = PASSWORD('newpassword');

直接更新 mysql.user 表(不推荐,因为这可能绕过某些安全检查):

UPDATE mysql.user SET Password=PASSWORD('newpassword') WHERE User='username' AND Host='hostname';
FLUSH PRIVILEGES;
MySQL 5.7

从 MySQL 5.7 开始,推荐使用 ALTER USER 命令来修改密码。这是因为 MySQL 5.7 做了很多安全性方面的改进,包括如何处理密码。

ALTER USER 'username'@'hostname' IDENTIFIED BY 'newpassword';
MySQL 8.0

在 MySQL 8.0 中,直接更新 mysql.user 表的方法被废弃,并且 SET PASSWORD 命令的行为也有所变更。这是因为 MySQL 8.0 引入了更强的密码加密和验证机制,旨在增强安全性。

ALTER USER 'username'@'hostname' IDENTIFIED BY 'newpassword';

忘记MySQL密码

1、跳过权限验证

以无需密码的安全模式启动 MySQL,跳过授权表并以 root 权限运行


配置文件中加入以下两个参数:

  • --skip-grant-tables:表示不做权限和账号验证

  • --skip-networking:禁用网络连接,防止远程连接到MySQL

[mysqld]
skip-grant-tables

skip-networking
2、重启MySQL服务
sudo systemctl restart mysql.service
3、以无密码模式登录
mysql -uroot 
4、更改密码:

正常情况下,当更改 MySQL 用户密码或权限时,是先执行更改,然后使用 FLUSH PRIVILEGES 命令更新,但是在 --skip-grant-tables 模式下,MySQL 服务器启动时不会加载权限表。此时任何用户都可以无密码登录,并且所有的权限检查都被禁用。所以更改任何权限设置(包括密码)实际上是在直接修改 MySQL 的系统表,而不是通过通常的权限管理流程。

所以这里限制刷新权限的目的在于重新加载权限表,确保密码修改后重启服务能被正确地应用和识别。

FLUSH PRIVILEGES;

ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';

说明:如果是MySQL 5.7.6 之前的版本

UPDATE mysql.user SET authentication_string=PASSWORD('new_password') WHERE User='root';

FLUSH PRIVILEGES;
5、注释两个配置
6、重启服务即可
sudo systemctl restart mysql.service

MySQL 权限管理

创建好一个MySQL账户后,默认的权限是 USAGE,如果只有这个权限,仅仅能登录数据库系统,但除此之外没有任何特定数据库、表或其他对象的权限。


说明:

修改了账户权限后,需要执行FLUSH PRIVILEGES 命令来刷新权限


MySQL的权限大致可以分为这几类:

  • 全局权限:允许用户执行各种管理和配置任务,以及对所有数据库进行操作。例如:CREATE, DROP, RELOAD, SHUTDOWN等。

  • 数据库权限:允许用户对特定数据库执行特定操作。例如:CREATE, DROP, SELECT, INSERT, UPDATE, DELETE 等

  • 数据表权限:允许用户对特定表执行特定操作。例如:SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER等。

  • 其它权限:包括存储程序权限以及代理权限等。例如:CREATE ROUTINE、PROXY等

账户授权

GRANT
    [权限类型]     #  ALL PRIVILEGES 表示授予所有权限。
ON
    [数据库对象]  # 可以是数据库、表或者其他数据库对象。格式通常为 数据库名.表名。授予权限到所有数据库和表,可以使用 *.*。
TO
    [账户]     # 格式通常为 '用户名'@'主机名'。

例如:

GRANT ALL PRIVILEGES ON *.* TO ehigh@'localhost';

查看账户权限

SHOW GRANTS FOR username@'hostname'

取消账户权限

REVOKE
    [权限类型]
ON
    [数据库对象]
FROM
    [用户名];

例如:

REVOKE SELECT ON db1.* FROM 'ehigh'@'localhost';

MySQL 身份验证插件

早期版本的 MySQL 默认使用的是 mysql_native_password 身份验证插件。它的主要特点是广泛的兼容性,但相对于新的身份验证方法,它的安全性较低。


在 MySQL 8.0 中,引入了 caching_sha2_password 作为默认的身份验证插件,提供了更强的安全性。caching_sha2_password 使用 SHA-256 加密算法,比mysql_native_password提供更高级的密码加密。


由于一些老旧的客户端和应用程序可能不支持caching_sha2_password插件,MySQL 提供了default_authentication_plugin配置选项,允许数据库管理员指定默认的身份验证插件。

修改账户默认验证插件

修改用户默认使用的身份验证插件可以通过 ALTER USER 命令来实现。

ALTER USER 'username'@'hostname' IDENTIFIED WITH '插件名称' BY 'password';

例如:ehigh@"%"用户原来默认使用的是 caching_sha2_password 插件,修改为 mysql_native_password 插件。

ALTER USER ehigh@'%' IDENTIFIED WITH "mysql_native_password" BY "Abc123";