MySQL数据库 安全管理


Posted in MySQL onMay 06, 2022

权限表

MySQL 服务器通过权限表来控制用户对数据库的访问,由 mysql_install_db 脚本初始化,MySQL 会根据这些权限表的内容为每个用户赋予相应的权限

1. user 表

user 表是 MySQL 最重要的一个权限表,有 49 个字段,这些字段可以分成四类:

  • 范围列:包括 Host、User,分别表示主机名、用户名,Host 指明允许访问的 IP 或主机范围,User 指明允许访问的用户名
  • 权限列:权限列字段描述用户在全局范围内允许进行的操作,该列的字段值类型为 ENUM,只能取 Y 和 N
  • 安全列:安全列有 12 个字段,其中两个和 ssl 相关、两个和 x509 相关、其他八个是授权插件和密码相关
  • 资源控制列:用于限制用户使用的资源,一个小时内用户查询或连接数量超过资源控制限制将被锁定,知道下一个小时才可以再次执行

2. db 表

db 表存储用户对某个数据库的操作权限,决定用户能从哪个主机存取哪个数据库,大致可以分为两类字段:

  • 用户列:用户列有三个字段,分别是 Host、Db 和 User,分别表示主机名、数据库名和用户名
  • 权限列:决定用户是否具有创建和修改存储过程的权限

3. tables_priv 表

tables_priv 表用来对表设置操作权限,有八个字段:

  • Host、Db、User 和 Table_name 四个字段分别表示主机名、数据库名、用户名和表名
  • Grantor 表示修改记录的用户
  • Timestamp 表示修改该记录的时间
  • Table_priv 表示对象操作权限。包括 Select、Insert、Delete 等
  • Column_priv 表示对表中的列的操作权限,包括 Select、Insert、Update 和 References

4. columns_priv 表

columns_priv 表用来对表的某一列设置权限,字段 Column_name 用来指定对哪些数据列具有操作权限

账户管理

1. 新建普通用户

在 MySQL8 以前可以使用 GRANT 语句新建用户,MySQL8 以后需要先创建用户才能执行 GRANT 语句

CREATE USER user[IDENTIFIED BY 'password'][,user[IDENTIFIED BY 'password']]...

user 参数表示新建用户的账户,由用户(User)和主机名(Host)构成,形式如 Justin@localhost,IDENTIFIED BY 关键字用来设置用户的密码,password 参数表示用户密码,可以同时创建多个用户,新用户可以没有初始密码

2. 删除普通用户

DROP USER user[,user]...

user 参数表示新建用户的账户,由用户(User)和主机名(Host)构成,可以同时删除多个用户

也可以使用 DELETE 语句直接将用户信息从 mysql.user 表删除,前提是拥有对 mysql.user 表的删除权限

DELETE FROM mysql.user WHERE Host='hostname' AND User='username';

3. Root 用户修改自己的密码

root 用户可以使用 ALTER 命令修改密码

ALTER USER USER() IDENTIFIED BY 'new_password'

也可以使用 SET 语句修改密码

SET PASSWORD='new_password'

4. Root 用户修改普通用户的密码

root 用户可以使用 ALTER 命令修改普通用户的密码

ALTER USER user [IDENTIFIED BY 'new_password'][,user [IDENTIFIED BY 'new_password']]...

也可以使用 SET 语句修改普通用户的密码

SET PASSWORD FOR 'username'@'hostname'='new_password'

普通用户也可对自己的密码进行管理,方式与 Root 用户相同

密码管理

1. 密码过期策略

数据库管理员可以手动设置账号密码过期,也可以建立一个自动密码过期策略。过期策略可以是全局的,也可以为每个账号设置单独的过期策略

手动设置账号密码过期:

ALTER USER user PASSWORD EXPIRE

密码过期策略基于最后修改密码的时间自动将密码设置为过期,MySQL 使用 default_password_lifetime 系统变量建立全局密码过期策略,默认值为 0 表示不使用自动过期策略。它允许的值是正整数 N,表示密码必须每隔 N 天进行修改。该值可在服务器的配置文件设置,也可以使用 SQL 语句设置,使用 SQL 语句方式如下:

SET PERSIST default_password_lifetime=180

每个账号既可沿用全局密码过期策略,也可单独设置策略

# 设置账号密码90天过期
CREATE USER 'Justin@localhost' PASSWORD EXPIRE INTERVAL 90 DAY;
ALTER USER 'Justin@localhost' PASSWORD EXPIRE INTERVAL 90 DAY;
# 设置账号密码永不过期
CREATE USER 'Justin@localhost' PASSWORD EXPIRE NEVER;
ALTER USER 'Justin@localhost' PASSWORD EXPIRE NEVER;
# 沿用全局密码过期策略
CREATE USER 'Justin@localhost' PASSWORD EXPIRE DEFAULT;

2. 密码重用策略

MySQL 限制使用已用过的密码,重用限制策略基于密码更改时间和使用时间,可以是全局的,也可以为每个账号设置单独的策略

MySQL 基于以下规则来限制密码重用:

  1. 如果账户密码限制基于密码更改的数量,那么新密码不能从最近限制的密码数量中选择,例如,如果密码更改的最小值为3,那么新密码不能与最近3个密码中任何一个相同
  2. 如果账户密码限制基于时间,那么新密码不能从规定时间内选择,例如,如果重用周期为60天,那么新密码不能从最近60天内使用的密码中选择

可以在配置文件设置密码重用策略,也可以使用 SQL 语句

# 密码重用数量
SET PERSIST password_history=6;
# 密码重用周期
SET PERSIST password_reuse_interval=365;

每个账号既可沿用全局密码重用策略,也可单独设置策略

