Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >技术分享 | MySQL 授权表运维注意事项

技术分享 | MySQL 授权表运维注意事项

作者头像
爱可生开源社区
发布于 2024-03-25 10:40:33
发布于 2024-03-25 10:40:33
14500
代码可运行
举报
运行总次数:0
代码可运行

作者:余振兴,爱可生 DBA 团队成员,热衷技术分享、编写技术文档。

爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。

本文共 1100 字,预计阅读需要 3 分钟。

1基础背景

我们在做权限授权时需要给到应用用户增删改查权限,比如下面的授权语句。这样的好处是当实例创建多个业务库时,无需再次给新的业务库授权,该权限默认对所有库有增删改查权限,主打一个方便,但实际这种授权方式会带来较大的权限风险,甚至导致数据库被攻击破坏。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
create user 'app'@'%' identified by 'app';
grant select,update,delete,insert on *.* to 'app'@'%';

2演示验证

我们基于以上的授权来做一个业务用户 提权(自己给自己增加额外的权限)操作,下面是操作的时序表格(建议 PC 端查看)。

场景1

管理用户触发 flush privileges 刷新内存授权表触发提权。

操作/用户

root 用户

app 用户

登录

mysql -S /data/mysql/3306/data/mysqld.sock

mysql -h127.0.0.1 -uapp -papp -P3306

app 用户给自己提权。这里 update 成功了,但由于缺少 reload 或 super 权限,导致刷新到内存中失败了。

mysql> update mysql.user set Select_priv='Y',Insert_priv='Y',Update_priv='Y',Delete_priv='Y',Create_priv='Y',Drop_priv='Y',Reload_priv='Y',Shutdown_priv='Y',Process_priv='Y',File_priv='Y',Grant_priv='Y',References_priv='Y',Index_priv='Y',Alter_priv='Y',Show_db_priv='Y',Super_priv='Y',Lock_tables_priv='Y' where user='app' and host='%';Query OK, 1 row affected (0.01 sec)Rows matched: 1 Changed: 1 Warnings: 0mysql> flush privileges;ERROR 1227 (42000): Access denied; you need (at least one of) the RELOAD privilege(s) for this operation

某天 root 用户做了个 flush privileges 操作

mysql> flush privileges; Query OK, 0 rows affected (0.00 sec)

app 用户重新登录数据库查看自己的权限,提权成功。

mysql> show grants\G*************************** 1. row ***************************Grants for app@%: GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, LOCK TABLES ON . TO app@% WITH GRANT OPTION1 row in set (0.00 sec)

场景2

重启数据库重新加载授权表到内存触发提权。

操作/用户

root 用户

app 用户

登录

mysql -S /data/mysql/3306/data/mysqld.sock

mysql -h127.0.0.1 -uapp -papp -P3306

app 用户给自己提权,这里 update 成功了,但由于缺少 reload 或 super 权限,导致刷新到内存中失败了。

mysql> update mysql.user set Select_priv='Y',Insert_priv='Y',Update_priv='Y',Delete_priv='Y',Create_priv='Y',Drop_priv='Y',Reload_priv='Y',Shutdown_priv='Y',Process_priv='Y',File_priv='Y',Grant_priv='Y',References_priv='Y',Index_priv='Y',Alter_priv='Y',Show_db_priv='Y',Super_priv='Y',Lock_tables_priv='Y' where user='app' and host='%';Query OK, 1 row affected (0.01 sec)Rows matched: 1 Changed: 1 Warnings: 0mysql> flush privileges;ERROR 1227 (42000): Access denied; you need (at least one of) the RELOAD privilege(s) for this operation

重启数据库

mysql> restart;Query OK, 0 rows affected (0.00 sec)

app 用户重新登录数据库查看自己的权限,提权成功。

mysql> show grants\G*************************** 1. row ***************************Grants for app@%: GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, LOCK TABLES ON . TO app@% WITH GRANT OPTION1 row in set (0.00 sec)

3场景总结

  • 给普通用户授予 MySQL 鉴权相关表的权限均会带来风险
    • 备注:鉴权表除了 user 表,还包括 dbcolumns_privtables_privprocs_privproxies_priv 表。
  • 即使只对鉴权表授予只读权限,如 user 表,也会被获取到 authentication_string 字段的密文串,通过其他方式做密码库匹配破解。
    • 曾经遇到过一个场景,普通用户仅有 user 的查询权限,其通过查询该表信息发现 root@localhost 用户密码为空,于是直接用 root 用户访问数据库,类似于进行了提权操作。

