计算机网络/计算机科学与应用/系统/运维/开发

MySQL8数据库进阶实战-MySQL用户管理

mysql用表存放在 mysql.user

mysql默认的几个用户:

mysql> select User from user;
+------------------+
| User             |
+------------------+ |
| mysql.infoschema |
| mysql.session    |
| mysql.sys        |
| root             |
+------------------+
5 rows in set (0.01 sec)

mysql.infoschema 数据库系统用户 用来管理和访问系统自带的information_schema数据库

mysql.session mysql的插件将会使用该用户来访问mysql数据库服务器,客户端不能直接使用该用户进行链接

mysql.sys 用于mysql数据库中对象的定义,使用该用户可避免数据库管理员重命名或者删除root用户时发生的问题,客户端不能直接连接

root 超级用户 管理mysql数据库 该用户拥有所有权限


1、创建MySQL用户

create user 语句创建新用户

首先使用root用户登录

mysql> create user user002 identified by '123456';

密码使用sha1函数加密

mysql> select sha1('123456');
+------------------------------------------+
| sha1('123456')                           |
+------------------------------------------+
| 7c4a8d09ca3762af61e59520943dc26494f8941b |
+------------------------------------------+
1 row in set (0.01 sec)


mysql登录时报错:

C:\Users\Administrator>mysql -uuser002 -p
Enter password: ******
ERROR 2026 (HY000): SSL connection error: unknown error number

解决方法: 在登录后添加--skip-ssl

C:\Users\Administrator>mysql -uuser002 -p --skip-ssl
WARNING: --ssl is deprecated and will be removed in a future version. Use --ssl-mode instead.
Enter password: ******


此时创建后,没有权限,只能访问如下数据库:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| performance_schema |
+--------------------+
2 rows in set (0.05 sec)


2、重命名MySQL用户

查看rename user 帮助信息

mysql> help rename user;
Name: 'RENAME USER'
Description:
Syntax:
RENAME USER old_user TO new_user
    [, old_user TO new_user] ...

old_user : mysql中已经存在的用户

new_user : 新的mysql用户


实例:将user002 重命名为user003

mysql> rename user user002 to user003;
Query OK, 0 rows affected (0.01 sec)

修改后查看当前数据库用户:

mysql> use mysql;
Database changed
mysql> select user from user;
+------------------+
| user             |
+------------------+
| user003          |
| user01           |
| mysql.infoschema |
| mysql.session    |
| mysql.sys        |
| root             |
+------------------+
6 rows in set (0.00 sec)

3、删除mysql用户

使用drop user 语句删除

mysql> drop user user003;
Query OK, 0 rows affected (0.00 sec)


也可以直接从 mysql.user 表中进行删除

mysql>use mysql;
mysql> delete from user where user ='user003';


二、mysql管理用户密码

mysql5.7版本 将密码 password改成 authentication_string 字段

mysql> select host,user,authentication_string from user;
+-----------+------------------+------------------------------------------------------------------------+
| host      | user             | authentication_string                                                  |
+-----------+------------------+------------------------------------------------------------------------+
| %         | user01           | *FF680E568727C9C00FABFEE03D13BA727047CC65                              |
| localhost | mysql.infoschema | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| localhost | mysql.session    | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| localhost | mysql.sys        | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| localhost | root             | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257                              |
+-----------+------------------+------------------------------------------------------------------------+
5 rows in set (0.00 sec)


1、使用 alter user 修改用户密码

mysql> alter user 'user01'@'%' identified by '123456';
Query OK, 0 rows affected (0.01 sec)



2、(win)my.ini(Linux)my.cnf 配置 default_authentication_plugin参数

[mysqld]
default_authentication_plugin=mysql_native_password



修改密码也可以使用如下方式:

mysql> alter user'user01'@'%' identified with mysql_native_password by '123';
Query OK, 0 rows affected (0.01 sec)



3、mysql 丢失root用户密码

首先停止mysql数据库服务


linux:

# systemctl stop mysqld


win:

net stop MYSQL80 (服务名称)


编辑配置文件 /etc/my.cnf 在末尾添加

skip-grant-tables


重启mysql服务

systemctl start mysqld
net start MYSQL80



直接登录mySQL

mysql


查询mysql.user 表信息

use mysql;
select host,user,authentication_string from user;



清空root用户密码

mysql>update user set authentication_string = '' where user ='root';



刷新权限

mysql>flush privileges;



重新设置root用户的密码

mysql>alter user 'root'@'%' identified by '123456';
mysql>alter user 'root'@'localhost' identified by '123456';



4、密码加载插件

mysql8中提供了2个不同的密码插件:

mysql_native_password 

caching_sha2_password


mysql> select user,plugin from user;

+------------------+-----------------------+

| user             | plugin                |

+------------------+-----------------------+

| user01           | mysql_native_password |

| mysql.infoschema | caching_sha2_password |

| mysql.session    | caching_sha2_password |

| mysql.sys        | caching_sha2_password |

| root             | mysql_native_password |

+------------------+-----------------------+

5 rows in set (0.00 sec)


mysql_native_password 密码插件:使用sha1哈希算法将用户的密码存储在mysql.user 表中

可以在未加密的通道上验证客户端的身份,无需发送实际密码 my.cnf配置中 也是默认使用的密码插件

缺点:存在一定的哈希暴力攻击


