MySQL如何绕过授予information_schema中对象时报ERROR 1044(4200)错误
2020-10-16 14:13 潇湘隐者 阅读(1119) 评论(0) 编辑 收藏 举报这个问题是微信群中网友关于MySQL权限的讨论,有这么一个业务需求(下面是他的原话):
因为MySQL的很多功能都依赖主键,我想用zabbix用户,来监控业务数据库的所有表,是否都建立了主键。
监控的语句是:
SELECT COUNT(*)
FROM information_schema.tables t1
LEFT OUTER JOIN information_schema.table_constraints t2
ON t1.table_schema = t2.table_schema
AND t1.table_name = t2.table_name
AND t2.constraint_name IN ( 'PRIMARY' )
WHERE t2.table_name IS NULL
AND t1.table_schema NOT IN ( 'information_schema', 'myawr', 'mysql',
'performance_schema',
'slowlog', 'sys', 'test' )
AND t1.table_type = 'BASE TABLE'
但是我不希望zabbix用户,能读取业务库的数据。一旦不给zabbix用户读取业务库数据的权限,那么information_schema.TABLES 和 information_schema.TABLE_CONSTRAINTS 就不包含业务库的表信息了,也就统计不出来业务库的表是否有建主键。有没有什么办法,即让zabbix不能读取业务库数据,又能监控是否业务库的表没有建立主键?
首先,我们要知道一个事实:information_schema下的视图没法授权给某个用户。如下所示
mysql> GRANT SELECT ON information_schema.TABLES TO test@'%';
ERROR 1044 (42000): Access denied for user 'root'@'localhost' to database 'information_schema'
关于这个问题,可以参考mos上这篇文章:Why Setting Privileges on INFORMATION_SCHEMA does not Work (文档 ID 1941558.1)
MySQL Server - Version 5.6 and later
Information in this document applies to any platform.
GOAL
To determine how MySQL privileges work for INFORMATION_SCHEMA.
A simple GRANT statement would be something like:
mysql> grant select,execute on information_schema.* to 'dbadm'@'localhost';
ERROR 1044 (42000): Access denied for user 'root'@'localhost' to database 'information_schema'
The error indicates that the super user does not have the privileges to change the information_schema access privileges.
Which seems to go against what is normally the case for the root account which has SUPER privileges.
The reason for this error is that the information_schema database is actually a virtual database that is built when the service is started.
It is made up of tables and views designed to keep track of the server meta-data, that is, details of all the tables, procedures etc. in the database server.
So looking specifically at the above command, there is an attempt to add SELECT and EXECUTE privileges to this specialised database.
The SELECT option is not required however, because all users have the ability to read the tables in the information_schema database, so this is redundant.
The EXECUTE option does not make sense, because you are not allowed to create procedures in this special database.
There is also no capability to modify the tables in terms of INSERT, UPDATE, DELETE etc., so privileges are hard coded instead of managed per user.
那么怎么解决这个授权问题呢? 直接授权不行,那么我们只能绕过这个问题,间接实现授权。思路如下:首先创建一个存储过程(用户数据库),此存储过程找出没有主键的表的数量,然后将其授予test用户。
DELIMITER //
CREATE DEFINER=`root`@`localhost` PROCEDURE `moitor_without_primarykey`()
BEGIN
SELECT COUNT(*)
FROM information_schema.tables t1
LEFT OUTER JOIN information_schema.table_constraints t2
ON t1.table_schema = t2.table_schema
AND t1.table_name = t2.table_name
AND t2.constraint_name IN ( 'PRIMARY' )
WHERE t2.table_name IS NULL
AND t1.table_schema NOT IN ( 'information_schema', 'myawr', 'mysql',
'performance_schema',
'slowlog', 'sys', 'test' )
AND t1.table_type = 'BASE TABLE';
END //
DELIMITER ;
mysql> GRANT EXECUTE ON PROCEDURE moitor_without_primarykey TO 'test'@'%';
Query OK, 0 rows affected (0.02 sec)
此时test就能间接的去查询information_schema下的对象了。
mysql> select current_user();
+----------------+
| current_user() |
+----------------+
| test@% |
+----------------+
1 row in set (0.00 sec)
mysql> call moitor_without_primarykey;
+----------+
| COUNT(*) |
+----------+
| 6 |
+----------+
1 row in set (0.02 sec)
Query OK, 0 rows affected (0.02 sec)
查看test用户的权限。
mysql> show grants for test@'%';
+-------------------------------------------------------------------------------+
| Grants for test@% |
+-------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `test`@`%` |
| GRANT EXECUTE ON PROCEDURE `zabbix`.`moitor_without_primarykey` TO `test`@`%` |
+-------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
2017-10-16 The Windows account sa does not exist and cannot be provisioned as a SQL Server system administrator
2015-10-16 ADDM Reports bug:Significant virtual memory paging was detected on the host operating system
2014-10-16 ORA-01113: file xxxx needs media recovery