ALTER USER

语法

ALTER USER [IF EXISTS] 
 user_specification [,user_specification] ...
  [REQUIRE {NONE | tls_option [[AND] tls_option] ...}]
  [WITH resource_option [resource_option] ...]
  [lock_option] [password_option] 

user_specification:
  username [authentication_option]

authentication_option:
  IDENTIFIED BY 'password' 
  | IDENTIFIED BY PASSWORD 'password_hash'
  | IDENTIFIED {VIA|WITH} authentication_rule [OR authentication_rule] ... 
 
authentication_rule:
  authentication_plugin
  | authentication_plugin {USING|AS} 'authentication_string'
  | authentication_plugin {USING|AS} PASSWORD('password')

tls_option
  SSL 
  | X509
  | CIPHER 'cipher'
  | ISSUER 'issuer'
  | SUBJECT 'subject'

resource_option
  MAX_QUERIES_PER_HOUR count
  | MAX_UPDATES_PER_HOUR count
  | MAX_CONNECTIONS_PER_HOUR count
  | MAX_USER_CONNECTIONS count
  | MAX_STATEMENT_TIME time

password_option:
  PASSWORD EXPIRE
  | PASSWORD EXPIRE DEFAULT
  | PASSWORD EXPIRE NEVER
  | PASSWORD EXPIRE INTERVAL N DAY

lock_option:
    ACCOUNT LOCK
  | ACCOUNT UNLOCK
}

描述

ALTER USER 语句用于修改现有的 MariaDB 账户。要使用它,您必须具有全局 CREATE USER 权限或 UPDATE 权限以更改 mysql 数据库中的用户。如果启用了 read_only 系统变量,则还需要全局 SUPER 权限。

如果指定的任何用户帐户尚不存在,则会产生错误。如果发生错误,则 ALTER USER 仍将修改未导致错误的帐户。对于所有未修改的用户,只会产生一个错误。

IF EXISTS

使用 IF EXISTS 子句时,MariaDB 会针对每个未存在的指定用户返回警告而不是错误。

帐户名称

对于 ALTER USER 语句,帐户名称与 CREATE USER 语句中一样作为 username 参数指定。有关如何指定帐户名称的详细信息,请参见 CREATE USER 页面上的 帐户名称 部分。

CURRENT_USERCURRENT_USER() 也可以用于更改登录到当前会话中的帐户。例如,要将当前用户的密码更改为 mariadb

ALTER USER CURRENT_USER() IDENTIFIED BY 'mariadb';

认证选项

MariaDB starting with 10.4

MariaDB 10.4 开始,每个用户帐户可以使用多个身份验证插件。例如,在过渡期间允许旧的 mysql_native_password 身份验证插件作为替代方案,可以逐步将用户迁移到更安全的 ed25519 身份验证插件。有关更多信息,请参见 来自 MariaDB 10.4 的身份验证