caching_sha2_password密码插件:


5、用户密码的复杂度设置

mysql8 提供插件 validate_password  需要手动安装


显示已经安装的插件信息

mysql>show plugins;


安装插件:

mysql> install plugin validate_password soname 'validate_password';

Query OK, 0 rows affected, 1 warning (0.02 sec)


查看默认策略配置:

mysql> show variables like 'validate_password%';

+--------------------------------------+--------+

| Variable_name                        | Value  |

+--------------------------------------+--------+

| validate_password_check_user_name    | ON     |

| validate_password_dictionary_file    |        |

| validate_password_length             | 8      |

| validate_password_mixed_case_count   | 1      |

| validate_password_number_count       | 1      |

| validate_password_policy             | MEDIUM |

| validate_password_special_char_count | 1      |

+--------------------------------------+--------+

7 rows in set, 1 warning (0.01 sec)


validate_password_check_user_name  :设置为ON时,可以将密码设置为当前用户名

validate_password_dictionary_file  : 检查密码字典文件的路径名

validate_password_length : 限制密码长度的最小字符数 默认是8个字符

validate_password_mixed_case_count : 限制小写字符和大写字符个数 默认值是1

validate_password_number_count : 限制数字的个数 默认值1

validate_password_policy : 设置密码强度等级 默认是MEDIUM

validate_password_special_char_count :限制特殊字符个数 默认值1


validate_password_policy 密码强度分为3个等级:

LOW : 只检查密码的长度,也可以用数字0表示

MEDIUM: 检查密码的长度、数字、大小写和特殊字符 也可以用数字1表示

STRONG: 检查密码的长度、数字、大小写和特殊字符和字典文件 也可以用数字2表示


修改用户密码:

mysql> alter user 'root'@'localhost' identified by '123456789';

ERROR 1819 (HY000): Your password does not satisfy the current policy requirements


修改默认的密码强度等级为0 设置为LOW

mysql> set global validate_password_policy=0;

Query OK, 0 rows affected (0.01 sec)


再次修改密码成功

mysql> alter user 'root'@'localhost' identified by '123456789';

Query OK, 0 rows affected (0.00 sec)


用户密码的过期设置与用户锁定:

用户密码过期在mysql.user 表中 用 password_expired 和password_lifetime表示


mysql> select user,host,password_expired,password_lifetime from user;

+------------------+-----------+------------------+-------------------+

| user             | host      | password_expired | password_lifetime |

+------------------+-----------+------------------+-------------------+

| user01           | %         | N                |              NULL |

| mysql.infoschema | localhost | N                |              NULL |

| mysql.session    | localhost | N                |              NULL |

| mysql.sys        | localhost | N                |              NULL |

| root             | localhost | N                |              NULL |

+------------------+-----------+------------------+-------------------+

5 rows in set (0.00 sec)

password_expired 为n表示没有启用用户的密码过期设置


启用root用户的密码过期策略,并设定密码过期时间为30天

mysql> alter user 'root'@'localhost' password expire interval 30 day;

Query OK, 0 rows affected (0.00 sec)



密码到期后,没有设置新密码之前不能运行任何查询语句

ERROR 1820(HY000):

you must reset your password using AlTER USER statement before executing this statement


修改root用户密码

alter user 'root'@'localhost' identified by '123456';


在重新查看mysql数据库中用户的 password_expired 和 password_lifetime字段

select user,host,password_expired,password_lifetime from user;


mysql> select user,host,password_expired,password_lifetime from user;

+------------------+-----------+------------------+-------------------+

| user             | host      | password_expired | password_lifetime |

+------------------+-----------+------------------+-------------------+

| user01           | %         | N                |              NULL |

| mysql.infoschema | localhost | N                |              NULL |

| mysql.session    | localhost | N                |              NULL |

| mysql.sys        | localhost | N                |              NULL |

| root             | localhost | N                |                30 |

+------------------+-----------+------------------+-------------------+

5 rows in set (0.00 sec)


mysql增加了一个全局变量default_password_lifetime 设置所有用户的密码过期时间,全局变量

可以设置一个全局的自动密码过期策略 默认是0 表示用户密码永不过期

mysql> show variables like 'default_password_lifetime';

+---------------------------+-------+

| Variable_name             | Value |

+---------------------------+-------+

| default_password_lifetime | 0     |

+---------------------------+-------+

1 row in set, 1 warning (0.00 sec)



将设置所有用户密码过期时间是90天

mysql> show variables like 'default_password_lifetime';

+---------------------------+-------+

| Variable_name             | Value |

+---------------------------+-------+

| default_password_lifetime | 0     |

+---------------------------+-------+

1 row in set, 1 warning (0.00 sec)


该参数也可以在配置文件my.cnf中设置


锁定用户可以使用如下语句:

alter user user01 account lock;


用户锁定后,尝试登陆mysql:

C:\Users\Administrator>mysql -u user01 -p -h localhost --skip-ssl

WARNING: --ssl is deprecated and will be removed in a future version. Use --ssl-mode instead.

Enter password: ***

ERROR 3118 (HY000): Access denied for user 'user01'@'localhost'. Account is locked.


解锁用户:

mysql> alter user user01 account unlock;

Query OK, 0 rows affected (0.00 sec)


只要认真对待生活,终有一天,你的每一份努力,都将绚烂成花。

评论

^