创建用户与用户权限grant

2019-11-11

创建和修改用户:

CREATE USER [IF NOT EXISTS]
    user [auth_option] [, user [auth_option]] ...
    [REQUIRE {NONE | tls_option [[AND] tls_option] ...}]
    [WITH resource_option [resource_option] ...]
    [password_option | lock_option] ...

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

ALTER USER [IF EXISTS]
    USER() IDENTIFIED BY 'auth_string'

-- 身份验证,默认由default_authentication_plugin系统变量定义的身份验证插件和空密码
auth_option: {
    IDENTIFIED BY 'auth_string' #将帐户身份验证插件设置为默认插件,将明文值传递给该插件以进行可能的散列,并将结果存储在系统表的帐户行中
  | IDENTIFIED WITH auth_plugin #将帐户身份验证插件设置为auth_plugin,将凭据清除为空字符(这些凭证与旧的认证插件相关联,而不是与新认证插件相关联),并将结果存储在mysql.user系统表的帐户行中,此外,密码标记为已过期。下次连接时,用户必须选择一个新的。
  | IDENTIFIED WITH auth_plugin BY 'auth_string' #将帐户身份验证插件设置为 auth_plugin,将明文值auth_string传递给该插件以进行可能的散列,并将结果存储在系统表的帐户行中 
  | IDENTIFIED WITH auth_plugin AS 'auth_string' #将帐户认证插件设置为auth_plugin,并将'auth_string'值存储为mysql中的值。用户帐户行。如果插件需要哈希字符串,则假定该字符串已经按照插件要求的格式进行了哈希处理
  | IDENTIFIED BY PASSWORD 'auth_string'
}

-- SSL/TLS加密 默认NONE
tls_option: {
   SSL #告诉服务器仅允许该语句命名的所有帐户的加密连接
 | X509 #要求客户端提供一个有效的证书,但是确切的证书、颁发者和主题并不重要。惟一的要求是,应该能够使用一个CA证书来验证其签名。使用X.509证书总是意味着加密,因此在这种情况下没有必要使用SSL选项。对于具有REQUIRE X509的帐户,客户必须指定--ssl-key和--ssl-cert选项进行连接。(建议但不要求 --ssl-ca也进行指定,以便可以验证服务器提供的公共证书。)这对ISSUER和SUBJECT且也是如此,因为这些REQUIRE选项暗示了的要求X509
 | CIPHER 'cipher' #需要一个特定的加密连接的密码方法。为了确保使用了足够强度的密码和密钥长度,需要使用此选项。如果使用使用短加密密钥的旧算法,加密可能会很弱。
 | ISSUER 'issuer' #要求客户端出示由CA颁发的有效X.509证书 。如果客户端出示的证书有效但具有不同的颁发者,则服务器将拒绝连接
 | SUBJECT 'subject' #要求客户端提供一个包含subject主题的有效X.509证书。如果客户端提供的证书是有效的,但具有不同的主题,则服务器拒绝连接。MySQL对“subject”值与证书中的值会进行简单的字符串比较,因此字母大小写和组件顺序必须与证书中给出的完全一致
}

-- 资源限制默认0无限制
resource_option: {
    MAX_QUERIES_PER_HOUR count #每小时允许每个帐户进行count次查询
  | MAX_UPDATES_PER_HOUR count #每小时允许每个帐户进行count次更新
  | MAX_CONNECTIONS_PER_HOUR count #每小时允许每个帐户进行count次连接
  | MAX_USER_CONNECTIONS count #限制每个帐户同时连接到服务器的最大数量为count,如果count为0,则服务器根据max_user_connections系统变量的全局值确定该帐户的并发连接数 。如果max_user_connections也为零,则该帐户没有限制。
}

