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
权限会影响以下操作
帐户操作。
帐户操作包括创建和删除帐户、授予和撤销权限、更改帐户身份验证特征(例如凭据或身份验证插件)以及更改其他帐户特征(例如密码过期策略)。
使用帐户管理语句(例如
CREATE USER
和GRANT
)操作系统帐户需要SYSTEM_USER
权限。要防止帐户以这种方式修改系统帐户,请不要向其授予SYSTEM_USER
权限,使其成为常规帐户。(但是,要完全保护系统帐户免受常规帐户的攻击,您还必须拒绝常规帐户对mysql
系统架构的修改权限。请参阅 保护系统帐户免受常规帐户的攻击。)终止当前会话和其中正在执行的语句。
要终止使用
SYSTEM_USER
权限执行的会话或语句,您自己的会话除了任何其他必需的权限(CONNECTION_ADMIN
或已弃用的SUPER
权限)外,还必须具有SYSTEM_USER
权限。如果将服务器置于离线模式的用户没有
SYSTEM_USER
权限,则拥有SYSTEM_USER
权限的已连接客户端用户也不会断开连接。但是,除非这些用户还拥有CONNECTION_ADMIN
或SUPER
权限,否则他们在服务器处于离线模式时无法启动与服务器的新连接。只有他们现有的连接不会终止,因为终止连接需要SYSTEM_USER
权限。为存储对象设置
DEFINER
属性。要将存储对象的
DEFINER
属性设置为具有SYSTEM_USER
权限的帐户,除了任何其他必需的权限外,您还必须具有SYSTEM_USER
权限。指定强制角色。
具有
SYSTEM_USER
权限的角色不能列在mandatory_roles
系统变量的值中。覆盖 MySQL Enterprise Audit 审计日志过滤器中的““abort””项。
具有
SYSTEM_USER
权限的帐户会自动分配AUDIT_ABORT_EXEMPT
权限,以便即使审计日志过滤器中的““abort””项会阻止来自该帐户的查询,这些查询也会始终执行。因此,在审计配置错误后,可以使用具有SYSTEM_USER
权限的帐户重新获得对系统的访问权限。请参阅 “第 8.4.5 节 “MySQL Enterprise Audit””。
在服务器中执行的会话区分为系统会话或常规会话,类似于系统用户和常规用户之间的区别
拥有
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
和UPDATE
)直接修改授权表。不鼓励使用此方法,但对于对包含授权表的mysql
系统架构具有相应权限的用户来说是可行的。
要完全保护系统帐户免受给定帐户的修改,请将其设为常规帐户,并且不要为其授予对 mysql
架构的修改权限
使用帐户管理语句操作系统帐户需要
SYSTEM_USER
权限。要防止帐户以这种方式修改系统帐户,请不要向其授予SYSTEM_USER
权限,使其成为常规帐户。这包括不向授予该帐户的任何角色授予SYSTEM_USER
。mysql
架构的权限允许通过直接修改授权表来操作系统帐户,即使修改帐户是常规帐户也是如此。要限制常规帐户未经授权直接修改系统帐户,请不要向该帐户(或授予该帐户的任何角色)授予对mysql
架构的修改权限。如果常规帐户必须具有适用于所有架构的全局权限,则可以使用通过部分撤销施加的权限限制来防止对mysql
架构的修改。请参阅 “第 8.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
权限,但对 mysql
架构只有 SELECT
权限
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
表以及 user
表的 Host
和 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;