【问题标题】:How do you revoke all EXECUTE privileges for a user in MySQL?你如何撤销 MySQL 中用户的所有 EXECUTE 权限?
【发布时间】:2020-02-16 13:11:24
【问题描述】:

我只需要在一段时间内向用户授予特定过程的 EXECUTE PROCEDURE 权限。在这段时间之后,我想从用户那里删除 所有 执行权限 - 但保留已授予的其他权限,如 SELECT 或 INSERT,原封不动。

如何删除所有执行权限?这似乎不起作用:

GRANT EXECUTE ON PROCEDURE add_data TO user1;

--时间过去了,现在:

GRANT EXECUTE ON PROCEDURE list_data TO user1;

-- 时间过去了,现在该撤销了:

REVOKE EXECUTE ON *.* FROM user1;

结果是用户仍然在 add_data 和 list_data 上执行。 REVOKE EXECUTE on *.* 似乎只在用户被授予 EXECUTE ON *.* 的情况下撤销某些内容,即使这样它也会删除 *.* 权限但保留更具体的授权。

我错过了什么吗?我是否必须在表中记录我授予用户的所有权限并一一撤销(看起来很疯狂)?

我在 AWS Aurora Serverless 上使用 MySQL 5.6.10。

【问题讨论】:

  • 我想通了,并在下面发布了答案。我认为 GRANT EXECUTE ON PROCEDURE、GRANT EXECUTE ON db.* 和 GRANT EXECUTE ON *.* 都是同一事物的所有版本,并且会在您发出权限时累积权限;它根本不工作。

标签: mysql


【解决方案1】:

在 SQL 中没有办法“撤销用户的所有 EXECUTE 授权”,而不知道您曾经给予他们的所有授权。相反,您需要直接修改三个mysql表(eek)。像这样:

SET @user = 'myuser';
SET @host = '%';

-- remove all proc-level execute permissions
DELETE FROM mysql.procs_priv WHERE user=@user AND Host=@host AND Proc_priv = 'Execute';

-- remove all db-level execute permissions
UPDATE mysql.db SET Execute_priv = 'N' WHERE user=@user AND Host=@host;

-- remove user-level permission
UPDATE mysql.user SET execute_priv = 'N' WHERE user=@user AND Host=@host;

-- force engine to reload its cached permissions so they take effect now
FLUSH PRIVILEGES

在 MySQL 中,如果您不知道每个用户同时存在 三个 EXECUTE 权限状态,您很容易意外地授予某人您不打算授予的权限。

GRANT/REVOKE EXECUTE ON *.*GRANT/REVOKE EXECUTE ON mydb.*GRANT/REVOKE EXECUTE ON PROCEDURE nnn 创建三个独立的静态状态,它们在您进行权限更改时同步。

MySQL 使用三个权限表来确定 EXECUTE 权限:user 表、db 表和 procs_priv 表。

(1)GRANT EXECUTE ON *.* TO user1;

此语句在 user 表中设置一个标志 (execute_priv)。如果用户开启了这个标志,他们可以在任何数据库中执行任何过程或函数。

(2)GRANT EXECUTE ON mydb.* TO user1;

此语句在 db 表中为该用户/数据库组合设置一个标志 (Execute_priv)。 如果用户为某个数据库打开了这个标志,他们就可以执行该数据库中的任何过程或函数。

(3)GRANT EXECUTE ON PROCEDURE proc TO user1;

此语句在 procs_priv 表中创建一个条目,授权用户执行该特定过程。

在函数/存储过程调用之前,引擎会查看您是否具有用户级权限。如果是这样,它不会再看下去并继续进行调用。然后它会查看您是否具有数据库级权限。最后,它会查看您是否具有特定于过程的权限。

如果您像我一样误解并认为您的授予和撤销语句是在当前权限状态中添加/减去,这可能会导致大错误。

示例 1:REVOKE EXECUTE ON *.* FROM user1 确实撤销 user1 的所有 EXECUTE 权限。它从 user1 中删除了用户级别的全局 EXECUTE 权限,并保留所有其他 EXECUTE 权限(数据库级别和过程级别)。

示例 2:REVOKE EXECUTE ON PROCEDURE proc1 FROM user1 确实删除 user1 执行 proc1 的能力。如果只擦除特定的过程级权限。如果用户之前被赋予了 mydb.* 或 *.* 执行权限,那么在 REVOKE 之后这些权限仍然存在。

【讨论】:

    猜你喜欢
    • 2015-07-30
    • 2011-07-14
    • 2018-06-12
    • 1970-01-01
    • 1970-01-01
    • 2018-09-29
    • 2013-04-20
    • 1970-01-01
    • 2012-04-14
    相关资源
    最近更新 更多