MySQL 查看所有数据库的权限
MySQL permissions to see all databases
我的服务器上有一些用户可以访问每个 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
没有什么比 GRANT
、ALL
或 SUPER
更突出了。我创建了一个新数据库 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) 像这样如何识别所有权限?我必须查看每个用户吗?
您应该能够使用以下命令查看用户的授权:
SHOW GRANTS FOR 'bob'@'localhost';
来自 MySQL 手册:
The SHOW DATABASES privilege enables the account to see database names by issuing the SHOW DATABASE statement. Accounts that do not have this privilege see only databases for which they have some privileges, and cannot use the statement at all if the server was started with the --skip-show-database option. Note that any global privilege is a privilege for the database.
如果启用了 SHOW DATABASES,请撤销该权限。
REVOKE SHOW DATABASES ON *.* FROM 'bob'@'localhost';
最后,使用命令重新加载所有权限:
FLUSH PRIVILEGES;
(或重新启动 MySQL - 如果这是一个选项 - 通常不是)。
P.S:您可能需要将 'localhost' 替换为您的数据库主机名。
部分参考资料:
编辑:
回答您的问题:
1) How does one drop this permission? I assume if I run: REVOKE SELECT, INSERT,... on *.* to 'bob'@'%';
你可以简单地 运行 REVOKE ALL ON *.* TO 'bob'@'%';
2) How does one identify all permissions like this? Do I have to look over every user?
看到这个 blog post. 免责声明:我与这个博客无关。
我的服务器上有一些用户可以访问每个 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
没有什么比 GRANT
、ALL
或 SUPER
更突出了。我创建了一个新数据库 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) 像这样如何识别所有权限?我必须查看每个用户吗?
您应该能够使用以下命令查看用户的授权:
SHOW GRANTS FOR 'bob'@'localhost';
来自 MySQL 手册:
The SHOW DATABASES privilege enables the account to see database names by issuing the SHOW DATABASE statement. Accounts that do not have this privilege see only databases for which they have some privileges, and cannot use the statement at all if the server was started with the --skip-show-database option. Note that any global privilege is a privilege for the database.
如果启用了 SHOW DATABASES,请撤销该权限。
REVOKE SHOW DATABASES ON *.* FROM 'bob'@'localhost';
最后,使用命令重新加载所有权限:
FLUSH PRIVILEGES;
(或重新启动 MySQL - 如果这是一个选项 - 通常不是)。
P.S:您可能需要将 'localhost' 替换为您的数据库主机名。
部分参考资料:
编辑:
回答您的问题:
1) How does one drop this permission? I assume if I run:
REVOKE SELECT, INSERT,... on *.* to 'bob'@'%';
你可以简单地 运行 REVOKE ALL ON *.* TO 'bob'@'%';
2) How does one identify all permissions like this? Do I have to look over every user?
看到这个 blog post. 免责声明:我与这个博客无关。