MySQL 基础篇 -- DCL

文章目录

  • 一、简介
  • 二、用户管理
    • 2.1 CRUD
    • 2.2 密码管理
      • 2.2.1 修改密码
      • 2.2.2 忘记密码
      • 2.2.3 过期策略(了解)
      • 2.2.4 重用策略(了解)
    • 2.3 密码强度
  • 三、权限管理
    • 3.1 授予权限
    • 3.2 查看权限
    • 3.3 收回权限
  • 四、角色管理
    • 4.1 使用角色
    • 4.2 操纵角色
    • 4.3 强制角色

一、简介

  • DCL(Data Control Language、数据控制语言)
  1. 用于定义数据库、表、字段、用户的 访问权限和安全级别
  2. 主要的语句关键字包括 GRANT 、 REVOKE 、 COMMIT 、 ROLLBACK 、 SAVEPOINT 等。

二、用户管理

2.1 CRUD

  • 创建用户

CREATE USER 用户名 [IDENTIFIED BY ‘密码’] [,用户名 [IDENTIFIED BY ‘密码’]];

  1. 用户名参数表示新建用户的账户,由 用户(User) 和 主机名(Host) 构成,默认 host 是 ‘%’
  2. 实例:CREATE USER 'kangshifu'@'localhost' IDENTIFIED BY '123456';
  3. 常见的主机名(Host)形式:
用户 白名单
user@’%’ 全开放
user@‘localhost’ 本地
user@‘127.0.0.1’ 本地
user@‘10.0.0.%’ 24位掩码
user@‘10.0.0.5%’ [50-59]
user@‘10.0.0.0/255.255.254.0’ 23位掩码
user@‘10.0.%’ 16位掩码
mysql> SELECT user, host FROM mysql.user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| rayslee          | %         |
| root             | %         |
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+
6 rows in set (0.00 sec)

mysql> 
  • 修改用户
UPDATE mysql.user SET USER='li4' WHERE USER='wang5';

FLUSH PRIVILEGES;
  • 删除用户
DROP USER li4 ; # 默认删除host为%的用户

DROP USER 'kangshifu'@'localhost';

2.2 密码管理

2.2.1 修改密码

  • 修改当前用户的密码
ALTER USER USER() IDENTIFIED BY 'new_password';
# 或
SET PASSWORD='new_password';
# 或
mysqladmin password -u[user] -p # 回车先输旧密码再设置新密码
  • 修改其它用户的密码
ALTER USER  'user'@'host' IDENTIFIED BY 'new_password' [,'user'@'host' IDENTIFIED BY 'new_password']] …;
# 或
SET PASSWORD FOR 'username'@'hostname'='new_password';
# 或
UPDATE MySQL.user SET authentication_string=PASSWORD("123456")
WHERE User = "username" AND Host = "hostname";

2.2.2 忘记密码

[root@mysql01 ~]# systemctl stop mysqld
[root@mysql01 ~]# mysqld_safe --skip-grant-tables --skip-networking &
[1] 6736
[root@mysql01 ~]# 2020-09-20T08:39:41.185821Z mysqld_safe Logging to '/data/mysql/data/mysql01.err'.
2020-09-20T08:39:41.209970Z mysqld_safe Starting mysqld daemon with databases from /data/mysql/data

[root@mysql01 ~]# mysql
....
mysql> update mysql.user set authentication_string='' where user='root' and host='localhost';
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1  Changed: 0  Warnings: 0

mysql> quit
Bye
[root@mysql01 ~]# ps -ef | grep mysql
root        6736    6618  0 16:39 pts/2    00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --skip-grant-tables --skip-networking
mysql       6919    6736  0 16:39 pts/2    00:00:03 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/data/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --skip-grant-tables --skip-networking --log-error=mysql01.err --pid-file=mysql01.pid --socket=/tmp/mysql.sock --port=3306
root        7215    6618  0 16:48 pts/2    00:00:00 grep --color=auto mysql
[root@mysql01 ~]# kill -9 6736 6919
[root@mysql01 ~]# systemctl start mysqld
[root@mysql01 ~]# mysqladmin password -uroot -p
Enter password: 
New password: 
Confirm new password: 
Warning: Since password will be sent to server in plain text, use ssl connection to ensure password safety.
[root@mysql01 ~]# 

2.2.3 过期策略(了解)

  • 简介
  1. 数据库管理员可以手动设置账号密码过期,也可以建立一个自动密码过期策略。
  2. 过期策略可以是全局的,也可以为每个账号设置单独的过期策略。
  • 全局