-- 密码管理,过期策略 默认为PASSWORD EXPIRE DEFAULT;支持多个密码过期管理的password_option值。策略选项不会使密码过期,服务器会根据帐户密码使用期限对帐户应用自动过期;在密码过期后的下次连接时要重新设置密码
password_option: {
    PASSWORD EXPIRE #将密码标记为过期
  | PASSWORD EXPIRE DEFAULT #使账号应用default_password_lifetime指定的全局到期策略
  | PASSWORD EXPIRE NEVER #会覆盖账号到期的全局策略。对于每个密码,它都会禁用密码过期,以便密码永不过期。
  | PASSWORD EXPIRE INTERVAL N DAY #将密码有效期设置为N几天
}
-- 用户是否锁定 默认为ACCOUNT UNLOCK
lock_option: {
    ACCOUNT LOCK
  | ACCOUNT UNLOCK
}

示例

创建用户

CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'password';

修改密码

注:如果使用(如CREATE USER、GRANT、SET PASSWORD)和调用PASSWORD()函数的语句,密码将已纯文本的方式编写,并被写入MYSQL服务器的日志中,其中的密码对于任何访问这些日志的人都是可见的,以下语句可以避免这种情况

  • CREATE USER ... IDENTIFIED BY ...
  • ALTER USER ... IDENTIFIED BY ...
  • GRANT ... IDENTIFIED BY ...
  • SET PASSWORD ...

更改当前用户密码。 将USER()改为指定用户,则修改指定用户的密码

ALTER USER USER() IDENTIFIED BY 'auth_string';

更改帐户密码并使其在登陆一次后失效。用户必须使用指定的密码进行连接,并在下一次连接时要更换一个新密码:

ALTER USER 'jeffrey'@'localhost' IDENTIFIED BY 'new_password' PASSWORD EXPIRE;

修改一个帐户以使用 sha256_password身份验证插件和给定的密码。要求每180天更换一个新密码:

ALTER USER 'jeffrey'@'localhost'
  IDENTIFIED WITH sha256_password BY 'new_password'
  PASSWORD EXPIRE INTERVAL 180 DAY;

锁定或解锁帐户:

ALTER USER 'jeffrey'@'localhost' ACCOUNT LOCK;
ALTER USER 'jeffrey'@'localhost' ACCOUNT UNLOCK;

要求一个帐户使用SSL进行连接并每小时只允许建立20个连接:

ALTER USER 'jeffrey'@'localhost' REQUIRE SSL WITH MAX_CONNECTIONS_PER_HOUR 20;

更改多个帐户,并指定每个帐户的一些属性和一些全局属性:

ALTER USER
  'jeffrey'@'localhost' IDENTIFIED BY 'new_password',
  'jeanne'@'localhost'
  REQUIRE SSL WITH MAX_USER_CONNECTIONS 2;

IDENTIFIED BY following的值仅适用于jeffrey帐户,其余属性全局应用于语句中命名的所有帐户,因此对于两个帐户:
使用SSL需要连接。
该帐户最多可用于两个同时连接。

身份验证

将密码指定为明文;使用默认插件:

ALTER USER 'jeffrey'@'localhost' IDENTIFIED BY 'password';

指定身份验证插件以及明文密码值:

ALTER USER 'jeffrey'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

指定身份验证插件以及哈希密码值:

ALTER USER 'jeffrey'@'localhost' IDENTIFIED WITH mysql_native_password AS '*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4';

SSL验证

REQUIRE选项的顺序无关紧要,但是不能指定两次该选项。REQUIRE可选关键字AND设置多个SSL选项 。

ALTER USER 'jeffrey'@'localhost' REQUIRE ISSUER '/C=SE/ST=Stockholm/L=Stockholm/O=MySQL/CN=CA/emailAddress=ca@example.com';
ALTER USER 'jeffrey'@'localhost' REQUIRE SUBJECT '/C=SE/ST=Stockholm/L=Stockholm/O=MySQL demo client certificate/CN=client/emailAddress=client@example.com';
ALTER USER 'jeffrey'@'localhost' REQUIRE CIPHER 'EDH-RSA-DES-CBC3-SHA';
ALTER USER 'jeffrey'@'localhost' REQUIRE SUBJECT '/C=SE/ST=Stockholm/L=Stockholm/O=MySQL demo client certificate/CN=client/emailAddress=client@example.com' AND ISSUER '/C=SE/ST=Stockholm/L=Stockholm/O=MySQL/CN=CA/emailAddress=ca@example.com' AND CIPHER 'EDH-RSA-DES-CBC3-SHA';

