数据库服务器通常包含着关键的数据,所以为了确保这些数据的安全和完整需要要利用访问控制。
MySQL服务器的安全基础是:用户应该对他们需要的数据具有适当的访问权,既不能多也不能少(即用户不能对过多的数据具有访问权)
访问控制:需要给用户提供他们所需的访问权,且仅提供他们所需的访问权。
管理访问控制需要创建和管理用户账号
如:
1、多数用户只需要对表进行读和写,但少数用户甚至需要能创建和删除表
2、某些用户需要读表,但可能不需要更新表
3、你可能想允许某些用户添加数据,但不允许他们删除数据
4、某些用户(管理员)可能需要处理用户账号的权限,但多数用户可能不需要
5、你可能想让用户通过存储过程访问数据,但不允许他们直接访问数据
6、你可能根据用户登录的地点限制对某些功能的访问
最开始安装时为了操作数据库,需要登陆MySQL,创建一个名为root用户账号,使它对整个MySQL 服务器具有完全的控制,之前的操作也是依赖于此账号,你一个人怎么弄都行,但是要是实际使用的话,应该创建一系列的账号,有的用于管理,有的用于用户、开发等等
注意:
1、访问控制的目的不仅仅是防止用户的恶意企图,更常见的是防止无意识的操作错误,通过保证用户不能执行他们不应该执行的语句,有利于维护数据的安全,
2、要严肃对来root 登录使用,仅在绝对需要的时候使用它
MySQL Administrator 提供了一个图形用户界面,用来管理用户及账号权限。本文使用语句进行操作 ,下面就来介绍一下
One、查看用户
MySQL用户账号和信息存储在名为mysql 的数据库,一般不需要直接访问mysql 数据库和表,但有时需要直接访问
需要直接访问它的时机之一是在需要获得所有用户账号列表时
-- 使用名为mysql 的数据库
从中可以看出,mysql 数据库中有一个名为user 的表,它包含所有的用户账号,
user表中有一个名为user 的列,它存储用户登录名。新安装的一般就一个root 用户
试验对用户账号和权限进行更改的最好方法就是打开多个数据库客户机(如mysql命令行实用程序的多个副本),作为一个管理登录,其他作为被测试的用户登陆
Two、创建用户账号(并指定密码)
cretae user 创建一个新用户账号,在创建用户账号时不一定需要口令(即密码),指定口令时使用 IDENTIFIED BY 进行指定
-- create user 用户名 identified by 密码
这个表有 45行,有很多是一些其访问权限的控制
验证一下有没有,创建成功
注意:
1、identified by 指定的口令为纯文本,MySQL将在保存到user 表之前对其加密,为了作为散列值指定口令使用 IDENTIFIED BY PASSWORD
IDENTIFIED BY PASSWORD
2、GRANT 语句也可以用于创建用户账号,但一般使用CREATE USER ,因为create user 语句最为清楚和简单,也可以使用insert语句进行增加不过一般不建议,因为MySQL用来存储用户账号信息的表(以及表模式等)极为重要,对他们的任何毁坏都有可能严重的伤害到MySQL服务器,因此相对于直接处理来说,最好是用标记和函数来处理这些表。
Three、重命名用户名 (RENAME)
-- RENAME USER 原来的名字 TO 现在的
注意:仅在MySQL 5 或之后的版本支持上述语句(rename user),之前是通过 update语句进行更新
Four、更改口令
使用 SET PASSWORD ,新的口令必须加密
主要分为两种,一种是给指定的用户设置密码,另一种是自己设置自己的密码
-- 给 obge 这个用户更改密码
注意:SET PASSWORD 更新用户口令时,新的口令必须传递到Password()函数中进行加密
Five、删除用户账号(DROP)
为了删除一个用户账号(以及相关的权限),使用 DROP USER 用户名
-- 删除名为 boge 的用户
注意:MySQL 5 或之后的版本可以通过 drop user 来删除用户账号和所有相关的账号权限,但是之前的版本,使用drop user 语句只能删除用户账号,不能删除账号权限,还要先借助 REVOKE删除与账号相关的权限,然后在使用drop user 删除账号。
Six、设置访问权限(GRANT)
在创建用户账号后必须接着分配访问权限。因为新创建的用户账号没有访问权限,虽然可以登陆MySQL但不能看到数据,不能执行任何数据操作。
1、查看赋予用户账号的权限
-- SHOW GRANTS FOR 用户账号名
上述中, USAGE ON *.* 表示没有权限,与之相对的是 ALL PRIVILEGES ON *.* 与所有权限。
而 GRANT USAGE ON *.* TO 'obge'@'%' 就可以理解为,在任意数据库和任意表上对任何东西没有权限。
MySQL 的权限使用: 用户名和主机名结合定义(user@host),
如果不指定主机名,则使用默认的主机名%授予用户访问权限而不管主机名
2、使用 grant 语句进行设置权限
设置时需要至少提供:要授予的权限,被授予访问权限的数据库或表以及 用户名
如:设置 obge 这个用户只可以查询 bookstu 这个数据库的所有表
-- GRANT SELECT ON 数据库名.* TO 用户名
上述 grank 允许 用户在bookstu 数据库的所有表(bookstu.*)上使用 select,通过只授予select 访问权限,用户 obge ,对bookstu 这个数据库中的所有数据具有只读权限。
登陆测试一下
3、撤销特定的权限(REVOKE)
-- REVOKE 设置的权限 from 用户名
撤销用户obge 对 bookstu.archive_orders 的增加权限
注意: 被撤销的访问权限必须存在否则会报错
4、GRANT 与 REVOKE
4.1、grant 与revoke 可在以下几个层次进行控制访问权限
a、整个服务器,使用GRANT ALL 和 REVOKE ALL
b、整个数据库,使用 ON database.*
c、特定的表,使用ON databse.table
d、特定的列
e、特定的存储过程
4.2、可以授予和撤销的每个权限
使用 grant 和revoke 结合表中列出的权限,可以完全控制用户对数据做什么事情和不能做什么事情。
注意:
1、在使用grant和 revoke时,用户账号必须存在,但对所涉及的对象没有这个要求。这允许管理员在创建数据和表之前设计和实现安全措施,但是这样做的副作用是当某个数据库或表被删除时,相关的访问权限依然存在,而且将来重新创建该数据库或表时,这些权限依然起作用,所以建议,在设置权限时对那些存在的数据库和表进行设置表
2、可以通过列出各个权限并用逗号分隔,将多条grant 语句串在一起
-- 允许obge 对 bookstu 数据库中的表执行 增加和查看操作