MySQL权限查看所有数据库

5

我服务器上有一些用户可以访问所有MySQL数据库。我想要撤销这些用户的权限,但是不确定如何进行操作。

例如:我有一个名为bob的用户,他可以访问服务器上的所有数据库。我运行以下命令来查看bob拥有哪些权限:

mysql -e "select * from information_schema.user_privileges;" | grep bob
'bob'@'%'       def     SELECT  NO
'bob'@'%'       def     INSERT  NO
'bob'@'%'       def     UPDATE  NO
'bob'@'%'       def     DELETE  NO
'bob'@'%'       def     CREATE  NO
'bob'@'%'       def     FILE    NO
'bob'@'%'       def     CREATE USER     NO

没有什么比GRANTALLSUPER更引人注目了。我创建了一个名为sometest的新数据库,切换到bob的帐户并发现bob可以访问sometest。不确定我错过了什么。

编辑:我运行了SHOW GRANTS FOR 'bob'@'%';并看到:

GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN,
  PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, CREATE TEMPORARY TABLES, 
  LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, 
  CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE 
  ON *.* TO 'bob'@'%'

1)如何取消这个权限?我认为如果我运行:

REVOKE SELECT, INSERT,... on *.* to 'bob'@'%';

它将删除像以下这样的权限

GRANT ALL ON bobsdb.* TO 'bob'@'%';

我不希望发生这种情况。但也许最好的方法是删除所有权限并从头开始构建。

2) 如何识别所有此类权限?我是否需要查看每个用户?

1个回答

5

你可以使用以下命令查看用户的授权:

SHOW GRANTS FOR 'bob'@'localhost';

从MySQL手册中得知:

SHOW DATABASES特权使账户可以通过发出SHOW DATABASE语句来查看数据库名称。没有此特权的帐户仅能看到他们拥有某些权限的数据库,如果服务器是使用--skip-show-database选项启动,则根本无法使用该语句。请注意,任何全局特权都是数据库的特权。

如果启用了SHOW DATABASES权限,请撤销该权限。

REVOKE SHOW DATABASES ON *.* FROM 'bob'@'localhost';

最后,使用以下命令重新加载所有权限:
FLUSH PRIVILEGES;

(如果可以的话)重新启动MySQL,否则可以删除权限。

P.S:您可能需要将“localhost”替换为您的数据库主机名。

一些参考资料:

编辑:

回答您的问题:

1)如何删除此权限?我假设如果运行:REVOKE SELECT, INSERT,... on *.* to 'bob'@'%';

您只需运行REVOKE ALL ON *.* TO 'bob'@'%';即可。

2)如何识别所有此类权限?我必须检查每个用户吗?

请参阅此博客文章。 声明: 我与该博客无关。


谢谢!这不是问题所在,但它确实帮助我找到了问题。请看编辑。 - Sal
我已经修改了文本,包括您后来提出的问题的答案。 - R T

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接