DB2 UDB 安全性,第 4 部分: 了解如何在 DB2 UDB 中实现权限和特权

如果没有对不同管理权限级别和特权进行讨论,那么关于 IBM DB2 Universal Database for Linux, UNIX and Windows (DB2 UDB) V8.2 的安全特性的系列文章就不算完整。本文是研究 DB2 UDB V8.2 中提供的安全特性的系列文章的第 4 部分。

第 1 部分 讨论了 DB2 UDB 安装和操作所需要的用户和组帐户。第 2 部分 讨论了如何启用和编写自己的安全插件,而 第 3 部分 讨论了如何自定义安全插件,从而对用户进行身份验证。本文回顾了 DB2 UDB 中的不同管理权限级别和特权,以及如何能够将它们授予用户和组帐户,或从用户和组帐户撤销它们。

Ted J. Wasserman, 数据库顾问, IBM

Ted J. Wasserman 的照片Ted J. Wasserman 是位于加州圣何塞市的 IBM 硅谷实验室的数据库顾问。Ted 在 DB2 Business Partner Technical Enablement 团队工作,专门帮助 IBM 业务合作伙伴将他们的应用程序和数据库迁移到 DB2 中。Ted 拥有金斯顿皇后大学(位于加拿大安大略省)的计算机科学学士和硕士学位。



2012 年 9 月 20 日

免费下载:IBM® DB2® Express-C 10.1 免费版 或者 DB2® 10.1 for Linux®, UNIX®, and Windows® 试用版
下载更多的 IBM 软件试用版,并加入 IBM 软件下载与技术交流群组,参与在线交流。

简介

在本系列的 第 1 部分 中,您了解到安装和操作 DB2 UDB V8.2 时需要某些用户和组帐户。需要记住的重点是,这些帐户是在 DB2 UDB 之外的安全设施(通常是操作系统)中定义的。用户帐户管理(包括密码策略、命名约定和组定义)都是由该外部设施进行管理。

图 1. 身份验证与授权
身份验证与授权

当提交 DB2 请求时,DB2 UDB 与该外部设施进行交互,以验证所提供的用户 ID 和密码。这种交互称为身份验证,如 图 1 的下半部分所示。DB2 UDB 依赖于该外部安全设施对用户进行身份验证,只有当身份验证成功时,才授予对 DB2 UDB 资源的访问权限。

身份验证成功之后,DB2 UDB 必须判断用户是否具有执行预定操作所需的权限。该过程称为授权,如 图 1 的上半部分所示。DB2 UDB 使用两种内部机制(权限级别和特权)来判断授权是否成功。我们将在下面的章节中更详细地介绍这些概念。


权限级别

DB2 UDB 定义了一个权限级别层次结构,用于将一组预先确定的管理 权限授予用户帐户组。这些管理权限包括能够对数据库进行备份、迫使用户离开系统、查看表数据等。

有四个实例权限级别 (SYSADM, SYSCTRL, SYSMAINT, SYSMON) 和两个数据库权限级别 (DBAMD, LOAD)。在实例级别上定义的权限级别适用于该实例中的所有数据库。

图 2. DB2 UDB 中的权限级别层次结构
DB2 UDB 中的权限级别层次结构

权限级别按照 图 2 所示的层次结构格式进行排列。在这个层次结构的顶部是 SYSADM 权限级别,这是用户在 DB2 UDB 中可以拥有的最高权限级别。具有 SYSADM 权限的用户可以执行所有可用的 DB2 操作。SYSCTRL 和 SYSMAINT 权限级别提供了 SYSADM 权限的子集,可以管理系统,但是不允许访问表中的任何数据。SYSMON 权限提供了使用数据库系统监视器的能力。DBADM 权限允许用户在一个实例中的特定数据库上执行管理任务,还允许对该数据库中的数据和对象的完全访问。LOAD 权限允许用户运行 LOAD 实用程序,这是 DB2 UDB 的高速批量数据加载程序。

表 1 总结了每个权限级别及其预期用途。

表 1. 每个权限级别的汇总表
权限级别描述和预期用途
SYSADM
  • DB2 UDB 中最高的管理权限级别
  • 具有 SYSADM 权限的用户可以运行实用程序,发出数据库和数据库管理器命令,以及访问这个数据库管理器实例中任何数据库中任何表中的数据
  • 提供控制该实例中所有数据库对象的能力,包括数据库、表、视图、索引、包、模式、服务器、别名、数据类型、函数、过程、触发器、表空间、数据库分区组、缓冲池和事件监控程序
  • 专为需要实用程序和数据的完全访问权限的 DB2 UDB 管理员而设计
SYSCTRL
  • 最高的系统控制权限级别
  • 提供对数据库管理器实例及其数据库执行维护和实用程序操作的能力
  • 不允许直接访问数据库中的数据
  • 具有连接数据库的隐式特权,并可以执行具有 SYSMAINT 和 SYSMON 权限的用户能够执行的功能
  • 专为管理包含敏感数据的数据库管理器实例的用户而设计
SYSMAINT
  • 次高的系统控制权限级别
  • 提供对数据库管理器实例及其数据库执行维护和实用程序操作的能力
  • 不允许直接访问数据库中的数据
  • 具有连接数据库的隐式特权,并可以执行具有 SYSMON 权限的用户能够执行的功能
  • 专为在包含敏感数据的数据库管理器实例中维护数据库的用户而设计
