MySQL安全大讲堂:MySQL数据库安全配置(5)
来源:asp之家 发布时间:2009-10-18 11:24:00
2)MySQL授权表运行机制
MySQL的访问控制分两个步骤:
a)服务器检查是否允许该用户连接。
b)如果该用户有权连接,那么服务器还会检查它的每一个请求是否有足够的权限。比如:用户检索数据库中的一个表需要有这个数据库的select权限,用户删除数据库中的一个表需要有这个数据库的drop权限。
授权表的user, db, host表使用这两个步骤,tables_priv和columns_priv表只使用第二步(检查请求)。每个授权表包含决定一个权限何时运用的范围列和决定授予哪种权限的权限列。
范围列指定表中的权限何时运用。每个授权表条目包含User和Host列来指定权限何时运用于一个给定用户从给定主机的连接。其他表包含附加的范围列,如db表包含一个Db列指出权限运用于哪个数据库。类似地,tables_priv和columns_priv表包含范围字段,缩小范围到一个数据库中的特定表或一个表的特定列。
下面是user表的Host字段和User字段组合的一些例子:
+-----------------------------+--------+--------------------------------------------------------+
| Host值 | User值 | 匹配的连接 |
+-----------------------------+--------+--------------------------------------------------------+
| 'x.y.z' | 'test' | test用户只能从x.y.z连接数据库 |
+-----------------------------+--------+--------------------------------------------------------+
| 'x.y.z' | '' | 任何用户可以从x.y.z连接数据库 |
+-----------------------------+--------+--------------------------------------------------------+
| '%' | 'test' | test用户可以从任意主机连接数据库 |
+-----------------------------+--------+--------------------------------------------------------+
| '' | '' | 任何用户可以从任意主机连接数据库 |
+-----------------------------+--------+--------------------------------------------------------+
| '%.y.z' | 'test' | test用户可以从y.z域的任意主机连接数据库 |
+-----------------------------+--------+--------------------------------------------------------+
| 'x.y.% ' | 'test' | test用户可以从x.y.net, x.y.com, x.y.edu等主机连接数据库|
+-----------------------------+--------+--------------------------------------------------------+
| '192.168.1.1' | 'test' | test用户可以从IP地址为192.168.1.1的主机连接数据库 |
+-----------------------------+--------+--------------------------------------------------------+
| '192.168.1.% ' | 'test' | test用户可以从C类子网192.168.1中的任意主机连接数据库 |
+-----------------------------+--------+--------------------------------------------------------+
| '192.168.1.0/255.255.255.0' | 'test' | 同上 |
+-----------------------------+--------+--------------------------------------------------------+
SQL的字符串通配符%表示匹配任意字符,可以是0个字符,通配符_表示匹配一个字符。
权限列指出在范围列中指定的用户拥有何种权限。该表使用GRANT语句的权限名称。对于绝大多数在user、db和host表中的权限列的名称与GRANT语句中有明显的联系。如Select_priv对应于SELECT权限。
3)授权表使用举例
grant用于给增加用户和创建权限,revoke用于删除用户权限。
下面是一些用grant增加用户和创建权限的例子:
mysql> grant all privileges on *.* to test@localhost identified by 'test' with grant option;
这句增加一个本地具有所有权限的test用户(超级用户),密码是test。ON子句中的*.*意味着"所有数据库、所有表"。with grant option表示它具有grant权限。
mysql> grant select,insert,update,delete,create,drop privileges on test.* to test1@'192.168.1.0/255.255.255.0' identified by 'test';
这句是增加了一个test1用户,口令是test,但是它只能从C类子网192.168.1连接,对test库有select,insert,update,delete,create,drop操作权限。
用grant语句创建权限是不需要再手工刷新授权表的,因为它已经自动刷新了。
给用户创建权限还可以通过直接修改授权表:
mysql> insert into user values("localhost","test",password("test"),"Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y");
mysql> flush privileges;
这两句和上面第一句grant的效果是一样的,也是增加了一个本地的test超级用户。我们看到用grant方便多了,而且还不需flush privileges。
mysql> insert into user (host,user,password) values("192.168.1.0/255.255.255.0","test1",PASSWORD("test"));
mysql> insert into db values("192.168.1.0/255.255.255.0","test","test1","Y","Y","Y","Y","Y","Y","N","N","N","N")
mysql> flush privileges;
这三句和上面第二句grant的效果也是一样的,也是增加了一个只能从C类子网192.168.1连接,对test库有select,insert,update,delete,create,drop操作权限的test1用户,口令是test。
要取消一个用户的权限,使用revoke语句。revoke的语法非常类似于grant语句,除了to用from取代并且没有identified by和with grant option子句,下面是用revoke删除用户权限的例子:
mysql> revoke all on test.* from test1@'192.168.1.0/255.255.255.0';
这句revoke就撤消了上面第二句grant创建的权限,但是test1用户并没有被删除,必须手工从user表删除:
mysql> delete from user where user='test1';
mysql> flush privileges;
这样,test1用户就彻底删除了。
这些只是MySQL授权表的简单使用,更多详细的资料请见MySQL提供的手册。


