关于用户权限的格言是,应该为用户分配执行其工作职能所需的最少权限,而不必分配更多权限。这就是 MySQL 提供如此精细的访问控制系统的原因。尽管这不是最容易掌握的系统,但是一旦 DBA 做到了,他或她就会倾向于认为此系统确实非常有效。在今天的文章中,我们将学习如何防止用户在 MySQL 中列出数据库。
使用 mysql.user 表
mysql.user 表包含有关有权访问 MySQL 服务器的用户的信息以及其全局权限。尽管可以直接查询和更新 user 表,但是最好使用 GRANT 和 CREATE USER 添加用户和权限。若要查看 user 表的内容,我们可以使用 DESC 命令:
允许用户使用 SHOW_DATABASES 命令获取数据库列表的权限是 Show_db_priv。因此,在新数据库上,我们可以简单地不将用户添加到数据库中以防止用户看到它。否则,你可以发出 SHOW GRANTS 命令来查看用户当前拥有哪些权限:
SHOW GRANTS FOR 'bob_s'@'localhost';
这是Navicat Premium中“bob_s @ localhost”用户的一些示例输出:
撤销用户权限
上面的输出确认 bob_s 确实具有 SHOW DATABASES 权限。如果现在想删除该权限,可以发出 REVOKE 命令:
REVOKE Show_db_priv ON sakila FROM bob_s'@'localhost;
在 Navica t中,我们可以在用户详细信息的“服务器权限”和“权限”选项卡上在服务器和数据库级别设置用户权限。若要访问它们,请点击主按钮栏上的“用户”按钮并选择你感兴趣的用户,然后点击对象工具栏上的“权限管理员”按钮:
以下是 bob_s@localhost 的服务器级权限(包括 SHOW DATABASES):
若要撤消 SHOW DATABASES 权限,我们只需取消勾选 SHOW DATABASES 标签旁边的框,然后点击“保存”按钮。
以下是 bob_s@localhost 的 sakila 数据库权限:
在这里,我们还可以设置数据库特定的权限,例如用于创建视图、显示视图、删除表、执行 INSERT 语句等的权限。我们甚至可以在表和列级别管理权限!
总结
在今天的文章中,我们看到了如何通过 MySQL REVOKE 命令以及使用 Navicat 的“服务器权限”和“权限”选项卡来阻止用户在 MySQL 中列出数据库。大家可能会争论两者哪一个比较容易,但我个人认为复选框方法更直观。
若要了解有关在 Navicat 中管理用户的更多信息,请查看“在 Navicat Premium 中管理 MySQL 用户”系列:
如果你对 Navicat for MySQL 感兴趣,可以免费试用 14 天!