我运行一个 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>
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_type
,definer
则您具有与存储过程所有者相同的访问权限。当然,这仅适用于
- 调用存储过程或从视图中进行选择时
- 你有执行特权