SYSMON
  • 提供获得数据库管理器实例或其数据库的快照的能力
  • 专为在包含敏感数据的数据库管理器实例中维护数据库,但是只需要诊断数据来进行问题判断的用户而设计
  • 不具备改变系统资源使用的能力
DBADM
  • 对于一个实例中的一个特定数据库 的次高管理权限级别
  • 允许用户运行某些实用程序、发出数据库命令以及访问数据库中任何表中的数据
  • 专为需要完全访问数据库对象和数据,但是不需要完整的维护权限的管理员而设计
LOAD
  • 允许用户调用 LOAD 实用程序
  • 根据 LOAD 操作的模式,用户还需要所加载的表上的 INSERT 和 DELETE 特权
  • 专为只需要访问批量加载的一组新数据的用户而设计

表 2 对比了每个权限级别所允许的常见管理操作。

表 2. 每个权限级别所允许的操作对比
功能SYSADMSYSCTRLSYSMAINTSYSMONDBADMLOAD
迁移数据库
授予/撤销 DBADM
更新 DBM 配置
建立/更改 SYSCTRL/SYSMAINT 权限
更新 DB/节点/数据中心目录
强制用户离开数据库
创建/删除数据库
创建/删除/修改表空间
还原到新数据库
更新 DB 配置
备份数据库或表空间
还原到现有数据库
执行前滚恢复
启动/停止数据库实例
还原表空间
运行跟踪
获取监视器快照
创建/激活/删除事件监视器
查询表空间状态
删除日志历史文件
停止实例
停止数据库
停止表空间
重组表
运行 RUNSTATS 实用程序
加载表
读取数据库表数据

授予/撤销实例级权限

将相关的实例级权限参数 (SYSADM_GROUP, SYSCTRL_GROUP, SYSMAINT_GROUP, SYSMON_GROUP) 分配给在外部安全设施中定义的用户组,从而建立实例级权限。例如,如果希望用户帐户 KATE 具有 SYSMAINT 权限,可以将 KATE 放进 MAINT 组,然后将实例参数 SYSMAINT_GROUP 更新为 MAINT。那么,MAINT 组中的任何用户都将具有 SYSMAINT 权限。要从 KATE 撤销 SYSMAINT 特权,只需从 MAINT 组中删除它,或者将 SYSMAINT_GROUP 参数的值更改为一个不包括该特权的新的组名称即可。在后一种情况下,如果 MAINT 组的其他成员不是新组的成员,那么他们的 SYSMAINT 权限也会被撤销。

实例级权限参数可以从命令行或 Control center 进行更改。例如,要使用命令行将 SYSMAINT_GROUP 参数的值更改为 MAINT,您可以执行以下命令:

组名称

所有平台上的组名称长度都不得大于 30 字节。

update dbm cfg using SYSADM_GROUP MAINT

要让更改生效,必须使用以下两个命令重新启动 DB2 UDB 实例:

db2stop

db2start

要确认更改已经生效,可以通过发出以下命令来查看参数的值:

get dbm cfg

前面的一系列命令及其结果如 清单 1 所示。您还可以通过类似的方式更新任何其他实例级权限参数。

清单 1. 使用命令行更新实例级权限参数
db2 => update dbm cfg using sysmaint_group maint
DB20000I  The UPDATE DATABASE MANAGER CONFIGURATION command completed
successfully.

db2 => db2stop
11/19/2005 21:19:03     0   0   SQL1064N  DB2STOP processing was successful.
SQL1064N  DB2STOP processing was successful.

db2 => db2start
11/19/2005 21:19:09     0   0   SQL1063N  DB2START processing was successful.
SQL1063N  DB2START processing was successful.

db2 => get dbm cfg

Database Manager Configuration

Node type = Enterprise Server Edition with local and remote clients

.....

 SYSADM group name                        (SYSADM_GROUP)      =
 SYSCTRL group name                       (SYSCTRL_GROUP)     =
 SYSMAINT group name                      (SYSMAINT_GROUP)    = MAINT
 SYSMON group name                        (SYSMON_GROUP)      = 

.....

要使用 Control Center 更改实例级权限参数,应该打开 Control Center,展开 All Systems 文件夹,展开目标系统,展开 Instances 文件夹,右击目标实例(在本例中是 DB2),并选择 Configure Parameters 项(见 图 3)。

图 3. 在 Control Center 中打开 configure parameters 对话框
Control Center 中的 Configure parameters 对话框

滚动参数列表(图 4)并找到相关的权限级别参数。单击参数值旁边的按钮来更改它的值。在图 4 的示例中,我们将 SYSMAINT_GROUP 参数的值更改为 MAINT

图 4. 在 Control Center 中更改 SYSMAINT_GROUP 参数
Control Center 中的 DBM configuration 对话框

您必须停止并重新启动实例,对参数的更改才会生效。在 Control Center 中,再次右击目标实例,并选择 Stop 项。如果提示对是否停止实例进行确认,那么单击 OK 按钮。再次右击目标实例,并选择 Start 项。然后就可以返回并检查参数是否已生效。

