ESTABLISH/CHANGE SYSCTRL/SYSMAINT AUTHORITY
YES
NO
NO
NO
NO
NO
UPDATE DB/NODE/DCS DIRECTORIES
YES
YES
NO
NO
NO
NO
FORCE USERS OFF DATABASE
YES
YES
NO
NO
NO
NO
CREATE/DROP DATABASE
YES
YES
NO
NO
NO
NO
CREATE/DROP/ALTER TABLE SPACE
YES
YES
NO
NO
NO
NO
RESTORE TO NEW DATABASE
YES
YES
NO
NO
NO
NO
UPDATE DB CFG
YES
YES
YES
NO
NO
NO
BACKUP DATABASE OR TABLE SPACE
YES
YES
YES
NO
NO
NO
RESTORE TO EXISTING DATABASE
YES
YES
YES
NO
NO
NO
PERFORM ROLLFORWARD RECOVERY
YES
YES
YES
NO
NO
NO
START/STOP DATABASE INSTANCE
YES
YES
YES
NO
NO
NO
RESTORE TABLE SPACE
YES
YES
YES
NO
NO
NO
RUN TRACE
YES
YES
YES
NO
NO
NO
OBTAIN MONITOR SNAPSHOTS
YES
YES
YES
YES
NO
NO
CREATE/ACTIVATE/DROP EVENT MONITOR
YES
NO
NO
NO
YES
NO
QUERY TABLE SPACE STATE
YES
YES
YES
NO
YES
YES
PRUNE LOG HISTORY FILES
YES
YES
YES
NO
YES
NO
QUIESCE INSTANCES
YES
YES
NO
NO
NO
NO
QUIESCE DATABASES
YES
NO
NO
NO
YES
NO
QUIESCE TABLE SPACE
YES
YES
YES
NO
YES
YES
REORG TABLE
YES
YES
YES
NO
YES
NO
RUN RUNSTATS UTILITY
YES
YES
YES
NO
YES
YES
LOAD TABLE
YES
NO
NO
NO
YES
YES
READ DATABASE TABLE DATA
YES
NO
NO
NO
YES
NO
授予/撤消实例级权限
建立实例级权限的办法是,将在外部安全设施中定义的用户组赋给相关的实例级权限参数(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,可以在命令行上执行以下命令:
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 对话框
ALTER
允许用户使用 ALTER SEQUENCE 语句修改序列属性
授予特权
与实例级权限相似,可以使用命令语法或 Control Center 授予和撤消特权。要想授予或撤消特权,必须有数据库连接。图 6 显示表和视图特权的 GRANT 语句的语法图。其他数据库对象的 GRANT 语句语法是相似的,请参考
DB2 UDB 文档。
图 6. 表和视图的 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 中的表特权对话框
在表特权对话窗口中,根据要向用户还是组授予特权,选择 User 或 Group。如果用户/组不在列表中,那么点击 Add User 或 Add Group 按钮添加用户或组。通过点击适当特权的下拉框并选择
Yes、No 或 Grant,从而指定应该向用户或组授予哪些特权。选择
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 特权。这种特权必须专门授予用户或组,并只能由具有 SYSADM 或 DBADM 权限的用户执行。
WITH GRANT OPTION 只能用于包、例程、模式、表、视图和表空间的 GRANT 语句。
撤消特权
REVOKE 语句用于撤消以前授予的特权。图 8 显示表和视图的 REVOKE 语句的语法图。同样,其他数据库对象的 REVOKE 语法是相似的,请参考
DB2 UDB 文档。
图 8. 表和视图的 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 撤消特权,操作方式与授予特权相似。只需重新打开对象特权对话窗口,如前面的 图 7 所示。要撤消一种特权,只需将此特权的下拉列表改为 NO,或者点击 Revoke All 按钮撤消与此对象相关的所有特权。
要撤消数据库对象上的特权,必须具有 DBADM 权限、SYSADM 权限或此对象上的 CONTROL 特权。注意,拥有 WITH GRANT OPTION 特权并不足以撤消这一特权。要从另一个用户撤消 CONTROL 特权,必须具有 SYSADM 或 DBADM 权限。
从用户或组撤消特权是撤消其他任何帐号授予他的特权。但是从用户或组撤消特权并不撤消这个用户/组授予别的帐号的同一特权。例如,假设用户 BEN 将 SELECT WITH GRANT OPTION 授予用户 RICK,然后 RICK 将 SELECT 授予用户 RAVI 和 CHRIS。如果以后
BEN 从 RICK 撤消了 SELECT 特权,那么 RAVI 和 CHRIS 仍然拥有 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 总结了授予隐式特权的情况。
可以像查询任何其他视图一样查询这些视图。例如,要查明用户 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 Users 或
DB Groups 文件夹,并双击感兴趣的用户或组的行。在 图 9 中,打开了 SAMPLE 数据库中用户 MARK 的特权对话框。选择 Database 选项卡,会看到用户 MARK 具有 CONNECT 和 LOAD 权限。要撤消这些权限,可以不选中权限旁边的复选框。
图 9. 在 Control Center 中打开修改用户(特权)对话框
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