# 1.1 使用SQL语句更改该变量的值并持久化
SET PERSIST default_password_lifetime = 180; # 建立全局策略,设置密码每隔180天过期
# 1.2 或配置文件my.cnf中进行维护
[mysqld]
default_password_lifetime=180 #建立全局策略,设置密码每隔180天过期

# 2. 使用户按照全局策略过期
ALTER USER 'kangshifu'@'localhost' PASSWORD EXPIRE;
  • 单独指定
#设置kangshifu账号密码每90天过期:
CREATE USER 'kangshifu'@'localhost' 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 'kangshifu'@'localhost' PASSWORD EXPIRE DEFAULT;

2.2.4 重用策略(了解)

  • 全局
# 使用SQL
SET PERSIST password_history = 6; #设置不能选择最近使用过的6个密码
SET PERSIST password_reuse_interval = 365; #设置不能选择最近一年内的密码

# 或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;

# 既不能使用最近5个密码,也不能使用365天内的密码
CREATE USER 'kangshifu'@'localhost'
PASSWORD HISTORY 5
PASSWORD REUSE INTERVAL 365 DAY;

ALTER USER 'kangshifu'@'localhost'
PASSWORD HISTORY 5
PASSWORD REUSE INTERVAL 365 DAY;

2.3 密码强度

  • 简介
  1. 在 MySQL 8.0 之前,MySQL 使用的是 validate_password 插件检测、验证账号密码强度,保障账号的安全性。
  2. In MySQL 8.0, the validate_password plugin was reimplemented as the validate_password component.
  3. The validate_password plugin is deprecated; expect it to be removed in a future version of MySQL.
  • 安装/卸载
INSTALL PLUGIN validate_password SONAME 'validate_password.so';
INSTALL COMPONENT 'file://component_validate_password';

UNINSTALL PLUGIN validate_password;
UNINSTALL COMPONENT 'file://component_validate_password';
  • 关于 validate_password 组件对应的系统变量说明:
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 设置为ON的时候表示能将密码设置成当前用户名。
validate_password_dictionary_file 用于检查密码的字典文件的路径名,默认为空
validate_password_length 8 密码的最小长度,也就是说密码长度必须大于或等于8
validate_password_mixed_case_count 1 如果密码策略是中等或更强的,validate_password要求密码具有的小写和大写字符的最小数量。对于给定的这个值密码必须有那么多小写字符和那么多大写字符。
validate_password_number_count 1 密码必须包含的数字个数
validate_password_policy MEDIUM 密码强度检验等级,可以使用数值0、1、2或相应的符号值LOW、MEDIUM、STRONG来指定。 0/LOW :只检查长度。1/MEDIUM :检查长度、数字、大小写、特殊字符。 2/STRONG :检查长度、数字、大小写、特殊字符、字典文件。
validate_password_special_char_count 1 密码必须包含的特殊字符个数
  • 修改安全策略
#注意,如果是插件的话,SQL为set global validate_password_policy=LOW
SET GLOBAL validate_password_policy=LOW;
SET GLOBAL validate_password_policy=0; # For LOW

SET GLOBAL validate_password_length=1;

三、权限管理

  • 常用权限