删除用户

语法:删除一个或多个MySQL帐户及其特权。

DROP USER [IF EXISTS] user [, user] ...

示例:

DROP USER 'jeffrey'@'localhost';

注:

  • DROP USER不会自动关闭任何打开的用户会话。而且如果删除了打开了会话的用户,则该语句在该用户的会话关闭之前不会生效。会话关闭后,该用户将被丢弃,并且该用户的下一次登录尝试失败。
  • DROP USER不会自动删除旧用户创建的数据库或其中的对象或使其无效。这包括被DEFINER属性命名为已删除用户的存储程序或视图。如果这些对象在definer安全上下文中执行,尝试访问这些对象可能会产生错误。

修改用户名

RENAME USER old_user TO new_user [, old_user TO new_user] ...

修改不会自动删除旧用户创建的数据库和其中的对象或使它们无效。这包括DEFINER属性名称为旧用户的存储程序或视图。如果尝试在定义程序安全性上下文中执行,则尝试访问此类对象可能会产生错误。

用户权限grant

  • 账号首次创建时没有权限,需要使用GRANT进行分配
  • GRANT支持最多60个字符的主机名,用户名最多可以包含32个字符,数据库,表,列和例程的名称最多可以包含64个字符
GRANT
    priv_type [(column_list)]
      [, priv_type [(column_list)]] ...
    ON [object_type] priv_level
    TO user [auth_option] [, user [auth_option]] ...
    [REQUIRE {NONE | tls_option [[AND] tls_option] ...}]
    [WITH {GRANT OPTION | resource_option} ...]

GRANT PROXY ON user
    TO user [, user] ...
    [WITH GRANT OPTION]

object_type: {
    TABLE
  | FUNCTION
  | PROCEDURE
}

priv_level: {
    *
  | *.*
  | db_name.*
  | db_name.tbl_name
  | tbl_name
  | db_name.routine_name
}

auth_option: {
    IDENTIFIED BY 'auth_string'
  | IDENTIFIED WITH auth_plugin
  | IDENTIFIED WITH auth_plugin BY 'auth_string'
  | IDENTIFIED WITH auth_plugin AS 'auth_string'
  | IDENTIFIED BY PASSWORD 'auth_string'
}

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
}

全局权限

全局权限是管理性的,适用于给定服务器上的所有数据库。要分配全局特权,使用ON *.*语法;其他特权可以全局授予,也可以在特定的级别授予

GRANT ALL ON *.* TO 'someuser'@'somehost';
GRANT SELECT, INSERT ON *.* TO 'someuser'@'somehost'
  1. SUPER:允许使用其他管理操作,如CHANGE MASTER TO、KILL、PURGE BINARY LOGS、SET GLOBAL和mysqladmin调试命令
  2. FILE:允许使用服务器读取或写入文件
  3. RELOAD:允许FLUSH操作
  4. PROCESS:允许用户使用SHOW PROCESSLIST查看所有进程
  5. SHUTDOWN:允许使用mysqladmin关机
  6. CREATE USER:允许使用CREATE USER、DROP USER、RENAME USER和REVOKE ALL PRIVILEGES
  7. SHOW DATABASES:显示所有数据库
  8. REPLICATION SLAVE:使副本能够从源读取二进制日志事件
  9. CREATE TABLESPACE:允许创建、修改或删除表空间和日志文件组
  10. REPLICATION CLIENT:允许用户查询源服务器或副本服务器在哪里

数据库权限

数据库权限适用于给定数据库中的所有对象。要分配数据库级权限,使用语法: ON db_name.*

GRANT ALL ON mydb.* TO 'someuser'@'somehost';
GRANT SELECT, INSERT ON mydb.* TO 'someuser'@'somehost';
  1. DROP:允许删除数据库、表和视图
  2. EVENT:允许使用事件计划程序
  3. CREATE:允许创建数据库和表
  4. REFERENCES:允许创建外键表
  5. LOCK TABLES:允许在拥有select权限的表上使用表锁
  6. GRANT OPTION:允许授予其他帐户权限或从其他帐户中删除的权限
  7. CREATE ROUTINE:允许创建存储程序

