代理用户

代理用户

我运行一个 MySQL 服务器,并且对该实例拥有 MySQL 根级权限:

mysql> select CURRENT_USER();
+----------------+
| CURRENT_USER() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.02 sec)
mysql> 

我正在对一系列用户的 MySQL 权限进行故障排除。我不知道这些用户的密码。作为 MySQL 根用户,我可以在不知道其他用户密码的情况下冒充其身份吗?

在 Linux/Unix 世界中,我会使用类似“su - someuser”的命令来执行此操作以假定用户的身份。MySQL 是否提供了等效功能?

答案1

你的要求只能通过两种方式实现

代理用户

MySQL 5.5 引入代理用户

当通过身份验证插件对 MySQL 服务器进行身份验证时,该插件可能会要求将连接的(外部)用户视为不同的用户以进行权限检查。这使得外部用户能够成为第二个用户的代理;也就是说,拥有第二个用户的权限。换句话说,外部用户是“代理用户”(可以冒充或被视为另一个用户的用户),而第二个用户是“被代理用户”(其身份可以由代理用户承担的用户)。

您可以在mysql.proxies_priv中找到定义的代理用户:

mysql> desc mysql.proxies_priv;
+--------------+------------+------+-----+-------------------+-----------------------------+
| Field        | Type       | Null | Key | Default           | Extra                       |
+--------------+------------+------+-----+-------------------+-----------------------------+
| Host         | char(60)   | NO   | PRI |                   |                             |
| User         | char(16)   | NO   | PRI |                   |                             |
| Proxied_host | char(60)   | NO   | PRI |                   |                             |
| Proxied_user | char(16)   | NO   | PRI |                   |                             |
| With_grant   | tinyint(1) | NO   |     | 0                 |                             |
| Grantor      | char(77)   | NO   | MUL |                   |                             |
| Timestamp    | timestamp  | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+--------------+------------+------+-----+-------------------+-----------------------------+
7 rows in set (0.22 sec)

mysql>

这是来自 MySQL 文档的示例代码

CREATE USER 'empl_external'@'localhost'
  IDENTIFIED WITH auth_plugin AS 'auth_string';
CREATE USER 'employee'@'localhost'
  IDENTIFIED BY 'employee_pass';
GRANT PROXY
  ON 'employee'@'localhost'
  TO 'empl_external'@'localhost';

安全类型(存储过程/视图)

在 中mysql.proc,有一列名为security_type。对于视图,这列存在于 中information_schema.views。它有两个值 1)invoker和 2) definer。如果存储过程具有security_typedefiner则您具有与存储过程所有者相同的访问权限。当然,这仅适用于

  • 调用存储过程或从视图中进行选择时
  • 你有执行特权

相关内容