我为我的 mysql 用户授予了“授予 my_user@localhost 的所有数据库名称权限”的权限。现在我想更细致地处理,首先降低特定表的权限。
我希望 mysql 具有或可以设置为遵循“最少权限”策略,这样我就可以保留当前设置并降低一个表的权限。但我在文档或网上没有看到类似的东西。
除了删除数据库级别的授予并在表级别重新授予之外,是否有办法通过添加另一条规则来获得相同的结果?
答案1
MySQL 中的所有权限都是加性的;没有减性权限的概念。
您必须删除GRANT ALL ON db.* ...
并分配您想要的细粒度表级权限。
请记住,你有一个非常广泛的特权MySQL 中可供您使用。也许您可以从为GRANT SELECT
您的用户提供只读访问权限的数据库级别开始。然后,您可以根据需要有选择地按表添加破坏性权限。
答案2
不幸的是,如果用户已经具有数据库级权限,则运行revoke all on db.table from user@host;
不会为您创建所有现有的表级权限(您要撤销的权限除外)。
我能想到的最好的方法是向用户添加所需的所有表级权限,然后撤销数据库级权限。
mysql
MySQL根据权限的上下文将其权限保存在数据库的不同表中。
- 如果您授予权限,
*.*
它将进入mysql.User
表中。 - 如果您授予权限,
db.*
它将进入mysql.db
表中。 - 如果您授予权限,
db.table
它将进入mysql.tables_priv
表中。 - 如果您授予列权限,
db.table
它将进入mysql.columns_priv
表中。
因此,运行下面的最终撤销只会从表中删除条目db
并保留表中所已有的所有内容tables_priv
。
例如:用户已经拥有这个:
mysql> grant all on db.* to user@host;
你运行这个:
mysql> grant all on db.table1 to user@host;
mysql> grant all on db.table2 to user@host;
mysql> grant all on db.table3 to user@host;
mysql> grant all on db.table4 to user@host;
mysql> revoke all on db.* from user@host;
在您运行撤销命令之前,用户将一直可以访问db.table5
。撤销之前和之后,用户都可以访问其他四个表。
例外情况(总是有例外)是列权限。如果您将列权限授予已拥有同一表的表级权限的用户,这些权限将存在于表中,columns_priv
但不会显示在show grants
命令中,并且如果您运行命令,这些权限将消失revoke ... on db.table from user@host;
。
您应该能够编写脚本来添加所有表级权限,而不是手动创建它们。