前言
MySQL是瑞典MySQL AB公司开发的关系型数据库管理系统,Oracle公司的产品。 MySQL 是最流行的关系数据库管理系统之一。在WEB应用方面,MySQL是最好的RDBMS(Relational Database Management System)应用软件之一。本文收录在MySQL性能优化+原理+实战专栏。本文更新于2023年4月24日,耗时1周。由于文章偏长,如果您觉得对工作和学习有帮助,请记得点赞收藏。本文包含在开篇介绍中。点击此处查看开场介绍。
我们在学习本章的时候,可以先了解一下SQL语言,SQL语言分为四类:
- 数据查询语言DQL(Data Query Language):
选择等
- DML Data Manipulation Language(数据库管理语言):
插入更新删除等
- 数据定义语言DDL(Data Definition Language):
create drop alter execute 等
- 数据控制语言DCL(Data Control Language):
grant remember confirm reverse 等
本文会经常用到DCL数据控制语言
点此了解关系数据库标准语言SQL的概念和发展历程。
目录
- 1.访问控制
- 1.1 连接确认(第一阶段)
- 1.2 允许的连接
- 1.3 连接优先级
- 1.4 确认请求(第二阶段)
- 2.用户管理
- 2.1 添加新用户
- 2.2 用户变更
- 2.2.1 使用DDL语言切换用户
- 2.2.2 DML语句管理mysql用户
- 2.3 删除用户
- 2.4 查看用户
- 2.4.1 show create user 未经许可显示用户属性
- 2.4.2 select * from mysql.user 查看创建的用户
- 2.4.3 select current_user() 查看当前登录的用户
- 3.密码管理
- 3.1 修改密码(最终版)
- 3.1.1 change 更改密码(推荐)
- 3.1.2 mysqladmin修改密码
- 3.1.3 设置密码更改密码
- 更新 3.1.4(不推荐)
- 3.1.5 修改当前登录用户密码
- 3.2 密码政策
- 3.2.1 密码过期政策
- 3.2.2 密码复杂度策略
- 3.2.3 必填密码验证策略(MySQL 8.0新特性)
- 3.2.4 密码重用策略(MySQL 8.0新特性)
- 3.2.5 双密码策略(MySQL 8.0新特性)
- 3.2.5 随机密码策略(MySQL 8.0新特性)
- 3.2.6 登录失败跟踪及临时密码锁定(MySQL 8.0新特性)
- 3.4 密码插件
- 3.4.1 mysql 5.7版本默认使用的密码插件
- 3.4.2 mysql 8.0版本默认使用的密码插件
- 3.4.3 mysql 8应该向下兼容
- 3.4.4 MySQL 8.0 多因素认证(Comprender)
- 4.用户权限管理
- 4.1 权限粒度
- 4.2 为没有权限的用户显示属性
- 4.3 全局权限
- 4.4 库级权限
- 4.5 表级权限
- 4.6 列级权限
- 4.7 恢复权限
- 4.7.1 取回部分权限
- 4.7.2 恢复部分权限(MySQL 8.0新特性)
- 4.7.3 取回所有权限
- 4.8 MySQL权限(MySQL 8.0新特性)
- 4.8.1 Mysql 8.0静态权限总结
- 4.8.2 动态权限概述
- 4.8.2 许可证审批和回收技术
- 5.角色管理(MySQL 8.0新特性)
- 5.1 创建角色并授予权限
- 5.2 检查角色权限
- 5.3 撤销角色或角色权限
- 5.4 删除角色
- 6. 资源限制
- 6.1 指定用户创建配额
- 6.2 更改配额
1.1 连接确认(第一阶段)
当我们连接到 MySQL 时,MySQL 通过以下 2 点执行连接检查
- 通过输入您的用户名和密码确认您的身份
- 确认账户被锁定
该服务首先检查凭据,然后检查帐户锁定状态。如果您在任何步骤中失败,访问将被拒绝,连接将被毫无问题地接受。锁定状态记录在users表的account_locked列中。
数据库> 选择 用户,被冻结的账户的 用户;+------+----------------+| 用户 |被冻结的账户|+------+----------------+|是|北方||太多|北方||太多|北方||是|北方|+------+----------------+4个 行 我 放置 (0,00塞克)
1.2 允许的连接
下表显示了在用户和主机值的各种组合下传入连接的用户表。
用户 | 状态 | 允许连接 |
---|---|---|
'弗雷多' | h1.ejemplo.net | h1.example.net 的和平 |
'' | 'h1.ejemplo.net' | h1.example.net 的任何用户 |
'弗雷多' | '%' | 所有主人的和平 |
'' | '' | 任何主机上的任何用户 |
'弗雷多' | '%.example.net' | example.net 的任何主机的和平 |
'弗雷多' | 'x.example.net%' | 来自 x.example.net、x.example.com 等的任何主机的和平。 |
'弗雷多' | '198.51.100.177' | 主机和平ip198.51.100.177 |
'弗雷多' | '198.51.100.%' | 来自 ip198.51.100C 类网络上的任何主机的和平 |
'弗雷多' | '198.51.100.0/255.255.255.0 | 像之前一样 |
1.3 连接优先级
当有多个匹配项时,请确认您需要哪个匹配项并按如下方式解决问题
- 服务器将user表读入内存时,对user表进行排序
- 当客户端尝试连接时,服务器会按顺序检查行。
- 服务器使用与客户端的主机名和用户名匹配的第一行。
排序
- 优先排序主机,然后是用户
- 特定文本的优先级高于 %(127.0.0.1 高于 localhost)
例子一
要查看其工作原理,假设用户表如下所示:
+----------------------+-|状态| 用户 | ...+----------------------+-| % |是| ...| % |杰弗里| ...|本地主机|是| ...|本地主机|| ...+----------------------+-
加载到内存后,自动排序后的结果如下:
+----------------------+-|状态| 用户 | ...+----------------------+-|本地主机|是| ...|本地主机|| ...| % |杰弗里| ...| % |是| ...+----------------------+-
当localhost上的root用户连接mysql时,会匹配|对应的权限本地服务器 |根 |这个帖子。其他记录也满足但不会匹配其相应的权限。
例子二
我们创造'试图'@'%'
是''@'192.168.79.140
'两个用户,测试连接优先级
[是@mysql2 ~]# mysql-root-p123456## 忽略部分登录代码##数据库> 内阁 用户 ''@'192.168.79.140'确定经过 '123456';数据库> 内阁 用户 '试图'@'%'确定经过 '123456';数据库> 选择状态,用户 的 用户;+------------------+------+|状态| 用户 |+------------------+------+| %|试图|| 192.168.79.140 |||本地主机|是|+------------------+------+3个 行 我 放置 (0,00塞克)数据库> 沙利达;
使用我们刚刚创建的'试图'@'%'
mysql用户登录
[是@mysql2 ~]# mysql-utest-p123456-h192.168.79.140
根据用户登录mysql时mysql连接的优先级,mysql读入内存并自动排序的结果应该如下:
+------------------+------+|状态| 用户 |+------------------+------+| 192.168.79.140 |||本地主机|是|| %|试图|+------------------+------+
当前连接'试图'@'%'
用户匹配连接是| 192.168.79.140 | |
, 我们可以进来吗当前用户()
角色检查器检查当前用户是否匹配| 192.168.79.140 | |
数据库> 选择 当前用户();+------------------+| 当前用户()|+------------------+| @192.168.79.140 |+------------------+1个 斐乐 我 放置 (0,00塞克)
验证结果与我们的推测一致。在正式环境中,不建议创建没有用户名且只有主机的用户。
1.4 确认请求(第二阶段)
MySQL建立连接后,服务器进入访问控制的第二阶段。连接发出的每个请求都会检查是否有足够的权限,这些权限对应如下表:
用户
用户(全球)数据库
数据库表_priv
表面priv_columns
列表procs_priv
存储过程proxies_priv
代理用户权限
这里我们需要知道的是,mysql 用户名和主机名一起是一个有效用户。
2.1 添加新用户
MySQL的语法和Oracle类似,如下
创建由“密码”识别的用户“用户”@“本地主机”[解锁帐户]
解锁账户
默认情况下不阻止用户。如果用户被屏蔽,我们登录的用户将不会有请求的第二阶段验证。
我们创建一个可以在本地登录并且默认解锁的多用户。
数据库> 内阁 用户 '许多'@'本地主机'确定经过 '123456';查询成功, 0 行做作的(0,00塞克)
2.2 用户变更
MySQL可以通过DML数据操作语言和DDL数据定义语言进行修改
2.2.1 使用DDL语言切换用户
我们查询当前数据库中所有用户名、主机和用户的状态
数据库> 选择 用户,状态,被冻结的账户的 用户;+----+------------+----------------+| 用户 |状态|被冻结的账户|+----+------------+----------------+|是|本地主机|北方||太多|本地主机|北方|+----+------------+----------------+2个 行 我 放置 (0,00塞克)
1.我们使用alters来改变'multis'@'localhost'
用户状态被锁定
数据库> 修正 用户 '许多'@'本地主机'帐户关闭;查询成功, 0 行做作的(0,00塞克)数据库> 选择 用户,状态,被冻结的账户的 用户;+----+------------+----------------+| 用户 |状态|被冻结的账户|+----+------------+----------------+|是|本地主机|北方||太多|本地主机|是|+----+------------+----------------+2个 行 我 放置 (0,00塞克)
再次打开一个窗口登录mysql。登录时MySQL报错错误 3118 (HY000):用户 'multis'@'localhost' 的访问被拒绝。该帐户被锁定。
帐户被锁定,用户被拒绝访问。
[是@mysql2 ~]# mysql -umultis -s输入密码:错误3118 (HY000): 拒绝访问A 用户 '许多'@'本地主机'.帐户是封锁.
2.我们使用alters来改变'测试'@'本地主机'
用户密码
数据库> 修正 用户 '试图'@'本地主机'确定经过 '654321';查询成功, 0 行做作的(0,01塞克)
我们登录了'测试'@'本地主机'
Brugergodkendelse
[是@mysql2 ~]# mysql-utest-p654321## 跳过一些登录提示##数据库>
'测试'@'本地主机'
用户使用修改后的密码登录
2.2.2 DML语句管理mysql用户
我们也可以直接更新mysql.user表中的信息来管理用户,但是需要刷新权限
,保持内存和磁盘中的数据一致。
1.编辑'sarna' @'localhost'
用户名多线程1
数据库> 更新数据库.用户 放置 用户 = 'multis1' 在哪里 用户 = '许多' 是状态='本地主机';查询成功, 1个 斐乐做作的(0,01塞克)行 配对:1个改变:1个警告:0数据库>冲洗特权;查询成功, 0 行做作的(0,00塞克)
查询 mysql.user 表来验证
数据库> 选择 用户,状态的数据库.用户;+------------------+| 用户|状态|+------------------+|多线程1|本地主机||是|本地主机|+------------------+2个 行 我 放置 (0,00塞克)
2.编辑'multis1' @'localhost'
用户的主机是127.0.0.1
数据库> 更新数据库.用户 放置状态= '127.0.0.1' 在哪里 用户 = 'multis1' 是状态='本地主机';查询成功, 1个 斐乐做作的(0,00塞克)行 配对:1个改变:1个警告:0
我们不更新刷新权限
,问题'multis1' @'localhost'
用户信息
数据库> 选择 用户,状态的数据库.用户;+------------------+| 用户|状态|+------------------+|多线程1|本地主机||是|本地主机|+------------------+2个 行 我 放置 (0,00塞克)
发现虽然换了host但是原来的host还在,我们刷新权限
所以继续问'multis1' @'localhost'
用户信息
数据库>冲洗特权;查询成功, 0 行做作的(0,00塞克)数据库> 选择 用户,状态的数据库.用户;+------------------+| 用户|状态|+------------------+|多线程1| 127,0.0.1 ||是|本地主机|+------------------+2个 行 我 放置 (0,00塞克)
2.3 删除用户
方法一:删除用户
数据库> 内阁 用户 '试图'@'本地主机'确定经过 '123456'帐户开锁;查询成功, 0 行做作的(0,00塞克)数据库> 降低 用户 '试图'@'本地主机';查询成功, 0 行做作的(0,00塞克
方案二:删除
数据库> 内阁 用户 '试图'@'本地主机'确定经过 '123456'帐户开锁;查询成功, 0 行做作的(0,00塞克)数据库> 删除 的数据库.用户 在哪里 用户 = '试图' 是状态='本地主机';查询成功, 1个 斐乐做作的(0,00塞克)数据库>冲洗特权;查询成功, 0 行做作的(0,00塞克)
我们已经删除了一个特定的用户,但是通过这个用户连接的那些人不会受到影响。那么如何清理这些用户并断开他们的连接呢?
查询删除的用户id并生成SQL
数据库> 选择串联的('马塔尔',ID,';') 的信息表.进程列表在哪里 用户='是' 我也是 大纲 '/tmp/matar.sql';错误1290 (HY000): MySQL 服务器是卡雷拉骗局他--secure-file-priv 选项所以你不能执行这条语句
错误原因:未指定 secure_file_priv 参数
解决方案:secure_file_priv 是一个 MySQL 系统变量,用于限制 LOAD DATA INFILE 和 SELECT ... INTO OUTFILE 语句的文件读写权限。指定允许从中读取或写入文件的文件夹。要启用 secure_file_priv 参数,请在配置文件中更改它并重新启动数据库。
问题priv_secure_file
参数,当前参数值为空
数据库> 选择@@secure_file_priv;+------------------+|@@secure_file_priv |+------------------+| 无效的|+------------------+1个 斐乐 我 放置 (0,00塞克)
我们来分钟.cnf
该文件指定:
[mysqld]priv_secure_file=/tmp/
也可以通过随时生效、永久生效的命令实时更改(推荐MySQL 8.0):
数据库> 放置坚持 secure_private_file=/tmp/;查询成功, 0 行做作的(0,00塞克)
见伊根priv_secure_file
参数,是参数的当前值/tmp/
数据库> 选择@@secure_file_priv;+------------------+|@@secure_file_priv |+------------------+| /tmp/|+------------------+1个 斐乐 我 放置 (0,00塞克)
继续查询经过清理的用户 ID 并生成 SQL
数据库> 选择串联的('马塔尔',ID,';') 的信息表.进程列表在哪里 用户='是' 我也是 大纲 '/tmp/matar.sql';查询成功, 1个 斐乐做作的(0,00塞克)数据库>丰特/tmp/马塔尔.数据库
OK,被删除的用户不在线
2.4 查看用户
2.4.1 show create user 未经许可显示用户属性
数据库> 内阁 用户试图@'本地主机'确定经过 '123456';查询成功, 0 行做作的(0,00塞克)数据库> 展示 内阁 用户 '试图'@'本地主机'\克;*************************** 1. 斐乐 ***************************内阁 用户 A试图主持@local:内阁 用户 '试图'@'本地主机'鉴定缺点 'mysql_native_password' 作为 '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' 要求没有密码过期标准帐户开锁1个 斐乐 我 放置 (0,00塞克)错误:不指定查询
2.4.2 select * from mysql.user 查看创建的用户
数据库> 选择 * 的数据库.用户 在哪里 用户='试图' 是状态='本地主机'\克;*************************** 1. 斐乐 ***************************主机:本地主机用户:prueba Select_priv:N Insert_priv:N Update_priv:N Delete_priv:N Create_priv:N Drop_priv:N Reload_priv:N Shutdown_priv:NProcess_priv:N File_priv:NGrant_priv:N References_priv:NIndex_priv:NAlter_priv:NAlter_priv:NShow_db_privt_priv_:N_db_privt_priv:NS_db_privt_priv:NS_d b _privt_priv: NEjecutar_priv:N Repl_slave_priv:NRepl_client_priv:NCreate_view_priv:NShow_view_priv:N Create_routine_priv:NAlter_routine_priv:NCreate_user_priv:NEvent_priv:NTrigger_priv:NCreate_tablespace_priv:Nsssubject50_cipher:ssubjectsl_9_type:ssxquer_max:ssxque_ 0 人:0最大更新:0最大连接数:0最大用户连接数:0插件:mysql_native_password authentication_string:*6个BB4837EB74329105EE4568DDA7DC67ED2CA2AD9password_expired:N password_last_changed:2023年-04-18 22:00:36password_lifetime:无效的account_blocked:N1个 斐乐 我 放置 (0,00塞克)错误:不指定查询
2.4.3 select current_user() 查看当前登录的用户
数据库> 选择 当前用户;+--------------+| 当前用户 |+--------------+|是主持@local |+--------------+1个 斐乐 我 放置 (0,00塞克)数据库> 选择 用户();+--------------+| 用户() |+--------------+|是主持@local |+--------------+1个 斐乐 我 放置 (0,00塞克)
3.1 修改密码(最终版)
3.1.1 change 更改密码(推荐)
数据库> 修正 用户 '试图'@'本地主机'确定经过 '654321';查询成功, 0 行做作的(0,01塞克)
3.1.2 mysqladmin修改密码
[是@mysql2 ~]# mysqladmin -utest -p654321 密码mysql管理员:[警告] 使用密码在命令行界面可能不安全.新密码: 确认新密码: 警告:因为密码将被发送A服务器我一般来说文本, 使用SSL连接A确保密码安全.
3.1.3 设置密码更改密码
1.使用标准加密
数据库> 放置密码A '试图'@'%' ='A b c d e f g';查询成功, 0 行做作的(0,01塞克)
2.使用PASSWORD()函数进行加密(mysql使用该方法对密码进行加密)
数据库> 放置密码A '试图'@'%' =密码('123456');查询成功, 0 行做作的(0,01塞克)
更新 3.1.4(不推荐)
数据库> 更新数据库.用户 放置身份验证字符串=密码('Aroot123#') 在哪里 用户='dba';查询成功, 0 行做作的, 1个警告(0,00塞克)行 配对:0改变:0警告:1个数据库>冲洗特权;查询成功, 0 行做作的(0,00塞克)
3.1.5 修改当前登录用户密码
数据库> 修正 用户 当前用户()确定经过 '123456';查询成功, 0 行做作的(0,00塞克)数据库> 修正 用户 用户()确定经过 '123456';查询成功, 0 行做作的(0,00塞克)
3.2 密码政策
当您设置密码策略时由“密码”识别
可以忽略
3.2.1 密码过期政策
从 MySQL 版本 5.7.4 开始,您可以使用全局变量default_password_lifetime
设置全局密码过期策略。主要有四种策略。
1.即时密码过期政策密码过期
ERROR 1820 (HY000):您必须在执行此语句之前使用 ALTER USER 语句重置您的密码。
重置密码后可以正常登录
我们改变了'测试'@'本地主机'
用户密码立即过期,查询用户disallow属性
数据库> 修正 用户 '试图'@'本地主机'确定经过 '123456'密码过期;查询成功, 0 行做作的(0,00塞克)数据库> 展示 内阁 用户 '试图'主持@local\克;*************************** 1. 斐乐 ***************************内阁 用户 A试图主持@local:内阁 用户 '试图'@'本地主机'鉴定缺点 'mysql_native_password' 作为 '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' 要求没有密码过期帐户开锁1个 斐乐 我 放置 (0,00塞克)错误:不指定查询
我们可以找到密码策略密码默认过期
成为密码过期
,我们再次登录mysql,发现sql语句无法使用,提示使用更改用户
短语重置密码
数据库> 选择 当前用户();错误1820 (HY000): 您必须重设密码使用 修正 用户执行此语句之前的语句.
使用root用户修改'测试'@'本地主机'
布鲁格冈斯科德
数据库> 修正 用户 '试图'@'本地主机'确定经过 '123456';查询成功, 0 行做作的(0,01塞克)
修改密码后就可以正常登录mysql了
[是@mysql2 ~]# mysql-utest-p123456数据库> 展示 数据库;+------------------+| 数据库 |+------------------+|信息表|+------------------+1个 斐乐 我 放置 (0,00塞克)
很好,测试完成。
2.永不过期的密码策略密码永不过期
数据库> 修正 用户 '试图'@'本地主机'确定经过 '123456'密码过期;查询成功, 0 行做作的(0,00塞克)
礼物'测试'@'本地主机'
用户永不过期。
3.指定过期时间策略密码过期间隔 90 天
数据库> 修正 用户 '试图'@'本地主机'密码过期间隔 90后 天;查询成功, 0 行做作的(0,00塞克)
礼物'测试'@'本地主机'
用户在90天后过期,我们需要在过期后进行更改'测试'@'本地主机'
密码。
4.标准到期时间政策密码默认过期
创建用户时,mysql默认使用这个策略密码默认过期
,密码有效期由default_password_lifetime参数决定。
我可以用选择@@default_password_lifetime
ovis variabler som '%default_password_lifetime%'
查询
数据库> 选择@@default_password_lifetime;+----------------------------+|@@default_password_lifetime |+----------------------------+| 0 |+----------------------------+1个 斐乐 我 放置 (0,00塞克)
我们改变了'测试'@'本地主机'
默认过期
数据库> 修正 用户 '试图'@'本地主机'密码过期标准;查询成功, 0 行做作的(0,01塞克)
如果您需要更改全局参数,我们可以在分钟.cnf
该文件指定:
[mysqld]default_password_lifetime=180
default_password_lifetime=180 密码有效期为6个月,最大值为65535
default_password_lifetime=0 默认为0,密码永不过期
也可以通过随时生效、永久生效的命令实时更改(兼容mysql 8.0版本,推荐):
数据库> 放置default_password_lifetime=180;查询成功, 0 行做作的(0,00塞克)
我们现在要求每 90 天更改一次密码,我们可以创建用户
是更改用户...密码到期间隔 90 天
数据库> 内阁 用户 '测试 1'@'本地主机'确定经过 '123456'密码过期间隔 90后 天;查询成功, 0 行做作的(0,00塞克)
需要注意的是,当我们指定用户密码立即过期,永久生效,并指定过期时间间隔策略时,会覆盖声明中指定用户的全局策略。当用户为用户设置一个默认的过期时间时,该用户将遵循全局密码策略。
当密码过期时,我们可以通过更改密码来处理密码过期
;下面测试
我们创建一个用户,默认策略是一个全局参数
数据库> 内阁 用户 '测试3'@'本地主机'确定经过 '123456';查询成功, 0 行做作的(0,00塞克)数据库> 展示 内阁 用户 '测试3'@'本地主机';+---------------------------------------------- ---------------------------------------------- ---------------------------------------------- ----------------------+| 内阁 用户 A测试 3主持@local|+---------------------------------------------- ---------------------------------------------- ---------------------------------------------- ----------------------+| 内阁 用户 '测试3'@'本地主机'鉴定缺点 'mysql_native_password' 作为 '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' 要求没有密码过期标准帐户开锁 |+---------------------------------------------- ---------------------------------------------- ---------------------------------------------- ----------------------+1个 斐乐 我 放置 (0,00塞克)
立即更改当前用户无效
数据库> 修正 用户 '测试3'@'本地主机'密码过期;查询成功, 0 行做作的(0,00塞克)
新开窗口登录mysql查询数据
[是@mysql2 ~]# mysql-utest3-p123456## 忽略登录删除##数据库> 展示 数据库;错误1820 (HY000): 您必须重设密码使用 修正 用户执行此语句之前的语句.数据库>
系统要求修改密码
数据库> 修正 用户 '测试3'@'本地主机'确定经过 '123456';查询成功, 0 行做作的(0,00塞克)
再次登录mysql
[是@mysql2 ~]# mysql-utest3-p123456## 忽略登录删除##数据库> 展示 数据库;+------------------+| 数据库 |+------------------+|信息表|+------------------+1个 斐乐 我 放置 (0,00塞克)
经过上面的测试,我们了解到修改密码可以处理密码过期的问题。
3.2.2 密码复杂度策略
MySQL 5.6.6之后,增加了validate_password密码强度校验插件,相关参数设置更加严格。使用这个插件会检查设置的密码是否符合当前设置的安全规则,如果不符合,它会拒绝设置。这个插件默认没有安装,我们可以通过从 mysql.plugin 中选择 *
使用显示像“%validate_password%”这样的变量
显示列表为空
数据库> 选择 * 的数据库.插头;托马斯放置 (0,00塞克)数据库> 展示变量作为 '%validate_password%';托马斯放置 (0,00塞克)
我们可以使用命令安装补充 validate_password soname 'validate_password.so'
安装
数据库>安装程序插件 validate_password我的名字 'validate_password.so';查询成功, 0 行做作的(0,00塞克)数据库> 展示变量作为 '值得%';+------------------------------------------+----- - ---+|变量名| 勇气|+------------------------------------------+----- - ---+|validate_password_verify_user_name| 的||验证密码字典文件|||验证密码长度| 8个||validate_password_mixed_case_count| 1个||validate_password_count_number| 1个||验证密码政策|一半||validate_password_special_char_count| 1个|+------------------------------------------+----- - ---+7 行 我 放置 (0,01塞克)
使用更改命令禁用密码复杂性卸载 validate_password 插件
数据库>卸载 validate_password 插件;查询成功, 0 行做作的(0,00塞克)数据库> 展示变量作为 '值得%';托马斯放置 (0,00塞克)
也可以在my.cnf配置文件中指定插件加载=validate_password.so
启用密码复杂性
[mysqld]插头-收费=验证密码.所以
关闭 my.cnf 配置文件中指定的密码复杂度验证密码=关闭
只需重新启动服务即可。
[mysqld]插头-收费=验证密码.确认-密码=的
建议使用安装补充 validate_password soname 'validate_password.so'
是卸载 validate_password 插件
打开和关闭密码复杂性
通过查询我们知道密码的复杂度有
validate_password_verify_user_name
用户名注册,检测名字是否重复,默认关闭验证密码字典文件
字典文件,字典文件中查到的密码不应使用验证密码长度
密码的最小长度,这里是8validate_password_mixed_case_count
至少必须包含若干个小写或大写字母,这里是1个validate_password_count_number
此处包含的最小数字数为 1验证密码政策
密码安全策略0~2,默认BETWEEN(2)LOW O 1:仅限长度
MEDIUM OR 2:边框长度、数字、字母、特殊字符
STRONG O 3:限制长度、数字、字母、特殊字符、字典validate_password_special_char_count
此处必须包含的最少字符数为 1
我们用全局设置
设置全局变量密码复杂度策略为STRONG(3),从8开始,可以通过设置持久性
该命令继续修改全局变量到配置文件。我们开始尝试
数据库> 放置 全球的验证密码政策=2个;查询成功, 0 行做作的(0,00塞克)
首先,我们创建密码字典文件
[是@mysql2 ~]# echo 'admin'> /tmp/dic.fil[是@mysql2 ~]# kat /tmp/dic.fil行政
使用全局设置
指定字典文件
数据库> 放置 全球的验证密码字典文件='/tmp/dic.fil';查询成功, 0 行做作的(0,00塞克)
我们质疑密码复杂性政策
数据库> 展示变量作为 '值得%';+------------------------------------------+----- - ------ -----+|变量名| 勇气 |+------------------------------------------+----- - ------ -----+|validate_password_verify_user_name| 的 ||验证密码字典文件| /tmp/迪克.充满 ||验证密码长度| 8个 ||validate_password_mixed_case_count| 1个 ||validate_password_count_number| 1个 ||验证密码政策|强的||validate_password_special_char_count| 1个 |+------------------------------------------+----- - ------ -----+
我们测试密码、大小写字母、符号、字典等的最小长度。如下
--密码长度6位数据库> 修正 用户 '测试3'@'本地主机'确定经过 '123456';错误1819 (HY000): 你的密码不是它不是满足礼物政治诉求--密码长度8位数据库> 修正 用户 '测试3'@'本地主机'确定经过 '12345678';错误1819 (HY000): 你的密码不是它不是满足礼物政治诉求--密码长度为10位,包括大小写字母各1位数据库> 修正 用户 '测试3'@'本地主机'确定经过 'A12345678a';错误1819 (HY000): 你的密码不是它不是满足礼物政治诉求--密码长度为11位,包括1位大小写字母和符号,成功数据库> 修正 用户 '测试3'@'本地主机'确定经过 'A12345678a#';查询成功, 0 行做作的(0,00塞克)--密码字母包含在字典中,失败数据库> 修正 用户 '测试3'@'本地主机'确定经过 'admin123456#';错误1819 (HY000): 你的密码不是它不是满足礼物政治诉求
OK,测试成功,我们禁用密码复杂度策略
数据库>卸载 validate_password 插件;查询成功, 0 行做作的(0,00塞克)
3.2.3 必填密码验证策略(MySQL 8.0新特性)
在 MySQL 8.0 之前的版本中,普通用户可以直接更改自己的密码,而无需事先确认密码或通知管理员。比如用户test需要修改密码,直接在MySQL 5.7中输入alter user命令即可,假设test在服务器上登录数据库后,忘记注销了。用户test2直接去服务器修改密码,为了防止此类不安全事件的发生,MySQL 8.0发布了一系列的密码验证策略。
需要密码的身份验证策略当前要求密码
即修改密码前必须验证密码。
我们来分钟.cnf
该文件指定:
[mysqld]当前要求密码=在
也可以通过随时生效和永久生效的命令实时更改(推荐):
数据库> 放置坚持 current_require_password=在;查询成功, 0 行做作的(0,00塞克)
我们通过了将变量显示为“密码%”
检查参数是否有效的命令:
数据库> 展示变量作为 '密码%';+--------------------------+------+|变量名| 勇气 |+--------------------------+------+|当前要求密码| 在|+--------------------------+------+1个 行 我 放置 (0,01塞克)
你可以通过创建用户
是更改用户...需要密码当前可选
o密码需要当前标准
覆盖全局参数的值,但请注意密码需要当前标准
参数取决于需要当前可选
参数值
数据库> 内阁 用户 '试图'@'本地主机'确定经过 '123456'密码永不过期密码要求 礼物;查询成功, 0 行做作的(0,01塞克)
刚刚创建了登录名'测试'@'本地主机'
用户登录并尝试更改密码。
[是@mysql2 ~]# mysql -utest -p123456 -S /data/mysql/my3307/mysql.sock## 跳过部分登录代码##服务器版本:8,0.32MySQL 社区服务器-GPL MySQL> 修正 用户 用户()确定经过 '654321';错误3892 (HY000):礼物要求输入密码A请明确点我他代替条款我 命令 A更改.
当前密码必须在 REPLACE 语句中指定才能更改。然后更改用户后跟替换子句来做'测试'@'本地主机'
用户输入旧密码并修改新密码
数据库> 修正 用户 用户()确定经过 '123456' 代替 '123456';查询成功, 0 行做作的(0,01塞克)
我们用更改用户...需要密码当前可选
关闭'prueba1'@'localhost'
所需的用户密码认证策略
数据库>修正 '测试 1'@'本地主机'密码要求 礼物选修的;查询成功, 0 行做作的(0,01塞克)
下一个'prueba1'@'localhost'
用户已恢复到以前版本 MySQL 的安全行为
数据库> 修正 用户 用户()确定经过 '123456';查询成功, 0 行做作的(0,01塞克)
很好,测试完成。
3.2.4 密码重用策略(MySQL 8.0新特性)
MySQL 8.0 允许限制旧密码的重用。重用限制可以基于密码更改次数、经过的时间或两者。可以全局设置回收策略,并且可以将单个帐户配置为遵循全局策略或使用特定帐户行为覆盖全局策略。
帐户的密码历史记录包含以前分配的密码。 MySQL 可以限制从我们可以查询的历史记录中选择新密码mysql.password_history
, 它记录了密码更改的历史
如果帐户受密码更改次数限制,则无法从指定数量的最近密码中选择新密码。例如密码最小修改次数设置为3,则新密码不能与最近3次密码相同。
如果您根据经过的时间限制帐户,则您不能从历史记录中超过指定天数的密码中选择新密码。例如,如果密码重用间隔设置为 60,则新密码不能与最近 60 天的密码相同。
如果根据经过的时间限制帐户和密码的更改,则必须满足这两个参数才能更改密码。
注意:空密码不计入密码历史记录。如果要配置密码重用策略,可以设置password_history和password_reuse_interval系统变量:默认值为0,即不启用密码重用策略。
最后密码存储密码历史
保留最近密码的天数密码重用间隔
我们来分钟.cnf
该文件指定:
[mysqld]密码历史=3个密码重用间隔=30
也可以通过随时生效和永久生效的命令实时更改(推荐):
数据库> 放置坚持密码历史=3个;查询成功, 0 行做作的(0,00塞克)数据库> 放置persistir password_reuse_interval=30;查询成功, 0 行做作的(0,00塞克)
我们通过了将变量显示为“密码%”
检查参数是否有效的命令:
数据库> 展示变量作为 '密码%';+--------------------------+------+|变量名| 勇气 |+--------------------------+------+|密码历史| 3个 ||当前要求密码| 在||密码重用间隔| 30|+--------------------------+------+3个 行 我 放置 (0,01塞克)
你可以通过创建用户
是更改用户... 密码历史记录 3 密码重用间隔 30
覆盖全局参数的值
数据库> 内阁 用户 '测试4'@'本地主机'确定经过 '123456'密码历史3个密码重用间隔 30 天;查询成功, 0 行做作的(0,00塞克)
我们可以使用命令显示创建用户
命令查询'test4'@'localhost'
可以找到未经用户许可的属性密码历史 3 密码重用间隔 30 天
, 用户策略覆盖全局策略
数据库> 展示 内阁 用户 '测试4'@'本地主机'\克;*************************** 1. 斐乐 ***************************内阁 用户 A测试 4主持@local:内阁 用户 `测试 4`@`localhost`鉴定缺点 'caching_sha2_password' 作为 '$A$005$IPDZ.elS9pULZ|sjDgdLpKcyNUdLk2LZ7VfI9T6y56gc79nD2zOTB9xF5' 要求没有密码过期标准帐户开锁密码历史3个密码重用间隔 30 天密码要求 礼物 标准1个 斐乐 我 放置 (0,00塞克)
返回全局设置:
数据库> 修正 用户 '测试4'@'本地主机'密码历史标准密码重用间隔 标准;查询成功, 0 行做作的(0,00塞克)
默认密码历史记录
是默认密码重用间隔
经过密码历史
是密码重用间隔
由全局参数决定。
3.2.5 双密码策略(MySQL 8.0新特性)
在MySQL 8.0.14版本中,用户支持双密码(主密码和副密码)。双密码策略是一种在日常运维中需要定期更改特定用户密码,同时需要旧密码的策略。临时存储一段指定的时间。它的作用是延迟用户新旧密码在应用程序和数据库之间的耦合时间。
双密码机制其实就是主密码和备份密码。当备份密码不再使用时,提示管理员丢弃备份密码。此时,用户的主密码是唯一的密码。使用方法如下:
管理员首先创建一个新用户'prueba1'@'localhost'
,密码是测试1旧
并将您的密码更改为测试1ny
,y保留当前密码
.此时rootnew为主密码,rootold为备份密码。
数据库> 内阁 用户 '测试 1'@'本地主机'确定经过 'test1old';查询成功, 0 行做作的(0,01塞克)数据库> 修正 用户'测试 1'@'本地主机'确定经过 'test1ny'保持礼物密码;查询成功, 0 行做作的(0,01塞克)
下一个用户'prueba1'@'localhost'
使用备用密码和主密码连接MySQL,执行简单的SQL语句:
[是@mysql2 ~]# mysql -utest1 -ptest1new -e "选择'hello world'" -S /data/mysql/my3307/mysql.sock数据库:[警告] 使用密码在命令行界面可能不安全.+--------------+|你好世界|+--------------+|你好世界|+--------------+[是@mysql2 ~]# mysql -utest1 -ptest1old -e "选择'hello world'" -S /data/mysql/my3307/mysql.sock数据库:[警告] 使用密码在命令行界面可能不安全.+--------------+|你好世界|+--------------+|你好世界|+--------------+
可能发现两个密码都可以正常使用,相关业务修改完成后,可能会要求管理员丢弃备份密码。丢弃旧密码
:
数据库> 修正 用户'测试 1'@'本地主机' 收银员旧密码;查询成功, 0 行做作的(0,01塞克)
双密码策略有以下几点需要考虑:
1. 如果用户已有双重密码策略且不包含当前密码子句,当再次修改新密码时,旧的主密码将被替换为新修改的密码,但备份密码不会被替换。还有一个细节需要注意。如果没有保留当前密码的子句,将新密码修改为空串,则主备密码统一修改为空串。下面8个地方
数据库> 修正 用户 '测试 1'@'本地主机'确定经过 '';查询成功, 0 行做作的(0,02塞克)[是@mysql2 ~]# mysql -utest1 -ptest1old -e "选择'hello world'" -S /data/mysql/my3307/mysql.sock数据库:[警告] 使用密码在命令行界面可能不安全.错误1045 (28.000): 拒绝访问A 用户 '测试 1'@'本地主机' (使用密码:是)
2、使用双密码策略时,用户认证插件不能更改。
数据库> 修正 用户 '测试 1'@'本地主机'确定骗局sha256_密码经过 '测试一下'保持礼物密码;错误3894 (HY000):礼物密码可以它不是被保留A 用户 '测试 1'@'本地主机'因为身份验证插件是被改变.
3.新密码为空,不允许备份密码
数据库> 修正 用户'测试 1'@'本地主机'确定经过 ''保持礼物密码;错误3895 (HY000):礼物密码可以它不是被保留A 用户 '测试 1'@'本地主机'为什么新密码是托马斯.
3.2.5 随机密码策略(MySQL 8.0新特性)
以前,旧版本需要生成无法直接在 MySQL 端设置的随机密码。 MySQL 8.0 可以直接配置为创建用户
数据库> 内阁 用户 '测试2'@'本地主机'确定经过随机密码;+------+------------+--------------------+----- -- ------+| 用户|状态|生成的密码|授权因素|+------+------------+--------------------+----- -- ------+|测试 2|本地主机| 7HcEGYi6:K.*超高-北方.C| 1个 |+------+------------+--------------------+----- -- ------+1个 斐乐 我 放置 (0,00塞克)
也可以用设定键
设置随机密码的子句
数据库> 放置密码A '测试2'@'本地主机' A随机的;+------+------------+--------------------+----- -- ------+| 用户|状态|生成的密码|授权因素|+------+------------+--------------------+----- -- ------+|测试 2|本地主机|tJKznYxoL1u+J3YS<你-吨| 1个 |+------+------------+--------------------+----- -- ------+1个 斐乐 我 放置 (0,00塞克)
也可以用更改用户
设置随机密码
数据库> 修正 用户 '测试2'@'本地主机'确定经过随机密码;+------+------------+--------------------+----- -- ------+| 用户|状态|生成的密码|授权因素|+------+------------+--------------------+----- -- ------+|测试 2|本地主机|vZ-q{OqQqDnaT]gbhCy+ | 1个 |+------+------------+--------------------+----- -- ------+1个 斐乐 我 放置 (0,00塞克)
3.2.6 登录失败跟踪及临时密码锁定(MySQL 8.0新特性)
跟踪登录失败和临时密码锁定,以下简称:FLTTAL。
与以往的密码策略不同,FLTTAL 没有全局参数匹配,只能在创建用户或更改用户属性时匹配。有两种选择
不成功_启动_尝试
密码错误和密码锁定时间
封锁日
应该记住的是:
1、不成功_启动_尝试
是密码锁定时间
FLTTAL 也必须为非零才能生效。
数据库> 内阁 用户 '测试3'@'本地主机'确定经过 '试图'不成功_启动_尝试2个密码锁定时间0;查询成功, 0 行做作的(0,01塞克)[是@mysql2 ~]#mysql -utest3 -ptest11111 -e “选择‘hello world’”-S /data/mysql/my3307/mysql.sock数据库:[警告] 使用密码在命令行界面可能不安全.错误1045 (28.000): 拒绝访问A 用户 '测试3'@'本地主机' (使用密码:是)[是@mysql2 ~]#mysql -utest3 -ptest11111 -e “选择‘hello world’”-S /data/mysql/my3307/mysql.sock数据库:[警告] 使用密码在命令行界面可能不安全.错误1045 (28.000): 拒绝访问A 用户 '测试3'@'本地主机' (使用密码:是)[是@mysql2 ~]#mysql -utest3 -ptest11111 -e “选择‘hello world’”-S /data/mysql/my3307/mysql.sock数据库:[警告] 使用密码在命令行界面可能不安全.错误1045 (28.000): 拒绝访问A 用户 '测试3'@'本地主机' (使用密码:是)[是@mysql2 ~]#mysql -utest3 -ptest -e "选择'hello world'" -S /data/mysql/my3307/mysql.sock数据库:[警告] 使用密码在命令行界面可能不安全.+--------------+|你好世界|+--------------+|你好世界|+--------------+
2.新建一个未指定的用户不成功_启动_尝试
是密码锁定时间
, 那么默认情况下 FLTTAL 是禁用的。
3、对于已经使用过FLTTAL的用户,管理员可以在切换用户后更改原有的密码验证策略。
数据库>更改用户'测试3'@'本地主机'由'试图'不成功_启动_尝试4个密码锁定时间1个;好好咨询,0受影响的行(0,00塞克)[[电子邮件保护]~]#mysql -utest3 -ptest11111 -e “选择‘hello world’”-S /data/mysql/my3307/mysql.sock数据库:[警告]在中使用密码命令线路接口可能不安全。错误1045 (28.000): 拒绝访问A用户'测试3'@'本地主机' (用户密码:是)[[电子邮件保护]~]#mysql -utest3 -ptest11111 -e “选择‘hello world’”-S /data/mysql/my3307/mysql.sock数据库:[警告]在中使用密码命令线路接口可能不安全。错误1045 (28.000): 拒绝访问A用户'测试3'@'本地主机' (用户密码:是)[[电子邮件保护]~]#mysql -utest3 -ptest11111 -e “选择‘hello world’”-S /data/mysql/my3307/mysql.sock数据库:[警告]在中使用密码命令线路接口可能不安全。错误1045 (28.000): 拒绝访问A用户'测试3'@'本地主机' (用户密码:是)[[电子邮件保护]~]#mysql -utest3 -ptest11111 -e “选择‘hello world’”-S /data/mysql/my3307/mysql.sock数据库:[警告]在中使用密码命令线路接口可能不安全。错误3955 (HY000): 拒绝访问A用户'测试3'@'本地主机'.该帐户被锁定A 1个天(秒) (1个天(秒)后退)为什么4个连续登录失败。
4、账号一旦被锁定,即使输入正确的密码也无法登录。
[[电子邮件保护]~]#mysql -utest3 -ptest -e "选择'hello world'" -S /data/mysql/my3307/mysql.sock数据库:[警告]在中使用密码命令线路接口可能不安全。错误3955 (HY000): 拒绝访问A用户'测试3'@'本地主机'.该帐户被锁定A 1个天(秒) (1个天(秒)后退)为什么4个连续登录失败。
只有管理员解锁账户后,才能正常使用:(或忘记密码,请管理员解锁账户,重新设置新密码)
数据库> 修正 用户 '测试3'@'本地主机'帐户开锁;查询成功, 0 行做作的(0,01塞克)[是@mysql2 ~]#mysql -utest3 -ptest -e "选择'hello world'" -S /data/mysql/my3307/mysql.sock数据库:[警告] 使用密码在命令行界面可能不安全.+--------------+|你好世界|+--------------+|你好世界|+--------------+
最重要的一点:由于 FLTTAL 密码检查的连续性,任何成功的登录都会重置 FLTTAL 计数器
[[电子邮件保护]~]#mysql -utest3 -ptest11111 -e “选择‘hello world’”-S /data/mysql/my3307/mysql.sock数据库:[警告]在中使用密码命令线路接口可能不安全。错误1045 (28.000): 拒绝访问A用户'测试3'@'本地主机' (用户密码:是)[[电子邮件保护]~]#mysql -utest3 -ptest11111 -e “选择‘hello world’”-S /data/mysql/my3307/mysql.sock数据库:[警告]在中使用密码命令线路接口可能不安全。错误1045 (28.000): 拒绝访问A用户'测试3'@'本地主机' (用户密码:是)[[电子邮件保护]~]#mysql -utest3 -ptest -e "选择'hello world'" -S /data/mysql/my3307/mysql.sock数据库:[警告]在中使用密码命令线路接口可能不安全。+------------+|你好世界|+------------------------------------+|你好世界|+------------------------------------+[[电子邮件保护]~]#mysql -utest3 -ptest11111 -e “选择‘hello world’”-S /data/mysql/my3307/mysql.sock数据库:[警告]在中使用密码命令线路接口可能不安全。错误1045 (28.000): 拒绝访问A用户'测试3'@'本地主机' (用户密码:是)[[电子邮件保护]~]#mysql -utest3 -ptest11111 -e “选择‘hello world’”-S /data/mysql/my3307/mysql.sock数据库:[警告]在中使用密码命令线路接口可能不安全。错误1045 (28.000): 拒绝访问A用户'测试3'@'本地主机' (用户密码:是)[[电子邮件保护]~]#mysql -utest3 -ptest11111 -e “选择‘hello world’”-S /data/mysql/my3307/mysql.sock数据库:[警告]在中使用密码命令线路接口可能不安全。错误1045 (28.000): 拒绝访问A用户'测试3'@'本地主机' (用户密码:是)[[电子邮件保护]~]#mysql -utest3 -ptest11111 -e “选择‘hello world’”-S /data/mysql/my3307/mysql.sock数据库:[警告]在中使用密码命令线路接口可能不安全。错误3955 (HY000): 拒绝访问A用户'测试3'@'本地主机'.该帐户被锁定A 1个天(秒) (1个天(秒)后退)为什么4个连续登录失败。[[电子邮件保护]~]#
3.4 密码插件
3.4.1 mysql 5.7版本默认使用的密码插件
mysql_native_password
数据库> 展示变量作为 '%赞同%';+--------------------------------------+-------- ---------- - -----+|变量名| 勇气 |+--------------------------------------+-------- ---------- - -----+|默认身份验证插件|mysql_native_password| +--------------------------------------+-------- ---------- - -----+1个 斐乐 我 放置 (0,78塞克)
3.4.2 mysql 8.0版本默认使用的密码插件
缓存_sha2_密码
数据库> 选择@@default_authentication_plugin ;+----------------------------------+|@@default_authentication_plugin |+----------------------------------+|缓存_sha2_密码|+----------------------------------+1个 斐乐 我 放置, 1个警告(0,00塞克)
3.4.3 mysql 8应该向下兼容
方法一:更改更改用户指定的密码插件
数据库> 修正 用户 '是'@'本地主机'确定骗局mysql_native_password经过 '123456';查询成功, 0 行做作的(0,00塞克)数据库>冲洗特权;查询成功, 0 行做作的(0,01塞克)
方法二:我们可以使用分钟.cnf
该文件指定:
[mysqld]默认身份验证插件=mysql_native_password
也可以通过随时生效、永久生效的命令实时更改(推荐MySQL 8.0):
数据库> 放置坚持 default_authentication_plugin=mysql_native_password;查询成功, 0 行做作的(0,00塞克)
3.4.4 MySQL 8.0 多因素认证(Comprender)
MySQL 8.0.27 增加了多重身份验证特性,可以为一个用户指定多重身份验证。为此还引入了一个新的 authentication_policy 系统变量,它控制多因素身份验证功能。在 MySQL 8.0.27 之前,可以在创建用户时指定身份验证插件。如果未明确指定,将采用 default_authentication_plugin 系统变量的值。 default_authentication_plugin有3个有效值分别是mysql_native_password
,sha256_密码
,缓存_sha2_密码
.
在MySQL 8.0.27中,用户认证由authentication_policy管理,同时检查authentication_policy和default_authentication_plugin的值
数据库> 展示变量作为 '%赞同_%';+--------------------------------------+-------- ---------- - -----+|变量名| 勇气 |+--------------------------------------+-------- ---------- - -----+|身份验证策略| *,, ||默认身份验证插件|缓存_sha2_密码|+--------------------------------------+-------- ---------- - -----+2个 行 我 放置 (0,06塞克)';
我们看到 authentication_policy 的默认值为*,,
第一个元素的值为*
,表示可以是任意插件,默认值为default_authentication_plugin的值。如果元素值不是星号,则应设置为mysql_native_password
,sha256_密码
,缓存_sha2_密码
其中之一。
第2项和第3项的值为空,这两个位置不能配置为内部仓库插件。如果该元素的值为空,则表示该插件是可选的。
当我们创建用户并且不指定插件名称时,会自动使用默认插件缓存_sha2_密码
数据库> 内阁 用户 '试图'@'本地主机'确定经过'123456';查询成功, 0 行做作的(0,01塞克)数据库> 选择 用户,状态,插头的数据库.用户 在哪里 用户='试图';+------+------------+--------------------+| 用户 |状态|插头|+------+------------+--------------------+|试图|本地主机|缓存_sha2_密码|+------+------------+--------------------+1个 斐乐 我 放置 (0,00塞克)
当您指定插件名称时,将使用相应的插件
数据库> 内阁 用户 '测试4'@'本地主机'确定骗局mysql_native_password经过'123456';查询成功, 0 行做作的(0,01塞克)数据库> 选择 用户,状态,插头的数据库.用户 在哪里 用户='测试4';+------+------------+------------------------+| 用户|状态|插头|+------+------------+------------------------+|测试 4|本地主机|mysql_native_password|+------+------------+------------------------+1个 斐乐 我 放置 (0,00塞克)
尝试将 authentication_policy 第一个元素的值更改为 sha256_password
数据库> 放置坚持 authentication_policy='sha256_password,,';查询成功, 0 行做作的(0,00塞克)数据库> 展示变量作为 '授权政策';+--------------+------+|变量名| 勇气 |+--------------+------+|身份验证策略| *,, |+--------------+------+1个 斐乐 我 放置 (0,01塞克)
在不指定插件名称的情况下再次创建用户
数据库> 内阁 用户 '测试5'@'本地主机'确定经过'123456';查询成功, 0 行做作的(0,01塞克)数据库> 选择 用户,状态,插头的数据库.用户 在哪里 用户='测试5';+------+------------+----------------+| 用户|状态|插头|+------+------------+----------------+|测试 5|本地主机|sha256_密码|+------+------------+----------------+1个 斐乐 我 放置 (0,00塞克)
可以看到默认使用的插件是sha256_password,这说明当authentication_policy的第一个元素指定插件名称时,default_authentication_plugin被弃用了。
对于我们现在的多因素认证用户,我们首先将authentication_policy恢复为默认值
数据库> 放置persistauthentication_policy='*,,';查询成功, 0 行做作的(0,01塞克)数据库> 展示变量作为 '授权政策';+--------------+------+|变量名| 勇气 |+--------------+------+|身份验证策略| *,, |+--------------+------+1个 斐乐 我 放置 (0,01塞克)
创建一个双重身份验证用户,以下创建失败,因为我们同时使用了两个内部存储插件。
数据库> 内阁 用户 '测试7'@'本地主机'确定经过 '123456' 是确定骗局mysql_native_password经过 '123456';错误4052 (HY000): 无效插件“mysql_native_password”指定的作为 2个以下因素“创建一个帐户”.
接下来,让我们安装一个 Socket Peer Credentials 插件
数据库>安装插件 auth_socket声音名称 'auth_socket.so';查询成功, 0 行做作的(0,00塞克)数据库> 选择PLUGIN_NAME,PLUGIN_STATUS的SCHEME_INFORMATION.补品在哪里PLUGIN_NAME作为 '%插头%';+--------------+----------------+|PLUGIN_NAME|PLUGIN_STATUS|+--------------+----------------+|auth_socket|资产|+--------------+----------------+1个 斐乐 我 放置 (0,00塞克)
创建另一个双因素身份验证用户
数据库> 内阁 用户 '测试7'@'本地主机'确定经过 '123456' 是确定骗局auth_socket作为 '是';查询成功, 0 行做作的(0,05塞克)数据库> 选择 用户,状态,插头,用户属性的数据库.用户 在哪里 用户='测试7';+------+------------+--------------------+----- ------------------------------------------------- ------------------------------------------------- -------------------------------------+| 用户|状态|插头|用户属性|+------+------------+--------------------+----- ------------------------------------------------- ------------------------------------------------- -------------------------------------+|测试 7|本地主机|缓存_sha2_密码|{“多因素认证”:[{“插头”:“auth_socket”, “无法访问”:0, “认证字符串”:“是”, “需要注册”:0}]}|+------+------------+--------------------+----- ------------------------------------------------- ------------------------------------------------- -------------------------------------+1个 斐乐 我 放置 (0,00塞克)
创建成功后,'test6'@'localhost'用户必须输入正确的密码,同时localhost登录用户为root,才能通过验证。
[是@mysql2观众]#mysql -utest7 --contraseña1=123456 --contraseña2-S /data/mysql/my3307/mysql.sock数据库:[警告] 使用密码在命令行界面可能不安全.输入密码:## 跳过部分代码##数据库>
很好,测试成功。也可以更改并发登录用户如下,我们先输入错误的密码,再输入正确的密码
数据库> 修正 用户 '测试7'@'本地主机' 调整 2个确定的因素骗局auth_socket作为 '测试7';
再次,作为宿主机的root用户,需要输入正确的密码123,登录失败,可以判断双因素认证机制生效。
MySQL数据库对对象的操作级别分为:全局、数据库、表、字段等。粒径从粗到细不等。如果满足一般权限,则不检查详细级别,即满足全局权限,不检查数据库、表和字段等。
4.1 权限粒度
权限相关表 | 描述 |
---|---|
用户 | 用户账号、全局权限、连接权限 |
数据库 | 数据库级别的权限 |
表_priv | 表级权限 |
priv_columns | 列级权限 |
procs_priv | 存储过程、函数级权限 |
proxies_priv | 代理用户权限 |
4.2 为没有权限的用户显示属性
数据库> 展示 内阁 用户 '但'@'本地主机'\克;*************************** 1. 斐乐 ***************************内阁 用户 A 但主持@local:内阁 用户 '但'@'本地主机'鉴定缺点 'mysql_native_password' 作为 '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' 要求没有密码过期标准帐户开锁1个 斐乐 我 放置 (0,00塞克)错误:不指定查询
4.3 全局权限
我们创造'授予'@'本地主机'
详细了解用户权限
数据库> 内阁 用户 '但'@'本地主机'确定经过 '123456';查询成功, 0 行做作的(0,00塞克)
使用显示补助金
查看用户权限可以看到刚刚创建的用户有使用
权限
数据库> 展示补贴A '但'@'本地主机'\克;*************************** 1. 斐乐 ***************************作业A 但主持@local:但 使用 在 *.* A '但'@'本地主机'1个 斐乐 我 放置 (0,00塞克)错误:不指定查询
授予用户复制客户端
是复制奴隶
查询用户权限为用户级权限
数据库> 但 复制客户, 复制奴隶在 *.* A '但'@'本地主机';查询成功, 0 行做作的(0,00塞克)数据库>冲洗特权;查询成功, 0 行做作的(0,00塞克)数据库> 展示补贴A '但'@'本地主机'\克;*************************** 1. 斐乐 ***************************作业A 但主持@local:但 复制奴隶, 复制客户在 *.* A '但'@'本地主机'1个 斐乐 我 放置 (0,00塞克)错误:不指定查询
用户权限查询,类似全局权限mysql.用户
表面
数据库> 选择 * 的数据库.用户 在哪里 用户='但'\克;*************************** 1. 斐乐 ***************************主机:本地主机用户:但Select_priv:N Insert_priv:N Update_priv:N Delete_priv:N Create_priv:N Drop_priv:N Reload_priv:N Shutdown_priv:NProcess_priv:N File_priv:NGrant_priv:N References_priv:NIndex_priv:NAlter_priv:NShow_db_privt_NLOpret_privt:NSupertEx cute_priv:N Repl_slave_priv:YRepl_client_priv: Y 创建_view_priv: NMostrar_view_priv:N Create_routine_priv:NAlter_routine_priv:NCreate_user_priv:NEvent_priv:NTrigger_priv:NCreate_tablespace_priv:Nssl_type:ssl50_quest:xsubject50_9_queissuer:xissuer:xsubjects_max:0最大更新:0最大连接数:0最大用户连接数:0插件:mysql_native_password authentication_string:*6个BB4837EB74329105EE4568DDA7DC67ED2CA2AD9password_expired:N password_last_changed:2023年-04-20 22:37:57password_lifetime:无效的account_blocked:N1个 斐乐 我 放置 (0,00塞克)错误:不指定查询
4.4 库级权限
在这里创建一个数据库来模拟和测试库级别的权限。这里我们回顾一下字符集设置。创建表时不指定charset,默认使用数据库。如果没有配置数据库,则默认使用服务器的字符集。
数据库> 展示变量作为 '特点%';+--------------------------+-------------------- ---------------------------------------------- ------+|变量名| 勇气|+--------------------------+-------------------- ---------------------------------------------- ------+|client_character_set|utf8||字符集连接|utf8||数据库字符集|utf8||字符集文件系统| 曲目 ||字符集_结果|utf8||字符集服务器|utf8||字符集系统|utf8||字符集目录| /选择/数据库/数据库-5.7.39-Linux-glibc2.12-x86_64/的/字符集/ |+--------------------------+-------------------- ---------------------------------------------- ------+8个 行 我 放置 (0,00塞克)
创建数据库,默认charset utf8
数据库> 内阁 数据库测试数据库标准 特点 放置utf8;查询成功, 1个 斐乐做作的(0,00塞克)
分配'授予'@'本地主机'
用户测试数据库
图书馆级权限
数据库> 但 选择,插入,更新,删除,内阁,修正,关闭 应该,展示 远景,扳机 在证明.* A '但'@'本地主机';查询成功, 0 行做作的(0,01塞克)数据库>冲洗特权;查询成功, 0 行做作的(0,00塞克)
询问用户权限
数据库> 展示补贴A '但'@'本地主机'\克;*************************** 1. 斐乐 ***************************作业A 但主持@local:但 复制奴隶, 复制客户在 *.* A '但'@'本地主机'*************************** 2. 斐乐 ***************************作业A 但主持@local:但 选择, 插入, 更新, 删除, 内阁, 修正, 关闭 应该, 展示 维斯塔, 扳机 在 `证明`.* A '但'@'本地主机'2个 行 我 放置 (0,00塞克)错误:不指定查询
在库级别请求权限。图书馆级权限对应的表为mysql数据库
表面
数据库> 选择 * 的数据库.数据库在哪里 用户='但'\克;*************************** 1. 斐乐 ***************************主机:localhost 数据库:tesdb用户:但选择_priv: YInsert_priv: YUpdate_priv: YDelete_priv: YCreate_priv: YDrop_priv: N Grant_priv: NReferences_priv: N Index_priv: N Alter_priv: YCreate_tmp_table_priv: N Lock_tables_priv: Y Create_view_priv: N Show_private_privine: NCreprivate_privine: NCreprivate_privine: NCreprivate_cut: priv: N Event_priv:N Trigger_priv:Y1个 斐乐 我 放置 (0,00塞克)错误:不指定查询
4.5 表级权限
我们创建一个表来学习权限
数据库> 使用测试数据库;数据库更改mysql> 内阁 木板测试 1(ID和T,姓名变量(20));查询成功, 0 行做作的(0,01塞克)数据库> 展示 应该;+------------------+|表_in_testdb|+------------------+|测试 1|+------------------+1个 斐乐 我 放置 (0,00塞克)
分配'授予'@'本地主机'
用户测试数据库.test1
表级权限
数据库> 但选择,插入,更新,删除,内阁,修正在测试数据库.测试 1A '但'@'本地主机';数据库>冲洗特权;查询成功, 0 行做作的(0,00塞克)
询问用户权限
数据库> 展示补贴A '但'@'本地主机'\克;*************************** 1. 斐乐 ***************************作业A 但主持@local:但 复制奴隶, 复制客户在 *.* A '但'@'本地主机'*************************** 2. 斐乐 ***************************作业A 但主持@local:但 选择, 插入, 更新, 删除, 内阁, 修正, 关闭 应该, 展示 维斯塔, 扳机 在 `证明`.* A '但'@'本地主机'*************************** 3. 斐乐 ***************************作业A 但主持@local:但 选择, 插入, 更新, 删除, 内阁, 修正 在 `测试数据库`.`测试 1` A '但'@'本地主机'3个 行 我 放置 (0,00塞克)错误:不指定查询
表级查询权限,对应表级别mysql.tables_priv
表面
数据库> 选择 *的数据库.表_priv在哪里tabelnavn='测试 1'\克;*************************** 1. 斐乐 ***************************主机:localhost 数据库:testdb用户:但表名:test1授予者:root主持@local潮汐圣殿:0000-00-00 00:00:00表_priv:选择,插入,更新,删除,内阁,修正私有列:1个 斐乐 我 放置 (0,00塞克)错误:不指定查询
4.6 列级权限
我们提供补贴'授予'@'本地主机'
用户测试数据库.test1
表面ID
字段查询权限,姓名
字段更新权限
数据库> 但 选择(ID),更新(姓名) 在测试数据库.测试 1A '但'@'本地主机';查询成功, 0 行做作的(0,04塞克)数据库>冲洗特权;查询成功, 0 行做作的(0,00塞克)
询问用户权限
数据库> 展示补贴A '但'@'本地主机'\克;*************************** 1. 斐乐 ***************************作业A 但主持@local:但 复制奴隶, 复制客户在 *.* A '但'@'本地主机'*************************** 2. 斐乐 ***************************作业A 但主持@local:但 选择, 插入, 更新, 删除, 内阁, 修正, 关闭 应该, 展示 维斯塔, 扳机 在 `证明`.* A '但'@'本地主机'*************************** 3. 斐乐 ***************************作业A 但主持@local:但 选择, 选择 (ID), 插入, 更新, 更新 (姓名), 删除, 内阁, 修正 在 `测试数据库`.`测试 1` A '但'@'本地主机'3个 行 我 放置 (0,00塞克)错误:不指定查询
查询列级权限
对应列的级别mysql.tables_priv
边缘的priv_columns
表,但我们问mysql.tables_priv
表表示列级权限有多个查询和更新权限但不知道是哪一列
数据库> 选择 * 的数据库.表_priv在哪里tabelnavn= '测试 1'\克;*************************** 1. 斐乐 ***************************主机:localhost 数据库:testdb用户:但表名:test1授予者:root主持@local潮汐圣殿:0000-00-00 00:00:00表_priv:选择,插入,更新,删除,内阁,修正私有列:选择,更新1个 斐乐 我 放置 (0,00塞克)错误:不指定查询
问题mysql.columns_priv
表格可以清楚的看到哪个列有哪个权限
数据库> 选择 * 的数据库.priv_columns在哪里tabelnavn= '测试 1'\克;*************************** 1. 斐乐 ***************************主机:localhost 数据库:testdb用户:但表名:test1 列名:id潮汐圣殿:0000-00-00 00:00:00私有列:选择*************************** 2. 斐乐 ***************************主机:localhost 数据库:testdb用户:但表名:test1 列名:name潮汐圣殿:0000-00-00 00:00:00私有列:更新2个 行 我 放置 (0,00塞克)错误:不指定查询
4.7 恢复权限
询问用户权限
数据库> 展示补贴A '但'@'本地主机'\克;*************************** 1. 斐乐 ***************************作业A 但主持@local:但 复制奴隶, 复制客户在 *.* A '但'@'本地主机'*************************** 2. 斐乐 ***************************作业A 但主持@local:但 选择, 插入, 更新, 删除, 内阁, 修正, 关闭 应该, 展示 维斯塔, 扳机 在 `证明`.* A '但'@'本地主机'*************************** 3. 斐乐 ***************************作业A 但主持@local:但 选择, 选择 (ID), 插入, 更新, 更新 (姓名), 删除, 内阁, 修正 在 `测试数据库`.`测试 1` A '但'@'本地主机'3个 行 我 放置 (0,00塞克)错误:不指定查询
4.7.1 取回部分权限
使用记住
重用权限
数据库> 记住 选择(ID), 更新(姓名) 在测试数据库.测试 1的 '但'@'本地主机';查询成功, 0 行做作的(0,00塞克)数据库>冲洗特权;查询成功, 0 行做作的(0,00塞克)
这里我们要知道,在MySQL的权限机制中,如果在一个数据库中多次授予权限,权限会自动合并;
数据库> 展示补贴A '但'@'本地主机'\克;*************************** 1. 斐乐 ***************************作业A 但主持@local:但 使用 在 *.* A '但'@'本地主机'*************************** 2. 斐乐 ***************************作业A 但主持@local:但 选择, 插入, 更新, 删除, 内阁, 修正, 关闭 应该, 展示 维斯塔, 扳机 在 `证明`.* A '但'@'本地主机'2个 行 我 放置 (0,00塞克)错误:不指定查询
4.7.2 恢复部分权限(MySQL 8.0新特性)
MySQL数据库对对象的操作级别分为:全局、数据库、表、字段等。粒径从粗到细不等。如果满足粗粒度权限,则不再检查细粒度级别。这种验证方法有时很不方便。例如,需要将100个数据库中除特定数据库之外的用户授予访问权限。 99个授权。从MySQL 8.0.16开始,MySQL引入了部分撤销(Partial Revocations)的特性,可以将粗粒度授予的权限撤销到细粒度。
您可以使用以下命令打开此参数
数据库> 放置坚持 partial_revocations= 在;查询成功, 0 行做作的(0,00塞克)
我们创造了一个'测试'@'本地主机'
用户
数据库> 内阁 用户 '试图'@'本地主机'确定经过 '123456';查询成功, 0 行做作的(0,01塞克)
以下命令为用户提供'测试'@'本地主机'
在除 mysql 和下表之外的所有数据库上选择权限:
数据库> 但 选择 在 *.* A '试图'@'本地主机';查询成功, 0 行做作的(0,01塞克)数据库> 记住 选择 在数据库.* 的 '试图'@'本地主机';查询成功, 0 行做作的(0,01塞克)
授权完成后,可以使用show grants命令查看:
数据库> 展示补贴A '试图'@'本地主机';+---------------------------------------------- --+|作业A试图主持@local|+---------------------------------------------- --+| 但 选择 在 *.* A `试图`@`localhost`|| 后退 选择 在 `数据库`.* 的 `试图`@`localhost` |+---------------------------------------------- --+2个 行 我 放置 (0,00塞克)
认证完成后,mysql.user表中的User_attributes会有Restrictions属性:
数据库> 选择用户属性的数据库.用户 在哪里 用户='试图';+---------------------------------------------- ------------------+|用户属性|+---------------------------------------------- ------------------+|{“限制”:[{“数据库”:“mysql”, “特权”:[“选择”]}]}|+---------------------------------------------- ------------------+1个 斐乐 我 放置 (0,00塞克)
重新获得一些权限回收函数可以重新授予一些权限,例如:
数据库> 但 选择 在 *.* A '试图'@'本地主机';查询成功, 0 行做作的(0,01塞克)数据库> 展示补贴A '试图'@'本地主机';+---------------------------------------------- --+|作业A试图主持@local|+---------------------------------------------- --+| 但 选择 在 *.* A `试图`@`localhost`|+---------------------------------------------- --+1个 行 我 放置 (0,00塞克)
也可以从粗粒度级别声明权限,因此细粒度声明显然是不必要的。
数据库> 记住 在 特权 在 *.* 的 '试图'@'本地主机';查询成功, 0 行做作的(0,00塞克)数据库> 展示补贴A '试图'@'本地主机';+---------------------------------------------- ------+|作业A试图主持@local|+---------------------------------------------- ------+| 但 使用 在 *.* A `试图`@`localhost` |+---------------------------------------------- ------+1个 斐乐 我 放置 (0,00塞克)
4.7.3 取回所有权限
数据库> 记住 在 特权 在 *.* 的 '但'@'本地主机';查询成功, 0 行做作的(0,00塞克)数据库>冲洗特权;查询成功, 0 行做作的(0,00塞克)
询问用户权限
数据库> 展示补贴A '但'@'本地主机'\克;*************************** 1. 斐乐 ***************************作业A 但主持@local:但 使用 在 *.* A '但'@'本地主机'*************************** 2. 斐乐 ***************************作业A 但主持@local:但 选择, 插入, 更新, 删除, 内阁, 修正, 关闭 应该, 展示 维斯塔, 扳机 在 `证明`.* A '但'@'本地主机'2个 行 我 放置 (0,00塞克)错误:不指定查询
根据我们的想法,这是否令人惊讶,'授予'@'本地主机'
用户应该没有任何权限,但是这里revoke说你不能做这个工作,你加钱也做不了。 . .查了很多资料: 在MySQL的权限机制中,如果对一个数据库多次授予权限,权限会自动合并;但是,如果在多个数据库上多次授予权限,则每个数据库将被视为一个单独的权限集。要撤销,撤销命令必须仅在相应的库上使用。看来Revoke也有下水摸鱼的时间了。不过8.0版本好像优化了。我们只能在库级别重用权限
数据库> 记住 选择, 插入, 更新, 删除, 内阁, 修正, 关闭 应该, 展示 远景, 扳机 在证明.* 的 '但'@'本地主机';查询成功, 0 行做作的(0,00塞克)数据库>冲洗特权;查询成功, 0 行做作的(0,00塞克)数据库> 展示补贴A '但'@'本地主机'\克;*************************** 1. 斐乐 ***************************作业A 但主持@local:但 使用 在 *.* A '但'@'本地主机'1个 斐乐 我 放置 (0,00塞克)错误:不指定查询
4.8 MySQL权限(MySQL 8.0新特性)
权限列表大致分为服务级和表级、列级、大广角存储程序权限(也是MySQL 8.0新增的)。我们看到有一个特殊的SUPER权限,可以执行多个操作。比如SET变量,在slave机器上重新输入相关主机信息,清理二进制日志。可以看到这里SUPER有点太强大了,只执行子权限就很困难了,比如用户只能设置变量,不要其他的。所以MySQL 8.0无法更早的实现,权限的细分不够清晰,很容易被不法用户钻空子。然后MySQL 8.0将权限拆分为静态权限和动态权限
4.8.1 Mysql 8.0静态权限总结
MySQL 服务器具有内置的静态权限。下表描述了 MySQL 中可用的每个静态权限。这里我把权限分为Server、Table、Column、Rosa和User、Stored Routine等。
权限 | 对应user表中的字段 | 许可证说明 | 分权 | 全局权限 | 图书馆级权限 | 表级权限 | 列级权限 | 观察 |
---|---|---|---|---|---|---|---|---|
在 | 该权限只能用于登录数据库,不能进行任何操作。 | 服务器 | 而且这个权限是不能撤销的,即使使用REVOKE也不能撤销用户权限 | |||||
全部或全部特权 | 所有权限名称 | 服务器 | × | 影响除可分配性之外的所有权限 | ||||
极好的 | 超级特权 | 使用管理员级别的命令,例如将 master 更改为、kill、thread、mysqladmin、debug、清除主记录和设置全局等。 | 服务器 | √ | × | × | × | mysql 8.0中的动态权限是SUPER权限的细分。 SUPER 权限将在未来被弃用,给非管理员用户带来严重的安全风险。 |
充满 | 私有文件 | udfør select... in output file, load data into file... 操作 | 服务器 | √ | × | × | × | 分配给非管理员用户具有严重的安全隐患 |
处理 | 私有进程 | 查看所有用户线程和连接的权限 | 服务器 | √ | × | × | × | 分配给非管理员用户具有严重的安全隐患 |
Genindlæs | 重新加载_priv | 您必须具有刷新表、记录和权限的重新加载权限 | 服务器 | √ | × | × | × | |
复制奴隶 | Repl_slave_priv | 有了这个权限,就可以看到从服务器,读取主服务器的二进制日志 | 服务器 | √ | × | × | × | |
复制客户端 | Repl_client_priv | 允许执行 show master status, show slave status, show binary logs | 服务器 | √ | × | × | × | |
关闭 | 关闭_剥夺 | 关闭mysql的权限 | 服务器 | √ | × | × | × | |
显示数据库 | vis_db_priv | 查看自己的数据库 | 服务器 | √ | × | × | × | |
事件 | 私人事件 | 指定创建、修改、执行和删除事件(event)的权限 | 服务器 | √ | √ | × | × | |
锁表 | Lock_tables_priv | 锁表权限 | 服务器 | √ | √ | × | × | |
选择 | 选择_priv | 在船上 | 应该 | √ | √ | √ | √ | 权限后必须跟一个列名列表 column-list |
插入 | 插入_priv | 插入权限 | 应该 | √ | √ | √ | √ | 列名列表的列列表必须加在权限后。 |
更新 | 更新权限 | 更改表数据 | 应该 | √ | √ | √ | √ | 列名列表的列列表必须加在权限后。 |
删除 | 删除_priv | 删除行权限 | 应该 | √ | √ | √ | × | |
内阁 | 创建_priv | 创建表的权限。 | 应该 | √ | √ | √ | × | |
降低 | 删除_priv | 删除库、表、索引、视图 | 应该 | √ | √ | √ | × | |
参考 | priv_references | 用户可以使用另一个字段作为表的外键约束 | 应该 | √ | √ | √ | × | |
指数 | 索引_priv | 您必须具有索引权限才能执行索引创建或索引删除。 | 应该 | √ | √ | √ | × | |
修正 | 改变_priv | 更改表的结构。 | 应该 | √ | √ | √ | × | |
创建视图 | 创建_view_priv | 创建视图 | 应该 | √ | √ | √ | × | |
显示视图 | 显示_view_priv | 查看视图 | 应该 | √ | √ | √ | × | |
扳机 | 触发器_priv | 允许创建、删除、执行和显示触发器的权限 | 应该 | √ | √ | √ | × | |
创建临时表 | 创建_tmp_table_priv | 创建临时表 | 应该 | √ | √ | × | × | |
创建例程 | 创建_routine_priv | 创建存储函数或存储过程的权限 | 保存的程序 | √ | √ | × | × | |
改变常规 | 改变_routine_priv | 更改或删除存储函数或存储过程 | 保存的程序 | √ | √ | × | × | |
混蛋 | 执行特权 | 以用户身份执行存储过程的权限 | 保存的程序 | √ | √ | × | × | |
创建用户 | 创建_user_priv | 用户可以创建和删除新的用户权限 | 玫瑰和用户 | √ | × | × | × | |
授予选择权 | 授予特权 | 使用授予选项,您可以将自己的权限授予其他用户 | 玫瑰和用户 | √ | × | × | × | 给出权限声明,然后是 with grant option |
创建角色 | 创建_role_priv | 创建角色 | 玫瑰和用户 | √ | × | × | × | MySQL 8.0 的新特性 |
落辊 | Drop_rolle_priv | 删除角色 | 玫瑰和用户 | √ | × | × | × | MySQL 8.0 的新特性 |
管理权限是指全局权限(如super、process、file等)不能指定特定的数据库,后面必须跟*.*
其实truncated权限是create+drop,需要注意。
4.8.2 动态权限概述
动态权限是在运行时定义的,与服务器内置的静态权限相反。下表描述了 MySQL 中可用的每个动态权限。大多数动态权限是在服务器启动时设置的。其他权限由特定服务器组件或插件定义,如权限说明中所述。在这种情况下,除非启用定义权限的组件或插件,否则权限不可用。
权限 | 许可证说明 |
---|---|
连接管理器 | 允许使用 KILL 语句或 mysqladmin kill 命令杀死属于其他帐户的线程 |
encryption_key_admin | 启用 InnoDB 加密密钥轮换 |
firewall_exempt | 使用户免受防火墙限制。此权限由 MYSQL_FIREWALL 插件定义; |
flush_optimizer_costs | 启用充值优化成本 |
下载状态 | Aktiver 状态灯更新 |
平滑表 | 启用表更新 |
flush_user_resources | 启用用户资源更新 |
group_replication_admin | 开始组复制 |
组复制流程 | 允许连接安全管理的通信栈 |
innodb_redo_log_archivo | 重新启用日志归档处理 |
innodb_redo_log_enable | 再次启用或禁用日志记录 |
没有 password_user_admin | 启用无密码用户帐户管理 |
persist_ro_variables_admin | 启用持久只读系统变量 |
复制用户 | 让这个账号作为PRIVILEGE_CHECKS_USER复制通道的账号,运行mysqlbinlog输出中的BINLOG语句 |
replicacisionslave_admin | 启用一般复制控制,它允许帐户连接到主服务器,使用 START SLAVE 和 STOP SLAVE 语句启动和停止复制,并使用 CHANGE MASTER TO 和 CHANGE REPICATION FILTER 语句。 |
admin_resource_group | 启用资源组管理,包括创建、修改和删除资源组,以及为资源组分配线程和语句。 |
资源组用户 | 允许将线程和语句分配给资源组。 |
role_admin | 使用管理选项启用分配或撤销角色 |
observer_sensitive_variables | 收益表系统变量表的权限 |
服务连接管理员 | 启用与仅允许管理连接的网络接口的连接 |
session_variables_admin | 启用设置受限会话系统变量 |
设置_user_id | 启用非自有值设置 |
show_routine | 提供对保存的例程定义的访问 |
用户系统 | 指定账户为系统账户 |
system_variables_admin | 启用修改或保留全局系统变量 |
table_encryption_admin | 启用覆盖默认加密设置 |
xa_recover_admin | 启用执行 XA 恢复 |
这些权限只能后面慢慢测试
4.8.2 许可证审批和回收技术
许可授予
但
特权 1...特权 n在
数据库名.表名用户
;
重用权限
记住
特权 1...特权 n在
dbname.tablename de用户
;
是但
相等的记住
,A
相等的的
角色是 MySQL 8.0 中引入的新功能。在 MySQL 中,角色是可以添加到角色或从角色中删除的权限的集合。可以为用户分配角色,同时为用户分配角色中包含的权限。对角色的操作需要更高的权限。就像用户帐户一样,角色可以授予和撤销权限。引入角色的目的是为了方便管理具有相同权限的用户。正确的权限设置可以保证数据的安全,这一点非常重要。
5.1 创建角色并授予权限
我们用创建角色
创建角色
数据库> 内阁罗洛'dba_role','写论文','学习角色';查询成功, 0 行做作的(0,02塞克)
许可授予
数据库> 但 在 在 *.* A 'dba_role';查询成功, 0 行做作的(0,01塞克)数据库> 但 选择在 *.* A '学习角色';查询成功, 0 行做作的(0,01塞克)数据库> 但 更新,删除,插入在 *.* A '写论文';查询成功, 0 行做作的(0,01塞克)
将角色分配给相应的用户
数据库> 内阁 用户dba1 确定经过 '123456';查询成功, 0 行做作的(0,01塞克)数据库> 但 'dba_role' A 'dba1'@'%';查询成功, 0 行做作的(0,01塞克)
GRANT授权角色和授权用户的语法不同:有一个ON来区分角色和用户的授权,ON是用来授权用户的,但是没有ON来授予角色。由于语法不同,您不能在同一语句中混合权限分配和用户角色。 (可以授予用户权限和角色,但必须使用单独的GRANT语句,且每条语句的语法必须与授权内容相匹配)
5.2 检查角色权限
要检查分配给用户的权限,请使用显示赠款
,例如:
数据库> 展示补贴A 'dba1'@'%';+----------------------------------+|作业A [电子邮件保护]%|+----------------------------------+| 但 使用 在 *.* A `dba1`@`%` || 但 `dba_role`@`%` A `dba1`@`%` |+----------------------------------+2个 行 我 放置 (0,00塞克)
但是,它显示每个分配的角色,而不是角色所代表的权限。要查看功能权限,请添加一个使用
展示:
数据库> 展示补贴A 'dba1'@'%'使用 'dba_role'\克;*************************** 1. 斐乐 ***************************作业A [电子邮件保护]%:但 选择, 插入, 更新, 删除, 内阁, 降低,涉及, 关闭,处理, 文件, 参考, 指数, 修正, 展示 数据库,极好的, 内阁 暂时的 应该, 关闭 应该, 执行, 复制奴隶, 复制客户, 内阁 维斯塔, 展示 维斯塔, 内阁 常规, 修正 常规, 内阁 用户,事件, 扳机, 内阁 表区, 内阁罗洛, 降低罗洛在 *.* A `dba1`@`%`*************************** 2. 斐乐 ***************************作业A [电子邮件保护]%:但APP_ADMIN_PASSWORD,AUDIT_ABORT_EXEMPT,AUDIT_ADMIN,AUTHENTICATION_POLICY_ADMIN,备份管理员,BINLOG_ADMIN,BINLOG_ENCRYPTION_ADMIN,克隆管理员,管理连接,ENCRYPTION_KEY_ADMIN,防火墙执行,FLUSH_OPTIMIZER_COSTOS,FLUSH_STATE,FLUSH_TABLER,FLUSH_USER_RESOURCES,GROUP_REPLICATION_ADMIN,GROUP_REPLICATION_STREAM,INNODB_REDO_LOG_ARCHIVE,INNODB_REDO_LOG_ENABLE,ADMIN_USER_PASSWORD,PERSIST_RO_VARIABLES_ADMIN,复制应用程序,REPLICATION_SLAVE_ADMIN,RESOURCE_GROUP_ADMIN,RESOURCE_GROUP_USUARIO,角色管理员,OBSERVER_SENSITIVE_VARIABLES,ADMIN_CONNECTION_SERVICE,ADMIN_VARIABLES_SESSION,SET_USER_ID,表演例程,USER_SYSTEM,SISTEMA_VARIABLES_ADMIN,TABLE_ENCRYPTION_ADMIN,XA_RECOVER_ADMIN在 *.* A `dba1`@`%`*************************** 3. 斐乐 ***************************作业A [电子邮件保护]%:但 `dba_role`@`%` A `dba1`@`%`3个 行 我 放置 (0,00塞克)
5.3 撤销角色或角色权限
回调可以用于角色来改变角色的权限。这不仅会影响角色本身的权限,还会影响授予该角色的所有用户权限。
提供以便所有用户都是只读的,使用记住
的dba_ro dem
删除角色更改权限:
数据库> 记住独立的, 更新, 删除 在 *.* 的 'dba_role';查询成功, 0 行做作的, 1个警告(0,02塞克)
正如可以将角色分配给用户一样,也可以从帐户中撤销角色:
数据库> 记住dba_role的dba1@'%';查询成功, 0 行做作的(0,00塞克)数据库> 展示补贴A 'dba1'@'%';+----------------------------------+|作业A [电子邮件保护]%|+----------------------------------+| 但 使用 在 *.* A `dba1`@`%` |+----------------------------------+1个 斐乐 我 放置 (0,00塞克)
5.4 删除角色
要删除角色,请使用 drop-role:
数据库> 降低rol dba_role;查询成功, 0 行做作的(0,01塞克)
删除角色会从已批准它的所有帐户中撤销它
资源约束可以基于以下四个方面进行限制
- 帐户每小时可以发送的请求数
- 一个账户每小时可以发送的更新数量
- 帐户每小时可以连接到服务器的次数
- 与帐户服务器的并发连接数。
6.1 指定用户创建配额
数据库> 内阁 用户 '测试4'@'本地主机'确定经过 '123456' 缺点MAX_QUERIES_PER_HOUR2个MAX_UPDATES_PER_HOUR10MAX_CONNECTIONS_PER_HOUR5个MAX_USER_CONNECTIONS 个2个;查询成功, 0 行做作的(0,03塞克)
6.2 更改配额
数据库> 修正 用户 '测试4'@'本地主机' 骗局MAX_QUERIES_PER_HOUR100;查询成功, 0 行做作的(0,01塞克)
公告:本站所有文章,除特别注明或核对外,均为本站原创。未经本站同意,禁止任何个人和组织在任何网站、图书及其他媒体平台上复制、盗用、编译、发布本站内容。如果本站内容侵犯了原作者的合法权益,请联系我们进行申诉。