在 Windows 上的默认 DB2 UDB 安装中,这些实例级权限参数的值默认为 NULL。这意味着任何属于本地 Administrators 组的用户帐户自动继承这些权限。因此,我们强烈建议将这些参数的值显式更改为特定的组名称,以避免意外的/未授权的访问。在 Linux 和 UNIX 安装上,这不是个大问题,因为 NULL 值默认表示实例拥有者的主要组,而该组在安装之后默认只包含实例拥有者的用户 ID。但是,显式设置这些参数仍然是很好的实践。

按照与数据库特权相似的方式授予和撤销数据库级权限(比如 DBADM、CONNECT、CREATETAB 和 LOAD)。这将在下一节中讨论。


特权

虽然实例权限级别被用作一种机制,将一组预定义的管理权限授予一组用户帐户,但将特权显式分配给单个用户或组,会允许他们在数据库对象上执行特定操作(例如,创建和删除索引)。特权严格定义用户可以执行的任务。例如,用户可能具有读取一个表中的数据的特权,但是不能更新此数据。

图 5. DB2 UDB 权限和特权的层次结构
各种权限和特权

图 5 显示了 DB2 UDB 中可用的不同权限和特权级别。其范围从表上的特权到模式和存储过程上的特权。图 5 的上部显示了前一节所描述的实例权限级别。注意 SYSADM 和 DBADM 权限如何自动获得虚线下面的用于某个数据库的所有权限和特权。

表 3 总结了对于用户或用户组可以授予和撤销的数据库权限类型。只有具有 SYSADM 或 DBADM 权限的用户可以授予和撤销这些权限。

表 3. 数据库级权限的汇总表
数据库权限
CONNECT允许用户连接数据库
BINDADD允许用户在数据库中创建新的包
CREATETAB允许用户在数据库中创建新的表
CREATE_NOT_FENCED允许用户注册一个用户定义的函数 (UDF) 或定义为 NOT FENCED 的存储过程
IMPLICIT SCHEMA允许用户在尚不存在的模式中创建对象(它会动态创建模式)*
QUIESCE_CONNECT允许用户连接处于静止状态的数据库
CREATE_EXTERNAL_ROUTINE允许用户注册外部例程(用 C 和 Java 等外部语言编写的例程)

*SYSIBM 成为隐式创建的模式的所有者,PUBLIC 组被授予在此模式中创建对象的特权。

表 4 总结了对于用户或用户组可以授予和撤销的惟一可用表空间特权 (USE)。USE 特权不能与 SYSCATSPACE 或任何系统临时表空间同时使用。

表 4. 表空间特权的汇总表
表空间特权
USE允许用户在指定的表空间中创建表

表 5 总结了对于用户或用户组可以授予和撤销的不同模式特权类型。

表 5. 模式特权的汇总表
模式特权
CREATEIN允许用户在模式中创建对象
ALTERIN允许用户在模式中修改对象
DROPIN允许用户在模式中删除对象

表 6 总结了对于用户或用户组可以授予和撤销的不同表/视图特权类型。

表 6. 表和视图特权的汇总表
表/视图特权
CONTROL授予用户在表或视图上的所有特权,以及将这些特权(除了 CONTROL)授予其他人的能力
ALTER允许用户在表中添加列、在表及其列上添加或修改注释、添加主键或惟一约束条件,以及创建或删除表检查约束
DELETE允许用户从表或视图中删除行
INDEX允许用户在表上创建索引
INSERT允许用户在表或视图中插入数据
REFERENCES允许用户创建和删除外键,将表指定为关系中的父表
SELECT允许用户从表或视图中检索行、在表上创建视图以及运行 EXPORT 实用程序
UPDATE允许用户更改表、视图、或者表或视图中的一个或多个特定列中的数据;用户可以只在特定列上具有这种特权

表 7 总结了对于用户或用户组可以授予和撤销的惟一可用索引特权 (CONTROL)。

表 7. 索引特权的汇总表
索引特权
CONTROL允许用户删除索引

表 8 总结了对于用户或用户组可以授予和撤销的包特权类型。“静态和动态 SQL 考虑因素” 一节将更详细地讨论包概念。

表 8. 包特权的汇总表
包特权
CONTROL允许用户重新绑定、删除或执行包,以及将这些特权(除了 CONTROL)授予其他人的能力
BIND允许用户重新绑定现有的包
EXECUTE允许用户执行包

表 9 总结了对于用户或用户组可以授予和撤销的惟一可用例程特权 (EXECUTE)

表 9. 例程特权的汇总表
例程特权
EXECUTE允许用户调用例程,从该例程创建函数(只应用于函数),以及在任何 DDL 语句(比如 CREATE VIEW、CREATE TRIGGER)中或在定义约束条件时引用例程。

表 10 总结了对于用户或用户组可以授予和撤销的不同序列特权类型。

表 10. 序列特权的汇总表
序列特权
USAGE允许用户对序列使用 NEXTVAL 和 PREVVAL 表达式
ALTER允许用户使用 ALTER SEQUENCE 语句修改序列属性

授予特权

与实例级权限相似,也可以使用命令语法或 Control Center 授予和撤销特权。要想授予或撤销特权,您必须有一个数据库连接。图 6 展示了表和视图特权的 GRANT 语句的语法图。其他数据库对象的 GRANT 语句语法也是相似的,并已在 DB2 UDB 文档 中提供。