权限 说明
CREATE和DROP 可以创建新的数据库和表,或删除(移掉)已有的数据库和表。如果将MySQL数据库中的DROP权限授予某用户,用户就可以删除MySQL访问权限保存的数据库。
SELECT、INSERT、UPDATE和DELETE 允许在一个数据库现有的表上实施操作。
SELECT 只有在它们真正从一个表中检索行时才被用到。
INDEX 允许创建或删除索引,INDEX适用于已有的表。如果具有某个表的CREATE权限,就可以在CREATE TABLE语句中包括索引定义。
ALTER 可以使用ALTER TABLE来更改表的结构和重新命名表。
CREATE ROUTINE 用来创建保存的程序(函数和程序),ALTER ROUTINE权限用来更改和删除保存的程序, EXECUTE权限 用来执行保存的程序。
GRANT 允许授权给其他用户,可用于数据库、表和保存的程序。
FILE 使用户可以使用LOAD DATA INFILE和SELECT … INTO OUTFILE语句读或写服务器上的文件,任何被授予FILE权限的用户都能读或写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                             |
| Insert                      | Tables                                | To insert data into tables                            |
| Lock tables                 | Databases                             | To use LOCK TABLES (together with SELECT privilege)   |
| Process                     | Server Admin                          | To view the plain text of currently executing queries |
| Proxy                       | Server Admin                          | To make proxy user possible                           |
| References                  | Databases,Tables                      | To have references on tables                          |
| Reload                      | Server Admin                          | To reload or refresh tables, logs and privileges      |
| Replication client          | Server Admin                          | To ask where the slave or master servers are          |
| Replication slave           | Server Admin                          | To read binary log events from the master             |
| Select                      | Tables                                | To retrieve rows from table                           |
| Show databases              | Server Admin                          | To see all databases with SHOW DATABASES              |
| Show view                   | Tables                                | To see views with SHOW CREATE VIEW                    |
| Shutdown                    | Server Admin                          | To shut down the server                               |
| Super                       | Server Admin                          | To use KILL thread, SET GLOBAL, CHANGE MASTER, etc.   |
| Trigger                     | Tables                                | To use triggers                                       |
| Create tablespace           | Server Admin                          | To create/alter/drop tablespaces                      |
| Update                      | Tables                                | To update existing rows                               |
| Usage                       | Server Admin                          | No privileges - allow connect only                    |
| SHOW_ROUTINE                | Server Admin                          |                                                       |
| RESOURCE_GROUP_USER         | Server Admin                          |                                                       |
| REPLICATION_APPLIER         | Server Admin                          |                                                       |
| PASSWORDLESS_USER_ADMIN     | Server Admin                          |                                                       |
| INNODB_REDO_LOG_ENABLE      | Server Admin                          |                                                       |
| XA_RECOVER_ADMIN            | Server Admin                          |                                                       |
| GROUP_REPLICATION_STREAM    | Server Admin                          |                                                       |
| GROUP_REPLICATION_ADMIN     | Server Admin                          |                                                       |
| FLUSH_USER_RESOURCES        | Server Admin                          |                                                       |
| FLUSH_TABLES                | Server Admin                          |                                                       |
| PERSIST_RO_VARIABLES_ADMIN  | Server Admin                          |                                                       |
| ROLE_ADMIN                  | Server Admin                          |                                                       |
| BACKUP_ADMIN                | Server Admin                          |                                                       |
| CONNECTION_ADMIN            | Server Admin                          |                                                       |
| SET_USER_ID                 | Server Admin                          |                                                       |
| SESSION_VARIABLES_ADMIN     | Server Admin                          |                                                       |
| RESOURCE_GROUP_ADMIN        | Server Admin                          |                                                       |
| INNODB_REDO_LOG_ARCHIVE     | Server Admin                          |                                                       |
| BINLOG_ENCRYPTION_ADMIN     | Server Admin                          |                                                       |
| REPLICATION_SLAVE_ADMIN     | Server Admin                          |                                                       |
| SYSTEM_VARIABLES_ADMIN      | Server Admin                          |                                                       |
| SYSTEM_USER                 | Server Admin                          |                                                       |
| APPLICATION_PASSWORD_ADMIN  | Server Admin                          |                                                       |
| TABLE_ENCRYPTION_ADMIN      | Server Admin                          |                                                       |
| SERVICE_CONNECTION_ADMIN    | Server Admin                          |                                                       |
| AUDIT_ADMIN                 | Server Admin                          |                                                       |
| AUTHENTICATION_POLICY_ADMIN | Server Admin                          |                                                       |
| BINLOG_ADMIN                | Server Admin                          |                                                       |
| ENCRYPTION_KEY_ADMIN        | Server Admin                          |                                                       |
| CLONE_ADMIN                 | Server Admin                          |                                                       |
| FLUSH_OPTIMIZER_COSTS       | Server Admin                          |                                                       |
| FLUSH_STATUS                | Server Admin                          |                                                       |
+-----------------------------+---------------------------------------+-------------------------------------------------------+
65 rows in set (0.00 sec)

mysql> 

3.1 授予权限

给用户授权的方式有 2 种,分别是通过把 角色赋予用户给用户授权 和 直接给用户授权 。

  • 授予权限的原则
  1. 只授予能满足需要的最小权限
  2. 创建用户的时候限制用户的登录主机,一般是限制成指定IP或者内网IP段。
  3. 为每个用户设置满足密码复杂度的密码
  4. 定期清理不需要的用户,回收权限或者删除用户。

GRANT 权限1,权限2,…权限n ON 数据库名称.表名称 TO 用户名@用户地址 [IDENTIFIED BY ‘密码口令’];

# 给li4用户用本地命令行方式,授予atguigudb这个库下的所有表的插删改查的权限。
GRANT SELECT,INSERT,DELETE,UPDATE ON atguigudb.* TO li4@localhost;

# 授予通过网络方式登录的joe用户 ,对所有库所有表的全部权限。注意这里唯独不包括grant的权限
GRANT ALL PRIVILEGES ON *.* TO joe@'%' 