表权限

表特权适用于给定表中的所有列。表权限适用于基表和视图,不适用于临时表。要分配表级特权,使用语法: ON db_name.tbl_name

GRANT ALL ON mydb.mytbl TO 'someuser'@'somehost';
GRANT SELECT, INSERT ON mydb.mytbl TO 'someuser'@'somehost';
  1. DROP:允许删除表和视图
  2. ALTER:允许修改表
  3. INDEX:允许创建和删除索引
  4. CREATE:允许创建
  5. DELETE:允许删除
  6. INSERT:允许插入数据
  7. SELECT:允许查询
  8. UPDATE:允许更新
  9. TRIGGER:允许操作触发器
  10. SHOW VIEW:允许使用SHOW CREATE VIEW
  11. REFERENCES:允许创建外键表
  12. CREATE VIEW:允许创建和更改视图
  13. GRANT OPTION:允许授予其他帐户权限或从其他帐户中删除的权限
  14. CREATE ROUTINE:允许创建存储程序

列权限

列特权适用于给定表中的单个列。在列级别要授予的每个特权都必须在权限后加上括号和一个或多个列

GRANT SELECT (col1), INSERT (col1, col2) ON mydb.mytbl TO 'someuser'@'somehost';
  1. INSERT:允许插入数据
  2. UPDATE:允许更新
  3. SELECT:允许查询
  4. REFERENCES:允许创建外键表

存储程序权限

适用于存储例程(过程和函数)。可以在全局和数据库级别授予它们。可以在存储程序级别为单个存储程序授予这些特权

GRANT EXECUTE ON PROCEDURE mydb.myproc TO 'someuser'@'somehost';
  1. EXECUTE:允许执行存储程序
  2. GRANT OPTION:允许授予其他帐户权限或从其他帐户中删除的权限
  3. ALTER ROUTINE:允许修改和删除

代理用户权限

使一个用户可以成为另一个用户的代理。代理用户模拟或获取代理用户的权限
GRANT PROXY ON 'localuser'@'localhost' TO 'externaluser'@'somehost';
当PROXY被授予时,它必须是GRANT语句中的唯一权限,唯一允许的WITH选项是WITH GRANT OPTION。
代理要求代理用户通过插件进行身份验证,该插件在代理用户连接时将代理用户的名称返回到服务器,并且代理用户必须具有PROXY特权的代理用户。

隐式帐户创建

如果在GRANT 语句中命名的帐户不存在,则采取的操作取决于 NO_AUTO_CREATE_USERSQL模式:
如果NO_AUTO_CREATE_USER未启用,则GRANT将创建帐户。除非您使用IDENTIFIED BY指定非空密码,否则这是非常不安全的。
如果NO_AUTO_CREATE_USER启用,则GRANT失败,并且不会创建帐户,除非您使用IDENTIFIED BY来指定非空密码或使用IDENTIFIED WITH来命名身份验证插件。如果该帐户已经存在,IDENTIFIED WITH则被禁止,因为该帐户仅在创建新帐户时使用。

分配权限时可以在主机名中指定通配符。例如,'user_name'@'%.example.com'适用于example.com域中任何主机的user_name,而'user_name'@'198.51.100.%'适用于198.51.100类C子网中的任何主机的user_name。
MySQL在用户名中不支持通配符。要引用匿名用户,请使用以下GRANT语句指定一个用户名为空的帐户 :

GRANT ALL ON test.* TO ''@'localhost' ...;

撤销用户权限

方法1:必须具有GRANT OPTION 权限,并且必须具有要撤消的权限。

REVOKE
    priv_type [(column_list)]
      [, priv_type [(column_list)]] ...
    ON [object_type] priv_level
    FROM user [, user] ...

REVOKE PROXY ON user
    FROM user [, user] ...

方法2:将删除一个或多个指定用户的所有全局,数据库,表,列和存储过程权限的所有权限

REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] ...

 

{/if}