图 6. 表和视图的 GRANT 语句语法图
表和视图的 GRANT 语句语法图

例如,要使用 GRANT 语句向用户 JEFF 授予 ACCOUNT 表的 INSERT 特权,那么应该发出以下语句:

GRANT INSERT ON TABLE account TO USER jeff

要向 SALESREPS 组授予 CUSTOMER 表的 SELECT 特权,那么应该发出以下语句:

GRANT SELECT ON TABLE customer TO GROUP salesreps

在向用户或组授予权限和特权时必须小心,因为 DB2 UDB 允许将这些特权授予不存在的帐户。以后,可能会创建同名的帐户,并自动获得以前授予的所有权限和特权。

您还可以使用 Control Center 授予特权,展开 All Databases 文件夹,展开目标数据库,展开包含感兴趣的数据库对象的文件夹,右击这个对象,并选择 Privileges 项。在 图 7 中,展开 SAMPLE 数据库中的 Tables 文件夹,右击 EMPLOYEE 表并选择 Privileges 项。

图 7. Control Center 中的 Table Privileges 对话框
Control Center 中的 Table Privileges 对话框

在 Table Privileges 对话框中,根据要向用户还是组授予特权,您可以选择 UserGroup 选项卡。如果用户/组还不在列表中,那么单击 Add UserAdd Group 按钮添加一个用户或组。您可以单击每个特权的下拉框并选择 YesNoGrant,从而指定应该向用户或组授予哪些特权。选择 Yes 意味着应该授予特权,选择 No 意味着不应该授予特权,选择 Grant 意味着应该授予此特权,并且拥有向其他用户/组授予此特权的特权。单击 Grant All 按钮向指定用户或组授予所有可用特权。单击 Revoke All 按钮从指定用户或组撤销所有可用特权。

图 7 中可以看到,用户 MARK 只被授予 EMPLOYEE 表上的 INSERT 特权,这意味着 MARK 只能在这个表中插入数据,而不能读或更新它。当然,这会任务 MARK 不是具有这些特权或 SYSADM/DBADM 权限的组的成员。

向用户与组授予特权

在上面的示例或 GRANT 语句语法图中,您可能已经注意到,您可以分别使用 TO USER 或 TO GROUP 子句指定是向用户还是向组授予特权。如果没有指定这两个子句之一,但是所指定的名称在操作系统中只被定义为组,那么就假设是 GROUP。如果指定的名称在操作系统中只定义为用户,或者没有定义,那么假设是 USER。如果指定的名称在操作系统中同时定义为用户和组,那么会返回一个错误。作为最佳实践,我们建议在 GRANT 语句中总是包含 TO USER 或 TO GROUP 子句,以避免产生任何歧义。

PUBLIC 组

DB2 UDB 在内部使用一个伪组 PUBLIC,可以对它授予和撤销特权。PUBLIC 实际上并不是在外部安全设施中定义的一个组,而是向成功通过身份验证的用户分配特权的一种方式。您可以对 PUBLIC 组授予和撤消特权,就像对其他组一样。例如,要从 PUBLIC 组撤销 IMPLICIT_SCHEMA 权限,您可以发出以下语句:

REVOKE IMPLICIT_SCHEMA ON DATABASE FROM PUBLIC

重要的是,要了解向 PUBLIC 组授予特权的安全影响。任何提供了有效用户 ID 和密码的用户都能够执行授予 PUBLIC 组的任何操作。

WITH GRANT OPTION

许多数据库对象特权还允许在 GRANT 语句中包含 WITH GRANT OPTION 子句。这使您能够将一种特权授予用户或组,同时让用户或组的成员能够将同一特权授予其他用户/组。例如,以下语句将 ACCT 模式上的 ALTERIN、CREATEIN 和 DROPIN 特权授予组 G1,同时允许组 G1 的成员将这些相同的特权授予其他用户或组:

GRANT ALTERIN, CREATEIN, DROPIN ON SCHEMA ACCT TO GROUP G1 WITH GRANT OPTION

CONTROL 特权

使用 WITH GRANT OPTION 子句不能向其他用户或组授予对象的 CONTROL 特权。CONTROL 特权必须专门授予用户或组,并只能由具有 SYSADM 或 DBADM 权限的用户执行。

WITH GRANT OPTION 只能用于包、例程、模式、表、视图和表空间的 GRANT 语句。

撤销特权

REVOKE 语句用于撤销之前授予的特权。图 8 显示了表和视图的 REVOKE 语句的语法图。同样,其他数据库对象的 REVOKE 语法是相似的,已在 DB2 UDB 文档 中提供。

图 8. 表和视图的 REVOKE 语句语法图
表和视图的 REVOKE 语句语法图

例如,要从用户 JEN 撤销 STAFF 表上的 ALTER 特权,您可以发出以下语句:

REVOKE ALTER ON TABLE staff FROM USER jen

要从 JEN 撤销 STAFF 表上的所有特权,您可以发出以下语句:

REVOKE ALL PRIVILEGES ON TABLE staff FROM USER jen

还可以使用 Control Center 撤销特权,操作方式与授予特权方式相似。只需重新打开 Object Privileges 对话框,如前面的 图 7 所示。要撤销一项特权,只需将此特权的下拉列表更改为 NO,或者单击 Revoke All 按钮,以撤销与此对象相关的所有特权。

