我发现了user@host和mysql.db表的show grants之间的区别。为什么会这样呢?
我该如何解决这个问题?我们担心安全问题。
我对mysql.users中的用户进行了一次授权展示。在mysql.users中,用户是user@xxx.xx,当我运行show grants时,它显示GRANT USAGE TO user@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 |
+----------+------------+------------+发布于 2012-02-09 06:23:32
别担心。
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数据库。
用户不需要权限,除非您想让用户看到进程列表中的所有进程,甚至是属于其他进程的进程。
用户不需要权限,除非您希望用户写入只读的mysql实例、启动和停止复制、zap二进制日志等。
用户不需要权限,除非您希望用户从操作系统命令行用户mysqladmin客户端程序关闭mysql。
要复制您正在查找的priv,
将输出编辑为
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授权,您可以执行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.sqlhttps://stackoverflow.com/questions/9202372
复制相似问题