猜你喜欢
- 可能不少学习javascript在使用call,apply,callee时会感到困惑,以下希望对于你有所帮助:1、它是函数的方法或属性;2、
- one: declare @s varchar(20) declare @i varchar(20) set @i='' s
- ECMAScript5为数组定义了5个迭代方法。每个方法都接收两个参数:要在每一项上运行的函数和(可选的)运行该函数的作用域对象(即影响th
- mysql中用命令行复制表结构的方法主要有一下几种: 1.只复制表结构到新表CREATE TABLE 新表 SELECT * FR
- 一:图形界面安装 1、打开Anconda2、点击Environment3、将Installed点击为Not installed4、搜索dja
- 之前在豆瓣上听到有友邻在抱怨卓越的配送速度慢得跟蜗牛一样,超过配送时间期限几天还没送到,当时不太相信,因为此前在卓越网上购买的物品基本上是在
- 前言计算机存储数据的方式都是二进制数据,但是我们在mysql中存储的是字符串数据,那么这些数据到底在Mysql中如何存储呢?这就涉及到字符集
- 下面给大家介绍如何利用pandas工具输出每行的索引值、及其对应的行数据,先给大家展示下输出结果,感兴趣的朋友可以参考具体实例代码。输出结果
- 一切皆是对象在 Python 一切皆是对象,包括所有类型的常量与变量,整型,布尔型,甚至函数。 参见stackoverflow上的一个问题
- Web网站可用性的关键指标是速度,更确切地说,是页面能以多快的速度出现在访问者的浏览器窗口里。影响速度的因素有很多种,包括Web服务器的速度
- 一:模板要了解jinja2,那么需要先理解模板的概念。模板在Python的web开发中广泛使用,它能够有效的将业务逻辑和页面逻辑分开,使代码
- 我们知道为了提高代码的运行速度,我们需要对书写的python代码进行性能测试,而代码性能的高低的直接反馈是电脑运行代码所需要的时间。这里将介
- 遇到的问题:用户批量导入数据1000条,导入不成功的问题,提示查询不到商品资料。这个场景需要依靠批量的数据,每次测试的时候需要手动生成批量的
- 前言最近发现CentOS 7下升级MySQL5.7.23的一个坑,以前面升级到MySQL 5.7.23的一个集群为例在我们环境下打开文件描述
- 本节我们来介绍一下新浪微博宫格验证码的识别,此验证码是一种新型交互式验证码,每个宫格之间会有一条指示连线,指示了我们应该的滑动轨迹,我们需要
- 简介枚举是与多个唯一常量绑定的一组符号因为枚举表示的是常量,建议枚举成员名用大写IntEnum 便于进行系统交互初试from enum im
- 一、图示上面为pdf截图内容,下面为转化后的word截图内容接下来,我们试试自己动作写这个工具吧!二、前期准备由于我们采用的是python进
- 前言在Python中,enumrate和range都常用于for循环中,enumrate函数用于同时循环列表和元素,而range()函数可以
- 安装方法:Windows:在终端输入命令:pip install scrapy;mac:在终端输入命令:pip3 install scrap
- string.Template()string.Template()内添加替换的字符, 使用"$"符号, 或 在字符串内