3.2 查看权限

  • 查看当前用户权限
SHOW GRANTS;
# 或
SHOW GRANTS FOR CURRENT_USER;
# 或
SHOW GRANTS FOR CURRENT_USER();
  • 查看某用户的全局权限
SHOW GRANTS FOR 'user'@'主机地址' ;
  • 权限记录表
  1. mysql.user:记录用户账号和权限信息
  2. mysql.db:某个主机连接某个用户对某个数据库的操作权限
  3. mysql.tables_priv:对表设置操作权限
  4. mysql.columns_priv:对表的某一列设置权限
  5. mysql.procs_priv:对存储过程和存储函数设置操作权限

3.3 收回权限

注意:在将用户账户从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 基础篇 -- DCL_第1张图片

4.1 使用角色

  • 创建角色
  1. 语法:CREATE ROLE ‘role_name’[@‘host_name’] [,‘role_name’[@‘host_name’]]…
  2. 说明:角色名称的命名规则和用户名类似。如果 host_name省略,默认为% ,role_name不可省略 ,不可为空。
  • 给角色赋予权限
  1. 创建角色之后,默认这个角色是没有任何权限的
  2. 语法:GRANT privileges ON db_name.table_name TO 'role_name'[@'host_name'];
  3. 实例:GRANT SELECT ON demo.settlement TO 'manager';
  • 给用户赋予角色
  1. 角色创建并授权后,要赋给用户并处于激活状态才能发挥作用。
  2. 语法:GRANT role [,role2,...] TO user1@host [, user2@host, ...];
  3. 实例:GRANT 'school_read' TO 'kangshifu'@'localhost';
# !! 如果角色未激活,结果将显示NONE。

mysql> SELECT CURRENT_ROLE();
+----------------+
| CURRENT_ROLE() |
+----------------+
| NONE           |
+----------------+
1 row in set (0.00 sec)

mysql> 
  • 激活角色
  1. 方式一:使用set default role命令激活角色
SET DEFAULT ROLE ALL TO 'kangshifu'@'localhost';

# SET DEFAULT ROLE ALL TO 'kangshifu'@'localhost';
SET DEFAULT ROLE ALL TO
'dev1'@'localhost',
'read_user1'@'localhost',
'read_user2'@'localhost',
'rw_user1'@'localhost';
  1. 方式2:将activate_all_roles_on_login设置为 ON
mysql> show variables like 'activate_all_roles_on_login';
+-----------------------------+-------+
| Variable_name               | Value |
+-----------------------------+-------+
| activate_all_roles_on_login | OFF   |
+-----------------------------+-------+
1 row in set (0.08 sec)

mysql> SET GLOBAL activate_all_roles_on_login=ON;

4.2 操纵角色

  • 查看
mysql> SHOW GRANTS FOR 'manager';
+-------------------------------------------------------+
| Grants for manager@%                                  |
+-------------------------------------------------------+
| GRANT USAGE ON *.* TO `manager`@`%`                   |
| GRANT SELECT ON `demo`.`goodsmaster` TO `manager`@`%` |
| GRANT SELECT ON `demo`.`invcount` TO `manager`@`%`    |
| GRANT SELECT ON `demo`.`settlement` TO `manager`@`%`  |
+-------------------------------------------------------+
  • 回收角色的权限
  1. 语法:REVOKE privileges ON tablename FROM 'rolename';
  2. 实例:REVOKE INSERT, UPDATE, DELETE ON school.* FROM 'school_write';
  • 删除角色
  1. 如果你删除了角色,那么用户也就失去了通过这个角色所获得的所有权限 。
  2. 语法:DROP ROLE role [,role2] ...
  • 撤销用户的角色
  1. 语法:REVOKE role FROM user;
  2. 实例:REVOKE 'school_read' FROM 'kangshifu'@'localhost';

4.3 强制角色

  • Introduction
  1. Roles the server should treat as mandatory.
  2. In effect, these roles are automatically granted to every user.
  3. Setting mandatory_roles does not actually change any user accounts.
  4. The granted roles are not visible in the mysql.role_edges system table.
  • 服务启动前设置
[mysqld]
mandatory_roles='role1,role2@localhost,r3@%.atguigu.com'
  • 运行时设置
SET PERSIST mandatory_roles = 'role1,role2@localhost,r3@%.example.com'; #系统重启后仍然有效
SET GLOBAL mandatory_roles = 'role1,role2@localhost,r3@%.example.com'; #系统重启后失效

你可能感兴趣的:(MySQL,sql)