【Mysql数据库从0到1】-入门基础篇--用户与权限管理
- 🔻一、Mysql 用户管理
- 1.1 🍃 Mysql服务器登录
- 1.2 🍃 用户创建
- 1.3 🍃 用户修改
- 1.4 🍃 用户删除
- 1.5 🍃 用户密码修改
- 1.6 🍃 用户密码管理
- 🔻二、Mysql 权限管理
- 2.1 🍃 mysql数据库权限列表
- 2.2 🍃 数据库授权原则
- 2.3 🍃 数据库授权
- 2.4 🍃 数据库查看权限
- 2.5 🍃 数据库收回权限
- 2.6 🍃 数据库权限表
- 2.7 🍃 数据库访问控制
- 🔻三、总结—温故知新
🔻一、Mysql 用户管理
Mysql 用户分为root用户和普通用户,其中root用户是数据库超级管理员,拥有所有权限(创建、删除、修改密码、授权等管理权限),普通用户只拥有被授予的权限。
Mysql数据库的安全性通过账户管理来保障。
1.1 🍃 Mysql服务器登录
🍀 简单使用
[root@db-server ~]# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 8.0.32 MySQL Community Server - GPL
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> use test01;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select * from tab1;
+------+--------+-------+
| id | name | class |
+------+--------+-------+
| 1001 | 曹操 | 1班 |
| 1002 | 张飞 | 1班 |
| 1003 | 项羽 | 3班 |
| 1004 | 刘备 | 2班 |
+------+--------+-------+
4 rows in set (0.00 sec)
mysql>
🍀 复杂使用
#### mysql -h hostname|hostIP -P port -u username -p DatabaseName -e "sql语句";
[root@db-server ~]# mysql -h localhost -P 3306 -p test01 -e "select * from tab1";
Enter password:
+------+--------+-------+
| id | name | class |
+------+--------+-------+
| 1001 | 曹操 | 1班 |
| 1002 | 张飞 | 1班 |
| 1003 | 项羽 | 3班 |
| 1004 | 刘备 | 2班 |
+------+--------+-------+
[root@db-server ~]#
1.2 🍃 用户创建
推荐使用create user
命令创建用户,Mysql 8.0 版本移除了password加密方法,不再推荐使用insert
在user
表直接添加用户。
创建用户时,必须拥有 create user
权限,新创建的用户只有登录权限。
#####语法#####
create user '用户名'@'用户地址' identified by '密码';
mysql> create user liubei identified by 'Liubei@123456'; #默认host是 %
Query OK, 0 rows affected (0.01 sec)
####指定host创建用户####
mysql> create user 'liubei'@'localhost' identified by 'Liubei@123456';
Query OK, 0 rows affected (0.00 sec)
mysql> select host ,user from user;
+-----------+------------------+
| host | user |
+-----------+------------------+
| % | liubei |
| % | root |
| % | zyl |
| localhost | liubei |
| localhost | mysql.infoschema |
| localhost | mysql.session |
| localhost | mysql.sys |
+-----------+------------------+
7 rows in set (0.00 sec)
mysql>
用户名以username@hostname格式跟在create user子句之后。表user以host 和user为共同主键,可以创建同名用户(如:liubei)。
####新创建的用户只有登录权限####
mysql> show grants;
+--------------------------------------------+
| Grants for liubei@localhost |
+--------------------------------------------+
| GRANT USAGE ON *.* TO `liubei`@`localhost` |
+--------------------------------------------+
1 row in set (0.00 sec)
mysql>
1.3 🍃 用户修改
#####语法#####
update 表名 set user='新用户名' where user='旧用户名' and host='用户地址';
mysql> update mysql.user set user='liubei01' where user='liubei' and host='localhost';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> flush privileges; ###修改之后需要flush privileges 刷新权限。
Query OK, 0 rows affected (0.01 sec)
mysql>
1.4 🍃 用户删除
mysql数据库可以使用drop user
语句删除普通用户,也可在mysql.user
表中删除用户。
💦 方式一、使用drop
删除(推荐)
用户必须具备drop user
权限,才能使用drop删除,可以同时删除多个用户,用户之间用逗号隔开:
####语法####
drop user 用户名[,用户名2] [,用户名3]...;
drop user '用户名'@'用户地址'
mysql> drop user liubei; ###默认删除host 为%用户
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges; ###删除之后需要flush privileges 刷新权限。
Query OK, 0 rows affected (0.00 sec)
mysql>
💦 方式二、使用delete
删除(不推荐)
使用delete
删除 ,会有残留信息,而drop user
命令会删除用户及其对应权限,mysql.user
和mysql.db
对应记录都会删除。
####语法####
delete from 表名 where user='用户名' and host='用户地址';
mysql> delete from mysql.user where user='liubei01' and host='loaclhost';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges; ###删除之后需要flush privileges 刷新权限。
Query OK, 0 rows affected (0.00 sec)
mysql>
1.5 🍃 用户密码修改
⛳ 修改当前用户密码
查看当前登录mysql用户:
mysql> select user();
+----------------+
| user() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)
mysql>
适用于root
用户修改自己密码,其他普通用户
登录修改自己密码。
因root
用户具有数据库最高权限,所以必须保证root
用户密码安全,推荐使用alter user
修改密码,也可使用set 语句
修改,Mysql 8.0 版本移除了PASSWORD
加密方法,不再推荐使用update
语句直接操作user表修改密码(authentication_string 字段)。
select host ,user ,authentication_string from user;
💦 方式一、使用alter user
修改当前用户密码
####语法####
alter user user() identified by '新密码';
mysql> alter user user() identified by 'Zyl@123456'; ###当前root用户登录
Query OK, 0 rows affected (0.01 sec)
mysql>
💦 方式二、使用set
语句修改当前用户密码
####语法####
set password='新密码';
mysql> set password='Zyl@123456'; ###当前root用户登录
Query OK, 0 rows affected (0.01 sec)
mysql>
⛳修改其他普通用户密码
其他用户密码,可以通过root用户修改,还可自己修改,同样使用alter user
修改密码,或者使用set 语句
修改。
💦 方式一、使用alter user
修改普通用户密码
####语法####
alter user 用户名@'用户地址' identified by '新密码';
mysql> alter user liubei01@'localhost' identified by 'Liubei@123456'; ###修改用户liubei01密码
Query OK, 0 rows affected (0.00 sec)
mysql>
💦 方式二、使用set
语句修改普通用户密码
####语法####
set password for '用户名'@'用户地址' ='新密码';
mysql> set password for 'liubei01'@'localhost' ='Liubei@123456'; ###修改用户liubei01密码
Query OK, 0 rows affected (0.01 sec)
mysql>
💦 方式三、使用update
语句修改普通用户密码
适用于Mysql 5.7
,在Mysql 8.0
中不再适用(会报错
),Mysql 8.0 版本移除了password
加密方法。
####语法####
update mysql.user set authentication_string =PASSWORD("新密码") where user ='用户名' and host='主机名';
mysql> update mysql.user set authentication_string =PASSWORD("Liubei@123456") where user ='liubei01' and host='localhost';
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '("Liubei@123456") where user ='liubei01' and host='localhost'' at line 1
mysql>
1.6 🍃 用户密码管理
mysql密码管理只针对使用mysql授权插件的账号,插件有(mysql_native_password、sha256_password、caching_sha2_password
)。
⛳ 密码过期—要求定期修改密码
密码过期策略可以是全局的,也可单独设置账号过期策略。过期策略可手动设置,也可建立自动过期策略。
💦 方式一、手动设置密码过期策略立即过期—某个账户
使用 alter user 用户名 password EXPIRE
语句设置,用户可以正常登录,但无法查询,只有设置新密码后才能正常使用。
####语法####
alter user 用户名@'用户地址' password EXPIRE;
alter user liubei01@'localhost' password EXPIRE;
mysql> alter user liubei01@'localhost' password EXPIRE; ###手动设置liubei01用户密码过期
Query OK, 0 rows affected (0.00 sec)
mysql>
💦 方式二、手动设置密码过期策略—全局
如果密码使用时间大于允许使用的时间,服务器会自动设置过期。
mysql 使用default_password_lifetime 系统变量建立全局密码过期策略。默认值为0
–表示禁用密码过期,值为N
—表示允许的密码生存周期,密码需要每隔N天
修改。
🌿 1、使用sql语句更改default_password_lifetime 值,并持久化
## 建立全局密码过期策略,每隔180天过期
mysql> set persist default_password_lifetime = 180;
Query OK, 0 rows affected (0.00 sec)
mysql>
🌿 2、配置my.cnf文件
[mysqld]
## 建立全局密码过期策略,每隔180天过期
persist default_password_lifetime = 180
💦 方式三、手动设置密码过期策略—指定时间过期
数据库用户账号可以沿用全局密码过期策略,也可单独设置,在create user
或者alter user
语句上加上PASSWORD EXPIRE
选项即可实现单独设置策略。
🍀 1、设置180天过期
#####语法#####
create user '用户名'@'用户地址' identified by '密码' PASSWORD EXPIRE interval 过期时间 day;
mysql> create user 'liubei02'@'localhost' identified by 'Liubei@123456' PASSWORD EXPIRE interval 180 day;
Query OK, 0 rows affected (0.00 sec)
mysql>
#####语法#####
alter user '用户名'@'用户地址' PASSWORD EXPIRE interval 过期时间 day;
mysql> alter user 'liubei01'@'localhost' PASSWORD EXPIRE interval 180 day;
Query OK, 0 rows affected (0.00 sec)
mysql>
🍀 2、设置永不过期
#####语法#####
create user '用户名'@'用户地址' identified by '密码' PASSWORD EXPIRE never;
mysql> create user 'liubei03'@'localhost' identified by 'Liubei@123456' PASSWORD EXPIRE never;
Query OK, 0 rows affected (0.00 sec)
mysql>
#####语法#####
alter user '用户名'@'主机名' PASSWORD EXPIRE never;
mysql> alter user 'liubei03'@'localhost' PASSWORD EXPIRE never;
Query OK, 0 rows affected (0.00 sec)
mysql>
🍀 3、沿用全局密码过期策略
#####语法#####
create user '用户名'@'用户地址' identified by '密码' PASSWORD EXPIRE default;
mysql> create user 'liubei04'@'localhost' identified by 'Liubei@123456' PASSWORD EXPIRE default;
Query OK, 0 rows affected (0.00 sec)
#####语法#####
alter user '用户名'@'用户地址' PASSWORD EXPIRE default;
mysql> alter user 'liubei04'@'localhost' PASSWORD EXPIRE default;
Query OK, 0 rows affected (0.00 sec)
mysql>
⛳ 密码重用限制—不允许使用旧密码
重用策略基于密码的更改数量和使用时间,可以是全局的,也可以是单独的,mysql使用password_history
和password_reuse_interval
系统变量设置密码重用策略,可以在my.cnf
中配置维护,也可使用sql语句
改变变量的值并持久化。
- 如果账号密码限制基于密码的更改数量(
password_history
):新密码则不能从最近使用过的密码中选择。如:密码更改数量值为3
,则新密码不能与最近3
个相同。 - 如果账号密码限制基于密码的使用时间(
password_reuse_interval
):新密码不能从归定时间选择,如:设置密码重用周期为180天
,则新密码不能与最近180天
内使用过的密码相同。
💦 方式一、手动设置密码重用策略—全局
🌿 1、使用sql语句
#####语法 不能使用最近5个使用过的密码#####
set persist password_history=数量值
mysql> set persist password_history=5;
Query OK, 0 rows affected (0.00 sec)
#####语法 不能使用最近180天使用过的密码#####
set password_reuse_interval=数量值
mysql> set password_reuse_interval=180;
Query OK, 0 rows affected (0.00 sec)
mysql>
🌿 2、配置my.cnf文件
[mysqld]
## 不能使用最近5个使用过的密码
password_history=5
## 不能使用最近180天使用过的密码
password_reuse_interval=180
💦 方式二、手动设置密码重用策略—单独设置
#####语法 不能使用最近5个使用过的密码#####
create user '用户名'@'用户地址' identified by '密码' PASSWORD history 5;
mysql> create user 'liubei04'@'localhost' identified by 'Liubei@123456' PASSWORD history 5;
Query OK, 0 rows affected (0.00 sec)
#####语法 不能使用最近5个使用过的密码#####
mysql> alter user 'liubei04'@'localhost' PASSWORD history 5;
Query OK, 0 rows affected (0.00 sec)
#####语法 不能使用最近180天使用过的密码#####
create user '用户名'@'用户地址' identified by '密码' PASSWORD reuse inteval 时间值 day;
mysql> create user 'liubei04'@'localhost' identified by 'Liubei@123456' PASSWORD reuse interval 180 day;
Query OK, 0 rows affected (0.00 sec)
#####语法 不能使用最近180天使用过的密码#####
alter user 用户名'@'主机名' PASSWORD reuse inteval 时间值 day;
mysql> alter user 'liubei04'@'localhost' PASSWORD reuse interval 180 day;
Query OK, 0 rows affected (0.00 sec)
⛳ 密码强度评估—要求使用高强度密码
查看密码强度相关的配置
mysql> show variables like '%validate_password%';
+--------------------------------------+--------+
| Variable_name | Value |
+--------------------------------------+--------+
| validate_password.check_user_name | ON |
| validate_password.dictionary_file | |
| validate_password.length | 8 |
| validate_password.mixed_case_count | 1 |
| validate_password.number_count | 1 |
| validate_password.policy | MEDIUM |
| validate_password.special_char_count | 1 |
+--------------------------------------+--------+
7 rows in set (0.00 sec)
mysql>
validate_password.check_user_name=ON----检查密码与用户名
validate_password.policy----用于检查密码 的字典文件的路径名
validate_password.length=8— 密码长度
validate_password.mixed_case_count=1----必须包含1个大写和1个小写
validate_password.number_count=1----必须包含1个数字
validate_password.special_char_count=1----必须包含1个特殊字符
🔻二、Mysql 权限管理
权限即是允许你做的事情,不可以越界,如只有本机登录权限,就不能从其他设备登录,只有select
权限,就不能update
和insert
。
2.1 🍃 mysql数据库权限列表
mysql> show privileges;
+------------------------------+---------------------------------------+-------------------------------------------------------+
| Privilege | Context | Comment |
+------------------------------+---------------------------------------+-------------------------------------------------------+
| Alter | Tables | To alter the table |
| Alter routine | Functions,Procedures | To alter or drop stored functions/procedures |
| Create | Databases,Tables,Indexes | To create new databases and tables |
| Create routine | Databases | To use CREATE FUNCTION/PROCEDURE |
| Create role | Server Admin | To create new roles |
| Create temporary tables | Databases | To use CREATE TEMPORARY TABLE |
| Create view | Tables | To create new views |
| Create user | Server Admin | To create new users |
| Delete | Tables | To delete existing rows |
| Drop | Databases,Tables | To drop databases, tables, and views |
| Drop role | Server Admin | To drop roles |
| Event | Server Admin | To create, alter, drop and execute events |
| Execute | Functions,Procedures | To execute stored routines |
| File | File access on server | To read and write files on the server |
| Grant option | Databases,Tables,Functions,Procedures | To give to other users those privileges you possess |
| Index | Tables | To create or drop indexes |
...................................................
💦 mysql 权限分布:
权限分布 | 可设置权限 |
---|---|
表级权限 | Select、 Insert、 Update、 Delete、Create 、Drop、Grant、 References、 lndex、 Alter |
列级权限 | Select、 Insert、 Update、References |
过程权限 | Execute、Alter Routine、Grant |
2.2 🍃 数据库授权原则
- 💦 只赋予满足使用的最小权限,如某用户只需
select
权限,就不授予其他权限。 - 💦 创建用户时,指定登录主机,一般限制指定
ip
或者ip段
。 - 💦 为用户设置满足密码复杂度的密码。
- 💦 定期清理不使用的用户,回收权限或删除用户。
2.3 🍃 数据库授权
用户是数据库的使用者,可以给用户不同权限,控制对数据库的访问,保障数据库安全。
--- with grant option,表示该用户可以将自己的权限授权给别人。
##授权命令1##
grant 权限1,权限2,权限3,权限n on 数据库名称.表名 to '用户名'@'用户地址' with grant option;
##授权命令2 ##
grant all privileges on *.* to '用户名'@'用户地址' with grant option;
mysql> grant select ,update on test01.* to 'liubei'@'%'; ##授权liubei账号select ,update权限
Query OK, 0 rows affected (0.00 sec)
mysql> show grants; ##查看当前登录用户权限
+----------------------------------------------------+
| Grants for liubei@% |
+----------------------------------------------------+
| GRANT USAGE ON *.* TO `liubei`@`%` |
| GRANT SELECT, UPDATE ON `test01`.* TO `liubei`@`%` |
+----------------------------------------------------+
2 rows in set (0.00 sec)
mysql>
可以看到没授权liubei账户delete权限,删除数据报错。
2.4 🍃 数据库查看权限
- 查看当前用户权限:
mysql> show grants;
+----------------------------------------------------+
| Grants for liubei@% |
+----------------------------------------------------+
| GRANT USAGE ON *.* TO `liubei`@`%` |
| GRANT SELECT, UPDATE ON `test01`.* TO `liubei`@`%` |
+----------------------------------------------------+
2 rows in set (0.00 sec)
或
mysql> show grants for current_user;
+----------------------------------------------------+
| Grants for liubei@% |
+----------------------------------------------------+
| GRANT USAGE ON *.* TO `liubei`@`%` |
| GRANT SELECT, UPDATE ON `test01`.* TO `liubei`@`%` |
+----------------------------------------------------+
2 rows in set (0.00 sec)
或
mysql> show grants for current_user();
+----------------------------------------------------+
| Grants for liubei@% |
+----------------------------------------------------+
| GRANT USAGE ON *.* TO `liubei`@`%` |
| GRANT SELECT, UPDATE ON `test01`.* TO `liubei`@`%` |
+----------------------------------------------------+
2 rows in set (0.00 sec)
mysql>
- 查看某用户全局权限:
mysql> show grants for 'liubei'@'%';
+----------------------------------------------------+
| Grants for liubei@% |
+----------------------------------------------------+
| GRANT USAGE ON *.* TO `liubei`@`%` |
| GRANT SELECT, UPDATE ON `test01`.* TO `liubei`@`%` |
+----------------------------------------------------+
2 rows in set (0.00 sec)
mysql>
2.5 🍃 数据库收回权限
mysql 使用revoke 语句取消用户的某些权限,收回用户不必要的权限,可在一定程度上保证数据库的安全性。
❗ 从user表删除用户之前,应先收回想赢用户的权限。
#####语法1 ####
revoke 权限1,权限2,权限n on 数据库名.表名 from `用户名`@`用户地址`;
#####语法2 ####
revoke all privileges on *.* from '用户名'@'用户地址';
mysql> revoke SELECT, UPDATE ON test01.* from `liubei`@`%`;
Query OK, 0 rows affected (0.00 sec)
mysql> revoke all privileges on *.* from `liubei`@`%`;
Query OK, 0 rows affected (0.01 sec)
mysql>
2.6 🍃 数据库权限表
mysql 服务器通过权限表来控制用户对数据库的访问,权限表存放于mysql
表中,其中最重要的是user表,db表,table_priv表、column_priv 和proc_priv 等,启动mysql服务时,会将这些表中权限信息读入内存。
2.7 🍃 数据库访问控制
当mysql允许一个用户执行各种操作时,它将首先核实该用户向MySQL服务器发送的连接请求,然后确认用户的操作请求是否被允许。这个过程称为mysql中的访问控制过程。
mysql的访问控制分为两个阶段: 连接核实阶段和 请求核实阶段。
🔻三、总结—温故知新
❓ Mysql 数据库用户创建、修改、删除、密码修改
❓ Mysql数据库权限查看、收回、及授权
❓ Mysql数据库权限表及访问控制
👈【上一篇】 |
💖The End💖 点点关注,收藏不迷路💖
| 【下一篇】👉 |