MySQL服务器使用身份验证插件来验证客户端连接。验证给定连接的插件可能会请求将连接(外部)用户作为不同的用户进行权限检查。这使得外部用户可以作为第二个用户的代理;也就是说,假定第二个用户的特权:
外部用户为a“代理用户“(可以模仿或成为另一个用户的用户)。
第二个用户是a“代理用户“(其身份和特权可以由代理用户承担的用户)。
本节描述代理用户能力的工作原理。有关身份验证插件的一般信息,请参见第6.2.17节,“可插拔身份验证”.有关特定插件的信息,请参见第6.4.1节,“认证插件”.有关编写支持代理用户的身份验证插件的信息,请参阅在身份验证插件中实现代理用户支持.
代理获得一个管理福利是DBA可以使用一组权限设置一个单个帐户,然后启用多个代理用户以具有这些权限,而无需为每个用户单独分配权限。作为代理用户的替代方案,DBA可能会发现角色为将用户映射到特定的命名特权集中提供了合适的方式。每个用户都可以授予给定的单个角色,实际上是授予适当的一组权限。看第6.2.10节,“使用角色”.
对于给定的身份验证插件进行代理,必须满足这些条件:
代理必须被支持,无论是插件本身,还是MySQL服务器代表插件。在后一种情况下,可能需要显式地启用服务器支持;看到代理用户映射的服务器支持.
一般情况下,代理用户只能用于代理场景,不能用于直接登录。
对于将连接到代理帐户的客户端视为代理用户的客户端,身份验证插件必须返回与客户端用户名不同的用户名,以指示代理帐户的用户名,该用户名定义了代理用户要承担的特权。
或者,对于由服务器提供代理映射的插件,代理的用户从
代理人
代理用户持有的特权。
代理机制只允许将外部客户端用户名映射到代理用户名。没有映射主机名的规定:
当客户端连接到服务器时,服务器基于客户端程序的用户名和客户端连接的主机确定正确的帐户。
如果该帐户是一个代理帐户,则服务器尝试通过使用身份验证插件返回的用户名和代理帐户的主机名找到一个匹配的代理帐户来确定适当的代理帐户。代理帐户中的主机名将被忽略。
考虑以下帐户定义:
- 创建代理帐户创建使用My_auth_plugin标识的用户'localhost'@'localhost'my_auth_string.”;- 创建代理帐户并授予其特权;- 使用mysql_no_login插件来防止使用mysql_no_login标识的直接登录创建用户的员工'@'localhost';授予员工。*“雇员”@'localhost';- 授予代理帐户的代理账户 - 代理帐户授予代理的“员工”@'localhost'@'employee_ext'@'localhost';
当客户端连接为员工_ext.
从本地主机,MySQL使用名为的插件my_auth_plugin.
执行身份验证。假设my_auth_plugin.
返回用户名员工
到服务器,基于内容'
也许通过咨询一些外部认证系统。名字my_auth_string.
'员工
不同于员工_ext.
,所以返回员工
用作服务器的请求来治疗员工_ext.
外部用户,出于特权检查的目的,如图所示员工
本地用户。
在这种情况下,员工_ext.
是代理用户和员工
被代理的用户。
服务器验证代理身份验证员工
可能是可能的员工_ext.
用户检查是否员工_ext.
(代理用户)具有代理人
特权的员工
(代理用户)。如果未授予此权限,则会发生错误。除此以外,员工_ext.
享有特权员工
.服务器检查客户端会话期间执行的语句员工_ext.
抵制授予的特权员工
.在这种情况下,员工_ext.
可以访问表格中的表格雇员
数据库。
代理账户,员工
,用来mysql_no_login.
身份验证插件可防止客户端使用帐户直接登录。(这假设安装了插件。有关说明,请参阅第6.4.1.8节“无登录可插拔身份验证”。)对于保护代理账户免受直接使用的替代方法,请参阅防止直接登录代理帐户.
当代理发生时,用户()
和CURRENT_USER ()
函数可用于查看连接用户(代理用户)与权限期间应用的帐户之间的差异(代理用户)。对于刚刚描述的示例,这些函数返回以下值:
mysql> SELECT USER(), CURRENT_USER();+------------------------+--------------------+ | 用户()| CURRENT_USER () | +------------------------+--------------------+ | employee_ext@localhost | employee@localhost | +------------------------+--------------------+
在里面创建用户
创建代理用户帐户的声明确定
名称,名称代理支持身份验证插件可选地后跟一个为“
子句指定用户连接时服务器传递给插件的字符串。如果存在,则该字符串提供有助于插件确定如何将代理(外部)客户端用户名映射到代理用户名的信息。每个插件都需要它是否需要auth_string.
'作为
条款。如果是这样,身份验证字符串的格式取决于插件如何打算使用它。有关它接受的身份验证字符10bet官方网站串值的信息,请参阅给定插件的文档。
代理帐户通常只打算通过代理帐户的方式使用。也就是说,客户端使用代理帐户连接,然后映射到适当的代理用户,并假定其特权。
有多种方法可以直接确保无法使用代理帐户:
将帐户与
mysql_no_login.
身份验证插件。在这种情况下,该帐户不能在任何情况下用于直接登录。这假设安装了插件。有关说明,请参阅第6.4.1.8节“无登录可插拔身份验证”.包括
账户锁定
创建帐户时选项。看第13.7.1.3节,“CREATE USER Statement”.使用此方法,还包括密码,以便如果稍后解锁帐户,则无法访问未密码。(如果是validate_password.
组件启用后,不允许创建没有密码的帐户,即使帐户被锁定。看第6.4.3节,“密码验证组件”.)创建一个有密码的帐户,但不要告诉其他人密码。如果您不让任何人知道该帐户的密码,客户端就不能使用它直接连接到MySQL服务器。
这代理人
需要特权以使外部用户能够连接为另一个用户的权限。要授予此权限,请使用授予
声明。例如:
授予代理'proxied_user.' 至 'proxy_user”;
该声明在其中创建了一行mysql.proies_priv.
授予表。
在连接时间,proxy_user
必须表示有效的外部经过身份验证的MySQL用户,proxied_user.
必须表示有效的本地身份验证用户。否则,连接请求失败。
相应的撤销
语法是:
撤销代理'proxied_user.“从”proxy_user”;
——grant PROXY to multiple account grant PROXY ON 'a' to 'b', 'c', 'd';revoke PROXY ON 'a' from 'b', 'c', 'd';grant PROXY ON 'a' to 'd' WITH grant OPTION; / /授予代理权限grant PROXY to default PROXY account ON 'a' to " @ ";
这代理人
在这些情况下可以授予特权:
由拥有
授予代理......具有赠款选择
为了proxied_user.
.经过
proxied_user.
的价值用户()
必须完全匹配CURRENT_USER ()
和proxied_user.
,对于帐户名称的用户名和主机名部分。
最初的根
安装MySQL时创建的帐户具有代理......具有赠款选择
特权的''@''
,即所有用户和所有主机。这使根
设置代理用户,以及将设置代理用户的权限委托给其他帐户。例如,根
可以这样做:
创建用户admin @ localhost IDENTIFIED BYadmin_password”;在“@'”上的“@”@'@'localhost'授予proxy;
这些陈述创建了一个行政
可以管理所有的用户授权代理
映射。例如,行政
可以这样做:
将代理权授予joe;
要指定某些或所有用户应使用给定的身份验证插件连接,请创建一个“空白的“用户名和主机名为空的MySQL帐户(''@''
),将其与该插件相关联,并让插件返回真实身份验证的用户名(如果与空白用户不同)。假设存在一个名为的插件a ldap_auth
实现LDAP身份验证和将用户连接到开发人员或管理器帐户的映射。要将用户的代理设置到这些帐户上,请使用以下语句:
create USER " @ " IDENTIFIED WITH ldap_auth AS 'O=Oracle, OU=MySQL';——创建代理账户;CREATE USER 'developer'@'localhost' IDENTIFIED WITH mysql_no_login;CREATE USER 'manager'@'localhost' IDENTIFIED WITH mysql_no_login;grant proxy ON 'manager'@'localhost' to " @ ";GRANT PROXY ON 'developer'@'localhost' TO " @ ";
现在假设客户端连接如下:
shell> mysql -user = myuser --password ...输入密码:myuser_password
没有找到服务器myuser
定义为MySQL用户,但由于有一个空白的用户帐户(''@''
)与客户端用户名和主机名匹配,服务器对客户端进行验证。服务器调用了a ldap_auth
身份验证插件和通过myuser
和myuser_password
以它作为用户名和密码。
如果是a ldap_auth
插件在LDAP目录中找到myuser_password
不是正确的密码myuser
,身份验证失败,服务器拒绝连接。
如果密码正确,则a ldap_auth
找到myuser
是开发人员,它返回用户名吗开发人员
到MySQL服务器,而不是myuser
.返回与客户端用户名不同的用户名myuser
向服务器发出信号,它应该治疗myuser
作为一个代理。服务器验证''@''
可以验证开发人员
(因为''@''
有代理人
特权执行此操作)并接受连接。会议进行myuser
拥有…的特权开发人员
代理用户。(这些特权应该由DBA使用授予
没有显示的陈述。)用户()
和CURRENT_USER ()
函数返回以下值:
mysql> SELECT USER(), CURRENT_USER();+ ----------------------------------- + |用户()|current_user()|+ ----------------------------------- + |myuser @ localhost |开发人员@ localhost |+ -----------------------------------
如果插件改为在LDAP目录中找到myuser
是一个经理,它返回经理
作为用户名和会话继续myuser
拥有…的特权经理
代理用户。
mysql> SELECT USER(), CURRENT_USER();+------------------+-------------------+ | 用户()| CURRENT_USER () | +------------------+-------------------+ | myuser@localhost | manager@localhost | +------------------+-------------------+
为简单起见,外部身份验证不能是多级:凭证都不是开发人员
也不是的经理
在前面的例子中被考虑在内。但是,如果客户端尝试直接连接和验证,则仍然使用它们仍然使用它们开发人员
或经理
帐户,这就是为什么这些代理帐户应该保护,以防止直接登录(见防止直接登录代理帐户)。
如果您打算创建一个默认代理用户,请检查现有的其他代理用户“匹配任何用户“优先于默认代理用户的帐户,因为它们可以阻止该用户按预期工作。
在前面的讨论中,默认代理用户帐户具有''
在与任何主机匹配的主机部分中。如果您设置了默认代理用户,请注意检查非申请是否存在相同的用户零件和“%”
在主机部分中,因为“%”
也匹配任何主机,但优先于''
按照服务器用于在内部对帐户行进行排序的规则(参见第6.2.6节,“访问控制,第1阶段:连接验证”)。
假设MySQL安装包含这两个帐户:
- 创建默认代理帐户创建用户的“@”标识,用some_plugin为“some_auth_string”;——创建匿名用户anon_user_password”;
第一个帐户(''@''
)旨在作为默认代理用户,用于对不匹配更多特定帐户的用户进行身份验证连接。第二个帐户(“@‘%’
)是一个匿名用户帐户,可能已经创建,例如,在没有自己的帐户的情况下启用用户以匿名连接。
两个帐户都有相同的用户部分(''
),与任何用户匹配。每个帐户都有一个与任何主机匹配的主机部分。尽管如此,有一个优先考虑连接尝试的帐户匹配,因为匹配规则排序了一系列“%”
之前,''
.对于不匹配任何特定帐户的帐户,服务器会尝试对其进行身份验证“@‘%’
(匿名用户)而不是''@''
(默认代理用户)。因此,从未使用默认代理帐户。
要避免此问题,请使用以下策略之一:
删除匿名帐户,避免与默认代理用户冲突。
使用在匿名用户之前匹配的更具体的默认代理用户。例如,只允许
本地主机
代理连接,使用'''localhost'
:使用some_plugin为“创建用户的'@'localhost'some_auth_string”;
此外,修改任何
授权代理
名称的陈述'''localhost'
而不是''@''
作为代理用户。请注意,此策略阻止匿名用户连接
本地主机
.使用命名的默认帐户而不是匿名默认帐户。有关此技术的示例,请参阅使用的说明
authentication_windows
插件。看第6.4.1.6节,“Windows可插拔身份验证”.创建多个代理用户,一个用于本地连接,一个代理用户“其他一切“(远程连接)。这非常有用,特别是当本地用户与远程用户拥有不同的特权时。
创建代理用户:
create user " @'localhost' IDENTIFIED WITH some_plugin AS 'some_auth_string”;create user " @'%' IDENTIFIED WITH some_plugin AS '创建远程连接代理用户some_auth_string”;
创建代理用户:
create user 'developer'@'localhost' IDENTIFIED WITH mysql_no_login;create user 'developer'@'%' IDENTIFIED WITH mysql_no_login;
授权给每个代理帐户
代理人
对应代理账户的特权:GRANT PROXY ON 'developer'@'localhost' TO '@'localhost';GRANT PROXY ON 'developer'@'%' TO '@'%';
最后,为本地和远程代理用户(未示出)授予适当的权限。
假设
some_plugin.
/'
组合原因some_auth_string
'some_plugin.
将客户端名称映射到开发人员
.本地连接匹配'''localhost'
代理用户,映射到'开发人员'@'localhost'
代理用户。远程连接匹配“@‘%’
代理用户,映射到'开发人员'@'%'
代理用户。
一些身份验证插件为自己实现代理用户映射(例如,PAM和Windows身份验证插件)。其他认证插件默认不支持代理用户。其中,有些可以请求MySQL服务器根据授予的代理权限映射代理用户:mysql_native_password
那SHA256_PASSWORD.
.如果是check_proxy_users.
启用系统变量后,服务器将为任何发出这样请求的身份验证插件执行代理用户映射:
默认情况下,
check_proxy_users.
禁用,因此服务器不执行代理用户映射,即使是对请求服务器支持代理用户的身份验证插件。如果
check_proxy_users.
已启用,也可能需要启用Plugin特定的系统变量来利用服务器代理用户映射支持:为了
mysql_native_password
插件,使mysql_native_password_proxy_users
.为了
SHA256_PASSWORD.
插件,使sha256_password_proxy_users
.
例如,要启用所有上述功能,请使用这些行启动服务器我.CNF.
文件:
[mysqld] check_proxy_users=ON mysql_native_password_proxy_users=ON sha256_password_proxy_users=ON
假设已启用相关的系统变量,请按照常用创建代理用户创建用户
然后授予它代理人
权限到要视为代理用户的其他帐户。当服务器接收到代理用户的成功连接请求时,它会发现用户具有代理人
特权并使用它来确定适当的代理用户。
- 创建代理帐户创建使用MySQL_NIVITE_PASSWORD的用户'proxy_user'@'localhost''密码”;- 创建代理帐户并授予其特权;- 使用mysql_no_login插件来防止使用mysql_no_login标识的直接登录创建用户的proxied_user'@'localhost';- 授予代理帐户授予的权限......“proxied_user”@'localhoster';- 授予代理帐户的代理帐户 - 代理帐户授权代理在“proxied_user”@'localhost'@'proxy_user'@'localhost';
要使用代理帐户,请使用代理帐户的名称和密码连接到服务器:
mysql -u proxy_user -p输入密码(此处在此处输入proxy_user密码)
身份验证成功,服务器发现proxy_user
有代理人
特权的proxied_user.
,会议继续进行proxy_user
享有特权proxied_user.
.
由服务器执行的代理用户映射符合这些限制:
即使关联的,服务器也没有代理往返匿名用户或来自匿名用户
代理人
好处是理所当然。当一个帐户被授予多个代理帐户的代理权限时,服务器代理用户映射是不确定的。因此,不鼓励将多个代理帐户的代理权限授予单个帐户。
两个系统变量有助于跟踪代理登录过程:
proxy_user
:该值为空值
如果未使用代理。否则,它表示代理用户帐户。例如,如果客户通过验证''@''
Proxy帐户,此变量设置如下:mysql >选择@@proxy_user;+--------------+ | @@ proxy_user | +--------------+ | ''@'' | +--------------+
External_User.
:有时,身份验证插件可以使用外部用户对MySQL服务器进行身份验证。例如,在使用Windows本机认证时,使用Windows API进行身份验证的插件不需要传递给它的登录ID。但是,它仍然使用Windows用户标识来进行身份验证。插件可以使用该插件将此外部用户ID(或IT的第一个512 UTF-8字节)返回给服务器External_User.
只读会话变量。如果插件未设置此变量,则其值是空值
.