关于MySQL绕过授予information_schema中对象时报ERROR 1044(4200)错误

 更新时间:2020年10月16日 14:46:10   作者:潇湘隐者  
这篇文章主要介绍了关于MySQL绕过授予information_schema中对象时报ERROR 1044(4200)错误,本文给大家分享解决方法,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

这个问题是微信群中网友关于MySQL权限的讨论,有这么一个业务需求(下面是他的原话):

因为MySQL的很多功能都依赖主键,我想用zabbix用户,来监控业务数据库的所有表,是否都建立了主键。

监控的语句是:

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)

APPLIES TO:

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.

SOLUTION

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)

到此这篇关于关于MySQL绕过授予information_schema中对象时报ERROR 1044(4200)错误的文章就介绍到这了,更多相关mysql ERROR 1044(4200)内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解决Navicat Premium 连接 MySQL 8.0 报错

    解决Navicat Premium 连接 MySQL 8.0 报错"1251"的问题分析

    这篇文章主要介绍了解决Navicat Premium 连接 MySQL 8.0 报错"1251"的问题分析,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • Mysql中mysql.user用户表详解

    Mysql中mysql.user用户表详解

    在本篇文章里小编给大家分享了关于Mysql中mysql.user用户表的相关知识点内容,有需要的朋友们可以参考下。
    2019-09-09
  • MySQL密码策略管理插件validate_password用法详解

    MySQL密码策略管理插件validate_password用法详解

    自MySQL5.6起,引入validate_password插件,用于密码长度和强度管理,在MySQL8.0中,该插件通过服务器组件重新实现,插件默认不允许密码为用户名,可设定最小长度和强度等级,还可要求密码包含数字、大小写字母和特殊字符
    2024-11-11
  • (MariaDB)MySQL数据类型和存储机制全面讲解

    (MariaDB)MySQL数据类型和存储机制全面讲解

    下面小编就为大家分享一篇(MariaDB)MySQL数据类型和存储机制全面讲解,具有很的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • MySQL中SELECT+UPDATE处理并发更新问题解决方案分享

    MySQL中SELECT+UPDATE处理并发更新问题解决方案分享

    这篇文章主要介绍了MySQL中SELECT+UPDATE处理并发更新问题解决方案分享,需要的朋友可以参考下
    2014-05-05
  • mysql如何在线修改主从复制选项

    mysql如何在线修改主从复制选项

    这篇文章主要介绍了mysql如何在线修改主从复制选项,帮助大家更好的理解和学习mysql,感兴趣的朋友可以了解下
    2020-08-08
  • mysql数据库查询优化 mysql效率

    mysql数据库查询优化 mysql效率

    MySQL由于它本身的小巧和操作的高效, 在数据库应用中越来越多的被采用.我在开发一个P2P应用的时候曾经使用MySQL来保存P2P节点,由于P2P的应用中,结点数动辄上万个,而且节点变化频繁,因此一定要保持查询和插入的高效.以下是我在使用过程中做的提高效率的三个有效的尝试. 1. 使用statement进行绑定查询 2. 随机的获取记录 3. 使用连接池管理连接.
    2008-01-01
  • 一文弄懂MySQL中redo log与binlog的区别

    一文弄懂MySQL中redo log与binlog的区别

    在学习mysql数据库时,不可避免要去接触到redo log和binlog,好多人对这两者的概念分不太清,下面这篇文章主要给大家介绍了关于MySQL中redo log与binlog区别的相关资料,需要的朋友可以参考下
    2022-02-02
  • MySQL实时监控工具orztop的使用介绍

    MySQL实时监控工具orztop的使用介绍

    这篇文章主要给大家介绍了MySQL实时监控工具orztop的使用,文中给出了详细的介绍,相信对大家的学习具有一定的参考借鉴价值,有需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-01-01
  • mysql中update按照多重条件进行更新处理的方案

    mysql中update按照多重条件进行更新处理的方案

    更新数据是使用数据库时最重要的任务之一,下面这篇文章主要给大家介绍了关于mysql中update按照多重条件进行更新处理的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-09-09

最新评论