第18章 管理数据库用户
第19章 管理数据库安全
第18章 管理数据库用户
本章的重点包括:
用户的类型
用户管理
用户在数据库的位置
用户与规划
用户会话
修改用户的属性
用户特征
从数据库删除用户
用户使用的工具
本章介绍关系型数据库一个最关键的管理功能:管理数据库用户。该功能可以确保指定用户和应用对数据库的访问,并拒绝非指定的外部访问。考虑到数据库中大量敏感的商业和个人信息,本章的内容绝对是用户需要特别留心掌握的。
18.1 数据库的用户管理
用户是我们所做一切工作的原因:设计、创建、实现和维护数据库。在数据库设计时就考虑了用户的需求,而实现数据库的最终目标是把它交给用户,让用户使用。
关于用户的一个公认理解是,如果没有用户,数据库就不会发生任何不好的事情。虽然这句话貌似真理,但创建数据库就是为了保存数据,从而让用户在每天的工作中使用它们。
虽然用户管理通常是数据库管理员的份内工作,其他人有时也会参与到用户管理过程中。用户管理是关系型数据库生存周期内一件非常重要的工作,它最终是通过使用SQL概念和命令来实现的。对于数据库管理员来说,用户管理的最终目标是在让用户访问所需的数据与保持数据完整性之间寻求平衡。
注意:用户的身份会变化
不同场合的用户的名称、任务、职责之间有很大差别,取决于每个组织的规模和特定的数据处理需求。一个组织的DBA可能是另一个组织里的普通工作人员。
18.1.1 用户的类型
数据库用户的类型有多种,包括:
数据输入员;
程序员;
系统工程师;
数据库管理员;
系统分析员;
开发人员;
测试人员;
管理者;
终端用户。
每种用户都有其特定的工作职责(和要求),这对他们的每日工作与职位稳定都是很重要的。另外,每种用户在数据库里具有不同的权限级别和自己的位置。
18.1.2 谁管理用户
公司的管理人员负责日常的人员管理,而数据库管理员或其他被指定的人负责管理数据库里的用户。
数据库管理员(DBA)通常负责创建数据库用户账户、角色、权限和特征,以及相应的删除操作。在大型实用环境中,这可能是件非常繁重的工作,有些公司会安排一个安全员协助DBA进行用户管理。
这个安全员主要负责一些文书工作,向DBA传递用户的工作需求,让DBA知道哪些用户不再需要访问数据库了。
系统分析员或系统管理员通常负责操作系统安全,包括创建用户和分配适当的权限。安全员可以像帮助数据库管理员一样帮助系统分析员。
以有序的方式分配和撤销权限,并且记录所做的修改,这样可以让管理过程轻松一些。另外,当系统需要进行内部或外部审核时,文档也会提供很好的记录信息。本章将重点介绍用户管理系统。
18.1.3 用户在数据库里的位置
用户需要被赋予一定的角色和权限才能完成自己的工作,但用户的权限也不能超出其工作范围。设置用户账户和安全的唯一也是全部原因就是保护数据。如果错误的用户访问了错误的数据,即使是在无意情况下,数据也可能被毁坏或丢失。当用户不再需要访问数据库时,相应的账户应该尽快从数据库里删除或禁止。
注意:确保进行系统的用户管理
用户账户管理对于数据库保护和成功应用是至关重要,如果没有实施有系统的管理,它一般会失败的。从理论上讲,用户账户管理是最简单的数据库管理任务之一,但通常会由于政策因素与通信问题而复杂化。
全部用户在数据库里都有位置,有些具有更多的责任和与众不同的职责。数据库用户就像是我们身体的各个部分,以一个整体共同作用来达到某些目标。
18.1.4 不同规划里的用户
数据库对象与数据库用户账户相关联,被称为规划。规划是数据库用户拥有的数据库对象集,这个用户被称为规划所有人。规划在逻辑上的组织类似于数据库中的对象,由一个特定的所有人进行管理。例如,可以将所有的人事表组织起来成为一个名为HR的规划,便于进行人力资源管理。普通数据库用户与规划所有人之间的区别在于后者在数据库里拥有对象,而大多数用户没有自己的对象,只是被赋予数据库账户来访问规划里的数据。由于规划所有人实际上拥有这些对象,所以对它们有完全的控制。
Microsoft SQL Server中进一步设置了数据库所有人。数据库所有人拥有数据库中的所有对象,并且对其中存储的数据拥有完全控制。数据库中有一个或多个规划。数据库以及数据库所有人的默认规划,一般是 dbo。可以根据需要,对数据库中的对象进行组织形成多个规划,并指定规划所有人。
注意:不同系统中用户的创建和管理也不同
关于创建用户的实际操作请查看具体实现的帮助文档。在创建和管理用户时,还要遵守公司政策和手续。下面的小节介绍了在Oracle、MySQL、Sybase和Microsoft SQL Server里创建用户的操作。
18.2 管理过程
在任何数据库系统里,一个稳定的用户管理系统对于数据安全来说是必不可少的。用户管理系统从新用户的直接上级开始,他负责发起访问请求,然后就是通过公司的批准程序。如果管理层接受了请求,就会转到安全员或数据库管理员来完成实际操作。一个好的通知过程是必要的,在用户账户被创建、对数据库的访问被批准之后,管理人和用户必须得到通知,用户账户的密码应该只交给用户本人,而他应该在第一次登录到数据库后就立即修改密码。
18.2.1 创建用户
创建数据库用户需要使用数据库里的SQL命令,但并不存在着什么标准命令,每个实现都有自己的方法。不同实现中的基本概念都是一样的。另外还有一些图形化用户界面(GUI)工具可以进行用户管理。
当 DBA 或指定的安全员收到用户账户请求时,应该针对必要信息进行分析。这些信息应该包含公司对于创建用户ID所必需的条件。
一些必要信息包括社会保险号码、完整姓名、地址、电话号码、办公室或部分名称、被分配的数据库,有时还可以包括建议使用的用户名。
下面的小节将展示在不同实现里创建用户的范例。
一、在Oracle里创建用户
下面是在Oracle数据库里创建用户账户的步骤。
1.使用默认设置创建数据库用户账户。
2.给用户账户授予适当的权限。
下面是创建用户的语法:
如果不是在使用 Oracle,我们不必过于关注其中的选项。Tablespace(表空间)是容纳数据库对象(比如表和索引)的逻辑区域,是由DBA管理的。DEFAULT TABLESPACE指定用户在创建对象时所在的表空间,而TEMPORARY TABLESPACE是用于排序操作(表结合、ORDER BY、GROUP BY)的表空间。QUOTA是被限制在用户所访问的特定表空间上的空间,而PROFILE是指派给用户的数据库特征文件。
下面是给用户账户授予权限的语法:
注意:CREATE USER命令也有差别
上面的语法可以向 Oracle 数据库和其他一些主流关系型数据库添加用户。MySQL不支持CREATE USER命令,它使用mysqladmin工具管理用户。在Windows计算机上创建了一个本地用户账户之后,并不需要登录,但在多用户环境里,每个要访问数据库的用户都要创建一个账户。
GRANT 语句可以在同一个语句里给一个或多个用户授予一个或多个权限。权限也可以授予一个角色,然后再授予用户。
在MySQL里,GRANT命令可以把本地计算机上的用户授权到当前数据库里,比如:
像下面这样给用户授予其他权限:
在大多数情况下,只有在多用户环境下才需要设置MySQL的多用户。
二、在Microsoft SQL Server里创建用户
在Microsoft SQL Server里创建用户账户的步骤如下所述。
1.为SQL Server创建登录账户,指定密码和默认的数据库。
2.把用户添加到适当的数据库,从而创建一个数据库账户。
3.给数据库账户分配适当的权限。
下面是创建用户账户的语法:
注意:更多的权限内容
第19章将更详细地介绍关系型数据库里的权限问题。
下面是把用户添加到数据库的语法:
从上述内容可以看出,SQL Server将登录账户和数据库账户区别对待,登录账户用于访问SQL Server实例,而数据库账户则可以访问数据库对象。创建好登录账户后,在数据库级别运行SP_ADDUSER命令后,就可以在SQL Server Management Studio的安全文件夹中看到二者的区别。这是SQL Server的一个重要特点,你可以创建一个登录账户,但却不能用这个账户访问实例中的任何数据库。
在SQL Server中创建账户的一个常见错误,就是忘记为账户授权访问其默认数据库。所以在设置账户的时候,务必确保为账户授权,至少保证其能够访问默认数据库,否则在使用账户登录系统的时候就会报错。
下面是给用户账户分配权限的语法:
三、在MySQL里创建用户
在MySQL里创建用户账户的步骤如下所述。
1.在数据库里创建用户账户。
2.给用户账户分配适当的权限。
创建用户账户的语法与Oracle的很类似:
分配用户权限的语法也与Oracle很相似:
18.2.2 创建规划
规划是使用CREATE SCHEMA语句创建的。
其语法如下所示:
下面是一个范例:
下面是在一个实现里使用CREATE SCHEMA命令的实例:
这个命令里添加了关键字 AUTHORIZATION,它是在 Oracle 数据库里执行的。从这个范例以及前面的很多范例中都可以看出,不同实现的命令语法有所不同。
能够创建规划的实现会为用户分配一个默认规划,该规划通常与用户的账户相关联。所以,如果一个用户的账户名为 BethA2,那么他的默认规划名通常就为 BethA2。这一点很重要,如果在创建对象的时候不指定规划名,那么将在用户的默认规划中创建对象。如果我们在BethA2账户中运行下面的CREATE TABLE语句,将在BethA2默认规划中创建表:
但这里有可能并不是用户所希望创建表的位置。如果是在SQL Server中,我们拥有 dbo规划的访问权限,并且要在该规划中创建表。这时,需要对所创建的对象进行如下限定:
在创建用户账户并分配权限的时候,务必牢记上述问题。这样可以确保在用户的数据库中维持一个恰当的秩序,以避免不良后果。
18.2.3 删除规划
使用DROP SCHEMA语句可以从数据库里删除规划,这时必须要考虑两个选项。一个是RESTRICT,在使用这个选项时,如果规划里有对象,删除操作就会发生错误。第二个选项是 CASCADE,如果规划里有对象,删除规划就必须指定这个选项。记住,当我们删除规划时,与规划相关联的全部数据库对象都会被删除。
注意:不是所有实现都支持CREATE SCHEMA命令
有些实现可能不支持CREATE SCHEMA命令,但当用户创建对象时会隐含地创建规划,而CREATE SCHEMA命令只不过是完成这个任务的一个单步方法而已。当用户创建对象之后,可以向其他用户分配访问这些对象的权限。 MySQL不支持CREATE SCHEMA命令。在MySQL里,规划被看作一个数据库,所以我们要使用CREATE DATABASE命令来创建一个规划,然后在其中创建对象。
其语法如下所示:
注意:删除规划的不同方法
如果发现规划里缺少了某些对象,很可能是由于对象(比如表)会被像DROP TABLE 这样的命令删除。有些实现提供了删除用户的过程或命令,也可以用于删除规划。如果所使用的SQL实现里没有DROP SCHEMA命令,我们可以通过删除拥有规划对象的用户来删除规划。
18.2.4 调整用户
用户管理中的一个重要组成部分是在创建用户之后修改用户的属性。如果具有用户账户的个人永远不会升职、不会离开公司,或者新雇员非常少,DBA的工作就会轻松很多。但在现实世界里,频繁的人员调动和职责变化是用户管理中的重要因素,几乎每个人都会改变工作或职责。因此,数据库的用户权限必须进行相应的调整以适应用户的需要。
下面是Oracle里修改用户状态的范例:
这个语句可以改变用户的很多属性,但并不是所有SQL实现都提供了这样一个简单的命令来操作数据库用户。
比如 MySQL,它使用多种手段来调整用户账户。举例来说,使用如下语法重置用户的密码:
而使用下面的语法来改变用户的用户名:
有些实现还提供了GUI工具来创建、修改和删除用户。
注意:在数据库和工具中不使用手工输入命令
记住,不同实现中的语法是不一样的。另外,大多数数据库用户不会手工向数据库发出连接和断开的命令,而是使用厂商提供的工具或第三方工具来输入用户名和密码,从而连接到数据库并初始化数据库用户会话。
18.2.5 用户会话
一个用户数据库会话就是从登录数据库到退出这段时间。在一个用户会话中,用户可以执行允许范围内的各种操作,比如查询和事务。
基于创建的连接和会话,用户可以执行任意数量的事务,直到连接中断,这时数据库用户会话也结束了。
使用下面这样的命令可以明确地连接和断开数据库,从而开始和结束SQL会话:
用户会话能够——并且经常——被 DBA 或其他对用户行为感兴趣的人监视。用户会话是与特定用户相关联的。在主机的操作系统上,数据库用户会话实际上是一个进程。
18.2.6 禁止用户访问
通过几个简单的命令就可以从数据库里删除用户或禁止用户的访问,但在不同实现里具体的命令依然是不一样的,请查看相应的文档来了解实际的语法或工具。
下面是禁止用户访问数据库的一些方法:
修改用户的密码;
从数据库删除用户账户;
撤销分配给用户的相应权限。
有些实现里可以使用DROP命令删除数据库里的用户:
在很多实现里,与GRANT命令执行相反操作的是REVOKE,用于取消已经分配给用户的权限。这个命令在SQL Server、Oracle和MySQL里的语法如下所示:
18.3 数据库用户使用的工具
有些人认为不必了解SQL就可以执行数据库查询,这在有些情况下是正确的。然而即使是在使用GUI工具时,了解SQL也绝对会对查询操作有所帮助。GUI工具很不错,在方便得到时也应该使用它们,但理解其幕后的工作原理对于最有效地利用这些用户友好的工具也大有益处。
很多GUI工具帮助数据库用户自动生成SQL代码,用户只需要在一些窗口里浏览、对一些提示做出响应、选择一些选项即可。还有专门生成报告的工具,还可以为用户创建窗口来查询、更新、插入或删除数据库里的数据。有一些工具可以把数据转化为图形或图表,还有数据库管理工具可以监视数据库性能,有些还可以远程连接到数据库。数据库厂商提供了其中一部分工具,其他的工具则来自于第三方厂商。
18.4 小结
所有的数据库都有用户,无论是只有一个,还是成千上万。用户是数据库存在的原因。
用户管理有3个基本要素。首先,必须能够为特定的人和服务创建数据库用户账户。其次,必须能够为用户账户分配权限,使其能够完成要对数据库所做的操作。最后,必须能够从数据库里删除用户账户,或是撤销相应的权限。
本章介绍了用户管理中最常见的任务,但没有涉及过多的细节,因为大多数数据库在用户管理过程上是不同的。但由于用户管理与SQL的关系,在此对其进行讨论还是必要的。很多用于管理用户的命令在ANSI标准没有定义或详细讨论,但概念还是相同的。
18.5 问与答
问:向数据库添加用户有什么SQL标准吗?
答:ANSI 提供了一些命令和概念,但在创建用户方面每种实现和每家公司都有自己的命令、工具和规则。
问:在不把用户ID从数据库里彻底删除的情况下,有没有办法暂时禁止用户的访问?
答:有。要想暂时禁止用户的访问,只需要改变用户的密码,或是撤销允许用户连接到数据库的权限。之后,如果想恢复用户账户的功能,只需要把修改的密码告诉用户,或是分配适当的权限。
问:用户能改变自己的密码吗?
答:在大多数主流实现里是可以的。在创建用户或把用户添加到数据库的过程中,一般会为用户设置一个普通的密码,而且必须尽快由用户修改为自己所选择的密码。密码修改之后,即使DBA也不知道用户的密码。
18.6 实践
下面的内容包含一些测试问题和实战练习。这些测试问题的目的在于检验对学习内容的理解程度。实战练习有助于把学习的内容应用于实践,并且巩固对知识的掌握。在继续学习之前请先完成测试与练习,答案请见附录C。
18.6.1 测验
1.使用什么命令创建会话?
2.在删除包含数据库对象的规划时,必须要使用什么选项?
3.MySQL里使用什么命令创建规划?
4.使用什么命令清除数据库权限?
5.什么命令能够创建表、视图和权限的组或集合?
6.在SQL Server中,登录账户和数据库账户有什么区别?
18.6.2 练习
1.描述如何在learnsql数据库里创建一个新用户“John”。
2.如何让新用户John能够访问表Employee_tbl?
3.描述如何设置John的权限,让他访问learnsql数据库里的全部对象。
4.描述如何撤销John的权限,然后删除他的账户。
第19章 管理数据库安全
本章的重点包括:
数据库安全
安全与用户管理
数据库系统权限
数据库对象权限
给用户分配权限
撤销用户的权限
数据库里的安全特征
本章介绍使用SQL命令和相关命令在关系型数据库里实现和管理安全的基本知识。不同主流实现的安全命令在语法上是有区别的,但关系型数据库的整体安全概念都遵循 ANSI 标准。关于安全操作的详细语法和方针请查看具体实现的文档。
19.1 什么是数据库安全
数据库安全就是保护数据不受到未授权访问。那些只能对数据库里部分数据进行访问的用户,如果要访问其他的数据,也属于未授权访问。这种保护还包括防止未授权的连接和权限分配。数据库里存在多个用户级别,从数据库创建者,到负责维护数据库的人员(比如数据库管理员),到数据库程序员,到终端用户。终端用户虽然在访问权限上受到最大的限制,但却是数据库存在的原因。每个用户对数据库具有不同的访问级别,应该被限制到能够完成相应工作所需的最小权限。
那么,用户管理与数据库安全有什么区别呢?前一章介绍的用户管理似乎涵盖了安全问题。虽然用户管理和数据库安全有着必然的联系,但各自具有不同的目标,共同完成保护数据库的任务。
良好规划和维护的用户管理与数据库的整体安全是密切相关的。用户被分配一定的账户和密码,从而可以对数据库进行一般的访问。数据库里的用户账户应该保存一些用户信息,比如用户的实际姓名、所在的办公室和部门、电话号码或分机号、可以访问的数据库名称。个人用户信息应该只能由DBA访问。新用户一般会由DBA或安全员授予一个初始密码,他在首次登录后应该立即修改这个密码。记住,DBA不需要、也不应该知道个人的密码,这确保了职责的分离,也让用户账户的不断增加不会成为问题。
如果用户不再需要一定的权限,那么这些权限就应该被撤销。如果用户不再需要访问数据库,用户账户就应该从数据库里删除。
一般来说,用户管理是创建用户账户、删除用户账户、跟踪用户在数据库里行为的过程。而数据库安全更进一步,包括了为特定数据库访问授予权限、从用户撤销权限、采取手段保护数据库的其他部分(比如底层数据库文件)。
注意:数据库安全有更多的内容需要学习
由于这是一本SQL图书而不是数据库图书,所以重点在于数据库权限。但我们也要考虑到数据库安全的其他方面,比如保护底层数据库文件,这与数据库权限的配置具有同等的重要性。高级数据库安全可能相当复杂,而且在不同关系型数据库实现里也有所区别。如果想更详细地了解数据库安全,可以查看互联网安全中心的网页。
19.2 什么是权限
权限是用于访问数据库本身、访问数据库里的对象、操作数据库里的数据、在数据库里执行各种管理功能的许可级别。权限是通过GRANT命令分配的,用REVOKE命令撤销。
用户可以连接到数据库并不意味着可以访问数据库里的数据,要访问数据库里的数据还需要权限。权限有两种类型,一种是系统权限,一种是对象权限。
19.2.1 系统权限
系统权限允许用户在数据库里执行管理操作,比如创建数据库、删除数据库、创建用户账户、删除用户、删除和修改数据库对象、修改对象的状态、修改数据库的状态以及其他会对数据库造成重要影响的操作。
系统权限在不同关系型数据库实现里差别很大,所以具体权限及其正确用法请查看实现的文档。
下面是SQL Server里一些常见系统权限:
CREATE DATABASE——允许创建新的数据库;
CREATE PROCEDURE——允许创建新的存储过程;
CREATE VIEW——允许创建新的视图;
BACKUP DATABASE——允许用户对数据库进行备份;
CREATE TABLE——允许用户创建新表;
CREATE TRIGGER——允许用户在表上创建触发器;
EXECUTE——允许用户在特定数据库中运行给定的存储过程。
下面是Oracle里一些常见系统权限:
CREATE TABLE——允许用户在特定规划中创建新表;
CREATE ANY TABLE——允许用户在任意规划中创建新表;
ALTER ANY TABLE——允许用户在任意规划中修改表结构;
DROP TABLE——允许用户在特定规划中删除表对象;
CREATE USER——允许用户创建其他用户账户;
DROP USER——允许用户删除既有用户账户;
ALTER USER——允许用户修改既有用户账户;
ALTER DATABASE——允许用户修改数据库特性;
BACKUP ANY TABLE——允许用户备份任意规划中任意表的数据;
SELECT ANY TABLE——允许用户查询任意规划中任意表的数据。
下面是MySQL里一些常见的全局(系统)权限:
CREATE——允许用户创建特定对象,如数据库、表或索引;
DROP——允许用户删除特定对象;
GARNT——允许用户对特定对象分配权限;
RELOAD——允许用户进行清除缓存操作,以便清除缓存中的日志文件等内容;
SHUTDOWN——允许用户关闭MySQL实例。
注意:权限的不同级别
MySQL具有全局权限和对象权限。全局权限类似于系统权限,负责用户对全部数据库对象的访问。
19.2.2 对象权限
对象权限是针对对象的许可级别,意味着必须具有适当的权限才能对数据库对象进行操作。举例来说,为了从其他用户的表里选择数据,我们必须首先得到另一个用户的许可。对象权限由对象的所有者授予数据库里的其他用户。记住,这个所有者也被称为规划所有者。
ANSI标准里包含下述对象权限。
USAGE:批准使用指定的域。
SELECT:允许访问指定的表。
INSERT(column_name):允许对数据插入到指定表的指定字段。
INSERT:允许对数据插入到指定表的全部字段。
UPDATE(column_name):允许对指定表里的指定字段进行更新。
UPDATE:允许对指定表里的全部字段进行更新。
REFERENCES(column_name):允许在完整性约束里引用指定表里的指定字段,任何完整性约束都需要这个权限。
REFERENCES:允许引用指定表里的全部字段。
注意:自动授予的权限
对象的所有者自动被授予与对象相关的全部权限。有些SQL实现里还可以利用GRANT OPTION命令分配这些权限,这是一个相当不错的功能,稍后将详细讨论。
大多数SQL实现都遵循这个对象权限列表来控制对数据库对象的访问。
这些对象级别的权限应该用于许可和限制对规划内的对象的访问,可以保护一个规划里的对象不被能够访问其他规划的用户访问。
不同SQL实现里还有其他一些对象权限在此并没有列出来。比如删除其他用户的对象里的数据。关于全部可用的对象级权限,请查看具体实现的文档。
19.2.3 谁负责授予和撤销权限
使用GRANT和REVOKE命令的人通常是DBA,但如果存在着安全管理员,他也有这样的权力。具体要授予和撤销的权限来自于管理层,而且最好进行细致的跟踪,以确保只有被认可的用户才能具有相应的权限。
对象的所有者负责向数据库里的其他用户授予权限。即使 DBA 也不能给数据库用户授予不属于他的对象的权限,虽然有方法可以绕过这种限制。
19.3 控制用户访问
用户访问主要是通过用户账户和密码进行控制的,但在大多数主流实现里,这是不足以访问数据库的。创建用户账户只是允许和控制数据库访问的第一步。
在创建了数据库账户之后,数据库管理员、安全官员或某个指定的人必须能够向需要进行数据库操作的用户授予适当的系统级权限,比如创建表或选择表。接下来,规划所有者需要向用户授予访问规划中对象的权限。
SQL 里用两个命令控制数据库访问,包括权限的授予与撤销,分别是 GRANT 和REVOKE。
19.3.1 GRANT命令
GRANT命令用于向现有数据库用户账户授予系统级和对象级权限。
其语法如下所示:
下面就是向用户授予一个权限:
像下面这样给一个用户授予多个权限:
注意到在一个语句里向一个用户授予多个权限时,每个权限是以逗号分隔的。
注意:注意反馈信息
注意提示信息“Grant succeeded”,它表示授权语句成功完成了。这是Oracle的反馈信息。大多数SQL都会提供某种反馈,但所使用的短语不一定相同。
像下面这样给多个用户授予权限:
一、GRANT OPTION
GRANT OPTION是个功能强大的GRANT选项。当对象的所有者利用GRANT OPTION把自己对象的权限授予另一个用户时,这个用户还可以把这个对象的权限授予其他用户,尽管他并不是这个对象的所有者。范例如下:
二、ADMIN OPTION
使用ADMIN OPTION授予权限之后,用户不仅拥有了权限,也具有了把这个权限授予其他用户的能力,这一点与GRANT OPTION类似。但GRANT OPTION用于对象级权限,而ADMIN OPTION用于系统级权限。当一个用户用ADMIN OPTION向另一个用户授予系统权限之后,后者还可以把系统权限授予其他用户。范例如下:
19.3.2 REVOKE命令
注意:删除用户的同时也删除了权限
当一个被使用GRANT OPTION或ADMIN OPTION授予了权限的用户被删除之后,权限与用户之间的关联也被断开了。
REVOKE命令撤销已经分配给用户的权限,它有两个选项:RESTRICT和CASCADE。当使用RESTRICT选项时,只有当REVOKE命令里指定的权限撤销之后不会导致其他用户产生报废权限时,REVOKE才能顺利完成。而CASCADE会撤销权限,不会遗留其他用户的权限。换句话说,如果某个对象的所有者使用GRANT OPTION把权限授予USER1,USER1又使用了GRANT OPTION向USER2授予权限,然后对象所有者撤销了USER1的权限,这时如果使用CASCADE选项,那么USER2的权限也会被撤销。
当用户使用GRANT OPTION向其他用户授予权限之后,自己被从数据库里删除了,或是自己的权限被撤销了,那么后一个用户的权限就被称为报废权限。
REVOKE命令的语法如下所示:
下面是一个范例:
19.3.3 控制对单独字段的访问
我们不仅能够把表作为一个整体来分配对象权限(INSERT、UPDATE和DELETE),还可以分配表里指定字段的权限来限制用户的访问,如下所示:
19.3.4 数据库账户PUBLIC
数据库账户PUBLIC是个代表数据库里全体用户的账户。所有用户都属于PUBLIC账户。如果某个权限被授予PUBLIC账户,那么数据库全部用户都具有这个权限。类似地,如果一个权限从PUBLIC上撤销,就相当于从全部数据库用户上撤销了这个权限,除非这个权限明确地授予了特定用户。范例如下:
19.3.5 权限组
有些实现可以在数据库里形成权限组。这些权限组是通过不同的名称来引用的。通过使用权限组,我们可以更方便地给用户授予和撤销权限。举例来说,如果某个权限组具有 10个权限,我们就可以把这个组授予一个用户,而不必授予10个权限。
权限组在Oracle里称为角色。Oracle在其实现里包含以下权限组:
COMNECT——允许用户连接数据库,并且对已经访问过的任何数据库对象进行操作。
注意:不同系统的权限组有所不同
在使用数据库权限组方面,各个实现都有所不同。如果实现支持这个特性,我们可以利用它来减轻数据库安全管理工作。
RESOURCE——允许用户创建对象、删除其所拥有的对象、为其所拥有的对象赋予权限等;
DBA——允许用户在数据库中对任何对象进行任何操作。
警告:对PUBLIC授予的权限可能带来意想不到的后果
向 PUBLIC 授予权限时要特别小心。数据库的所有用户都会拥有 PUBLIC的权限,因此在向PUBLIC授予权限时,可能会意外地让用户能够访问本不该访问的数据。举例来说,如果让PUBLIC能够从雇员薪水表里选择数据,那么所有用户就可以访问数据库来了解公司发给每个人的工资。
CONNECT组允许用户连接到数据库,并且对能够访问的数据库对象执行操作。
RESOURCE组允许用户创建对象、删除他拥有的对象、授予他拥有的对象的权限等。
DBA组允许用户在数据库里执行任何操作,用户可以访问任何数据库对象,执行任何操作。
把权限组授予用户的范例如下:
SQL Server在服务器级别和数据库级别有一些权限组。
部分数据库权限组如下:
DB_DDLADMIN
DB_DATAREADER
DB_DATAWRITER
DB_DDLADMIN角色允许用户使用任意合法的DDL命令,对数据库中的任意对象进行操作。DB_DATAREADER 角色允许用户在已经获得权限的数据库中,对任意表进行查询。DB_DATAWRITER角色允许用户对数据库中的任意表运行任何数据控制命令,如INSERT、UPDATE或者DELETE。
19.4 通过角色控制权限
角色是数据库里的一个对象,具有类似权限组的特性。通过使用角色,我们不必明确地直接给用户授予权限,从而减少安全维护工作。使用角色可以更方便地进行组权限管理。角色的权限可以被修改,而这种修改对于用户来说是透明的。
如果某个用户需要在一个程序里、在指定时间内对某个表具有 SELECT 和 UPDATE 权限,我们可以暂时指派一个具有这些权限的角色,直到事务结束。
当一个角色最初被创建时,它就是数据库里的一个角色,没有任何实际值。角色可以被指派给用户或其他角色。假设在名为 APP01 的规划里,我们把对表 EMPLOYEE_PAY 的SELECT权限授予角色RECORDS_CLERK,那么任何被指派了RECORDS_CLERK角色的用户或角色就对表EMPLOYEE_PAY具有了SELECT权限。
类似地,如果APP01从RECORDS_CLERK角色撤销了对表EMPLOYEE_PAY的SELECT权限,任何被指派了RECORD_CLERK的用户或角色就不再对这个表有SELECT权限了。
在数据库中分配权限的时候,需要考虑好一个用户需要哪些权限,以及其他用户是否需要同样的权限。例如,会计部门的员工需要访问与会计相关的表。在这种情况下,除非这些员工有完全不同的权限要求,否则就可以创建一个角色并为其赋予适当的权限,并将这个角色分配给这些员工。
如果现在创建了一个新的对象,并需要将相应权限赋给会计部门,就可以方便地在一个位置进行修改,而不必对每一个账户都重新设置。同样,如果会计部门有了一个新成员,或者需要对其他员工赋予同样的权限,只要赋予其相应的角色就可以了。角色是个非常优秀的工具,可以帮助DBA智能地完成工作,即使处理复杂的数据库安全协议也并不麻烦。
19.4.1 CREATE ROLE语句
角色是由CREATE ROLE语句创建的:
向角色授予权限与向用户授予权限是一样的,范例如下:
19.4.2 DROP ROLE语句
这个语句用于删除角色
范例如下:
注意:MySQL不支持角色
MySQL不支持角色。在某些SQL实现里,不支持角色是它们的弱点之一。
19.4.3 SET ROLE语句
使用SET ROLE语句可以为用户的SQL会话设置角色:
范例如下:
一个语句里可以设置多个角色:
注意:SET ROLE语句并不经常使用
在某些实现里,例如Microsoft SQL Server和Oracle,被指派给用户的全部角色都自动成为默认角色。也就是说,只要用户登录到数据库,这些角色就会被设置给用户并发挥作用。这里所介绍的SET ROLE语句,只是为了帮助读者理解相应的ANSI标准。
19.5 小结
本章介绍了在SQL数据库或关系型数据库里实现安全的基本知识,包括管理数据库用户的基本方法。在数据库级别为用户实现安全的第一个步骤是创建用户,第二步是为用户分配适当的权限,允许其访问数据库的特定部分。另外,ANSI 允许使用角色。权限可以被授予用户或角色。
权限有两种类型,分别是系统权限和对象权限。系统权限允许用户在数据库里执行各种任务,比如连接到数据库、创建表、创建用户、改变量据库的状态等。对象权限允许用户访问数据库里的指定对象,比如从指定表里选择数据或操作数据。
SQL里有两个命令用于授予和撤销用户或角色的权限:GRANT和REVOKE。它们用于控制数据库里的整体管理权限。虽然在实现关系型数据库的安全时还需要考虑其他很多因素,但与SQL语言相关的基本内容在此都已经介绍了。
19.6 问与答
问:如果用户忘记了密码,应该如何做才能继续访问数据库呢?
答:用户应该去找直接上级或能够重置用户密码的人员。如果不存在这样的专门人员, DBA或安全员可以重置密码。当密码重置之后,用户应该尽快修改为自己的密码。有时DBA可以设置一个选项,强制用户在下次登录后立即修改密码。详细情况请参见具体实现的文档。
问:如果想授予某个用户CONNECT角色,但该用户不需要CONNECT角色的全部权限,应该怎么办?
答:这时不应该授予用户CONNECT角色,而是只分配必要的权限。如果已经授予了用户CONNECT角色,而用户不在需要这个角色的全部权限,我们就要从用户撤销CONNECT角色,然后再分配特定的权限。
问:为什么当新用户从管理者获得新密码之后,立即修改密码是非常重要的?
答:初始密码是根据用户ID设置的。包括DBA和管理人员在内的任何人都不应该知道个人的密码。密码应该始终高度保密,从而避免其他用户假冒他人身份登录到数据库。
19.7 实践
下面的内容包含一些测试问题和实战练习。这些测试问题的目的在于检验对学习内容的理解程度。实战练习有助于把学习的内容应用于实践,并且巩固对知识的掌握。在继续学习之前请先完成测试与练习,答案请见附录C。
19.7.1 测验
1.如果用户要把不是其所拥有的对象的权限授予另一个用户,必须使用什么选项?
2.当权限被授予PUBLIC之后,是数据库的全部用户,还是仅特定用户获得这些权限?
3.查看指定表里的数据需要什么权限。
4.SELECT是什么类型的权限?
5.如果想撤销用户对某个对象的权限,以及其他使用GRANT分配这个对象权限的其他用户的权限,应该使用什么选项?
19.7.2 练习
1.登录到你的数据库实例,如果learnsql数据库不是默认的,则转换到learnsql数据库。
2.在数据库提示符下,根据你所使用的数据库实例,输入相应命令来列出数据库实现中所默认的表:
3.创建如下数据库用户:
4.根据你所使用的数据库实例,输入如下命令来列出数据库里的全部用户: