我发现user @ host和mysql.db表的show grants之间存在差异。为什么是这样?
我该如何解决这个问题?我们担心安全问题。
我在mysql.users中对用户运行了一个show grants。在mysql.users中,用户是user@xxx.xxx.xxx.xx,当我运行show grants时,它表示GRANT USAGE到user@xxx.xxx.xxx.xx
这让我很担心,因为这个用户似乎也能够访问数据库。
当我查看mysql.db和information_schema.schema_privileges时,我可以看到与拥有xxx.xxx。%主机的用户相同的用户,可以完全访问该数据库。
是什么给出了?
编辑 - 更深入的解释:
这就是我所拥有的:
show grants for 'myuser'@'xxx.xxx.xxx.xxx';
它返回:
GRANT USAGE ON *.* TO 'myuser'@'xxx.xxx.xxx.xxx' IDENTIFIED BY PASSWORD 'xxxxxxxxxxxxxxxxx'
如果我跑:
select host,db,user from mysql.db where user='myuser';
我明白了:
+----------+------------+------------+
| host | db | user |
+----------+------------+------------+
|xxx.xxx.% | somedb | myuser |
+----------+------------+------------+
答案 0 :(得分:3)
mysql.user
表可以缓解所有数据库的特定全局权限。
如果用户被限制在特定数据库中,则只能在mysql.db表中看到特定于数据库的授权。限制在数据库中的用户不需要SUPER,PROCESS,SHUTDOWN和这些权限。
如果您创建具有全局权限的用户(从而将用户登陆到mysql.user
),则无法撤消全局权限以将用户降级为特定数据库。如果您尝试使用REVOKE命令执行此操作,您将在mysql.user
中看到所有列中的原始Y值以及mysql.db
中具有数据库特定权限的Y值的同一用户的用户。
您必须完全删除用户并使用较低权限创建新用户。
以下是基于评论的示例
mysql> show grants for advdb@'%';
+-----------------------------------------------------------------------------+
| Grants for advdb@% |
+-----------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'advdb'@'%' IDENTIFIED BY PASSWORD '................' |
| GRANT ALL PRIVILEGES ON `advertpro`.* TO 'advdb'@'%' |
+-----------------------------------------------------------------------------+
GRANT USAGE只允许您知道认证涉及哪些MD5密码(如果密码不是空白)。请注意,advdb可以从任何IP地址登录,只能访问advertpro数据库。
除非您希望用户查看流程列表中的所有流程,即使是属于其他流程的流程,否则用户不需要PROCESS权限。
用户不需要SUPER权限,除非您希望用户在只读的mysql实例中写入,启动和停止复制,zap二进制日志以及类似的事情。
除非您希望用户从OS命令行用户mysqladmin客户端程序关闭mysql,否则用户不需要SHUTDOWN权限。
要复制您正在寻找的私人信息,
SHOW GRANTS FOR 'user'@'xxx.xxx.xxx.%';
好吧,让我们破解:
UPDATE mysql.db
SET host='xxx.xxx.xxx.xxx'
WHERE user='myuser'
AND host='xxx.xxx.%'
AND db='somedb';
FLUSH PRIVILEGES;
这应该是!!!
要在SQL中转储MySQL Grants,您可以执行pt-show-grants
使用pt-show-grants移植mysql授权要好得多。
以下是我对pt-show-grants所做的个人模拟
mysql -hhostaddr -umyuserid -pmypassword --skip-column-names -A -e"SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';') FROM mysql.user WHERE user<>''" | mysql -hhostaddr -umyuserid -pmypassword --skip-column-names -A | sed 's/$/;/g' > MySQLUserGrants.sql