文章目录
一、简介
- DCL(Data Control Language、数据控制语言)
- 用于定义数据库、表、字段、用户的 访问权限和安全级别。
- 主要的语句关键字包括 GRANT 、 REVOKE 、 COMMIT 、 ROLLBACK 、 SAVEPOINT 等。
二、用户管理
2.1 CRUD
- 用户名参数表示新建用户的账户,由 用户(User) 和 主机名(Host) 构成,默认 host 是 ‘%’
- 实例:
CREATE USER 'kangshifu'@'localhost' IDENTIFIED BY '123456';
- 常见的主机名(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 ;
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 ~]
[root@mysql01 ~]
[1] 6736
[root@mysql01 ~]
2020-09-20T08:39:41.209970Z mysqld_safe Starting mysqld daemon with databases from /data/mysql/data
[root@mysql01 ~]
....
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 ~]
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 ~]
[root@mysql01 ~]
[root@mysql01 ~]
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 过期策略(了解)
- 数据库管理员可以
手动设置
账号密码过期,也可以建立一个自动
密码过期策略。 - 过期策略可以是
全局的
,也可以为每个账号
设置单独的过期策略。
SET PERSIST default_password_lifetime = 180;
[mysqld]
default_password_lifetime=180
ALTER USER 'kangshifu'@'localhost' PASSWORD EXPIRE;
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 重用策略(了解)
SET PERSIST password_history = 6;
SET PERSIST password_reuse_interval = 365;
[mysqld]
password_history=6
password_reuse_interval=365
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;
三、权限管理
权限 | 说明 |
---|
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 授予权限
- 只授予能
满足需要的最小权限
。 - 创建用户的时候
限制用户的登录主机
,一般是限制成指定IP或者内网IP段。 - 为每个用户
设置满足密码复杂度的密码
。 定期清理不需要的用户
,回收权限或者删除用户。
GRANT SELECT,INSERT,DELETE,UPDATE ON atguigudb.* TO li4@localhost;
GRANT ALL PRIVILEGES ON *.* TO joe@'%'
3.2 查看权限
SHOW GRANTS;
SHOW GRANTS FOR CURRENT_USER;
SHOW GRANTS FOR CURRENT_USER();
SHOW GRANTS FOR 'user'@'主机地址' ;
mysql.user
:记录用户账号和权限信息mysql.db
:某个主机连接某个用户对某个数据库的操作权限mysql.tables_priv
:对表设置操作权限mysql.columns_priv
:对表的某一列设置权限mysql.procs_priv
:对存储过程和存储函数设置操作权限
3.3 收回权限
REVOKE ALL PRIVILEGES ON *.* FROM joe@'%';
REVOKE SELECT,INSERT,UPDATE,DELETE ON mysql.* FROM joe@localhost;
四、角色管理

4.1 使用角色
- 语法:CREATE ROLE ‘role_name’[@‘host_name’] [,‘role_name’[@‘host_name’]]…
- 说明:角色名称的命名规则和用户名类似。如果 host_name省略,默认为% ,role_name不可省略 ,不可为空。
- 创建角色之后,默认这个角色是没有任何权限的
- 语法:
GRANT privileges ON db_name.table_name TO 'role_name'[@'host_name'];
- 实例:
GRANT SELECT ON demo.settlement TO 'manager';
- 角色创建并授权后,要赋给用户并处于
激活状态
才能发挥作用。 - 语法:
GRANT role [,role2,...] TO user1@host [, user2@host, ...];
- 实例:
GRANT 'school_read' TO 'kangshifu'@'localhost';
mysql> SELECT CURRENT_ROLE();
+
| CURRENT_ROLE() |
+
| NONE |
+
1 row in set (0.00 sec)
mysql>
- 方式一:使用
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';
- 方式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`@`%` |
+
- 语法:
REVOKE privileges ON tablename FROM 'rolename';
- 实例:
REVOKE INSERT, UPDATE, DELETE ON school.* FROM 'school_write';
- 如果你删除了角色,那么用户也就失去了通过这个角色所获得的所有权限 。
- 语法:
DROP ROLE role [,role2] ...
- 语法:
REVOKE role FROM user;
- 实例:
REVOKE 'school_read' FROM 'kangshifu'@'localhost';
4.3 强制角色
- Roles the server should treat as mandatory.
- In effect, these roles are automatically granted to every user.
- Setting mandatory_roles does not actually change any user accounts.
- 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';