关于MySQL账号授权和回收的那点“破事”!

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 本篇带领对用户的授权和回收似懂非懂的朋友进行简单剖析,希望能起到抛砖引玉的效果。放弃前戏,直奔主题!!!

实战未动,语法先行

1. 在MySQL中,拥有GRANT权限的用户才可以执行GRANT语句,其语法格式如下:

GRANT priv_type [(column_list)] ON database.table
TO user [IDENTIFIED BY [PASSWORD] 'password']
[, user[IDENTIFIED BY [PASSWORD] 'password']] ...
[WITH with_option [with_option]...]
  • priv_type 参数表示权限类型;
  • columns_list 参数表示权限作用于哪些列上,省略该参数时,表示作用于整个表;
  • database.table 用于指定权限的级别;
  • user 参数表示用户账户,由用户名和主机名构成,格式是“'username'@'hostname'”;
  • IDENTIFIED BY 参数用来为用户设置密码;
  • password 参数是用户的新密码。

2. WITH 关键字后面带有一个或多个 with_option 参数。这个参数有 5 个选项,详细介绍如下:

  • GRANT OPTION:被授权的用户可以将这些权限赋予给别的用户;
  • MAX_QUERIES_PER_HOUR count:设置每个小时可以允许执行 count 次查询;
  • MAX_UPDATES_PER_HOUR count:设置每个小时可以允许执行 count 次更新;
  • MAX_CONNECTIONS_PER_HOUR count:设置每小时可以建立 count 个连接;
  • MAX_USER_CONNECTIONS count:设置单个用户可以同时具有的 count 个连接。

3. MySQL 中可以授予的权限有如下几组:

  • 列权限,和表中的一个具体列相关。例如,可以使用 UPDATE 语句更新表 students 中 name 列的值的权限。
  • 表权限,和一个具体表中的所有数据相关。例如,可以使用 SELECT 语句查询表 students 的所有数据的权限。
  • 数据库权限,和一个具体的数据库中的所有表相关。例如,可以在已有的数据库 mytest 中创建新表的权限。
  • 用户权限,和 MySQL 中所有的数据库相关。例如,可以删除已有的数据库或者创建一个新的数据库的权限。

4. 对应地,在 GRANT 语句中可用于指定权限级别的值有以下几类格式:

  • *:表示当前数据库中的所有表。
  • *.*:表示所有数据库中的所有表。
  • db_name.*:表示某个数据库中的所有表,db_name 指定数据库名。
  • db_name.tbl_name:表示某个数据库中的某个表或视图,db_name 指定数据库名,tbl_name 指定表名或视图名。
  • db_name.routine_name:表示某个数据库中的某个存储过程或函数,routine_name 指定存储过程名或函数名。

权限类型那点事

因笔者比较懒,上面截图是直接摘自互联网,如有侵权请告知,将会在第一时间删除。

2. 授予表权限时,<权限类型>可以指定为以下值:

因笔者比较懒,上面截图是直接摘自互联网,如有侵权请告知,将会在第一时间删除。

3. 授予列权限时

<权限类型>的值只能指定为 SELECT、INSERT 和 UPDATE,同时权限的后面需要加上列名列表 column-list。

4. 最有效率的权限是用户权限。

授予用户权限时,<权限类型>除了可以指定为授予数据库权限时的所有值之外,还可以是下面这些值:

  • CREATE USER:表示授予用户可以创建和删除新用户的权限。
  • SHOW DATABASES:表示授予用户可以使用 SHOW DATABASES 语句查看所有已有的数据库的定义的权限。

原理略懂,直接开干(实战)

1. 创建用户并授权

  • 注意,mysql8或以上版本已经废弃了grant的一个特性:如果权限被授予给一个不存在的用户,MySQL 会自动执行一条 CREATE USER 语句来创建这个用户,但同时必须为该用户设置密码。(注意,该特性已在mysql8或以上版本废弃了)
mysql> CREATE USER 'ttr2'@'%' IDENTIFIED BY 'ttr2';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'ttr2'@'%' WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES;

2. 查看用户权限

# 查看普通用户权限,方式1
mysql> show grants for ttruser1@localhost;
+----------------------------------------------+
| Grants for ttruser1@localhost                |
+----------------------------------------------+
| GRANT USAGE ON *.* TO `ttruser1`@`localhost` |
+----------------------------------------------+
# 查看普通用户权限,方式2
mysql> select * from mysql.user where user="ttruser1" and host="localhost"\G;
# 查看root用户权限
mysql> show grants for root@localhost\G;
  • 新创建的普通用户默认是没有任何权限,只能登录进去
  • 查看刚创建完的用户,查看权限,USAGE ON *.*表示该用户对任何数据库和任何表都没有权限。