4规避方式

  • 不要对非管理员用户授予任何鉴权表的访问权限,即使是只读权限。
  • 授权遵循最小权限原则。
  • MySQL 8.0 增加了回收部分权限的参数 partial_revokes,可单独将 mysql 库的权限回收。示例如下:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 创建app用户并授予所有数据库增删改查权限
create user 'app'@'%' identified by 'app';
grant select,update,delete,insert on *.* to 'app'@'%';

-- 开启部分权限回收的参数
set global partial_revokes=on;

-- 单独回收app用户对mysql库的权限
revoke select,update,delete,insert on mysql.* from 'app'@'%';

-- 查看当前app用户的授权信息
-- 这里的权限是以交集的形式存在,必须两者都满足
show grants for app;
+-------------------------------------------------------------------+
| Grants for app@%                                                  |
+-------------------------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO `app`@`%`          |
| REVOKE SELECT, INSERT, UPDATE, DELETE ON `mysql`.* FROM `app`@`%` |
+-------------------------------------------------------------------+

-- 以app用户登录数据库访问mysql.user表,报错无权限
mysql> select user,host from mysql.user;
ERROR 1142 (42000): SELECT command denied to user 'app'@'127.0.0.1' for table 'user'

本文关键字:#MySQL# #权限# #安全#

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-03-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 爱可生开源社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MySQL 用户与权限管理
MySQL5.7官网介绍:https://dev.mysql.com/doc/refman/5.7/en/grant.html
Power
2025/03/01
2330
2024Mysql And Redis基础与进阶操作系列(3)作者——LJS[含MySQL用户,权限,角色管理;举例说明详解步骤及常见报错问题对应的解决方法]
不建议通过 DELETE FROM USER u WHERE USER='li4' 进行删除,系统会有残留信息保
盛透侧视攻城狮
2024/10/22
1690
2024Mysql And Redis基础与进阶操作系列(3)作者——LJS[含MySQL用户,权限,角色管理;举例说明详解步骤及常见报错问题对应的解决方法]
MySQL的用户管理
#前言:我们知道,无论是登陆MySQL数据库还是登陆Linux系统,都需要有用户来登陆。默认情况下,root用户是享有最高权限的超级用户,可以使用包括create,drop,insert等操作,但是我们也需要一些普通用户来进行管理,接下来就让我们对号入座,来进行如何创建用户,授权用户,和删除用户等操作
老油条IT记
2020/03/20
2.4K0
mysql安全权限的讲解
MySQL 默认有个root用户,但是这个用户权限太大,一般只在管理数据库时候才用。如果在项目中要连接 MySQL 数据库,则建议新建一个权限较小的用户来连接。
张哥编程
2024/12/19
1080
DCL数据库控制语言的详细用法
我们现在默认使用的都是root用户,超级管理员,拥有全部的权限。但是,一个公司里面的数据库服务器上面可能同时运行着很多个项目的数据库。所以,我们应该可以根据不同的项目建立不同的用户,分配不同的权限来管理和维护数据库。
绿水长流z
2024/06/18
2820
DCL数据库控制语言的详细用法
MySQL用户账户管理与权限管理详解
MySQL 的权限表在数据库启动的时候就载入内存,当用户通过身份认证后,就在内存中进行相应权限的存取,这样,此用户就可以在数据库中做权限范围内的各种操作了。
星哥玩云
2022/08/17
5.4K0
MySQL read_only与super_read_only参数解读
MySQL read_only参数可以让整个MySQL实例普通权限用户处于只读状态,但是其并不能限制拥有super权限的用户。read_only参数一般是用于主从复制从库的配置,目的是为了规避从库误写数据,导致主从复制异常或者主从数据不一致的隐患。另外,为了避免从库被super权限用户误写数据,MySQL官方在MySQL5.7版本引入了super_read_only参数来限制super用户在从库的只读属性。
Power
2025/02/28
1380
Server 层混杂信息字典表 | 全方位认识 information_schema(下)
该表提供查询关于表级别权限信息,该表中的内容来自mysql.tables_priv
老叶茶馆
2020/11/26
3230
MySQL 用户与权限管理
    MySQL权限系统的主要功能是证实连接到一台给定主机的用户,并且赋予该用户在数据库上的相关DML,DQL权限。MySQL存取控制包含2个阶段,一是服务器检查是否允许你连接;二是假定你能连接,服务器检查你发出的每个请求。看你是否有足够的权限实施它。本文主要描述MySQL权限系统相关的用户创建、授权、撤销权限等等。