要撤消数据库对象上的特权,您必须具有 DBADM 权限、SYSADM 权限或此对象上的 CONTROL 特权。注意,拥有 WITH GRANT OPTION 特权并不足以撤销这一特权。要从另一个用户撤销 CONTROL 特权,您必须具有 SYSADM 或 DBADM 权限。

从用户或组撤销一个特权,就会撤销由其他任何帐户授予的该特权。但是,从用户或组撤销一个特权,并不会从其他帐户撤销由这个用户/组授予的同一特权。例如,假设用户 BEN 将 SELECT WITH GRANT OPTION 授予用户 RICK,然后 RICK 将 SELECT 授予用户 RAVICHRIS。如果之后 BENRICK 撤销了 SELECT 特权,那么 RAVICHRIS 仍然拥有 SELECT 特权。

从组中的一个成员撤销特定特权

还有一种情况,您希望将一个特权授予一个组,然后只从该组中的一个成员撤销这一特权。但是,不能撤销起初并未显式授予的显式特权。在这种情况下,有两种选择:

  • 您可以从这个组中删除这个成员;或者创建一个包含较少成员的新组,并将特权授予这个新组。
  • 可以从这个组撤销特权,然后向组的各个成员分别授予特权

授予和撤销数据库权限

使用 GRANT 语句也可以将数据库级权限(如 DBADM、LOAD 和 CREATETAB)授予用户或组。例如,以下语句将 DBADM 权限授予用户 SALLY

GRANT DBADM ON DATABASE TO USER sally

以下语句将 LOAD 权限授予组 MAINT

GRANT LOAD ON DATABASE TO GROUP maint

回忆一下,如果 LOAD 操作被定义为 REPLACE,那么具有 LOAD 权限的用户还需要 INSERT 特权(将数据加载到表中)和 DELETE 特权。

撤销 DBADM 权限

要撤销 DBADM 权限,您必须具有 SYSADM 权限。

要撤销数据库级权限,需要使用 REVOKE 语句。例如,要从组 MAINT 撤销 LOAD 权限,您可以发出以下语句:

REVOKE LOAD ON DATABASE FROM GROUP maint


隐式特权

在某些情况下,当用户创建一个数据库对象(如表或包)时,或者授予 DBADM 权限级别时,数据库管理器会将某些特权隐式授予用户。重要的是,要了解授予哪些隐式特权以及这些隐式特权的安全影响。表 11 总结了授予隐式特权的情况。

表 11. 对于不同操作授予的隐式特权的汇总表
操作向执行此操作的用户授予的隐式特权
创建新数据库
  • 将 DBADM 权限以及 BINDADD、CONNECT、CREATETAB、CREATE_EXTERNAL_ROUTINE、CREATE_NOT_FENCED_ROUTINE、IMPLICIT_SCHEMA、LOAD 和 QUIESCE_CONNECT 权限授予创建者(SYSADM 或 SYSCTRL)
  • 将 BINDADD、CREATETAB、CONNECT 和 IMPLICIT_SCHEMA 授予 PUBLIC
  • 将每个成功绑定的实用程序上的 BIND 和 EXECUTE 特权授予 PUBLIC
  • 将系统目录表和视图上的 SELECT 授予 PUBLIC
  • 将 USERSPACE1 表空间上的 USE 特权授予 PUBLIC
  • 将 EXECUTE WITH GRANT 特权授予 SYSFUN 模式中所有函数上的 PUBLIC
  • 将 EXECUTE 特权授予 SYSIBM 模式中的所有过程上的 PUBLIC
授予 DBADM 权限
  • 授予 BINDADD、CONNECT、CREATETAB、CREATE_EXTERNAL_ROUTINE、CREATE_NOT_FENCED_ROUTINE、IMPLICIT_SCHEMA、LOAD 和 QUIESCE_CONNECT
模式
  • 在显式创建时,将 CREATEIN、ALTERIN、DROPIN 授予创建该模式的用户
  • 在隐式创建时,将 CREATEIN 额外授予 PUBLIC
创建对象(表、索引、包)
  • 将 CONTROL 授予对象创建者
创建视图
  • 只有当用户拥有在视图定义中所引用的所有表、视图和别名的 CONTROL 特权时,才授予 CONTROL 特权

例如,假设您最初将 DBADM 权限授予用户 PAUL,之后,您决定撤销此权限。要从 PAUL 撤销 DBADM 权限,您可以使用以下语句:

REVOKE DBADM ON DATABASE FROM USER paul

在执行此命令之后,PAUL 不再拥有 DBADM 权限;但是,他仍然拥有数据库上的 GRANT、BINDADD、CONNECT、CREATETAB、CREATE_EXTERNAL_ROUTINE、CREATE_NOT_FENCED_ROUTINE、IMPLICIT_SCHEMA、LOAD 和 QUIESCE_CONNECT 权限,这些权限是原来 PAUL 被授予 DBADM 权限时隐式授予的。需要从 PAUL 显式撤销这些权限。

在创建新数据库之后,一种很好的安全实践是显式撤销隐式授予 PUBLIC 的多个特权。这有助于保护系统,并确保只有应该访问数据库的用户才能真正执行。


静态和动态 SQL 考虑因素