3. 给用户授权(各种场景)

  1. 授权所有权限给ttr1@localhost用户(已经和root权限是一样的,也可以说ttr1也是额外的管理员了)
grant all privileges on *.* to ttr1@localhost;
# 或
grant all on *.* to ttr1@localhost; 
# 或
grant super on *.* to ttr1@localhost;
  1. 授予具体的查权限(select)给tantianran用户
grant select on *.* to tantianran@localhost;
  1. 让用tantianran只能查zabbixdb库的hosts表里的name字段
grant select(name) on zabbixdb.hosts to tantianran@localhost;
  1. 允许root用户可远程连接到mysql数据库
# 查看
mysql> select user,host from mysql.user;
+------------------+----------------+
| user             | host           |
+------------------+----------------+
| zabbix           | %              |
| syn_a            | 192.168.11.152 |
| mysql.infoschema | localhost      |
| mysql.session    | localhost      |
| mysql.sys        | localhost      |
| root             | localhost      | # 可以看到root用户的当前主机配置信息为localhost
+------------------+----------------+
6 rows in set (0.00 sec)
# 修改Host为通配符%
update mysql.user set host='%' where user='root';
# Host修改完成后记得执行flush privileges使配置立即生效
flush privileges;
# 修改root账户的密码,并将加密方法由caching_sha2_password修改为mysql_native_password
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'Root.123456';

知识拓展:Host列指定了允许用户登录所使用的IP,比如user=root Host=192.168.1.1。这里的意思就是说root用户只 能通过192.168.1.1的客户端去访问。user=root Host=localhost,表示只能通过本机客户端去访问。而 % 是个 通配符 ,如果Host=192.168.1.%,那么就表示只要是IP地址前缀为“192.168.1.”的客户端都可以连 接。如果 Host=% ,表示所有IP都有连接权限。注意:在生产环境下不能为了省事将host设置为%,这样做会存在安全问题,具体的设置可以根据生产环境的IP进行设置。

4. 回收用户权限

revoke all privileges on *.* from tantianran@localhost; # 回收所有权限
revoke select on *.* from tantianran@localhost;  # 回收掉具体的权限

写在最后

本篇只是简单剖析,后续笔者抽空再来一次更深入、更彻底的剖析。时间有限,就此搁笔。望多多关注、点赞、转发!

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
SQL 存储 关系型数据库
MySQL 回收表碎片实践教程
在 MySQL 数据库中,随着数据的增删改操作,表空间可能会出现碎片化,这不仅会占用额外的存储空间,还可能降低表的扫描效率,特别是一些大表,在进行数据清理后会产生大量的碎片。本篇文章我们一起来学习下如何进行碎片回收以及相关注意点。
87 1
MySQL 回收表碎片实践教程
|
4月前
|
数据可视化 关系型数据库 MySQL
【MySQL】MySQL8.0 创建用户及授权 - 看这篇就足够了
本文介绍了在MySQL 8.0+版本中创建和管理用户的详细步骤,包括通过命令行进入MySQL、创建数据库、用户及授权等操作,并提供了具体命令示例。适合初学者参考学习,帮助实现系统的权限管理和安全控制。
2059 2
【MySQL】MySQL8.0 创建用户及授权 - 看这篇就足够了
|
5月前
|
SQL 数据库 索引
MySQL设计规约问题之为什么程序连接不同的数据库要使用不同的账号
MySQL设计规约问题之为什么程序连接不同的数据库要使用不同的账号
|
6月前
|
关系型数据库 MySQL Java
关系型数据库mysql的开源与授权
【6月更文挑战第12天】
290 3
|
6月前
|
关系型数据库 MySQL Linux
Linux下mysql添加用户并授权数据库权限
Linux下mysql添加用户并授权数据库权限
547 0
|
7月前
|
canal
MySQL8.0创建新用户并授权
MySQL8.0创建新用户并授权
96 1
MySQL8.0创建新用户并授权
|
7月前
|
运维 监控 关系型数据库
Serverless 应用引擎产品使用之在阿里云函数计算(FC)中,要访问另一个账号的rds配置rds的白名单如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
7月前
|
监控 关系型数据库 数据库
rds跨账号迁移
rds跨账号迁移
248 2
|
7月前
|
Oracle 关系型数据库 MySQL
oceanbase在MySQL语法兼容模式下,在授权语法、行为方面 是否与 开源MySQL完全一致 ?
oceanbase在MySQL语法兼容模式下,在授权语法、行为方面 是否与 开源MySQL完全一致 ?
271 2
|
关系型数据库 MySQL
Mysql 8.0创建用户并授权
Mysql 8.0创建用户并授权
231 0