# 不能使用最近5个密码
CREATE USER 'Justin@localhost' PASSWORD PASSWORD HISTORY 5;
ALTER USER 'Justin@localhost' PASSWORD PASSWORD HISTORY 5;
# 不能使用最近365天内的密码
CREATE USER 'Justin@localhost' PASSWORD REUSE INTERVAL 365 DAY;
ALTER USER 'Justin@localhost' PASSWORD REUSE INTERVAL 365 DAY;

角色

在 MySQL 中,角色是权限的集合,可以为角色添加或移除权限。用户可以被赋予角色,同时也被赋予角色包含的权限

1. 创建角色并授权

创建角色语句如下:

CREATE ROLE 'role_name'[@'host_name'][,'role_name'[@'host_name']]...

为角色授权语句如下:

GRANT privileges ON table_name TO 'role_name'[@'host_name'];

privileges 代表权限的名称,多个权限以逗号1隔开,可以使用 SHOW 语句查询权限名称

SHOW PRIVILEGES\G;

2. 给用户添加角色

GTANT role[,role2,...] TO user[,user2,...];

role 代表角色,user 代表用户,添加之后如果角色处于未激活状态,需要先将用户对应的角色激活

SET ROLE DEFAULT

3. 编辑角色或权限

撤销用户角色的 SQL 语句如下:

REVOKE role FROM user;

撤销角色权限的 SQL 语句如下:

REVOKE privileges ON tablename FROM 'rolename';

4. 删除角色

DROP ROLE role[,role2]...

总结

到此这篇关于MySQL数据库安全管理的文章就介绍到这了!

MySQL 相关文章推荐
MySQL分库分表与分区的入门指南
Apr 22 MySQL
MySQL 8.0 之不可见列的基本操作
May 20 MySQL
Unity连接MySQL并读取表格数据的实现代码
Jun 20 MySQL
为什么MySQL分页用limit会越来越慢
Jul 25 MySQL
MySQL分区表实现按月份归类
Nov 01 MySQL
MySQL图形化管理工具Navicat安装步骤
Dec 04 MySQL
面试中老生常谈的MySQL问答集锦夯实基础
Mar 13 MySQL
简单聊一聊SQL注入及防止SQL注入
Mar 23 MySQL
Mysql分析设计表主键为何不用uuid
Mar 31 MySQL
详细聊一聊mysql的树形结构存储以及查询
Apr 05 MySQL
MySQL sql模式设置引起的问题
May 15 MySQL
MySQL详细讲解变量variables的用法
Jun 21 MySQL
Mysql 文件配置解析介绍
May 06 #MySQL
MySQL数据库中的锁、解锁以及删除事务
May 06 #MySQL
mysql性能优化以及配置连接参数设置
May 06 #MySQL
Mysql InnoDB 的内存逻辑架构
详细介绍MySQL中limit和offset的用法
May 06 #MySQL
MySQL数据库Innodb 引擎实现mvcc锁
May 06 #MySQL
讲解MySQL增删改操作
May 06 #MySQL
You might like
php实现字符串翻转的方法
2015/03/27 PHP
js仿百度有啊通栏展示效果实现代码
2013/05/28 Javascript
在服务端(Page.Write)调用自定义的JS方法详解
2013/08/09 Javascript
JS实现判断滚动条滚到页面底部并执行事件的方法
2014/12/18 Javascript
JavaScript实现文字跟随鼠标特效
2015/08/06 Javascript
轻松掌握JavaScript享元模式
2016/08/27 Javascript
MUI实现上拉加载和下拉刷新效果
2017/06/30 Javascript
bootstrap精简教程_动力节点Java学院整理
2017/07/14 Javascript
javascript按钮禁用和启用的效果实例代码
2017/10/29 Javascript
详解webpack require.ensure与require AMD的区别
2017/12/13 Javascript
vue组件表单数据回显验证及提交的实例代码
2018/08/30 Javascript
发布一款npm包帮助理解npm的使用
2019/01/03 Javascript
vue获取form表单的值示例
2019/10/29 Javascript
如何基于viewport vm适配移动端页面
2020/11/13 Javascript
[03:01]DOTA2英雄基础教程 露娜
2014/01/07 DOTA
Python脚本实现集群检测和管理功能
2015/03/06 Python
Python随机生成一个6位的验证码代码分享
2015/03/24 Python
操作Windows注册表的简单的Python程序制作教程
2015/04/07 Python
Python3读取zip文件信息的方法
2015/05/22 Python
Python3遍历目录树实现方法
2015/05/22 Python
Python cookbook(数据结构与算法)从序列中移除重复项且保持元素间顺序不变的方法
2018/03/13 Python
django 解决manage.py migrate无效的问题
2018/05/27 Python
Flask框架通过Flask_login实现用户登录功能示例
2018/07/17 Python
python批量修改图片后缀的方法(png到jpg)
2018/10/25 Python
使用pycharm设置控制台不换行的操作方法
2019/01/19 Python
numpy矩阵数值太多不能全部显示的解决
2020/05/14 Python
THE OUTNET英国官网:国际设计师品牌折扣网站
2016/08/14 全球购物
科沃斯机器人官网商城:Ecovacs
2016/08/29 全球购物
瑞士领先的网上超市:LeShop.ch
2018/11/14 全球购物
2014年会计工作总结
2014/11/27 职场文书
升职自荐信怎么写
2015/03/05 职场文书
财务总监岗位职责范本
2015/04/03 职场文书
社会心理学学习心得体会
2016/01/22 职场文书
MySQL数据迁移相关总结
2021/04/29 MySQL
react使用antd的上传组件实现文件表单一起提交功能(完整代码)
2021/06/29 Javascript
MySQL数据库优化之通过索引解决SQL性能问题
2022/04/10 MySQL