MySQL权限可以查看所有数据库

时间:2017-01-28 00:58:52

标签: mysql privileges

我的服务器上有一些用户可以访问每个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 个答案:

答案 0 :(得分:3)

您应该能够使用以下命令查看用户的授权:

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”替换为db主机名。

一些参考文献:

修改

回答你的问题:

  

1)如何取消此权限?我假设我跑:REVOKE SELECT, INSERT,... on *.* to 'bob'@'%';

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

即可
  

2)如何识别这样的所有权限?我是否必须查看每个用户?

请参阅此blog post. 免责声明:我与此博客无关。