如果在编译时一个 SQL 语句的语法是完全已知的,那么这个语句就称为静态 SQL。这与动态 SQL 语句相反,在运行时之前,动态 SQL 语句的语法都是未知的。

在静态和动态 SQL 语句之间,处理特权的方式存在一些差异。其中一个差异是如何处理组成员关系。一般来说,只针对动态 SQL 和非数据库对象授权(比如实例级命令和实用程序)考虑组成员关系。当向 PUBLIC 授予特权时,此通用规则会出现一个例外情况;在处理静态 SQL 时也考虑组成员关系。

另一个差异是实际进行授权的时间。如果用静态 SQL 语句编写一个程序,那么必须先在数据库中创建包(包含 SQL 语句的优化和可执行形式的数据库对象),然后,相关的程序才能执行包中包含的 SQL 语句。对静态 SQL 的授权发生在编译时或绑定时。在运行时,用户只需具有包上的 EXECUTE 特权,就能够执行其中的语句。这意味着用户不能直接访问基础数据库对象。对基础数据库对象的访问只能通过包中的特定语句进行。对于动态 SQL 语句,授权针对每个语句进行。执行语句的用户必须具有适当的特权,才能在运行时执行语句,这可能是因为显式授予了这些特权,也可能是因为通过组成员关系拥有了这些特权。

例如,假设在一个嵌入式 SQL 应用程序中发现了下列静态的 SQL 语句:

EXEC SQL SELECT col INTO :hostvar FROM table123;

假设已经预先编译了包含这个语句的应用程序文件,那么就会产生一个绑定文件 sampleapp.bnd。如果开发人员 BARBARA 希望将这个文件绑定到数据库(从而创建一个包),那么她明显需要具有 TABLE123 上的 SELECT 特权,才能成功执行 BIND 命令。这个规则有一个例外,即如果已经向 PUBLIC 组授予了这个特权,那么就不需要显式授予该组这个特权。BARBARA 还需要 BINDADD 权限(如果这是一个新的包)或只需要 BIND 特权(如果这是一个现有的包,并希望将它重新绑定到数据库,例如,因为最近更新了数据库统计数字)。

包也可能包含动态 SQL,在这种情况下,需要的特权取决于在对包进行预编译或绑定到数据库时 RECOMPILE/BIND 命令的 DYNAMICRULES 子句所指定的值。如果包是使用 DYNAMICRULES RUN(默认值)绑定的,那么运行动态 SQL 应用程序的用户必须具有发出每个 SQL 请求所需的特权,以及包上的 EXECUTE 特权。可将特权授予用户的 ID、用户所在的任何组或 PUBLIC。

如果应用程序是使用 DYNAMICRULES BIND 选项绑定的,那么 DB2 UDB 将包所有者的用户 ID 与应用程序包关联起来。这就使得运行这个应用程序的任何用户都能够继承与包所有者的用户 ID 相关联的特权。

例如,假设以上示例中的应用程序文件也包含动态 SQL,如 清单 2 所示:

清单 2. 嵌入式 SQL 应用程序中的动态 SQL
EXEC SQL BEGIN DECLARE SECTION;
  char hostVarStmt[50];
  short hostVarDeptnum;
EXEC SQL END DECLARE SECTION;

strcpy(hostVarStmt, "DELETE FROM org WHERE deptnum = ?"); 

EXEC SQL PREPARE Stmt1 FROM :hostVarStmt; 

hostVarDeptnum = 15;
EXEC SQL EXECUTE Stmt1 USING :hostVarDeptnum;

如果 BARBARA 希望将同一个绑定文件绑定到数据库,那么就需要 BINDADD 权限(如果这是一个新的包)或只需要 BIND 特权(如果这是一个现有的包)。因此,假设 BARBARA 使用以下的 BIND 命令绑定这个文件:

BIND sampleapp.bnd QUALIFIER u1 OWNER u2 DYNAMIC RULES RUN

在本例中,所有未限定的 SQL 语句(即没有使用模式名限定其中的数据库对象的语句)会使用模式 U1。因为使用了 OWNER 子句,所以用户 U2 会拥有这个包。因为 BARBARA 指定了 DYNAMIC RULES RUN 子句,所以会检查运行这个应用程序(执行这个包)的用户是否具有执行动态 SQL 的特权。

但是,如果 BARBARA 使用以下的 BIND 命令绑定这个文件,那么就会检查包的所有者是否具有执行动态 SQL 的特权:

BIND sampleapp.bnd QUALIFIER u1 OWNER u2 DYNAMIC RULES BIND

在本例中,包的所有者被指定为 U2。因此,在运行时检查用户 U2 的特权,而不是检查运行应用程序的用户的特权。

例程特权

EXECUTE 特权适用于数据库中所有类型的例程,包括函数、过程和方法。用户一旦被授予一个例程的 EXECUTE 特权,就可以调用这个例程,从例程创建函数(只适用于函数),以及在任何 DDL 语句(比如 CREATE VIEW 或 CREATE TRIGGER)中引用例程。对于这个例程中访问的对象,不需要具有对应的特权。


在 DB2 UDB 中如何维护特权/权限

实例级权限

实例级权限级别(SYSADM、SYSCTRL、SYSMAINT 和 SYSMON)和组成员关系是在 DB2 UDB 之外定义的,因此不会反映在系统目录表中。

