内容正文:
数据库原理与应用技术MySQL
项目11 数据库安全
1
《数据库原理与应用技术-MySQL》
数据库安全
任务1 数据库安全概述
任务2 用户管理
任务3 权限管理
任务4 角色管理
1
《数据库原理与应用技术-MySQL》
任务1 数据库安全概述
1
《数据库原理与应用技术-MySQL》
1. 数据库安全的概念
数据库安全,是为了保护数据库以防止对数据库的不安全使用和因偶然或恶意的原因,使数据库中数据遭到非法更改、破坏或泄露等所采取的各种技术、管理、立法及其它安全性措施的总称。
数据库的安全性是评价数据库系统性能的一个重要指标。安全问题不是数据库系统所特有的,几乎所有计算机系统都有这个问题。只是数据库系统中存有大量的数据,而且这些数据为许多用户所共享,从而使得数据库的安全问题更加重要。
数据库的安全不是孤立的,它与许多方面都有联系,它与计算机系统的安全紧密相连,是计算机系统安全的一部分。而计算机系统的安全问题概括起来可分为计算机系统本身的技术问题、管理问题和政策法律问题。这些问题涵盖:计算机安全理论与策略、计算机安全技术、计算机犯罪与侦查、计算机安全法律和安全监察等。
2. 数据库不安全的因素
非授权用户对数据库的恶意存取和破坏
一些黑客和犯罪分子在用户存取数据时猎取用户名和用户口令,然后假冒合法用户偷取、修改甚至破坏用户数据。因此,必须阻止有损数据库安全的非法操作,以保证数据免受未经授权的访问和破坏。数据库管理系统提供的安全措施主要包括用户身份鉴别、存取控制和视图等。
数据库中重要或敏感的数据被泄露
黑客和犯罪分子千方百计盗窃数据库中的重要数据,一些机密数据可能被泄露。为防止数据泄露,数据库管理系统提供了强制存取控制、数据加密存储和加密传输等技术。
安全环境的脆弱性
数据库的安全性与计算机系统的安全性(包括计算机硬件、操作系统、网络系统等的安全性)是紧密联系的。操作系统安全环境的脆弱性、网络协议安全保障的不足等都会造成数据库安全性被破坏。
3. 数据库安全性级别
环境级
计算机系统的机房和设备应加以保护,防止有人进行物理破坏。
用户级
工作人员应正确授予用户访问数据库的权限。
操作系统级
应防止未经授权的用户从操作系统处着手访问数据库。
网络级
网络软件内部的安全性很重要。
数据库系统级
检查用户的身份是否合法及使用数据库的权限是否正确。
任务2 用户管理
子任务1 创建用户
子任务2 修改用户
子任务3 删除用户
1
《数据库原理与应用技术-MySQL》
子任务1 创建用户
MySQL用户分为root用户和普通用户,root用户为超级管理员,具备操作MySQL数据库的所有权限,而普通用户只拥有部分被赋予的权限。
在MySQL数据库中,只有一个root用户是无法管理众多数据的,因此需要创建多个普通用户来管理不同类型的数据。
1. 查看用户
在进行用户管理前,可以通过SELECT语句查看mysql.user表,查看MySQL服务器中有哪些用户。
从查询结果可以看出,当前服务器中只有root用户。其中,host值为“localhost”,表示允许从本机登录,若host值为“%”,则表示允许从任意主机登录。
由于MySQL中所有用户的信息都保存在mysql.user表中,因此,创建用户可以直接通过利用root用户登录MySQL服务器,然后向mysql.user表中插入记录来实现。但是在开发中为了保证数据的安全,并不推荐使用此方式创建用户,而是建议采用MySQL提供的CREATE USER和GRANT语句创建用户。其中,GRANT语句在创建用户的同时还可以完成权限的设置。
2. 使用CREATE USER语句创建新用户
使用CREATE USER语句创建新用户时,必须拥有CREATE USER权限,语法格式如下:
CREATE '用户名1'@'主机名1' [IDENTIFIED BY [PASSWORD] '密码1']
[,'用户名2'@'主机名2' [IDENTIFIED BY [PASSWORD] '密码2']][,…];
参数说明如下:
主机名可以省略,若省略,则默认为“%”,表示对所有主机开发权限。
IDENTIFIED BY:用来设置用户密码,可以省略。
PASSWORD:用户登录时的密码,该密码存储时是加密过的。
CREATE USER语句可以同时创建多个用户。新用户可以没有初始密码。
例11.1 创建名为“user1”的用户,密码为“123456”,其主机名为“localhost”。
CREATE USER 'user1'@'localhost' IDENTIFIED BY '123456';
例11.2 创建名为“user2”和“user3”的用户,密码分为为“222222”和“333333”,其中user2可以从本地主机登录,user3可以从任意主机登录。
CREATE USER 'user2'@'localhost' IDENTIFIED BY '222222', 'user3'@'%' IDENTIFIED BY '333333';
执行成功后,通过使用SELECT语句验证用户是否创建成功,查询结果如图所示。
从查询结果可以看出,当前MySQL服务器中新增了3个用户。其中,用户user1和user2只能从本机登录,用户user3可以从任意主机登录。
在MySQL中创建用户时,必须拥有MySQL的全局CREATE USER权限或INSERT权限。
MySQL允许相关的用户不使用密码登录,也就是说,在创建新用户时可以不指定密码,但从数据库安全的角度出发,不推荐使用空密码。
3. 使用GRANT语句创建新用户
MySQL中还可以使用GRANT语句创建新用户,该语句在创建用户的同时还可以为用户授权,但必须拥有GRANT权限.
GRANT语句的语法格式如下:
GRANT 权限类型 ON 数据库名.表名 TO 用户1 [IDENTIFIED BY [PASSWORD] '密码1'][,用户2 [IDENTIFIED BY [PASSWORD] '密码2']];
例11.3 创建名为“user4”的用户,主机名为“localhost”,密码为“111222”,并设置该用户对服务器中所有数据库的所有表都有SELECT权限。
其SQL语句如下:
GRANT SELECT ON *.* TO 'user4'@'localhost' IDENTIFIED BY '111222';
执行上述语句,执行SELECT语句查看mysql.user表,查询结果如图所示。
从查询结果可以看出,用户user4成功添加,该用户只能从本机登录。
GRANT语句也支持同时创建多个用户。
4. 使用INSERT语句创建新用户
使用INSERT语句创建用户的语法格式如下:
INSERT INTO
mysql.user(host,user,authentication_string,ssl_type,ssl_cipher,x509_issuer,x509_subject) VALUES ('hostname', 'username', '', '', '', '');
需要注意的是,在MySQL数据库下的user表中,ssl_type、ssl_cipher、x509_issuer、x509_subject这4个字段不允许为空,并且没有默认值,因此使用INSERT语句创建用户时,需要给这几个字段设置初值,一般设置为空字符串即可。
例11.4 创建名为“user5”的用户,主机的IP地址为“192.168.10.5”密码为“654321”。
其SQL语句如下:
INSERT INTO mysql.user(host,user,authentication_string,ssl_type,ssl_cipher,x509_issuer,x509_subject) VALUES ('192.168.10.5', 'user5',PASSWORD('654321'), '', '', '', '');
其中PASSWORD()函数的功能是将明文密码进行哈希运算。
执行上述语句,使用SELECT语句查看mysql.user表,从查询结果可以看出用户user5成功添加,且登录主机的IP地址限制为“192.168.10.5”。如图所示。
使用INSERT语句创建新用户后,并不能立即使用该用户的账号和密码登录,需要使用FLUSH命令使新添加的用户生效,执行语句如下:
FLUSH PRIVILEGES;
执行该语句后,用户user5就可以登录MySQL服务器了。使用FLUSH命令可以从MySQL数据库中的user表中重新装载权限,执行该命令需要RELOAD权限。
子任务2 修改用户
创建用户后,可以对用户信息进行修改,包括账户名、密码、验证方式等。尤其是密码,用户密码是正确登录MySQL服务器的凭据,为保证数据库的安全性,用户需要经常修改密码,以防止密码泄露。
1. 修改用户名称
使用RENAME USER语句可以对用户进行重命名,其语法格式如下:
RENAME USER '旧用户名' TO '新用户名' @ '新主机名';
例11.5 修改用户user1和user2的名称,分别为“liming”和“wangwei”,且“liming”可以从任意主机登录。
修改用户名称的SQL语句如下:
Rename User 'user1'@'localhost' To 'liming'@'%','user2'@'localhost' To 'wangwei'@'localhost'
执行上述代码,然后使用SELECT语句查询mysql.user表,查询结果如图所示。
从查询结果可以看出,用户名修改成功,且用户“liming”对所有主机都开放了权限。
2. 修改用户密码
用户密码是正确登录MySQL服务器的凭据,为保证数据库的安全性,用户需要经常修改密码,以防止密码泄漏。
使用mysqladmin命令、SET语句和UPDATE语句都可以修改用户密码。
(1)使用mysqladmin命令修改用户密码
mysqladmin是MySQL服务器的管理工具,修改用户密码的语法格式如下:
mysqladmin –u 用户名 [-h 主机名] –p password 新密码
参数说明如下:
-u:指定待修改的用户名,通常为“root”。
-h:指定待修改的登录主机名,默认为“localhost”。
-p:指定要修改的密码,其后的password为关键字。
mysqladmin运行在Windows的命令提示符下。
例11.6 修改用户root的密码为“root123”,其执行语句如下:
mysqladmin –u root –p password root123
在命令行窗口输入以上语句,并输入root用户的旧密码,则可将root用户的密码修改为新密码“root123”,使用mysqladmin修改用户密码如图所示。
(2)使用SET语句修改用户密码
语法格式如下:
SET PASSWORD[FOR '用户名'@'主机名']=PASSWORD('密码');
由于SET语句没有对密码加密的功能,因此在使用SET语句进行密码修改时,必须使用PASSWORD()函数对明文密码进行哈希运算。
例11.7 修改用户“liming”的密码为“ming123”
SET PASSWORD FOR 'liming'@'%' = PASSWORD('ming123');
需要注意的是,只有root用户才可以设置或修改当前用户或其他特定用户的密码。
(3)使用UPDATE语句修改mysql.user表中指定用户的密码
在MySQL中,由于用户名和密码都存储在mysql.user表中,因此用户密码的修改也可以直接使用UPDATE语句对该表进行操作。
例11.8 修改用户“user3”的密码为“user333”。
UPDATE mysql.user
SET authentication_string = PASSWORD('user333')
WHERE user = 'user3' and host = '%'
使用UPDATE语句修改用户密码的执行结果如图11-7所示。
由于UPDATE语句不能刷新权限表,因此一定要使用FLUSH PRIVILEGES语句重新加载用户权限,修改后的密码才会生效。
子任务3 删除用户
当不需要某个用户时,就可以删除该用户。在MySQL中,可以使用DROP USER语句和DELETE语句删除一个或多个用户。
1. 使用DROP USER语句删除用户
使用DROP USER语句可以删除一个或多个用户,其语法格式如下:
DROP USER '用户名1'@'主机名1' [,'用户名2'@'主机名2'] [,…];
例11.9 删除用户user4和user5。
DROP USER 'user4'@'localhost', 'user5'@'192.168.10.5';
执行上述语句,可以删除用户user4和user5。
2. 使用DELETE语句删除用户
与创建和修改用户相似,在MySQL中可以使用DELETE语句直接删除mysql.user表中的用户数据。
例11.10 删除用户“user3”。
DELETE FROM mysql.user WHERE user = 'user3' and host = '%';
执行上述语句,并用SELECT语句查看服务器中用户情况,删除用户后的结果如图所示。
从查询的用户列表来看,用户user3、user4、user5都已经被删除。
删除用户时,必须拥有数据库的全局CREATE USER权限或DELETE权限。使用DELETE语句删除用户后,也需要使用FLUSH PRIVILEGES语句重新加载用户权限。
任务3 权限管理
子任务1 分配权限
子任务2 收回权限
1
《数据库原理与应用技术-MySQL》
子任务1 分配权限
分配权限就是给特定的用户授予对象的访问权限。
在MySQL数据库中,根据权限的范围,可以将权限分为多个层级。
(1)全局层级:使用ON *.* 语法授予权限。
(2)数据库层级:使用ON 数据库名.* 语法授予权限。
(3)表层级:使用ON 数据库名.表名 语法授予权限。
(4)列层级:使用SELECT(列1,列2,…)、INSERT(列1,列2,…)和UPDATE(列1,列2,…)语法授予权限。
(5)存储过程、函数级:使用EXECUTE ON PROCEDURE 或EXECUTE ON FUNCTION语法授予权限。
1. 使用GRANT语句分配权限
MySQL中使用GRANT语句为用户分配权限。GRANT语句语法格式如下:
GRANT 权限类型 ON 数据库名.表名 TO '用户名'@'主机名';
例11.11 授予用户“liming”对数据库student中所有的表有SELECT、INSERT、UPDATE和DELETE的权限。
GRANT SELECT,INSERT,UPDATE,DELETE ON student.* TO 'liming'@'%';
若想知道特定用户所拥有的权限,可以使用SHOW GRANTS语句查看用户权限,语法格式如下:
SHOW GRANTS FOR '用户名'@'主机名';
例11.12 查看用户liming的权限,SQL语句如下。
SHOW GRANTS FOR 'liming'@'%';
查看用户liming被授予权限后所拥有的权限的执行结果如图所示。
从显示结果可以看出,用户liming拥有登录权限和对student数据库所有表的增、删、查、改的权限。
子任务2 收回权限
收回权限就是取消某个用户的特定权限。收回权限可以保证数据库的安全。MySQL中,使用REVOKE语句收回用户的部分或所有权限。
1. 使用REVOKE语句回收权限
REVOKE语句语法格式如下:
REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';
例11.13 收回用户liming对数据库student中所有表的DELETE的权限。
REVOKE DELETE ON student.* FROM 'liming'@'%';
执行上述语句,并使用SHOW GRANT语句查看用户liming被收回权限后所拥有的权限,执行结果如图所示。
从查询结果可以看出,用户liming在student数据库中的DELETE权限已经被收回。
当要收回用户的所有权限时,只需要在REVOKE语句中增加ALL PRIVILEGES关键字,语法格式如下:
REVOKE ALL PRIVILEGES,GRANT OPTION FROM '用户名'@'主机名';
例11.14 收回用户liming的所有权限。
REVOKE ALL PRIVILEGES,GRANT OPTION FROM 'liming'@'%';
执行上述语句,并使用SHOW GRANT语句查看用户liming的所有权限,执行结果如图所示。
从查询结果可以看出,用户liming的权限都已被收回。
需要注意的是,在使用GRANT授权或REVOKE收回权限后,都必须使用FLUSH PRIVILEGES语句重新加载权限表,否则无法立即生效。
任务4 角色管理
1
《数据库原理与应用技术-MySQL》
1. 角色的概念
当用户越来越多时,权限的管理也越来越复杂。实际上,许多用户需要相同或类似的权限。在MySQL数据库中,为便于对用户及权限进行管理,引入了角色的概念。将一组具有相同权限的用户组织在一起,这一组具有相同权限的用户就称为角色(Role)。
角色是一组具有相同权限的用户。还是以student数据库为例,要与student数据库进行交互,需要分别为访问数据库的开发人员、仅需读取权限的普通用户、需读/写权限的普通用户这三种使用者创建用户账户。为避免单独为每个用户账户授予权限,可以创建一组角色,并为每个用户账户授予相应的角色。
角色就是命名的特权集合,如果要向多个用户授予相同的权限集,则应按以下步骤实施:首先,创建新的角色;第二,授予角色权限;第三,为用户分配角色。如果要更改用户的权限,则仅需要更改授权角色的权限。这些更改角色的权限将对授予角色的所有用户生效。
2. 创建角色
创建角色的语法格式如下:
CREATE ROLE '角色名1', '角色名2', '角色名n';
例11.15 创建一组角色,分别为a_developer、a_reader、a_writer。
CREATE ROLE 'a_developer', 'a_reader', 'a_writer'
角色名称命名类似于由用户和主机部分组成的用户账户:role_name@host_name。如果省略主机部分,则默认为%,表示任何主机。
3. 授予角色权限
授予角色权限语法格式如下:
GRANT 权限列表 ON 关系 TO 角色
例11.16 授予a_developer角色对数据库student中的Score表拥有插入、删除、更新的权限。
GRANT INSERT,DELETE,UPDATE ON student.Score TO a_developer
4. 查看角色权限
查看角色权限语法格式如下:
SHOW GRANTS FOR 角色
例11.17 查看a_developer角色的权限。
SHOW GRANTS FOR a_developer
5. 回收角色权限
回收角色权限语法格式如下:
REVOKE 权限列表 ON 关系 from 角色
例11.18 回收a_developer角色对数据库student中的Course表的所有权限。
REVOKE ALL PRIVILEGES ON student.Course FROM a_developer
6. 为用户分配角色
为用户分配角色语法格式如下:
GRANT 角色名 TO 用户名
例11.19 将角色a_developer的权限分配给用户liming。
GRANT a_developer TO liming
同步训练
什么是数据库的安全性?
对数据库安全产生威胁的因素有哪些?
数据库安全性级别有哪几种?
创建用户有哪几种方法?
写出为用户授权的命令。
$$