Leshami
2018/08/13
9K0
第十一章《mysql用户与权限》
mysql关于用户的信息保存在mysql.user表当中,关于用户的权限主要是存储在mysql库中(user、db、host、tables_priv、columns_priv)这5个表中。
Java架构师必看
2021/06/02
8080
第十一章《mysql用户与权限》
技术分享 | MySQL 权限变更,何时生效?
Uproxy 是爱可生研发的云树® DMP[1] 产品的一个高效的读写中间件,维护了自身到后端 MySQL 数据库之间的连接池,用以保持到数据库后端的 长连接。
爱可生开源社区
2023/09/27
4440
技术分享 | MySQL 权限变更,何时生效?
MySQL用户管理
说明:用户的信息保存在mysql数据库中的user表中,验证用户是否创建成功如下:
星哥玩云
2022/08/18
2K0
mysql操作命令梳理(4)-grant授权和revoke回收权限
在mysql维护工作中,做好权限管理是一个很重要的环节。下面对mysql权限操作进行梳理: mysql的权限命令是grant,权限撤销的命令时revoke; grant授权格式:grant 权限列表 on 库.表 to 用户名@'ip' identified by "密码"; revoke回收权限格式:revoke 权限列表 on 库.表 from 用户名@'ip'; 下面通过一些例子说明: 1.grant授权 1)grant 普通数据用户,查询、插入、更新、删除 数据库中所有表数据的权利。 mysql>
洗尽了浮华
2018/01/22
2.8K0
MySQL 之用户和权限管理
在MySQL 5.7.24中,关于用户及用户权限的相关信息,都保存在了mysql库中的user表中,可以将user表中大致分为用户列、权限列、安全列、资源控制列这几种。
小手冰凉
2020/05/21
2K0
带您深入了解MySQL的权限管理 转
MySQL 的权限表在数据库启动的时候就载入内存,当用户通过身份认证后,就在内存中进行相应权限的存取,这样,此用户就可以在数据库中做权限范围内的各种操作了。
双面人
2019/04/10
6300
03 . MysSQL权限和备份
恢复时间点之前首先将全量备份恢复之后,在此基础上回放增加的binlog直至指定的时间点
iginkgo18
2020/09/27
7930
MySQL权限管理 原
·  管理权限(如 super, process, file等)不能够指定某个数据库,on后面必须跟 *.*
拓荒者
2019/03/11
2.1K0
MySQL数据库(十):用户授权与撤销授权
前言: 1.mysql数据库服务在不授权的情况下,只允许数据库管理员从数据库服务器本机登陆. 2.系统管理员才有修改数据库管理员密码的权限. 一、用户授权(grant) 默认只有数据库管理员从数据库服务器本机登陆才有授权权限 1.授权命令格式: 1.1从客户端登陆的时候不需要密码 grant 权限列表  on 数据库名 to 用户名@"客户端地址"; 1.2 授权用户可以从网络中的任意地址登陆到mysql server服务器 grant 权限列表 on 数据库名 to 用户名; 1.3 设置
行 者
2018/03/26
4.2K0
MySQL数据库(十):用户授权与撤销授权
MYSQL 8 部分回收用户的权限,怎么操作
MySQL 8 的8.10已经推出有一段时间了,但是一部分项目和管理者还是停留在MySQL 5.7 ,那么哪项知识在 MySQL 8 和 MySQL 5.7 有了差别,这就是今天我们要说的部分revoke.
AustinDatabases
2023/09/18
4840
MYSQL 8  部分回收用户的权限,怎么操作
MySQL用户和权限管理(二)
在前面的文章中MySQL用户和权限管理(一)介绍了MYSQL用户和权限体系以及访问控制的两个阶段;
SEian.G
2021/03/03
3K0
相关推荐
MySQL 用户与权限管理
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验