DB2 UDB 将关于特权的信息存储在七个系统目录视图中:

  • SYSCAT.DBAUTH - 数据库特权
  • SYSCAT.COLAUTH - 表和视图列特权
  • SYSCAT.INDEXAUTH - 索引特权
  • SYSCAT.PACKAGEAUTH - 包特权
  • SYSCAT.SCHEMAAUTH - 模式特权
  • SYSCAT.TABAUTH - 表和视图特权
  • SYSCAT.TBSPACEAUTH - 表空间特权

可以像查询任何其他视图一样查询这些视图。例如,要查明用户 EMMA 拥有哪些表特权,可以发出如 清单 3 所示的命令:

清单 3. 查询 SYSCAT.TABAUTH 视图来了解特权信息
SELECT substr(grantor,1,8) AS grantor,
       SUBSTR(grantee,1,8) AS grantee,
       granteetype AS gtype,
       SUBSTR (tabschema,1,8) AS schema,
       SUBSTR (tabname,1,8) AS tabname,
       controlauth AS ctl,
       alterauth AS alt,
       deleteauth AS del,
       indexauth AS idx,
       insertauth AS ins,
       selectauth AS sel,
       refauth AS ref,
       updateauth AS upd
  FROM syscat.tabauth 
  WHERE grantee = 'EMMA'

GRANTOR GRANTEE  GTYPE SCHEMA   TABNAME  CTL ALT DEL IDX INS SEL REF UPD
------- -------- ----- -------- -------- --- --- --- --- --- --- --- ---
INST1   EMMA     U     INST1    TABLE1   Y   G   G   G   G   G   G   G

被授权者类型 (GTYPE) 'U' 意味着被授权者(拥有此特权的帐户)是一个用户帐户。GTYPE 值 'G' 意味着被授权者是一个组帐户。在其他列中,'Y' 值意味着拥有此特权,'N' 值意味着不拥有此特权,'G' 值意味着拥有此特权并可以授予其他人。在 清单 3 中,可以看出用户 EMMA 具有表 TABLE1 上的 CONTROL 特权,以及所有其他可用的表特权,包括将这些特权授予其他用户的能力。

隐式授予的特权

由系统授予用户的特权的授予者是 SYSIBM

要查明具有特权的所有帐户,可以查询每个系统目录视图并使用 UNION 操作符将结果组合在一起,如 清单 4 所示:

清单 4. 判断具有特权的所有授权名称
   SELECT DISTINCT GRANTEE, GRANTEETYPE, 'DATABASE' FROM SYSCAT.DBAUTH
   UNION
   SELECT DISTINCT GRANTEE, GRANTEETYPE, 'TABLE   ' FROM SYSCAT.TABAUTH
   UNION
   SELECT DISTINCT GRANTEE, GRANTEETYPE, 'PACKAGE ' FROM SYSCAT.PACKAGEAUTH
   UNION
   SELECT DISTINCT GRANTEE, GRANTEETYPE, 'INDEX   ' FROM SYSCAT.INDEXAUTH
   UNION
   SELECT DISTINCT GRANTEE, GRANTEETYPE, 'COLUMN  ' FROM SYSCAT.COLAUTH
   UNION
   SELECT DISTINCT GRANTEE, GRANTEETYPE, 'SCHEMA  ' FROM SYSCAT.SCHEMAAUTH
   UNION
   SELECT DISTINCT GRANTEE, GRANTEETYPE, 'SERVER  ' FROM SYSCAT.PASSTHRUAUTH
   ORDER BY GRANTEE, GRANTEETYPE, 3

您还可以使用 Control Center 查明一个用户或组具有的所有特权。操作方法是,打开 Control Center,展开 All Databases 文件夹,展开目标数据库,展开 Users and Group Objects 文件夹,展开 DB UsersDB Groups 文件夹,并双击感兴趣的用户或组的行。在 图 9 中,打开了 SAMPLE 数据库中用户 MARK 的特权对话框。选择 Database 选项卡,会看到用户 MARK 具有 CONNECT 和 LOAD 权限。要撤消这些权限,可以不选中权限旁边的复选框。

图 9. 在 Control Center 中打开 Change User(特权)对话框
Control Center 中的 Change User 对话框

GET AUTHORIZATIONS 命令

DB2 UDB 有一个 GET AUTHORIZATIONS 命令,这是一个报告当前用户的特权的便捷命令。这个命令使用在数据库管理器配置文件和授权系统目录视图 (SYSCAT.DBAUTH) 中找到的值。清单 5 显示了发出这个命令的结果:

清单 5. GET AUTHORIZATIONS 命令
 db2 => get authorizations

 Administrative Authorizations for Current User

 Direct SYSADM authority                    = NO
 Direct SYSCTRL authority                   = NO
 Direct SYSMAINT authority                  = NO
 Direct DBADM authority                     = NO
 Direct CREATETAB authority                 = NO
 Direct BINDADD authority                   = NO
 Direct CONNECT authority                   = NO
 Direct CREATE_NOT_FENC authority           = NO
 Direct IMPLICIT_SCHEMA authority           = NO
 Direct LOAD authority                      = NO
 Direct QUIESCE_CONNECT authority           = NO
 Direct CREATE_EXTERNAL_ROUTINE authority   = NO
 Direct SYSMON authority                    = NO

 Indirect SYSADM authority                  = YES
 Indirect SYSCTRL authority                 = NO
 Indirect SYSMAINT authority                = NO
 Indirect DBADM authority                   = NO
 Indirect CREATETAB authority               = YES
 Indirect BINDADD authority                 = YES
 Indirect CONNECT authority                 = YES
 Indirect CREATE_NOT_FENC authority         = NO
 Indirect IMPLICIT_SCHEMA authority         = YES
 Indirect LOAD authority                    = NO
 Indirect QUIESCE_CONNECT authority         = NO
 Indirect CREATE_EXTERNAL_ROUTINE authority = NO
 Indirect SYSMON authority                  = NO

