一、权限表
1、user表
2、db表
3、tables_priv 表和 columns_priv表
4、procs_priv表
二、账户管理
1、登录和退出管理
2、新建普通用户
3、删除普通用户
4、root 用户修改自己的密码
5、root 用户修改普通用户密码
三、权限管理
1、MySQL 的各种权限
2、授权
3、收回权限
4、查看权限
四、访问控制
1、连接核实阶段
2、请求核实阶段
五、提升安全性
1、AES 256 加密
2、密码到期更换策略
3、安全模式安装
六、MySQL8.0新特性----管理角色
一、权限表
1、user表
user表是MySQL中最重要的一个权限表,记录允许连接到服务器的账号信息,里面的权限是全局的。列如,一个用户在user表中被授予了delete权限,则该用户可以删除msyql服务器上所有数据库中的任何记录。MySQL8.0中user表中有42个字段。
mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> desc user;
+--------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Host | char(255) | NO | PRI | | |
| User | char(32) | NO | PRI | | |
| Select_priv | enum('N','Y') | NO | | N | |
| Insert_priv | enum('N','Y') | NO | | N | |
| Update_priv | enum('N','Y') | NO | | N | |
| Delete_priv | enum('N','Y') | NO | | N | |
| Create_priv | enum('N','Y') | NO | | N | |
| Drop_priv | enum('N','Y') | NO | | N | |
| Reload_priv | enum('N','Y') | NO | | N | |
| Shutdown_priv | enum('N','Y') | NO | | N | |
| Process_priv | enum('N','Y') | NO | | N | |
| File_priv | enum('N','Y') | NO | | N | |
| Grant_priv | enum('N','Y') | NO | | N | |
| References_priv | enum('N','Y') | NO | | N | |
| Index_priv | enum('N','Y') | NO | | N | |
| Alter_priv | enum('N','Y') | NO | | N | |
| Show_db_priv | enum('N','Y') | NO | | N | |
| Super_priv | enum('N','Y') | NO | | N | |
| Create_tmp_table_priv | enum('N','Y') | NO | | N | |
| Lock_tables_priv | enum('N','Y') | NO | | N | |
| Execute_priv | enum('N','Y') | NO | | N | |
| Repl_slave_priv | enum('N','Y') | NO | | N | |
| Repl_client_priv | enum('N','Y') | NO | | N | |
| Create_view_priv | enum('N','Y') | NO | | N | |
| Show_view_priv | enum('N','Y') | NO | | N | |
| Create_routine_priv | enum('N','Y') | NO | | N | |
| Alter_routine_priv | enum('N','Y') | NO | | N | |
| Create_user_priv | enum('N','Y') | NO | | N | |
| Event_priv | enum('N','Y') | NO | | N | |
| Trigger_priv | enum('N','Y') | NO | | N | |
| Create_tablespace_priv | enum('N','Y') | NO | | N | |
| ssl_type | enum('','ANY','X509','SPECIFIED') | NO | | | |
| ssl_cipher | blob | NO | | NULL | |
| x509_issuer | blob | NO | | NULL | |
| x509_subject | blob | NO | | NULL | |
| max_questions | int unsigned | NO | | 0 | |
| max_updates | int unsigned | NO | | 0 | |
| max_connections | int unsigned | NO | | 0 | |
| max_user_connections | int unsigned | NO | | 0 | |
| plugin | char(64) | NO | | caching_sha2_password | |
| authentication_string | text | YES | | NULL | |
| password_expired | enum('N','Y') | NO | | N | |
| password_last_changed | timestamp | YES | | NULL | |
| password_lifetime | smallint unsigned | YES | | NULL | |
| account_locked | enum('N','Y') | NO | | N | |
| Create_role_priv | enum('N','Y') | NO | | N | |
| Drop_role_priv | enum('N','Y') | NO | | N | |
| Password_reuse_history | smallint unsigned | YES | | NULL | |
| Password_reuse_time | smallint unsigned | YES | | NULL | |
| Password_require_current | enum('N','Y') | YES | | NULL | |
| User_attributes | json | YES | | NULL | |
+--------------------------+-----------------------------------+------+-----+-----------------------+-------+
51 rows in set (0.00 sec)
1)用户列
user表的用户列包括Host、User、authentication_string,分别表示主机名,用户名和密码。其中User和Host为User表的联合主键。当用户和服务器之间建立连接时,输入的账户信息中的用户名称、主机名和密码必须匹配User表中对应得字段,只有3个值都匹配的时候,才允许连接的建立。这3个字段的值就是创建账户时的账户信息。修改用户密码时,实际就是修改user表的authentication_string字段的值。
2)权限列
权限列的字段决定了用户的权限,描述了在全局范围内允许对数据和数据库进行的操作。包括查询权限、修改权限等普通权限,还包括了关闭服务器、超级权限和加载用户等高级权限。普通权限用于操作数据库;高级权限用于数据库管理。
如果要修改可以使用grant语句或者update语句更改user表的这些字段来修改用户对应的权限。
3)安全列
安全列只有6个字段,其中两个是ssl相关的,两个是x509相关的,另外两个是授权插件相关的。ssl用于加密;x509标椎用于标识用户;Plugin字段标识可以用于验证用户身份的插件,如果该字段为空,服务器使用内建授权验证机制验证用户身份。读者可以通过show variables like ‘have_openssl’ 语句来查询服务器是否支持ssl功能。
4)资源控制列
资源控制列的字段用来限制用户使用的资源,包括4个字段,分别是:
- max_questions:用户每小时允许执行的查询操作次数。
- max_updates:用户每小时允许执行的更新操作次数。
- max_connections:用户每小时允许执行的连接操作次数。
- max_user_connections:用户允许同时建立的连接次数。
一小时内用户查询或者链接数量超过资源控制权限,用户将被锁定,直到下一个小时,才可以再次执行操作,可以使用grant语句更新这些字段的值。
2、db表
db表是mysql数据中非常重要的权限表。db表中存储了用户对某个数据库的操作权限,决定用户能从那个主机存取哪个数据库。
mysql> desc db;
+-----------------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------------+---------------+------+-----+---------+-------+
| Host | char(255) | NO | PRI | | |
| Db | char(64) | NO | PRI | | |
| User | char(32) | NO | PRI | | |
| Select_priv | enum('N','Y') | NO | | N | |
| Insert_priv | enum('N','Y') | NO | | N | |
| Update_priv | enum('N','Y') | NO | | N | |
| Delete_priv | enum('N','Y') | NO | | N | |
| Create_priv | enum('N','Y') | NO | | N | |
| Drop_priv | enum('N','Y') | NO | | N | |
| Grant_priv | enum('N','Y') | NO | | N | |
| References_priv | enum('N','Y') | NO | | N | |
| Index_priv | enum('N','Y') | NO | | N | |
| Alter_priv | enum('N','Y') | NO | | N | |
| Create_tmp_table_priv | enum('N','Y') | NO | | N | |
| Lock_tables_priv | enum('N','Y') | NO | | N | |
| Create_view_priv | enum('N','Y') | NO | | N | |
| Show_view_priv | enum('N','Y') | NO | | N | |
| Create_routine_priv | enum('N','Y') | NO | | N | |
| Alter_routine_priv | enum('N','Y') | NO | | N | |
| Execute_priv | enum('N','Y') | NO | | N | |
| Event_priv | enum('N','Y') | NO | | N | |
| Trigger_priv | enum('N','Y') | NO | | N | |
+-----------------------+---------------+------+-----+---------+-------+
22 rows in set (0.00 sec)
1)用户列
db表用户列有三个字段,分别是Host、User、Db,标识从某个主机连接某个用户对某个数据库的操作权限,这3个字段组合构成了db表的主键。host表不存储用户名称,用户列只有2个字段,分别是Host和Db,表示从某个主机连接的用户对某个数据库的操作权限,其主键包括Host和Db两个字段。host很少用到,一般情况下db表可以满足权限空值需求了。
2)权限列
db表中create_routine_priv和alter_routine_priv这两个字段表明用户是否有创建和修改存储过程的权限。
user表中的权限是针对所有数据库对的,如果希望用户只对某个数据库有操作权限,那么需要将user表中对应的权限设置为N,然后再db表中设置对应数据库的操作权限。
3、tables_priv 表和 columns_priv表
tables_priv表用来对表设置操作权限,columns_priv表用来对表的某一列设置权限。tables_priv表和 columns_priv 表的结构分别如下
mysql> desc tables_priv;
+-------------+-----------------------------------------------------------------------------------------------------------------------------------+------+-----+-------------------+-----------------------------------------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-----------------------------------------------------------------------------------------------------------------------------------+------+-----+-------------------+-----------------------------------------------+
| Host | char(255) | NO | PRI | | |
| Db | char(64) | NO | PRI | | |
| User | char(32) | NO | PRI | | |
| Table_name | char(64) | NO | PRI | | |
| Grantor | varchar(288) | NO | MUL | | |
| Timestamp | timestamp | NO | | CURRENT_TIMESTAMP | DEFAULT_GENERATED on update CURRENT_TIMESTAMP |
| Table_priv | set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter','Create View','Show view','Trigger') | NO | | | |
| Column_priv | set('Select','Insert','Update','References') | NO | | | |
+-------------+-----------------------------------------------------------------------------------------------------------------------------------+------+-----+-------------------+-----------------------------------------------+
8 rows in set (0.00 sec)
- Host、Db、User和Table_name 这4个字段分别代表主机名、数据库名、用户名和表名。
- Grantor 表示修改该记录的用户
- Timestamp字段表示修改该记录的时间。
- Table_priv 表示对表的操作权限,包括Select、Insert、Delete、Create、Drop、Grant、References、Index和Alter
- Column_priv 字段表示对表中的列的操作权限,包括Select、Insert、Update和References。columns_priv表只有7个字段,分别是Host、Db、User、Table_name、Column_name、Timestamp、Column_priv。其中,Column_name用来指定对那些数据列具有操作权限。
mysql> desc columns_priv;
+-------------+----------------------------------------------+------+-----+-------------------+-----------------------------------------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+----------------------------------------------+------+-----+-------------------+-----------------------------------------------+
| Host | char(255) | NO | PRI | | |
| Db | char(64) | NO | PRI | | |
| User | char(32) | NO | PRI | | |
| Table_name | char(64) | NO | PRI | | |
| Column_name | char(64) | NO | PRI | | |
| Timestamp | timestamp | NO | | CURRENT_TIMESTAMP | DEFAULT_GENERATED on update CURRENT_TIMESTAMP |
| Column_priv | set('Select','Insert','Update','References') | NO | | | |
+-------------+----------------------------------------------+------+-----+-------------------+-----------------------------------------------+
7 rows in set (0.00 sec)
4、procs_priv表
procs_priv 表可以对存储过程函数设置操作权限。
mysql> desc procs_priv;
+--------------+----------------------------------------+------+-----+-------------------+-----------------------------------------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+----------------------------------------+------+-----+-------------------+-----------------------------------------------+
| Host | char(255) | NO | PRI | | |
| Db | char(64) | NO | PRI | | |
| User | char(32) | NO | PRI | | |
| Routine_name | char(64) | NO | PRI | | |
| Routine_type | enum('FUNCTION','PROCEDURE') | NO | PRI | NULL | |
| Grantor | varchar(288) | NO | MUL | | |
| Proc_priv | set('Execute','Alter Routine','Grant') | NO | | | |
| Timestamp | timestamp | NO | | CURRENT_TIMESTAMP | DEFAULT_GENERATED on update CURRENT_TIMESTAMP |
+--------------+----------------------------------------+------+-----+-------------------+-----------------------------------------------+
8 rows in set (0.00 sec)
- Host、Db和User字段分别表示主机名、数据库和用户名。
- routine_name 表示存储过程或函数的名称。
- Routine_type 表示存储过程或函数的类型。Routine_type 字段有两个值,分别是fumnction和procedure:fumnction表示函数,procedure表示存储过程。
- Grantor 是插入或修改该记录的用户。
- Proc_priv 表示拥有的权限,包括Execute、Alter Routine、Grant这3种。
- timestamp 表示记录更新时间。
二、账户管理
1、登录和退出管理
参数 | 作用 |
---|---|
-h | 主机名 |
-u | 用户 |
-p | 密码 |
-P | 端口号 |
数据库名 | 可以在命令的最后指定数据库名 |
-e | 执行SQL语句 |
2、新建普通用户
1)使用 create user 语句创建新用户
执行create user 或 grant 语句时,服务器会修改相应的用户授权表,添加或者修改用户及其权限。新增用户没有任何权限。
create user user_specification [ , user_specification]
user_specification:
user@host
[
identified by [password] '密码'
| identified with auth_plugin [as 'auth_string' ]
]
- user 表示创建的用户名称
- host 表示允许登录的用户主机名称
- identified by 表示用来设置用户的密码
- [password] 表示使用哈希值设置密码,该参数可选
- identified with 为用户指定一个身份验证插件
- auth_plugin 插件名称,插件的名称可以是一个单引号的字符串或者带双引的字符串
- auth_string 是一个可选字符串参数,该参数将传递给身份验证插件,由该插件解释该参数的意义。
#案例:创建jiaofan用户,只允许本地登录,密码设置为Huawei@123
mysql> create user 'jiaofan'@'localhost' identified by 'Huawei@123';
Query OK, 0 rows affected (0.01 sec)
mysql> select Host,User,authentication_string from mysql.user;
+-----------+------------------+------------------------------------------------------------------------+
| Host | User | authentication_string |
+-----------+------------------+------------------------------------------------------------------------+
| localhost | jiaofan | $A$005$O%]oI1eur|RYVswTtY5kCwMufMjYfOcKRl/p1z2VZaYzaBmIJV.pHXN1 |
| localhost | mysql.infoschema | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| localhost | mysql.session | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| localhost | mysql.sys | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| localhost | root | $A$005$g%F; Uh'N^t7VGrOEX1sIQS1A9cD3eKHL./LCyP7Gj8LmsqIoRrzHC06 |
+-----------+------------------+------------------------------------------------------------------------+
5 rows in set (0.00 sec)
2)直接操作MySQL 用户表
create user 创建一个新用户,实际上就是在user表中添加一条新纪录,可以使用insert语句向user表中直接插入一条记录来创建一个新用户。
insert into mysql.user(Host,User,authentication_string)
values('host','username',MD5('password'))
mysql> insert into mysql.user (Host.User,authentication_string)
-> values('localhost','user1',MD5'Huawei@123');
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''Huawei@123')' at line 2
mysql> select Host,User,authentication_string from mysql.user;
+-----------+------------------+------------------------------------------------------------------------+
| Host | User | authentication_string |
+-----------+------------------+------------------------------------------------------------------------+
| localhost | jiaofan | $A$005$O%]oI1eur|RYVswTtY5kCwMufMjYfOcKRl/p1z2VZaYzaBmIJV.pHXN1 |
| localhost | mysql.infoschema | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| localhost | mysql.session | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| localhost | mysql.sys | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| localhost | root | $A$005$g%F; Uh'N^t7VGrOEX1sIQS1A9cD3eKHL./LCyP7Gj8LmsqIoRrzHC06 |
+-----------+------------------+------------------------------------------------------------------------+
5 rows in set (0.00 sec)
创建失败的原因是 ssl_cipher、x509_issuer 和 x509_subject 这3个字段没有设置默认值。
3、删除普通用户
1)使用drop user 语法删除用户
#删除用户本地登录的权限
drop user user_name1 [, user_name2, .... ]
#删除来自所有授权表的账户权限记录
drop user 'user'@'localhost'
2)使用delete 语法删除用户
delete from mysql.user where host='hostname' identified and user = 'user_name'
4、root 用户修改自己的密码
update mysql.user set authentication_string = MD5("123456") where User = 'user_name' and Host = 'localhost'
5、root 用户修改普通用户密码
1)使用set语句修改普通用户的密码
set password for 'user'@'localhost' identified by 'my123'
2)使用update 语句修改普通用户的密码
updata mysql.user set authentication_string('my123')
where User = “username” and Host = 'hostname'
三、权限管理
1、MySQL 的各种权限
2、授权
#案例一:使用grant 语句创建一个新用户 grantuser ,密码Huawei@123 。grantuser用户对所有数据由查询和插入权限。
mysql> grant select,insert on *.* to 'grantuser'@'localhost' identified by 'Huawei123' with grant option;
1)全局层级
全局权限适用于一个给定服务器中的所有数据库。这些权限存储在MySQL.user 表中。grant all on *.* 和 revoke all on *.* 只授予和撤销全局授权。
2)数据库层级
数据库权限适用于一个给定数据库中的所有目标。这些权限存储在mysql.db 和 mysql.host 表中。grant all on db_name. 和 remoke all on db_name.tbl_name 只能授权和撤销数据库权限
3)表层级
表权限使用与一个给定表中的所有列。者喜爱廯存储在mysql.tables_priv 表中。 grant all on db_name.tbl_name 和 revoke all on db_name.tbl_name 只能授权和撤销表权限。
4)列层级
列权限适用于一个给定表中的单一列。这些权限存在在 mysql.columns_priv 表中。当使用revoke 时,必须指定与被授权列相同的列。
5)子程序层级
create routine 、alter routine、execute 和 grant 权限适用于已存储的子程序。这些权限可以被授予为全局层级和数据库层级。而且,除了 greate routine 外,这些权限可以被授予层级。并存储在mysql.procs_priv 表中
在mysql中,必须是用于grant 权限的用户才可以执行grant语句。
要使用grant和revoke,必须用于grant option 权限,并且必须用于正在授权或撤销的授权
grant priv_type [ (colums) ] [ , priv_type [ (columns) ] ] ...
on [ object_type ] table, table2, ... , tablen
to user [with grant option]
object_type = table | function | procedure
- priv_type 参数表示权限类型
- columns 参数表示权限作用于那些列,不指定该参数,表示作用于整个表;
- table, table2, … , tablen表示授权权限的列所在的表;
- object_type指定授权作用的对象类型包括table(表)、function(函数)和procedfure (存储过程)。
- with关键字后可以跟一个或多个with_potion参数。这个参数由5个选项,意义如下:
(1)grant option:被授权的用户可以将这些权限赋予别的用户
(2)max_queries_per_hour count:设置每个小时可以执行count 次查询
(3)max_updates_per_hour count:设置每个小时可以执行count次更新
(4)max_connecrions_per_hour count:设置每个小时可以建立coun个连接
(5)max_user_connections count:设置单个用户可以同时建立count个连接
3、收回权限
MYSQL使用revoke 语句取消用户的某些权限。使用热播可收回权限后,在用户账户的记录将从db、host、table_priv 和 columns_priv 表中删除,但是用户账号记录仍然在user表中保存。
revoke all privileges,grant option
from 'user'@'localhost' [ , 'user'@'host' ...]
#案例:收回user用户的更新权限。
mysql> revoke update on *.* from 'user'@'localhost';
4、查看权限
show grants for 'user'@'localhost';
四、访问控制
1、连接核实阶段
检查服务器的用户名,地址是、密码是否正确(Host、User 和 authentication_string)
2、请求核实阶段
服务器检查用户要执行的操作,然后检查是否有足够的权限来执行它。MySQL请求核实过程如下:
- 用户向MySQL发出操作请求
- MySQL检查 user 权限表中的权限信息,匹配User、Host字段,查看请求的全局权限是否被允许看,如果找到匹配结果,执行被允许执行,否则MySQL继续向下查找
- MySQL 检查 db 权限表中的权限信息,匹配User、Host 字段值,查看请求的数据库级别的权限是否被允许,如果找到匹配结果,操作允许被执行,否则 MySQL 继续向下查找。
- MySQL 检查 tables_priv 权限表中的权限信息,匹配User、Host 字段值,查看请求的数据表级别的权限是否被允许,如果找到匹配结果,操作被允许执行,否则 MySQL 继续向下查找。
- MySQL 检查 columns_priv 权限表中的权限信息,匹配User、Host 字段值,查看请求的列级别的权限是否被允许,如果找到匹配结果,操作被允许执行,否则 MySQL 返回错误信息。
五、提升安全性
1、AES 256 加密
1)aes_encode() 加密函数
aes_encrypt(str , pswd_str)
- str 是需要加密的字符串
- pswd_str 是秘钥
加密‘holle world’ 秘钥‘liming’ , 加密后存在于@ss中
mysql> set@ss=aes_encrypt('holle world', 'liming');
Query OK, 0 rows affected (0.00 sec)
查看加密后的字符串
mysql> select @ss ;
+------------------------------------+
| @ss |
+------------------------------------+
| 0xAA2FD49133AC80778F5C473C8202A5F3 |
+------------------------------------+
1 row in set (0.00 sec)
查看长度
mysql> select char_length(@ss);
+------------------+
| char_length(@ss) |
+------------------+
| 16 |
+------------------+
1 row in set (0.00 sec)
2)aes_decrypt() 解密函数
aes_decrypt(str , pswd_str)
解码后:
mysql> select aes_decrypt(@ss,'liming')
-> ;
+------------------------------------------------------+
| aes_decrypt(@ss,'liming') |
+------------------------------------------------------+
| 0x686F6C6C6520776F726C64 |
+------------------------------------------------------+
1 row in set (0.00 sec)
2、密码到期更换策略
mysql.user表中的 password_lifetime 列可以设置账户过期时间
1、查看过期时间,用不过期
mysql> select User,Host,password_last_changed,password_lifetime,password_expired from mysql.user;
+------------------+-----------+-----------------------+-------------------+------------------+
| User | Host | password_last_changed | password_lifetime | password_expired |
+------------------+-----------+-----------------------+-------------------+------------------+
| jiaofan | localhost | 2023-01-02 08:39:26 | NULL | N |
| mysql.infoschema | localhost | 2022-12-30 08:26:19 | NULL | N |
| mysql.session | localhost | 2022-12-30 08:26:19 | NULL | N |
| mysql.sys | localhost | 2022-12-30 08:26:19 | NULL | N |
| root | localhost | 2022-12-30 08:28:02 | NULL | N |
+------------------+-----------+-----------------------+-------------------+------------------+
5 rows in set (0.00 sec)
2、修改为260过期
mysql> alter user root@localhost password expire interval 260 day;
Query OK, 0 rows affected (0.00 sec)
mysql> select User,Host,password_last_changed,password_lifetime,password_expired from mysql.user;
+------------------+-----------+-----------------------+-------------------+------------------+
| User | Host | password_last_changed | password_lifetime | password_expired |
+------------------+-----------+-----------------------+-------------------+------------------+
| jiaofan | localhost | 2023-01-02 08:39:26 | NULL | N |
| mysql.infoschema | localhost | 2022-12-30 08:26:19 | NULL | N |
| mysql.session | localhost | 2022-12-30 08:26:19 | NULL | N |
| mysql.sys | localhost | 2022-12-30 08:26:19 | NULL | N |
| root | localhost | 2022-12-30 08:28:02 | 260 | N |
+------------------+-----------+-----------------------+-------------------+------------------+
5 rows in set (0.00 sec)
3、修改为永不过期
mysql> select User,Host,password_last_changed,password_lifetime,password_expired from mysql.user;
+------------------+-----------+-----------------------+-------------------+------------------+
| User | Host | password_last_changed | password_lifetime | password_expired |
+------------------+-----------+-----------------------+-------------------+------------------+
| jiaofan | localhost | 2023-01-02 08:39:26 | NULL | N |
| mysql.infoschema | localhost | 2022-12-30 08:26:19 | NULL | N |
| mysql.session | localhost | 2022-12-30 08:26:19 | NULL | N |
| mysql.sys | localhost | 2022-12-30 08:26:19 | NULL | N |
| root | localhost | 2022-12-30 08:28:02 | NULL | N |
+------------------+-----------+-----------------------+-------------------+------------------+
5 rows in set (0.00 sec)
3、安全模式安装
- 为 root 账户设置密码。
- 移除能从本地主机以外的地址访问数据库的root账户。
- 移除匿名账户
- 移除test数据库,该数据库默认可被任意用户甚至匿名用户访问。
使用 mysqld-initialize 命令安装MySQL 实例默认是安全的,主要原因如下:
- 在安装过程只创建一个root账户 ‘root’@‘localhost’,自动为这个账户生成一个随机密码并标记密码过期。
- 数据库管理员,必须用root 账户及该随机密码登录并设置一个新密码后才能对数据库进行正常操作。
- 安装过程不创建任何匿名账户。
- 安装过程不创建 test 数据库
六、MySQL8.0新特性----管理角色
在mysql 8.0 数据库中,角色可以看成是一些权限的集合,为用户赋予统一的角色,权限的修改直接通过角色来进行,无需为每个用户单独授权。
1、创建角色
mysql> create role role_tt;
Query OK, 0 rows affected (0.00 sec)
2、给角色授予权限
mysql> grant select on db.* to 'role_tt';
Query OK, 0 rows affected (0.00 sec)
3、创建user1用户
mysql> create user 'user1'@'%' identified by 'Huawei@123';
Query OK, 0 rows affected (0.00 sec)
4、为user1用户赋予 role_tt
mysql> grant 'role_tt' to 'user1'@'%';
Query OK, 0 rows affected (0.01 sec)
5、给角色增加权限
mysql> grant insert on db.* to 'role_tt';
Query OK, 0 rows affected (0.00 sec)
6、给角色role_tt 删除 insert权限
mysql> revoke insert on db.* from 'role_tt';
Query OK, 0 rows affected (0.01 sec)
7、查看默认角色信息
mysql> select * from mysql.default_roles;
Empty set (0.00 sec)
8、查看角色和用户的关系
mysql> select * from mysql.role_edges;
+-----------+-----------+---------+---------+-------------------+
| FROM_HOST | FROM_USER | TO_HOST | TO_USER | WITH_ADMIN_OPTION |
+-----------+-----------+---------+---------+-------------------+
| % | role_tt | % | user1 | N |
+-----------+-----------+---------+---------+-------------------+
1 row in set (0.00 sec)
9、删除角色
mysql> drop role role_tt;
Query OK, 0 rows affected (0.00 sec)