MySQL用户与权限管理
用户管理
登录MySQL服务器
mysql -h hostname | hostIP -P port -u usrename -p DatabaseName -e ''
- 参数介绍
- -h 参数:后面接主机名或者主机IP,hostname为主机,hosts为主机IP
- -P 参数:后面接MySQL服务器的端口,通过该参数连接到指定的端口。MySQL服务的默认端口是3306,不使用该参数时自动连接到3306端口,port为连接的端口号
- -u 参数:后面接用户名,username为用户名
- -p 参数 会提示输入密码
- DatabaseName参数 指明登陆到哪一个数据库中。如果没有该参数,就会直接登录到MSQL数据库中,然后可以使用USE命令来选择数据库
- -e 参数:后面可以直接加SQL语句。登录MySQL服务器以后可执行这个SQL语句,然后退出MySQL服务器
创建用户
- 基本语法
CREATE USER 用户名 [@'localhost'] [IDENTIFIED BY '密码'] [, 用户名 [IDENTIFIED BY '密码']];
- 用户参数表示新建用户的账户,由 用户 (User) 和 主机名(Host) 构成
- [ ]表示可选,也就是说,可以指定用户登录时需要密码验证,也可不不指定密码验证,这样用户可以直接登录。
- CREATE USER 语句可以同时创建多个用户
- 创建的用户host 默认是 %,可以在创建时指定
修改用户
UPDATE mysql.user SET USER = '114' WHERE USER = 'WANG5';
## 一定要做,刷新权限
FLUSH PRIVILEGES;
删除用户
- 方式1:使用DROP方式删除(推荐)
DROP USER user[, user]...;
- 方式2:使用 DELETE 方式删除,会在 mysql.db 残留信息,不推荐使用
DELETE FROM mysql.user WHERE Host = 'hostname' AND User = 'username';
FLUSH PRIVILEGES;
设置用户密码
当前用户密码
- 使用 ALTER USER 命令来修改当前用户密码
ALTER USER USER() IDENTIFIED BY 'new_password';
- 使用 SET 语句来修改当前用户密码
SET PASSWORD='new_password'
修改其他用户密码
- 使用 ALTER 语句来修改普通用户密码
ALTER USER user [IDENTIFIED BY '新密码'] [,user [IDENTIFIED BY '新密码']...];
- 使用 SET 命令修改普通用户的密码
SET PASSWORD FOR 'username'@'hostname'='new_password'
MySQL8 密码管理
-
MySQL中记录使用过的历史密码,目前包含如下密码管理功能
- 密码过期:要求定期修改密码
- 密码重用限制:不允许使用旧密码
- 密码强度评估:要求使用高强度的密码
-
密码过期策略
- 在MySQL中,数据库管理员可以手动设置账号密码过期,也可以建立一个自动密码过期策略
- 过期策略可以是全局的,也可以为每个账号设置单独的过期策略
-
手动设置立马过期
- 该语法将用户的密码设置为过期,但是仍然可以登录进入数据库,但无法进行查询。
ALTER USER user PASSWORD EXPIRE
-
手动设置指定时间过期方式1:全局
- MySQL默认使用 default_password_lifetime 系统变量建立全局密码过期策略
- 默认值是0,表示禁用自动密码过期
- 允许的值是正整数N,表示允许的密码生存期。密码必须每隔N天 进行修改
- 方式1:使用SQL语句更改该变量的值并持久化
SET PERSIST default_password_lifetime = 180; ## 建立全局策略,设置密码每隔180天过期
- 方式2:配置文件 my.cnf 中进行维护
[mysqld] default_password_lifetime=180; # 建立全局策略,设置密码每隔180天过期
- MySQL默认使用 default_password_lifetime 系统变量建立全局密码过期策略
-
手动设置指定时间过期方式2:单独设置
- 每个账号既可延用全局密码过期策略,也可单独设置策略。在 CREATE USER 和 ALTER USER 语句上加入 PASSWORD EXPIRE 选项可实现单独设置策略。下面是一些语句示例
#设置kangshifu账号密码每 90 天 过期 CREATE USER 'kangshifu'@'loaclhost' PASSWORD EXPIRE INTERVAL 90 DAY; ALTER USER 'kangshifu'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY; #设置密码永不过期 CREATE USER 'kangshifu'@'localhost' PASSWORD EXPIRE NEVER; ALTER USER 'kangshifu'@'localhost' PASSWORD EXPIRE NEVER; #延用全局密码过期策略 CREATE USER 'kangshifu'@'localhost' PASSWORD EXPIRE DEFAULT; ALTER USER 'kangshiuf'@'localhost' PASSWORD EXPIRE DEFAULT;
-
密码重用策略
-
手动设置密码重用方式1:全局
- 方式1:使用SQL
SET PERSIST password_history = 6; #设置不能选择最近使用过的6个密码 SET PERSISIT password_reuse_interval = 365; #设置不能选择最近一年内的密码
- 方式2:my.cnf 配置文件
[mysqld] password_history=6 password_reuse_interval=365
-
手动设置密码重用方式:单独设置
#不能使用最近5个密码 CREATE USER 'kangshifu'@'localhost' PASSWORD HISTORY 5; ALTER USER 'kangshifu'@'localhost' PASSWORD HISTORY 5; #不能使用最近365内的密码 CREATE USER 'kangshifu'@'localhost' PASSWORD REUSE INTERVAL 365 DAY; ALTER USER 'kangshifu'@'localhost' PASSWORD REUSE INTERVAL 365 DAY;
-
权限管理
权限列表
show privileges;
- CREATE 和 DROP 权限:可以创建新的数据库和表,或删除(移掉)已有的数据库和表。如果将MySQL数据库中的 DROP 权限授予某用户,用户就可以删除 MySQL 访问权限保存的数据库
- SELECT、INSERT、UPDATE 和 DELETE 权限 允许在一个数据库现有的表上实施操作
- SELECT 权限只有在它们真正从一个表中检索行时才被用到
- INDEX 权限 允许创建或删除索引,INDEX 适用于已有的表。
- ALTER 权限可以使用 ALTER TABLE 来更改表的结构和重新命名表
- CREATE ROUTINE 权限 用来创建保存的程序(函数和程序);ALTER ROUTINE权限用来更改和删除保存的程序,EXECUTE 权限用来执行保存的程序
- GRANT 权限 允许授权给其他用户,可用于数据库、表和保存的程序
- FILE 权限 使用户可以使用LOAD DATA INFILE 和 SELECT ... INTO OUTFILE 语句读或写服务器上的文件,任何被授予FILE权限的用户都能读或写MySQL服务器上的任何文件
- MySQL的权限如何分布:
权限分布 | 可能的设置的权限 |
---|---|
表权限 | Select,Insert,Update,Delete,Create,Drop,Grant,References,Index,Alter |
列权限 | Select,Insert,Update,REferences |
过程权限 | Execute,Alter Routine,Create Routine,Grant |
授予权限的原则
- 只授予能满足需要的最小权限
- 创建用户的时候 限制用户的登陆主机
- 为每个用户 设置满足密码复杂度的密码
- 定期清理不需要的用户,回收权限或者删除用户
授予权限
- 有两种方式授予权限
- 角色赋予用户给用户授权
- 直接给用户授权
- 授权命令
- 该权限如果发现没有该用户,则会直接创建一个新用户
GRANT 权限1,权限2,...权限n ON 数据库名称.表名称 TO 用户名@用户地址 [IDENTIFIED BY '密码口令'];
-
比如:
GRANT SELECT,INSERT,DELETE,UPDATE ON atguigudb.* TO li4@localhost; ##给li4用户本地命令行方式,授予atguigudb这个库底下的所有表的增删改查的权限 GRANT ALL PRIVILEGES ON *.* TO joe@'%' IDENTIFIED BY '123'
- ALL PRIVILEGES 是表示所有权限,你也可以使用SELECT、UPDATE等权限
- ON 用来指定权限针对哪些库和表
-
如果需要赋予包括 GRANT 的权限,添加参数 "WITH GRANT OPTION" 这个选项即可,表示该用户可以将自己拥有的权限授予给别人。
-
GRANT重复给用户添加权限
查看权限
- 查看当前用户权限
SHOW GRANTS;
SHOW GRANTS FOR CURRENT_USER;
SHOW GRANTS FOR CURRENT_USER();
SHOW GRANTS FOR 'user'@'主机地址';
收回权限
-
取消已经赋予用户的某些权限
-
注意:再将用户账户从user表删除之前,应该收回相应用户的所有权限
-
收回权限命令
REVOKE 权限1,权限2,..,权限n ON 数据库名称.表名称 FROM 用户名@用户地址;
- 举例
#收回全库全表的所有权限
REVOKE ALL PRIVILEGES ON *.* FROM joe@'%';
#收回mysql库下的所有表的插删改查权限
REVOKE SELECT,INSERT,UPDATE,DELETE ON mysql.* FROM joe@'localhost';
## 需要用户重新登陆后才能生效
权限表
- MySQL服务器通过 权限表 来控制用户对数据库的访问,权限表存放在 mysql 数据库中。MySQL数据库系统会根据这些权限表的内容为每个用户赋予相应的权限。这些权限表中最重要的是 user 表、db表。除此之外,还有 table_priv 表、column_priv 表 和 proc_priv 表等。
USER表
-
范围列
-
host:表示连接类型
- % 表示所有远程通过 TCP 方式的连接
- IP地址 通过制定 ip地址 进行的TCP方式的连接
- 机器名 通过指定网络中的机器名进行的TCP方式的连接
- ::1 IPv6的本地ip地址,等同于IPv4的127.0.0.1
- localhost 本地方式通过命令行方式的连接
-
user:表示用户名
-
authentication_string:密码
-
-
权限列
- Grant_priv字段
- 表示是否拥有GRANT权限
- Shutdown_priv字段
- 表示是否拥有停止MySQL服务的权限
- Super_priv字段
- 表示是否拥有超级权限
- Execute_priv字段
- 表示是否拥有EXECUTE权限
- Select_priv,Insert_priv等
- 为该用户所拥有的权限
- Grant_priv字段
-
安全列
- 有6个字段,ssl相关的(ssl_type,ssl_cipher),用于加密
- x509_issuer,x509_subject,用于标识用户
- 两个Plugin字段用于 验证用户身份 的插件
-
资源控制列
- max_questions:用户每小时允许执行的查询操作次数
- max_update:用户每小时允许执行的更新操作次数
- max_connections:用户每小时允许执行的连接操作次数
- max_user_connections:用户允许同时建立的连接次数
#查看字段
DESC mysql.user;
#查看用户,以列的方式显示数据
SELECT * FROM mysql.user;
#查看特定字段
SELECT host,user FROM mysql.user;
db表
- 查看表结构
DESC mysql.db
- 用户列:用户列拥有3个字段,分别是Host、User、Db。这3个字段分别表示主机名、用户名和数据库名。表示从某个主机连接某个用户对某个数据库的操作权限,这3个字段的组合构成了db表的主键
- 权限列:Create_routine_priv 和 Alter_routine_priv 这两个字段决定用户是否具有创建和修改存储过程的权限
tables_priv表和columns_priv表
- tables_priv表用来对表设置操作权限,colums_priv表用来对表的某一列设置权限
procs_priv表
- procs_priv表可以对存储过程和存储过函数设置操作权限
访问控制
- 连接核实阶段:
- 会使用user表中的host,user和authentication_string这3个字段匹配客户端提供信息
- 如果连接核实没有通过,服务器就完全拒绝访问;否则,服务器接收连接,然后进入阶段2等待用户请求
- 请求核实阶段
- 权限确认时,首先是user表,然后是db表,最后是tables_priv表和columns_priv表
角色管理
- 角色:方便管理拥有相同权限的用户
创建角色
CREATE ROLE 'role_name'[@'@host_name'][,'role_name'[@'host_name']]...
给角色赋予权限
GRANT privileges ON table_name TO 'role_name'[@'host_name'];
SHOW privileges;
查看角色的权限
SHOW GRANTS FOR 'manager'
回收角色的权限
REVOKE privileges ON tablenames FROM 'rolename';
删除角色
DROP ROLE role[,role2]...
给用户赋予角色
GRANT role[,role2...] TO user [,user2,...];#role代表角色,user代表用户
#查询当前用户的角色,如果角色未被激活,结果将显示NONE
SELECT CURRENT_ROLE();
激活角色
- 方式1:使用 set default role 命令激活角色
SET DEFAULT ROLE ALL TO user
- 方式2:将activate_all_roles_on_login 设置为ON
SHOW VARIABLES LIKE 'activate_all_roles_on_login';
SET GLOBAL activate_all_roles_on_login=ON;
撤销用户的角色
REVOKE role FROM user;
设置强制角色 (mandatory role)
-
强制角色:是给每个创建账户的默认角色,不需要手动设置。强制角色无法被REVOKE 或者 DROP
-
方式1:服务启动前设置
[mysqld]
mandatory_roles='role1,role2@locaalhost,r3@%.atguigu.com'
- 方式2:运行时设置
SET PERSIST mandatory_roles = 'role1,role2@locaalhost,r3@%.atguigu.com'; #系统重启后仍然有效
SET GLOBAL mandatory_roles = 'role1,role2@locaalhost,r3@%.atguigu.com'; #系统重启后失效
配置文件的使用
- 与在命令行中指定启动选项不同的是,配置文件中的启动选项被划分为若干个组,每个组有一个组名,用中括号[ ]括起来
启动命令与选项组
- 配置文件中不同的选项组是给不同的启动命令使用的
- [server] 组下边的启动选项将作用于所有的服务器程序
- [cilent] 组下边的启动选项将作用于所有的客户端程序
启动命令 | 类别 | 能读取的组 |
---|---|---|
mysqld | 启动服务器 | [mysqld]、[server] |
mysql_safe | 启动服务器 | [mysqld]、[server]、[mysqld_safe] |
mysql.server | 启动服务器 | [mysqld]、[server]、[mysqld_sserver] |
mysql | 启动客户端 | [mysql]、[client] |
mysqladmin | 启动客户端 | [mysqladmin]、[client] |
mysqldump | 启动客户端 | [mysqldump]、[client] |