直接 权限意味着此权限是显式授予此用户的。间接 权限意味着此用户属于具有此权限的组。如果用户被显式授予了此权限,同时又属于具有此权限的组,那么他同时具有直接和间接权限。


决定所需的特权/权限级

通常,组织中的不同用户需要不同的数据库访问级别。例如,与数据库管理员相比,客户服务代表需要更受限制的访问级别。本节给出几个场景,并讨论了在每个场景中需要的权限和特权。

场景 1

Tony 是财务部门的一位分析师,他每天早上运行查询,以查明公司的商店的收益率。

在该场景中,可以给 Tony 授予他感兴趣的数据库上的 CONNECT 特权,以及他需要访问的所有表上的 SELECT 特权。

场景 2

Janet 是一位数据库管理员,负责公司中所有数据库的所有数据库维护活动。她的职责包括进行备份、在需要时恢复数据库、进行存储管理并运行跟踪。她应该不能访问数据库中的任何数据。

在该场景中,可以给 Janet 授予 SYSMAINT 权限。如果认为 SYSMAINT 限制过多,也可以考虑授予 SYSCTRL 权限。

场景 3

Jim 是一位应用程序开发人员,负责开发和测试数据库管理器应用程序项目。他还可以创建包含测试数据的表。

在该场景中,Jim 需要一个或多个数据库上的 BINDADD、BIND、CONNECT 和 CREATETAB、某些特定的模式特权,以及某些表上的特权。如果他用一种外部编程语言(比如 C 或 Java)开发例程,那么可能还需要 CREATE_EXTERNAL_ROUTINE。

场景 4

Susan 是营销部门的一位规划师,她每天晚上都需要将从商店收到的新数据加载到 PRODUCT_SALES 表中,从而判断新的销售趋势。

在该场景中,Susan 需要数据库上的 CONNECT 特权、LOAD 权限以及 PRODUCT_SALES 表上的 INSERT 和 SELECT 特权。


使用模式控制对数据库对象的访问

新的 DB2 UDB 数据库管理员经常问的一个问题是,如何为用户创建适当的环境,让他们能够创建和删除自己拥有的数据库对象,同时能够限制其他用户访问这些对象。给每个用户提供一个他自己专用的物理数据库可以解决这个问题,但是这不是最优的解决方案。更好的解决方案可能是通过使用模式控制数据库对象访问。

模式是一种数据库对象,用于按照逻辑将相关的数据库对象分组。模式还常常用来表示对象所有权。模式具有与这些所有权相关联的特权,这使得模式所有者能够控制哪些用户拥有在这个模式中创建、修改和删除对象的特权。模式所有者最初具有这个模式上的所有特权,并能够将这些特权授予其他人。具有 SYSADM 或 DBADM 权限的用户可以更改用户在任何模式上拥有的特权。

默认情况下,在创建数据库时,所有用户具有 IMPLICIT_SCHEMA 权限。这就使得任何用户可以在任何尚不存在的模式中创建对象。隐式创建的模式允许任何用户在其中创建其他对象。如果从 PUBLIC 撤消了 IMPLICIT_SCHEMA 权限,那么可以使用 CREATE SCHEMA 语句显式创建模式,而且已经被隐式授予 IMPLICIT_SCHEMA 权限的用户(比如具有 DBADM 权限的用户)仍然可以隐式创建模式。

为了让每个用户可以控制自己的数据库对象,数据库管理员可以为每个用户显式创建一个模式。然后,管理员根据需要将模式上的特权授予单独的用户。这样就可以防止其他用户篡改在这个模式中创建的任何对象。为了进一步保护系统,还可以从 PUBLIC 撤消 IMPLICIT_SCHEMA 权限,这样的话,如果用户想创建数据库对象,那么必须通过其所具有的适当特权模式来创建。这种方式使用户能够创建他们需要的任何数据库对象,同时避免他们篡改其他用户创建的数据库对象,或者将自己和其他人创建的对象混在一起。


结束语

在本文中,我们回顾了 DB2 UDB 中定义的各种权限级别和特权,以及如何使用命令行语法和 Control Center 将它们分配给用户。还讨论了特权的某些细节,包括隐式特权、静态 SQL 和动态 SQL 之间授权方式的差异以及特权信息在系统目录表中的存储方式。最后,讨论了如何在多用户环境中使用模式有效地控制对数据库对象的访问。有了这些知识,您就应该能够定义一个特权/权限策略,防止用户意外或故意地误用系统,造成威胁。

参考资料

学习

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Information Management
ArticleID=851140
ArticleTitle=DB2 UDB 安全性,第 4 部分: 了解如何在 DB2 UDB 中实现权限和特权
publish-date=09202012