在运行 ALTER USER 时,如果在 IDENTIFIED VIA 子句中未指定身份验证选项,则将删除该身份验证方法。(但是在 MariaDB 10.4.13 之前不是这种情况,请参见 MDEV-21928

例如,创建了一个用户,该用户可以通过密码和 unix_socket 进行身份验证:

CREATE USER 'bob'@'localhost' 
  IDENTIFIED VIA mysql_native_password USING PASSWORD('pwd') 
  OR unix_socket;

SHOW CREATE USER 'bob'@'localhost'\G
*************************** 1. row ***************************
CREATE USER for bob@localhost: CREATE USER `bob`@`localhost` 
  IDENTIFIED VIA mysql_native_password 
  USING '*975B2CD4FF9AE554FE8AD33168FBFC326D2021DD' 
  OR unix_socket

如果更新了用户的密码,但在 IDENTIFIED VIA 子句中未指定unix_socket身份验证,则将不再允许使用unix_socket身份验证。

ALTER USER 'bob'@'localhost' IDENTIFIED VIA mysql_native_password 
  USING PASSWORD('pwd2');

SHOW CREATE USER 'bob'@'localhost'\G
*************************** 1. row ***************************
CREATE USER for bob@localhost: CREATE USER `bob`@`localhost` 
  IDENTIFIED BY PASSWORD '*38366FDA01695B6A5A9DD4E428D9FB8F7EB75512'

IDENTIFIED BY 'password'

可选的 IDENTIFIED BY 子句用于为帐户提供密码。密码应以明文形式指定。在存储到 mysql.user 表之前,它将由 PASSWORD 函数进行哈希处理。

例如,如果我们的密码是 mariadb,则可以使用以下方法设置帐户的密码:

ALTER USER foo2@test IDENTIFIED BY 'mariadb';

如果您没有使用 IDENTIFIED BY 子句指定密码,则用户将能够无需密码连接到 MariaDB。空白密码不是匹配任何密码的通配符。如果未设置密码,则用户必须在未提供密码的情况下连接。

此子句支持的唯一 身份验证插件mysql_native_passwordmysql_old_password

IDENTIFIED BY PASSWORD 'password_hash'

可选的 IDENTIFIED BY PASSWORD 子句用于为已经哈希处理的密码提供帐户。密码应指定为由 PASSWORD 函数提供的哈希值。它将按原样存储到 mysql.user 表中。

例如,如果我们的密码是 mariadb,则可以使用以下方法找到哈希值:

SELECT PASSWORD('mariadb');
+-------------------------------------------+
| PASSWORD('mariadb')                       |
+-------------------------------------------+
| *54958E764CE10E50764C2EECBB71D01F08549980 |
+-------------------------------------------+

然后,我们可以使用哈希值设置帐户的密码:

ALTER USER foo2@test 
  IDENTIFIED BY PASSWORD '*54958E764CE10E50764C2EECBB71D01F08549980';

如果您没有使用 IDENTIFIED BY 子句指定密码,则用户将能够无需密码连接到 MariaDB。空白密码不是匹配任何密码的通配符。如果未设置密码,则用户必须在未提供密码的情况下连接。

此子句支持的唯一 身份验证插件mysql_native_passwordmysql_old_password

IDENTIFIED {VIA|WITH} authentication_plugin

可选的 IDENTIFIED VIA authentication_plugin 允许您指定应该由特定 身份验证插件 对帐户进行身份验证。插件名称必须是 SHOW PLUGINS 中的活动身份验证插件。如果它没有显示在该输出中,则您需要使用 INSTALL PLUGININSTALL SONAME 进行安装。

例如,这可以与 PAM 身份验证插件 一起使用:

ALTER USER foo2@test IDENTIFIED VIA pam;

某些身份验证插件允许在 USINGAS 关键字之后指定其他参数。例如,PAM 身份验证插件 接受一个 服务名称

ALTER USER foo2@test IDENTIFIED VIA pam USING 'mariadb';

附加参数的确切含义取决于特定的身份验证插件。

MariaDB 10.4 及更高版本中,如果它作为 PASSWORD() 函数的参数提供,那么 USINGAS 关键字也可以用于向插件提供明文密码。这仅适用于已实现 PASSWORD() 函数钩子的 身份验证插件。例如,ed25519 身份验证插件支持此功能:

ALTER USER safe@'%' IDENTIFIED VIA ed25519 USING PASSWORD('secret');

TLS 选项

默认情况下,MariaDB 在服务器和客户端之间传输数据时不加密。当服务器和客户端在同一主机上运行或在通过其他方式保证安全性的网络中运行时,这通常是可以接受的。然而,在服务器和客户端存在于不同网络或它们在高风险网络中的情况下,缺乏加密确实引入了安全问题,因为恶意行为者有可能窃听它们之间在网络上传输的流量。

为了缓解这种担忧,MariaDB 允许您使用传输层安全性 (TLS) 协议在服务器和客户端之间加密传输数据。TLS 以前被称为安全套接字层 (SSL),但严格来说,SSL 协议是 TLS 的前身,并且该协议的版本现在被认为是不安全的。文档仍然经常使用术语 SSL,出于兼容性原因,与 TLS 相关的服务器系统和状态变量仍然使用前缀 ssl_,但在内部,MariaDB 仅支持其安全的后继者。

有关如何确定您的 MariaDB 服务器是否支持 TLS 的更多信息,请参见 Secure Connections Overview

您可以为特定用户帐户设置某些与 TLS 相关的限制。例如,您可能会将其与需要访问敏感数据的用户帐户一起使用,同时将其发送到您无法控制的网络。可以使用 CREATE USERALTER USERGRANT 语句为用户帐户启用这些限制。以下选项可用:

选项描述
REQUIRE NONE不需要此帐户使用 TLS,但仍然可以使用。
REQUIRE SSL必须使用 TLS,但不需要有效的 X509 证书。此选项不能与其他 TLS 选项结合使用。
REQUIRE X509必须使用 TLS,并且必须具有有效的 X509 证书。此选项意味着 REQUIRE SSL。此选项不能与其他 TLS 选项结合使用。
REQUIRE ISSUER 'issuer'必须使用 TLS,并且必须具有有效的 X509 证书。此外,证书颁发机构必须是通过字符串 issuer 指定的那个。此选项意味着 REQUIRE X509。此选项可以与任意顺序中的 SUBJECTCIPHER 选项结合使用。
REQUIRE SUBJECT 'subject'必须使用 TLS,并且必须具有有效的 X509 证书。此外,证书的主题必须是通过字符串 subject 指定的那个。此选项意味着 REQUIRE X509。此选项可以与任意顺序中的 ISSUERCIPHER 选项结合使用。
REQUIRE CIPHER 'cipher'必须使用 TLS,但不需要有效的 X509 证书。此外,用于连接的加密必须使用在字符串 cipher 中指定的特定密码方法。此选项意味着 REQUIRE SSL。此选项可以与任意顺序中的 ISSUERSUBJECT 选项结合使用。

必须仅对所有指定选项使用一次 REQUIRE 关键字,可以使用 AND 关键字将单个选项分隔开,但不是必需的。

例如,您可以更改用户帐户以要求这些 TLS 选项:

ALTER USER 'alice'@'%'
 REQUIRE SUBJECT '/CN=alice/O=My Dom, Inc./C=US/ST=Oregon/L=Portland' AND
 ISSUER '/C=FI/ST=Somewhere/L=City/ O=Some Company/CN=Peter Parker/emailAddress=p.parker@marvel.com'
 AND CIPHER 'SHA-DES-CBC3-EDH-RSA';

如果为特定用户帐户设置了这些选项中的任何一个,则尝试使用该用户帐户连接的任何客户端都必须配置为使用 TLS 连接。

有关如何在客户端和服务器上启用 TLS 的信息,请参见 Securing Connections for Client and Server

资源限制选项

可以为某些服务器资源设置每个帐户的限制。下表显示了每个帐户可以设置的值:

限制类型描述
MAX_QUERIES_PER_HOUR帐户每小时可以发出的语句数(包括更新)
MAX_UPDATES_PER_HOUR帐户每小时可以发出的更新(而不是查询)数
MAX_CONNECTIONS_PER_HOUR帐户每小时可以启动的连接数
MAX_USER_CONNECTIONS可从同一帐户接受的同时连接数;如果为 0,则将使用 max_connections;如果 max_connections 为 0,则此帐户的同时连接没有限制。
MAX_STATEMENT_TIME用户执行的语句的超时时间(以秒为单位)。另请参见 Aborting Statements that Exceed a Certain Time to Execute

如果将这些限制中的任何一个设置为 0,则该用户的该资源将没有限制。

以下是设置帐户资源限制的示例:

ALTER USER 'someone'@'localhost' WITH
    MAX_USER_CONNECTIONS 10
    MAX_QUERIES_PER_HOUR 200;

这些资源是按帐户跟踪的,这意味着按 'user'@'server' 而不是按用户名或连接跟踪。

可以使用 FLUSH USER_RESOURCESFLUSH PRIVILEGESmysqladmin reload 为所有用户重置计数。

每个帐户的资源限制存储在 mysql 数据库中的 user 表中。用于资源限制的列名为 max_questionsmax_updatesmax_connections(对于 MAX_CONNECTIONS_PER_HOUR)和 max_user_connections(对于 MAX_USER_CONNECTIONS)。

密码过期

MariaDB starting with 10.4.3

除了由 default_password_lifetime 确定的自动密码过期之外,还可以在单个用户基础上设置密码过期时间,以覆盖全局设置,例如:

ALTER USER 'monty'@'localhost' PASSWORD EXPIRE INTERVAL 120 DAY;
ALTER USER 'monty'@'localhost' PASSWORD EXPIRE NEVER;
ALTER USER 'monty'@'localhost' PASSWORD EXPIRE DEFAULT;

有关更多详细信息,请参见 User Password Expiry

帐户锁定

MariaDB starting with 10.4.2

帐户锁定允许特权管理员锁定/解锁用户帐户。如果帐户被锁定,则不会允许新的客户端连接(现有连接不受影响)。例如:

ALTER USER 'marijn'@'localhost' ACCOUNT LOCK;

有关更多详细信息,请参见 Account Locking

MariaDB 10.4.7MariaDB 10.5.8 开始,lock_optionpassword_option 子句可以以任意顺序出现。

另请参阅

Comments

Comments loading...
Content reproduced on this site is the property of its respective owners, and this content is not reviewed in advance by MariaDB. The views, information and opinions expressed by this content do not necessarily represent those of MariaDB or any other party.