1.DCL数据库控制语言
(Data Control Language 数据库控制语言)
- 数据库授权、角色控制等操作
- GRANT用户授权,为用户赋予访问权限
- REVOKE取消权限,撤回授权权限
2.MySQL权限表
2.1mysql.user
- 用户字段:Host、User、Password
- 权限字段:_Priv结尾的字段
- 安全字段:ssl x509字段
- 资源控制字段:max_开头的字段
2.2mysql.db
- 权限字段:剩下的_priv结尾的字段
2.3mysql.tables_priv,mysql.columns_priv、procs_priv
- 表、列、存储过程的授权表
2.4授权级别排列
- mysql.user #全局授权
- mysql.db #数据库级别授权
- 其他#表级,列级授权
2.5数据库和表格式
数据库.* 数据库中的所有
数据库.表名 指定数据库中的某张表
数据库名.存储过程 指定数据库中的存储过程
*.* 所有数据库
2.6用户和IP格式
用户名@IP地址 用户名只能在改IP下才能访问
用户名@192.168.1.% 用户名只能在改IP段下才能访问(通配符%表示任意)
用户名@%.123.com
用户名@% 用户可以再任意IP下访问(默认IP地址为%)
3.MySQL用户管理
3.1创建用户
//创建用户及权限
> create user 'zhangsan'@'localhost' identified by 'A.123com';
> grant all on *.* to 'zhangsan'@'192.168.0.%' identified by 'A.123com';
> select user,host from mysql.user;
# mysql -h192.168.0.2 -uzhangsan -p'A.123com';
3.2删除用户
//删除用户
> drop user 'zhangsan'@'192.168.0.%';
//delete语句删除
> delete from mysql.user where user='zhangsan' and host='localhost';
3.3修改用户
//修改用户
> rename user 'zhangsan'@'192.168.0.%' to 'lisi'@'192.168.0.%';
3.4修改密码
3.4.1root修改密码
> flush privileges;
//方法一
# mysqladmin -uroot -p'A.123com' password 'A.1234com'
//方法二
> alter user 'root'@'localhost' identified by 'A.123com';
//方法三
> SET PASSWORD=password('A.123com');
3.4.2root修改其他用户密码
> alter user 'zhangsan'@'192.168.0.%' identified by 'A.123com';
> grant select on *.* to 'zhangsan'@'192.168.0.%' identified by 'A.123com';
3.4.3普通用户修改自己密码
> set password=password('A.123com');
3.5root找回密码
# vim /etc/my.cnf
...
//设置免密码登录
skip-grant-tables
# systemctl restart mysqld
# mysql
> use mysql;
> update user set authentication_string=password('A.123com') where user='root';
//最后配置文件改回来
4.密码策略
4.1安装密码插件
- MySQL默认启用了复杂度设置,插件:validate_password
> install plugin validate_password soname 'validate_password.so'
4.2修改配置文件
# vim /etc/my.cnf
[mysqld]
plugin-load=validate_password.so
balidate_password_policy=0
validate-password=FORCE_PLUS_PERMANENT
4.3策略
- validate_password_policy
- 代表的密码策略,可配置的值有以下:默认MEDIUM
- 0 or LOW仅需符合密码长度(由validate_password_length指定)
- 1 or MEDIUM满足LOW策略通知还需要满足至少1个数字,小写字母,大写字母和特殊字符
- 2 or STRONG满足MEDIUM策略,同时密码不能存在(与字典密码相同)字典文件(dictionary file)中
- validate_password_dictionary_file
- 用于配置密码的字典文件,当validate_password_policy设置为STRONG时可以配置密码字典文件,字典文件存在的面不得使用。
- validate_password_length
- 用来设置密码的最小长度,默认值是8,最小是4
- validate_password_mixed_case_count
- 大小写的最小个数
- validate_password_number_count
- 密码中数字的最小个数
- validate_password_special_char_count
- 特殊字符的最小个数
> show variables like 'validate%'; //查看密码策略规则
> set global validate_password_length=1; //至少为4位
> set global validate_policy=0; //关闭密码复杂度
> grant all on *.* to 'zhangsan'@'%' identified by '1234';
> flush privileges;
> select @@validate_password_policy; //查看密码复杂性策略
LOW
> select @@validate_password_length; //查看密码复杂性最短长度
5.权限回收
- 被回收的权限必须存在,否则出错
- 整个服务器,使用GRANT ALL和REVOKE ALL;
- 整个数据库,使用ON datebase.*
- 特定的表:使用ON datebase.table
> show grants for 'zhangsan'@'%'; //查看用户权限
GRANT SELECT,INSERT,... ON *.* to 'zhangsan'@'%'
> revoke select on *.* from 'zhangsan'@'%'; //回收select
> revoke all on *.* from 'zhangsan'@'%'; //回收所有权限
> show grants for 'zhangsan2'@'%';
GRANT ALL PRIVILEGES ON `test`.* to 'zhangsan2'@'%'
> revoke select,insert on test.* from zhangsan2@'%';
> show grants for 'zhangsan2'@'%'; //select,insert被去掉
GRANT UPDATE,... ON `test`.* to 'zhangsan2'@'%'
> flush privileges;
- flush privileges是将当前user和privilege表中的用户信息/权限设置从mysql库(MySQL数据库的内置库)中提取到内存里
- MySQL用户数据和权限有修改后,搜索希望在“不重启MySQL服务器”的情况下直接生效,那么就需要执行这个命令。
6.授权及设置密码
6.1授权及设置密码
- 可以简化多次授权,并用逗号分隔
- GRANT需要明确一下信息
- 要授予的权限
- 被授予权限的数据库或表
权限 | 权限级别 | 权限说明 |
---|---|---|
CREATE | 数据库、表或索引 | 创建数据库、表或索引权限 |
DROP | 数据库或表 | 删除数据库或表权限 |
GRANT OPTION | 数据库、表或保存的程序 | 赋予权限选项 |
PEFERENCES | ||
ALTER | 表 | 更改,比如添加字段、索引等 |
DELETE | 删除数据权限 | |
INDEX | 索引权限 | |
INSERT | 插入权限 | |
SELECT | 查询权限 |
UPDATE | 更新权限 | |
---|---|---|
CREATE VIEW | 视图 | 创建试图权限 |
SHOW VIEW | 查看视图权限 | |
ALTER ROUTINE | 存储过程 | 更改存储过程权限 |
CREATE ROUTINE | 创建存储过程权限 | |
EXECUTE | 执行存储过程权限 | |
FILE | 服务器主机上的文件访问 | 文件访问权限 |
CREATE TEMPOPARY TABLE | 服务器管理 | 创建临时表权限 |
LOCK TABLES | 锁表权限 | |
CREATE USER | 创建用户权限 | |
RELOAD | 执行flush-hosts,flush-logs,flush-privileges,flush-status,flush-tables,flush-threads,refresh,reload等命令的权限 | |
PROCESS | 查看进程权限 | |
REPLICATION CLIENT | 复制权限 | |
REPLICATION SLAVE | ||
SHOW DATABASES | 查看数据库权限 | |
SHUTDOWN | 关闭数据库权限 | |
SUPER | 服务期管理 | 执行kill线程权限 |
权限分布 | 设置的权限 |
---|---|
表权限 | 'select','Insert','Update','Delete','Create','Drop','Grant','References','index','Alter' |
列权限 | 'Select','Insert','Update','References' |
过程权限 | 'Execute','Alter Routine','Grant' |
6.2实例
> grant all on *.* to 'zhangsan'@'%' identified by '1234'; //密码策略已改
> show grants for zhangsan@'%';