DB2安全性概述
DB2安全性是通过组合外部安全性服务与内部 DB2 授权机制来处理的。外部安全性服务对希望访问 DB2 服务器的用户进行身份验证,DB2 外部的安全性软件负责处理身份验证。该软件可以是操作系统的安全性设施,也可是 Kerberos 等独立产品。成功校验了用户 ID 和口令后,内部 DB2 进程将接管控制,并确保用户有权执行所请求的操作。
图1
身份验证类型
身份验证类型确定在何处验证用户 ID/口令对。所支持的身份验证类型有:
SERVER(默认) SERVER_ENCRYPT KERBEROS KRB_SERVER_ENCRYPT CLIENT |
身份验证类型是在服务器和客户机处同时设置的。
服务器
每个实例仅允许一种类型的身份验证,也就是说,设置适用于该实例下定义的所有数据库。在数据库管理器配置文件中使用 AUTHENTICATION 参数指定该设置。DB2 update database manager configuration authentication auth_type
manager configuration authentication auth_type |
客户机
在客户机处编目的各数据库拥有自己的身份验证类型,使用 catalog database 命令指定。#p#
使用 SERVER 选项进行身份验证
DB2 catalog database db_name at node node_nameauthentication auth_type |
使用 SERVER 选项时,用户 ID 和口令将发送到服务器进行校验。考虑以下示例。
图2
1、用户使用用户名 peter 和口令 peterpwd 登录到工作站。
2、peter 随后使用用户 ID db2user 和口令 db2pwd 连接到 SAMPLE 数据库,这是在远程 DB2 服务器上定义的。
3、db2user 和 db2pwd 通过网络发送到服务器。
4、db2user 和 db2pwd 在 DB2 服务器上校验。
若您想保护用户 ID 和口令免于被窃听,可使用身份验证类型 SERVER_ENCRYPT,这样用户 ID 和口令就都会被加密。
使用 Kerberos 进行身份验证
Kerberos 是一种外部安全性设施,它使用通用密码术创建共享的加密密钥。Kerberos 提供了安全的身份验证机制,这是因为用户 ID 和口令不再需要以明文形式通过网络传输。通过使用加密密钥,它使单点登录到远程 DB2 服务器成为可能。以下示意图展示了 Kerberos 身份验证在 DB2 中的工作原理。
图3
DB2 客户机和服务器均支持 Kerberos 安全协议时,即可使用 KERBEROS 身份验证类型。某些客户机可能并不支持 Kerberos,但依然需要访问 DB2 服务器。为确保所有类型的客户机均能安全地连接,将 DB2 服务器的身份验证类型设置为 KRB_SERVER_ENCRYPT。这将允许所有启用了 Kerberos 的客户机使用 Kerberos 进行身份验证,而其他客户机则使用 SERVER_ENCRYPT 身份验证。下面给出了与 Kerberos 相关的不同的客户机与服务器身份验证设置摘要。
图4
在客户机上进行身份验证
这一选项允许在客户机上进行身份验证。用户成功登录到客户机后,即可轻松连接到数据库,而无需再次提供口令。
图5
这里有一个重要问题需要理解:存在不具有可靠的安全性设施的客户机系统,例如 Windows 9x 和 Classic Mac OS。它们叫做不受信任的客户机。任何人只要可以访问这些系统,就可以不经过身份验证直接连接到 DB2 服务器。谁知道他们会执行怎样的破坏性操作(例如,删除一个数据库)?为提供允许受信任的客户机自行执行身份验证、同时强制不受信任的客户机在服务器处进行身份验证的灵活性,引入了另外两种数据库管理器配置参数:
TRUST_ALLCLNTS TRUST_CLNTAUTH |
这两个参数仅在身份验证设置为 CLIENT 时被评估。DB2
信任客户机
TRUST_ALLCLNTS 确定信任哪种类型的客户机。参数有以下可能值:
◆YES
信任所有客户机。这是默认设置。身份验证将在客户机处执行。但有一个例外,我们将在介绍 TRUST_CLNTAUTH 时更详细地予以讨论。
◆NO
仅信任具备可靠的安全性设施的客户机(受信任的客户机)。若不受信任的客户机连接,则必须提供用户 ID 和口令,以便在服务器进行身份验证。
◆DRDAONLY
仅信任在 iSeries 或 zSeries 平台上运行的客户机(例如,DRDA 客户机)。其他任何客户机都必须提供用户 ID 和口令。
设想一个场景,DB2 服务器将身份验证设置为 CLIENT、TRUST_ALLCLNTS 设置为 YES。您作为 localuser 登录到一台 Windows 2000 计算机,并在未指定用户 ID 和口令的情况下连接到远程数据库。那么 localuser 将成为数据库处的连接授权 ID。而如果您想使用其他用户 ID 连接到数据库(例如,有执行数据库备份权限的 poweruser),又会怎么样呢?
为允许此类行为,可使用 TRUST_CLNTAUTH 来指定,当在 connect 语句或 attach 命令中提供了用户 ID 和密码时将在何处进行身份验证。允许使用的值有两个:
◆CLIENT
身份验证在客户机处执行,不需要用户 ID 和口令。
◆SERVER
身份验证在服务器处完成,需要提供用户 ID 和口令。
让我们来看一些演示参数用法的示例:
图6 #p#
设置权限级别
权限级别控制执行数据库管理器维护操作和管理数据库对象的能力。在 DB2 中共有 5 种权限:
图7
SYSADM
具有管理实例的完整特权,还可访问底层数据库中的数据。
SYSCTRL 和 SYSMAINT
拥有管理实例、其数据库和数据库对象的特定特权。这些权限不含 访问数据的权限。例如,像 'SELECT * FROM mytable' 或 'DELETE FROM mytable' 这样的语句是不允许的。
DBADM
拥有在特定数据库上执行管理任务的特权。还具有数据库的完整数据访问权限。
LOAD
拥有对指定数据库运行加载实用工具的特权。
下表总结了各权限可执行的功能。
图8
管理 DB2 权限
SYS* 权限是在数据库管理器配置中设置的,通过将操作系统或安全性设施中定义的用户组指派给关联的参数进行设置。它必须是最大长度为 8 个字符的组名称,如下所示。
图9
DBADM 和 LOAD 是数据库级的权限。使用 grant 语句可授予用户或用户组这些权限,使用 revoke 语句可予以撤销权限:
connect to sample; grant dbadm on database to user john; grant load on database to group dbagrp; revoke load on database from group dbagrp; |
请注意,具有 LOAD 权限的用户也需要表上的 INSERT 特权,之后才能加载数据。下一节将讨论特权。
设置特权
特权给予用户通过特定方式访问数据库对象的权力。如下列表给出了不同数据库对象的特权摘要。
数据库特权
CONNECT 允许用户连接数据库。
BINDADD 允许用户在数据库中创建新包。
CREATETAB 允许用户在数据库中创建新表。
CREATE_NOT_FENCED 允许用户创建非 fenced 用户定义的函数或存储过程。
IMPLICIT_SCHEMA 允许用户在尚不存在的模式中创建对象。 QUIESCE_CONNECT 允许用户在数据库停顿时访问数据库。
CREATE_EXTERNAL_ROUTINE 允许用户创建以 C 语言、Java™ 语言、OLD 和 COBOL 编写的存储过程。
模式特权
CREATEIN 允许用户在模式内创建对象。
ALTERIN 允许用户更改模式内的对象。
DROPIN 允许用户删除模式内的对象。
要显式地创建新模式,可使用 create schema 命令:
connect to sample user dbowner;create schema dev authorization devuser; |
空间特权
USE OF TABLESPACE 允许用户在特定表空间内创建表。这一特权无法用于 SYSCATSPACE 或任何系统临时表空间。
表与视图特权
CONTROL 为用户提供表或视图的所有特权,以及将这些特权(除 CONTROL 以外)授予他人的能力。
ALTER 允许用户更改表或视图。
DELETE 允许用户删除表或视图中的记录。
INDEX 允许用户在表上创建索引。
INSERT 允许用户向表或视图中插入条目。
REFERENCES 允许用户创建和删除外键,将表指定为关系中的父表。
SELECT 允许用户从表或视图中检索行。
UPDATE 允许用户在表或视图中更新条目。这一特权还可将用户约束为仅更新特定列: grant update (workdept, job) on table employee to devuser;
ALL PRIVILEGES 授予用户表或视图上的上述全部特权(除 CONTROL 外)。
包特权
CONTROL 为用户提供了重新绑定、删除或执行一个包的能力,以及将这些特权(除CONTROL以外)授予他人的能力。
BIND 允许用户重新绑定现有包。
EXECUTE 允许用户执行包。
索引特权
CONTROL 允许用户删除索引。
例程特权
EXECUTE 允许用户执行用户定义的函数。
顺序特权
USAGE 允许用户为顺序对象使用 NEXTVAL 和 PREVVAL 表达式。
授予显式特权
授予特权 with grant option 允许授权 ID 将特定特权扩展给他人。该选项仅对包、例程、模式、表、表空间和视图可用。
尽管特权的授予是可扩展的,但撤销特权并非如此。若通过 with grant option 获得了特权,用户不能撤销他人的特权。示例如下。
该语句允许 john 在表 employee 上执行 select、update 或 delete 操作,并可将这些特权授予他人:
该语句允许 devusers 组中的用户重新绑定、删除及执行包 dev.pkg1。同一组的用户还可将 BIND 和 EXECUTE(但不包括 CONTROL)特权授予他人。
授予隐式及间接特权
典型情况下,DB2 特权是通过 grant 语句显式授予的,方法如前所述。有时用户可能还要隐式或间接地通过执行的特定操作获得特权。让我们来看一些场景。
被授予 DBADM 权限的用户还被隐式地授予 BINDADD、CONNECT、CREATETAB、CREATE_NOT_FENCED 和 IMPLICIT_SCHEMA 权限。
当用户创建数据库时:
◆DBADM 权限将被授予数据库创建者。
◆CONNECT、CREATETAB、BINDADD 和 IMPLICIT_SCHEMA 特权将被授予 PUBLIC。
◆USERSPACE1 表空间上的 USE OF TABLESPACE 特权将被授予 PUBLIC。
◆各成功绑定实用工具上的 BIND 和 EXECUTE 特权将被授予 PUBLIC。
grant select, update, delete on table employee to user johnwith grant option |
◆SYSFUN 模式中所有函数的 EXECUTE 特权 with grant option 将被授予 PUBLIC。
grant control on package dev.pkg1 to group devuserswith grant option |
创建表、视图、索引、模式或包的用户将自动获得他/她所创建的数据库对象上的 CONTROL 特权。
当用户执行一个包含静态 SQL 语句的包时,语句中所引用的数据库对象的显式特权是不需要的。用户仅需要包上的 EXECUTE 特权来执行语句。但这并不表示该用户有权直接访问底层数据库对象。考虑以下示例:
【编辑推荐】