用户与权限管理
1.用户管理
Mysql用户可分为普通用户和root用户。root用户拥有所有的权限,包括创建用户,删除用户和修改用户的密码等管理权限;普通用户只拥有被授予的各种权限。
1.1登录MySQL服务器
在命令行中启动mysql的命名如下
mysql -h hostname|hostIP -P port -u username -p DatabaseName -e "SQL语句"
下面是其中参数的定义
- -h参数 后面接 主机名或者主机IP地址,hostname为主机名,hostIP为主机IP
- -P参数 后面接MySql的端口号,MySql默认的端口号为3306,不使用该参数时,自动连接到3306端口,port为连接的端口号
- -u参数 后面接用户名,username为用户名
- -p参数 会提示输入密码,
不写好像直接就能连? - DatabaseName参数指明登录到哪一个数据库中,不写则直接登录进去,之后再用Use也行
- -e参数 后面可以直接加SQL语句。登录MySql服务器以后即可执行此语句。然后会退出MySql服务器
举个例子
mysql -h 127.0.0.1[^hostIP] -P 3306[1] -u root[2] -p bookdb[3] -e "select * from t_user;"[4]
当然了还有精简版的,都选用默认值
mysql -u root -p
一样能进,进去后语句就和平常mysql的查询一样了
(其实-u root什么的也能省,直接输mysql就能进,前提是设置了跳过安全检查)
1.2 创建用户
创建用户的语句依旧是通过create创建的,但是需要先切到'mysql'数据库,(叫这个名的一个数据库)
use mysql;
create user 'username' @'hostname' identified by 'pwd' ;
这里直接创建的用户默认可访问的来源是%,也就是任意IP来源,只要叫这个username名就能访问,
所以创建时最好指定一下来源权限,identified by 后面的是这个用户的密码
需要注意的一点是host和user合起来作为联合主键,也就是说允许存在username相同而hostname不同的两个用户
初始时系统默认的用户
创建成功后的用户
顺带一提,有些同学可能会出现下面的报错
这是因为my.ini里面设置跳过安全检查了,注释了就行
#跳过安全检查
#skip-grant-tables
那我们现在连接上新创建好的用户
成功连接!
但是……
这里面只有一个数据库
再来查看权限
发现也只有一个登录的权限,不过后续可以再赋给其权限
1.3 修改用户
修改用户的命令比较简单,和修改表的基本一致(其实改的就是个表)
update user set user='new username' where user='old username' and host='hostname';
那现在我们把之前的zhang3改成li4试试
修改成功
但是问题来了,当我们尝试去登录li4的账户时,却无法登录
这里有个要注意的点,此时MySql还没有反应过来用户名被修改,所以我们需要手动刷新一下
flush privileges;#刷新权限
这时我们再去登录一下试试
这次就成功了
1.4 删除用户
方法依旧和正常语法相似
DROP User username;
成功删除
drop就不用刷新了
顺带一提,如果有多个同名用户,默认删的是host为%的用户,如果想删对应的记得加上@'hostname'
此外还有种方式可以删除
delete from mysql.user where host='hostname' and user='username'
同样能删,但是不推荐使用,因为通过这种方式,系统会有残留信息保存。drop则删除所有记录信息。
举个好理解的例子,drop user 相当于是卸载软件,delete from 的方式相当于删文件夹
1.5 设置当前用户密码
适用于root用户修改自己的密码,以及普通用户登录后修改自己的密码。
-
使用Alter User命令来修改当前用户密码
Alter User User() Identified by 'new pwd';
-
使用SET语句来修改当前用户密码
SET PASSWORD='new pwd';
该语句会自动将密码加密后再赋给当前用户
1.6 修改其他用户密码
同样两种方式,就不过多解释了
-
使用Alter语句来修改其他普通用户密码
alter user 'username'@'hostname' identified by 'new pwd';
-
使用SET命名来修改其他普通用户密码
SET PASSWORD For 'username'@'hostname'='new pwd';
1.7 MySql密码管理
MySql中记录使用过的历史密码,目前包括如下密码管理功能
- 密码过期:要求定期修改密码。
- 密码重用限制:不允许使用旧密码。
- 密码强度评估:要求使用高强度密码。
1.密码过期策略
手动设置账号密码过期
Alter User 'username' PASSWORD EXPIRE;
该语句将该用户的密码设置为过期,该用户仍然可以正常登录进入数据库,但无法进行查询,只有重新设置了新密码,才能正常使用。
全局设置密码过期
SET Persist defult_password_lifetime = 180;#建立全局策略,设置密码每隔180天过期
单独设置密码过期
#在创建用户时设置每隔90天过期
create user 'username'@'hostname' PASSWORD Expire interval 90 DAY
#修改用户每隔90天过期
alter user 'username'@'hostname' PASSWORD Expire Interval 90 DAY;
#设置密码永不过期
alter user 'username'@'hostname' PASSWORD Expire Interval never;
#延用全局密码过期策略
alter user 'username'@'hostname' PASSWORD Expire Interval default;
2.密码重用策略
账号的历史密码包含过去所使用的密码。
- 如果账号的密码限制基于密码更改的数量,那么新密码不能从最近限制的密码数量中选择。例如,密码更改的限制为3,那么新密码不能与最近3个密码中的任何一个相同
- 如果账号的密码限制基于时间,那么新密码不能从规定时间内选择。例如,密码的重用时间为60,那么新密码不能从最近60天内使用过的密码中选择
password_history:规定密码重用的数量
password_reuse_interval:规定密码重用的周期
全局设置
Set Persist password_history = 3;#设置不能选择最近使用过的6个密码
Set Persist password_reuse_interval = 60;#设置不能从最近60天使用过的密码中选择
单独设置
#不能使用最近5个密码
Create User 'username'@'hostname' PASSWORD History 5;
Alter User 'username'@'hostname' PASSWORD History 5;
#不能使用最近365天内的密码
Create User 'username'@'hostname' PASSWORD Reuse Interval 365 DAY;
Alter User 'username'@'hostname' PASSWORD Reuse Interval 365 DAY;
#既不能用最近5个密码,也不能用365天内用过的密码
Create User 'username'@'hostname'
PASSWORD History 5
PASSWORD Reuse Interval 365 DAY;
#延用全局策略
Create User 'username'@'hostname'
PASSWORD History Default
PASSWORD Reuse Interval Default;
2. 权限管理
2.1 权限列表
show privileges;#查看MySql权限
MySql的权限分布:
权限分布 | 可能的设置的权限 |
---|---|
表权限 | Select,Insert,Update,Delete,Create,Drop,Alter,References,Grant,Index |
列权限 | Select,Insert,Update,References |
过程权限 | Execute,Alter Routine,Grant |
2.2 授予权限的原则
权限控制主要是出于安全因素,因此需要遵循以下几个经验原则
- 只授予能满足需要的最小权限,防止用户干坏事。比如用户只需要查询,那就只给select权限,不给update之类的权限
- 创建用户的时候限制用户的登录主机,一般是限制成指定IP或者内网IP段(就比如在学校能查到学校信息,回家就查不到了,这是限制主机IP了)
- 为每个用户设置满足密码复杂度的密码
- 定期清理不需要的用户,回收权限或者删除用户
2.3 授予权限
授权命令:
Grant 权限1,权限2,…… ON 数据库名称.表名称 TO 'username'@'hostname' [Identified by pwd];
该权限如果发现没有该用户,则会直接新建一个用户
这里我们来给用户li4赋予一下权限,前面我们通过查看权限发现li4只有一个登录的权限,无法进行增删改查
li4能查询到的数据库也只有系统默认数据库
这是root权限下能查询到的数据库(不要在意内容)
现在我们要把dp02数据库下所有表的增删改查权限赋给li4
grant select,update,delete,insert on dp02.* to 'li4';
这时li4用户再查询数据库就有dp02了
权限也有了
使用数据库,然后查询表内容都没有问题
此外,如果想把权限全部赋给一个用户,可以使用下面的语句
grant all privileges on *.* to 'username'@'hostname';
这样就把全部数据库的全部权限赋给该用户了
那么问题来了,这时候该用户权限是否和root权限一样呢?
答案是否定的,此时虽然该用户获得了几乎所有权限,但还是有一点和root权限不同,就是该用户无法给别的用户赋予权限。就好比root权限是皇帝,该用户是太子,太子几乎拥有皇帝的一切权力,但是皇帝能去给自己孩子立太子,太子不能给自己兄弟立太子,毕竟自己也是被立上来的;同时皇帝也能废掉太子,皇子可不能废太子。
2.4 查看权限
SHOW GRANTS;#查看当前用户权限
SHOW GRANTS FOR 'username'@'hostname'#查看某用户全局权限
这里没什么好说的
2.5 收回权限
收回用户不必要的权限可以在一定程度上保证系统的安全性
注意:在将用户账户从user表删除之前,应该收回相应用户的所有权限。
#收回权限命令
REVOKE 权限1,权限2,…… ON 数据库名称.表名称 FROM 'username'@'hostname';
同样拿li4举例子,这里回收他的查询和更改命令
REVOKE select,update on dp02.* from 'li4';
值得一提的是,收回权限要在目标用户重新登录后才能生效
重新登录以后,已经无法查询了
insert语句还是能正常执行的
如果想要删除该用户所有权限,仍然是all priviliges
revoke all privileges on *.* from 'username'@'hostname';