从 MySQL 8.0.16 开始,MySQL 引入了基于
SYSTEM_USER
权限的用户帐户类别的概念。
MySQL引入了用户账户类别的概念,系统用户和普通用户根据是否有SYSTEM_USER
权限区分:
具有
SYSTEM_USER
权限的用户是系统用户。没有
SYSTEM_USER
特权的用户是普通用户。
该SYSTEM_USER
权限会影响给定用户可以应用其其他权限的帐户,以及该用户是否受到其他帐户的保护:
系统用户可以修改系统帐户和普通帐户。也就是说,拥有对普通帐户执行给定操作的适当权限的用户也可以通过拥有
SYSTEM_USER
来对系统帐户执行操作。系统帐户只能由具有适当权限的系统用户修改,普通用户不能修改。具有适当权限的普通用户可以修改普通帐户,但不能修改系统帐户。具有适当权限的系统用户和普通用户都可以修改普通帐户。
如果用户具有对常规帐户执行给定操作的适当权限,则
SYSTEM_USER
使该用户也可以对系统帐户执行该操作。
SYSTEM_USER
并不意味着任何其他特权,因此执行给定帐户操作的能力仍然取决于拥有任何其他所需的特权。例如,如果一个用户可以授予
SELECT
和
UPDATE
权限给普通帐户,那么SYSTEM_USER
该用户也可以授予SELECT
和UPDATE
给系统帐户。
SYSTEM_USER
系统帐户和常规帐户之间的区别可以通过保护具有特权的帐户免受不具有特权的帐户的影响,
从而更好地控制某些帐户管理问题
。例如,该
CREATE USER
权限不仅可以创建新帐户,还可以修改和删除现有帐户。在没有系统用户概念的情况下,拥有CREATE USER
权限的用户可以修改或删除任何现有帐户,包括该
root
帐户。系统用户的概念可以限制对root
帐户(本身是系统帐户)的修改,因此只能由系统用户进行修改。普通用户CREATE
USER
特权仍然可以修改或删除现有帐户,但只能是普通帐户。
该SYSTEM_USER
特权会影响这些操作:
账户操纵。
帐户操纵包括创建和删除帐户、授予和撤销权限、更改帐户身份验证特征(如凭据或身份验证插件)以及更改其他帐户特征(如密码过期策略)。
使用
SYSTEM_USER
帐户管理语句(例如CREATE USER
和 )来操作系统帐户需要特权GRANT
。SYSTEM_USER
要防止帐户以这种方式修改系统帐户,请通过不授予它权限使其成为常规帐户 。(但是,要完全保护系统帐户免受常规帐户的侵害,您还必须保留常规帐户对mysql
系统架构的修改权限。请参阅保护系统帐户免受常规帐户的操纵。)杀死当前会话和其中执行的语句。
要终止以特权执行的会话或语句, 除了任何其他所需的特权(或已弃用的特权)之外
SYSTEM_USER
,您自己的会话必须具有 特权。SYSTEM_USER
CONNECTION_ADMIN
SUPER
从 MySQL 8.0.30 开始,如果将服务器置于离线模式的用户没有
SYSTEM_USER
权限,则具有权限的已连接客户端用户SYSTEM_USER
也不会断开连接。但是,这些用户无法在服务器处于脱机模式时发起与服务器的新连接,除非他们也具有CONNECTION_ADMIN
或SUPER
权限。只有他们现有的连接没有被终止,因为SYSTEM_USER
这样做需要特权。在 MySQL 8.0.16 之前,
CONNECTION_ADMIN
特权(或已弃用的SUPER
特权)足以终止任何会话或语句。设置
DEFINER
存储对象的属性。要将
DEFINER
存储对象的属性设置为具有权限的帐户, 除了任何其他所需的权限(或已弃用的权限) 之外SYSTEM_USER
,您还必须具有该权限。SYSTEM_USER
SET_USER_ID
SUPER
在 MySQL 8.0.16 之前,
SET_USER_ID
特权(或已弃用的SUPER
特权)足以DEFINER
为存储的对象指定任何值。指定强制角色。
具有
SYSTEM_USER
特权的角色不能列在mandatory_roles
系统变量的值中。在 MySQL 8.0.16 之前,任何角色都可以列在
mandatory_roles
.覆盖MySQL Enterprise Audit 的审计日志过滤器中的“中止”项目。
从 MySQL 8.0.28 开始,具有
SYSTEM_USER
特权的帐户会自动分配AUDIT_ABORT_EXEMPT
特权,因此即使审计日志过滤器中的“中止”项会阻止它们,来自该帐户的查询也会始终执行。因此,具有特权的帐户SYSTEM_USER
可用于在审计配置错误后重新获得对系统的访问权限。请参阅 第 6.4.5 节,“MySQL 企业审计”。
在服务器内执行的会话被区分为系统会话或常规会话,类似于系统用户和普通用户之间的区别:
拥有
SYSTEM_USER
特权的会话是系统会话。不具备
SYSTEM_USER
特权的会话是常规会话。
常规会话只能执行常规用户允许的操作。系统会话还能够执行仅允许系统用户执行的操作。
会话拥有的权限是直接授予其基础帐户的权限,以及授予会话中当前活动的所有角色的权限。因此,会话可能是系统会话,因为它的帐户已被
SYSTEM_USER
直接授予权限,或者因为会话已激活具有
SYSTEM_USER
权限的角色。授予会话中不活动帐户的角色不会影响会话权限。
因为激活和停用角色可以改变会话所拥有的特权,所以会话可能从常规会话变为系统会话,反之亦然。如果会话激活或停用具有
SYSTEM_USER
特权的角色,则常规会话和系统会话之间的适当更改将立即发生,仅针对该会话:
如果常规会话激活具有
SYSTEM_USER
特权的角色,则该会话成为系统会话。如果系统会话停用具有
SYSTEM_USER
特权的角色,则该会话将成为常规会话,除非具有SYSTEM_USER
特权的其他角色保持活动状态。
这些操作对现有会话没有影响:
如果
SYSTEM_USER
授予或撤销某个帐户的权限,则该帐户的现有会话不会在常规会话和系统会话之间发生变化。授予或撤销操作仅影响帐户后续连接的会话。由在会话中调用的存储对象执行的语句以系统或父会话的常规状态执行,即使对象
DEFINER
属性命名系统帐户也是如此。
由于角色激活仅影响会话而不影响帐户,因此授予
SYSTEM_USER
对普通帐户具有特权的角色并不能保护该帐户免受普通用户的侵害。该角色仅保护已激活该角色的帐户的会话,并且仅保护会话不被常规会话杀死。
帐户操纵包括创建和删除帐户、授予和撤销权限、更改帐户身份验证特征(如凭据或身份验证插件)以及更改其他帐户特征(如密码过期策略)。
帐户操纵可以通过两种方式完成:
通过使用帐户管理语句,例如
CREATE USER
和GRANT
。这是首选方法。通过使用诸如
INSERT
and 之类的语句直接修改授权表UPDATE
。mysql
不鼓励使用此方法,但对于对包含授权表 的系统模式具有适当权限的用户来说是可行的。
要完全保护系统帐户免受给定帐户的修改,请将其设置为常规帐户并且不要授予它对mysql
模式的修改权限:
使用
SYSTEM_USER
帐户管理语句操作系统帐户需要特权。要防止帐户以这种方式修改系统帐户,请通过不授予SYSTEM_USER
它使其成为常规帐户。这包括不授予SYSTEM_USER
授予该帐户的任何角色。模式的权限
mysql
允许通过直接修改授权表来操纵系统帐户,即使修改帐户是常规帐户也是如此。要限制普通帐户对系统帐户进行未经授权的直接修改,请不要将mysql
模式的修改权限授予该帐户(或授予该帐户的任何角色)。如果普通帐户必须具有适用于所有模式的全局权限,mysql
则可以使用部分撤销施加的权限限制来防止模式修改。请参阅第 6.2.12 节,“使用部分撤销的权限限制”。
与
SYSTEM_USER
阻止帐户修改系统帐户而不是常规帐户的保留权限不同,保留mysql
模式权限可防止帐户修改系统帐户和常规帐户。这应该不是问题,因为如前所述,不鼓励直接修改授权表。
假设您要创建一个u1
拥有所有模式的所有权限的用户,但该
u1
用户应该是不能修改系统帐户的普通用户。假设
partial_revokes
开启了系统变量,配置u1
如下:
CREATE USER u1 IDENTIFIED BY 'password';
GRANT ALL ON *.* TO u1 WITH GRANT OPTION;
-- GRANT ALL includes SYSTEM_USER, so at this point
-- u1 can manipulate system or regular accounts
REVOKE SYSTEM_USER ON *.* FROM u1;
-- Revoking SYSTEM_USER makes u1 a regular user;
-- now u1 can use account-management statements
-- to manipulate only regular accounts
REVOKE ALL ON mysql.* FROM u1;
-- This partial revoke prevents u1 from directly
-- modifying grant tables to manipulate accounts
要阻止mysql
帐户访问所有系统架构,请撤销其对该
mysql
架构的所有特权,如刚才所示。也可以允许部分mysql
模式访问,例如只读访问。以下示例创建一个帐户,该帐户对所有架构具有SELECT
、
INSERT
、UPDATE
和
DELETE
全局权限,但仅限SELECT
于该
mysql
架构:
CREATE USER u2 IDENTIFIED BY 'password';
GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO u2;
REVOKE INSERT, UPDATE, DELETE ON mysql.* FROM u2;
另一种可能性是撤销所有mysql
模式权限,但授予对特定
mysql
表或列的访问权限。即使对 进行部分撤销也可以做到这一点mysql
。
以下语句启用对架构u1
内的只读访问
,但仅适用于表和表
的列:
mysql
db
Host
User
user
CREATE USER u3 IDENTIFIED BY 'password';
GRANT ALL ON *.* TO u3;
REVOKE ALL ON mysql.* FROM u3;
GRANT SELECT ON mysql.db TO u3;
GRANT SELECT(Host,User) ON mysql.user TO u3;