DB2 中有三种主要的安全机制,能够帮助 DBA 实现数据库安全计划:
身份验证(authentication)、
受权(authorization) 和
特权(privilege)。
身份验证是用户在尝试访问 DB2 实例或数据库时遇到的第一种安全特性。DB2 身份验证与底层操做系统的安全特性紧密协做来检验用户 ID 和密码。DB2 还能够利用 Kerberos 这样的安全协议对用户进行身份验证。
受权决定用户和/或用户组能够执行的操做以及他们能够访问的数据对象。用户执行高级数据库和实例管理操做的能力由指派给他们的权限决定。在 DB2 中有 5 种不一样的权限级别:SYSADM、SYSCTRL、SYSMAINT、DBADM 和 LOAD。
特权的粒度比受权要细,能够分配给用户和/或用户组。特权定义用户能够建立或删除的对象。它们还定义用户能够用来访问对象(好比表、视图、索引和包)的命令。DB2 9 中新增的一个概念是基于标签的访问控制(LBAC),它容许以更细的粒度控制谁有权访问单独的行和/或列。
1.DB2身份验证
DB2 使用
身份验证类型 决定在什么地方进行身份验证。例如,在客户机 - 服务器环境中,是客户机仍是服务器检验用户的 ID 和密码?在客户机 - 网关 - 主机环境中,是客户机仍是主机检验用户的 ID 和密码? 能够在DBM CFG中指定相应的验证类型:
DB2 GET DBM CFG
Server Connection Authentication (SRVCON_AUTH) = KERBEROS
Database manager authentication (AUTHENTICATION) = SERVER_ENCRYPT
那么在链接实例时会使用 SERVER_ENCRYPT。可是在链接数据库时会使用 KERBEROS 身份验证。
在客户机 - 网关 - 主机环境中,这些身份验证选项在客户机和网关上设置,而不是在主机上。
类型 |
描述 |
SERVER |
身份验证在服务器上进行。 |
SERVER_ENCRYPT |
身份验证在服务器上进行。密码在客户机上进行加密,而后再发送到服务器。 |
CLIENT |
身份验证在客户机上进行. |
*KERBEROS |
由 Kerberos 安全软件执行身份验证。 |
*KRB_SERVER_ENCRYPT |
若是客户机设置是 KERBEROS,那么由 Kerberos 安全软件执行身份验证。不然使用 SERVER_ENCRYPT。 |
DATA_ENCRYPT |
身份验证在服务器上进行。服务器接受加密的用户 ID 和密码,并对数据进行加密。这个选项的操做方式与 SERVER_ENCRYPT 相同,可是数据也要加密。 |
DATA_ENCRYPT_CMP |
身份验证方式与 DATA_ENCRYPT 相同,可是容许不支持 DATA_ENCRYPT 的老式客户机使用 SERVER_ENCRYPT 身份验证进行链接。在这种状况下,数据不进行加密。若是进行链接的客户机支持 DATA_ENCRYPT,就会进行数据加密,而不能降级到 SERVER_ENCRYPT 身份验证。这个身份验证类型只在服务器的数据库管理程序配置文件中是有效的,并且在客户机或网关实例上使用 CATALOG DATABASE 时是无效的。 |
GSSPLUGIN |
身份验证方式由一个外部 GSS-API 插件决定。 |
GSS_SERVER_ENCRYPT |
身份验证方式由一个外部 GSS-API 插件决定。在客户机不支持服务器的 GSS-API 插件之一的状况下,使用 SERVER_ENCRYPT 身份验证。 |
2.受权
受权由特权组和高级数据库管理程序(实例级)维护和实用操做组成。在 DB2 可用的 5 种权限中,SYSADM、SYSCTRL 和 SYSMAINT 是
实例级权限。这意味着它们的范围包含实例级命令以及针对这个实例中的全部数据库的命令。这些权限只能分配给组;能够经过 DBM CFG 文件分配这些权限。
针对特定数据库的 DBADM 和 LOAD 权限能够分配给用户或用户组。可使用 GRANT 命令显式地分配这些权限。
SYSADM 权限由 DBM CFG 文件中的 SYSADM_GROUP 参数控制。在 Windows 上,在建立实例时,这个参数设置为 Administrator(可是,若是发出命令
db2 get dbm cfg
,它看起来是空的)。在 UNIX 上,它设置为建立这个实例的用户的主组。
由于只容许 SYSADM 用户更新 DBM CFG 文件,因此只有他们可以向其余组授予任何 SYS* 权限。如下示例演示如何向
db2grp1 组授予 SYSADM 权限:
db2 update dbm cfg using SYSADM_GROUP db2grp1
|
拥有 SYSCTRL 权限的用户能够在实例中执行全部管理和维护命令。可是,与 SYSADM 用户不一样,他们不能访问数据库中的任何数据,除非他们被授予了访问数据所需的特权。SYSCTRL 用户能够对实例中的任何数据库执行的命令示例以下:
db2start/db2stop
db2 create/drop database
db2 create/drop tablespace
db2 backup/restore/rollforward database
db2 runstats
(针对任何表)
db2 update db cfg for database dbname
拥有 SYSADM 权限的用户可使用如下命令将 SYSCTRL 分配给一个组:
拥有 SYSMAINT 权限的用户能够发出的命令是拥有 SYSCTRL 权限的用户能够发出的命令的子集。SYSMAINT 用户只能执行与维护相关的任务,好比:
db2start/db2stop
db2 backup/restore/rollforward database
db2 runstats
(针对任何表)
db2 update db cfg for database dbname
注意,拥有 SYSMAINT 权限的用户不能建立或删除数据库或表空间。他们也不能访问数据库中的任何数据,除非他们被显式地授予访问数据所需的特权。
若是您拥有 SYSADM 权限,那么可使用如下命令将 SYSMAINT 权限分配给一个组:
db2 update dbm cfg using SYSMAINT_GROUP group name
|
得到 DBADM 权限
DBADM 权限是一个数据库级权限,而不是实例级权限。DBADM 用户对一个数据库有几乎彻底的控制能力。DBADM 用户不能执行某些维护或管理任务,好比:
drop database
drop/create tablespace
backup/restore database
update db cfg for database db name
可是,他们能够执行如下任务:
db2 create/drop table
db2 grant/revoke
(任何特权)
db2 runstats
(任何表)
DBADM 用户还被自动地授予对数据库对象及其内容的全部特权。由于 DBADM 权限是一个数据库级权限,因此它能够被分配给用户和用户组。如下命令演示授予 DBADM 权限的不一样方法。
db2 create database test
这个命令将数据库
test 上的 DBADM 权限隐式地授予发出此命令的用户。
db2 connect to sample
db2 grant dbadm on database to user tst1
这个命令只能由 SYSADM 用户发出;它向用户
tst1 授予示例数据库上的 DBADM 权限。注意,在授予 DBADM 权限以前,发出这个命令的用户必须链接到示例数据库。
db2 grant dbadm on database to group db2grp1
这个命令将 DBADM 权限授予
db2grp1 组中的每一个用户。一样,只有 SYSADM 用户可以发出这个命令。
LOAD 权限是一个数据库级权限,因此它能够被分配给用户和用户组。顾名思义,LOAD 权限容许用户对表发出 LOAD 命令。当用大量数据填充表时,LOAD 命令一般用来替代插入或导入命令,它的速度更快。根据您但愿执行的 LOAD 操做类型,仅仅拥有 LOAD 权限可能还不够。可能还须要表上的特定特权。
拥有 LOAD 权限的用户能够运行如下命令:
db2 quiesce tablespaces for table
db2 list tablespaces
db2 runstats
(任何表)
db2 load insert
(必须有表上的插入特权)
db2 load restart/terminate after load insert
(必须有表上的插入特权)
db2 load replace
(必须有表上的插入和删除特权)
db2 load restart/terminate after load replace
(必须有表上的插入和删除特权)
只有拥有 SYSADM 或 DBADM 权限的用户可以对用户或用户组授予或撤消 LOAD 权限。如下示例演示 LOAD 权限如何容许咱们的用户使用
LOAD
命令将数据装载进
sales 表中。假设已经发出了命令
db2 connect to sample
。
db2 grant load on database to user tst1
db2 grant insert on table sales to user tst1
有了 LOAD 权限和插入特权,
tst1 就能够对 sales 表发出
LOAD INSERT
或
LOAD RESTART
,或者在
LOAD INSERT
以后发出
TERMINATE
。
db2 grant load on database to group grp1
db2 grant delete on table sales to group grp1
db2 grant insert on table sales to group grp1
有了 LOAD 权限以及删除和插入特权,
grp1 的任何成员就能够对 sales 表发出
LOAD REPLACE
或
LOAD RESTART
,或者在
LOAD REPLACE
以后发出
TERMINATE
。
3.特权
用户能够拥有的数据库级特权有:
- CREATETAB: 用户能够在数据库中建立表。
- BINDADD: 用户可使用 BIND 命令在数据库中建立包。
- CONNECT: 用户能够链接数据库。
- CREATE_NOT_FENCED: 用户能够建立 unfenced 用户定义函数(UDF)。
- IMPLICIT_SCHEMA: 用户能够在数据库中隐式地建立模式,而不须要使用 CREATE SCHEMA 命令。
- LOAD: 用户能够将数据装载进表中。
- QUIESCE_CONNECT: 用户能够访问处于静默(quiesced)状态的数据库。
- CREATE_EXTERNAL_ROUTINE: 用户能够建立供应用程序和数据库的其余用户使用的过程。
数据库
对象 包括表、视图、索引、模式和包。幸运的是,大多数对象级特权的意义无需解释。下表总结了这些特权。
特权名称 |
相关对象 |
描述 |
CONTROL |
表、视图、索引、包、别名、不一样的类型、用户定义函数、序列 |
提供对对象的所有权限。拥有这种特权的用户还能够向其余用户授予或撤消对对象的特权。 |
DELETE |
表、视图 |
容许用户从对象中删除记录。 |
INSERT |
表、视图 |
容许用户经过 INSERT 或 IMPORT 命令将记录插入对象中。 |
SELECT |
表、视图 |
提供使用选择语句来查看对象内容的能力。 |
UPDATE |
表、视图 |
容许用户使用更新语句修改对象中的记录。 |
ALTER |
表 |
容许用户使用更改语句更改对象定义。 |
INDEX |
表 |
容许用户使用建立索引语句在对象上建立索引。 |
REFERENCES |
表 |
提供在对象上建立或删除外键约束的能力。 |
BIND |
包 |
容许用户从新绑定现有的包。 |
EXECUTE |
包、过程、函数、方法 |
容许用户执行包和例程。 |
ALTERIN |
模式 |
容许用户修改模式中的对象定义。 |
CREATEIN |
模式 |
容许用户在模式中建立对象。 |
DROPIN |
模式 |
容许用户删除模式中的对象。 |
关于对象级特权的信息存储在系统编目视图中。视图名称是
syscat.tabauth
、
syscat.colauth
、
syscat.indexauth
、
syscat.schemaauth
、
syscat.routineauth
和
syscat.packageauth
。
可使用 GRANT 和 REVOKE 命令
显式地 对用户或组授予或撤消特权。咱们来看看如何在各类对象上使用这些命令。
做为拥有 Administrator 权限的用户登陆 Windows,打开两个 DB2 命令窗口。在这两个窗口中,确保将
db2instance
变量设置为
DB2
!
在第一个窗口中发出如下命»¤:
如今,在第二个窗口中发出如下命令:
db2 connect to sample user test1 using password
|
请记住,第一个窗口中的命令是由一个拥有 SYSADM 权限的用户发出的。第二个窗口中的命令是由
tst1 发出的,这个用户对示例数据库没有特殊的权限或特权。注意,与示例数据库中的表相关联的模式名是发出
db2sampl
命令的用户的名称。在这些示例中,这个用户是
GMILNE。
如今,在第二个窗口中发出如下命令:
db2 select * from gmilne.org
|
应该会看到如下响应:
SQL0551N "TEST1" does not have the privilege to perform operation "SELECT"
on object "GMILNE.ORG".
|
为了纠正这种情况,在第一个窗口中发出如下命令:
db2 grant select on table gmilne.org to user test1
|
如今,前面的命令就会成功!接下来,在第二个窗口中发出一个更复杂的命令:
db2 insert into gmilne.org values (100, 'Tutorial', 1, 'Eastern', 'Toronto')
|
一样会看到错误消息:
SQL0551N "TEST1" does not have the privilege to perform operation "INSERT"
on object "GMILNE.ORG"
|
因此,在第一个窗口中输入如下命令:
db2 grant insert on table gmilne.org to group db2grp1
|
原来失败的 INSERT 命令如今应该会成功完成,由于
test1 是
db2grp1 组的成员。
如今,在第二个窗口中输入如下命令:
db2 drop table gmilne.emp_photo
|
一样会看到错误消息:
SQL0551N "TEST1" does not have the privilege to perform operation "DROP TABLE"
on object "GMILNE.EMP_PHOTO".
|
因此,咱们要授予这个特权。在第一个窗口中输入如下命令:
db2 grant dropin on schema gmilne to all
|
DROP TABLE
命令如今应该会成功完成。
既然已经完成了示例,就能够撤消刚才授予的特权。在第一个窗口中发出如下命令:
db2 revoke select on table gmilne.org from user test1
db2 revoke insert on table gmilne.org from group db2grp1
db2 revoke dropin on schema gmilne from all
|
注意,从组中撤消特权不必定会从这个组的全部成员撤消它。例如,如下命令能够用来从
db2grp1 撤消对 gmilne.org 表的全部特权(CONTROL 除外):
db2 revoke all on table gmilne.org from group db2grp1
|
可是,
test1 用户(他是
db2grp1 的成员)仍然拥有对这个表的选择特权,由于他或她是被直接授予这个特权的。
当发出某些命令时,DB2 可能会自动地授予特权,而不须要像前面看到的那样发出显式的 GRANT 语句。下表总结了会致使数据库管理程序隐式地授予特权的一些命令。注意,当删除建立的对象时,这些特性会隐式地撤消。可是,当显式地撤消更高级的特权时,不会撤消它们。
发出的命令 |
授予的特权 |
被授予特权的用户 |
CREATE TABLE mytable |
mytable 上的 CONTROL |
发出命令的用户 |
CREATE SCHEMA myschema |
myschema 上的 CREATEIN、ALTERIN 和 DROPIN,以及将这些特权授予其余用户的能力 |
发出命令的用户 |
CREATE VIEW myview |
myview 上的 CONTROL(只有在用户拥有 myview 定义中引用的全部表和视图上的 CONTROL 特权的状况下) |
发出命令的用户 |
CREATE DATABASE mydb |
mydb 的系统编目表上的 SELECT,mydb 上的 IMPLICIT_SCHEMA * |
PUBLIC** |
*当用户建立数据库时,隐式地授予这个用户这个数据库上的 DBADM 权限。得到 DBADM 权限就会隐式地授予 CONNECT、CREATETAB、BINDADD、IMPLICIT_SCHEMA 和 CREATE_NOT_FENCED 特权。即便撤消了 DBADM 权限,这个用户仍然会保留这些特权。
**PUBLIC 是一个特殊的 DB2 组,其中包括特定数据库的全部用户。与前面讨论过的其余组不一样,PUBLIC 没必要在操做系统级进行定义。在默认状况下,会向 PUBLIC 授予一些特权。例如,这个组自动接受数据库上的 CONNECT 特权和编目表上的 SELECT 特权。能够对 PUBLIC 组发出 GRANT 和 REVOKE 命令,好比:
db2 grant select on table sysibm.systables to public
db2 revoke select on table sysibm.systables from public
|
间接特权
当数据库管理器执行
包 时,能够间接得到特权。包中包含一个或多个 SQL 语句,这些语句已经转换为 DB2 用来在内部执行它们的格式。换句话说,包中包含可执行格式的多个 SQL 语句。若是包中的全部语句都是静态的,那么用户只须要有包上的 EXECUTE 特权,就可以成功地执行包中的语句。
例如,假设
db2package1 执行如下静态的 SQL 语句:
db2 select * from org
db2 insert into test values (1, 2, 3)
|
在这种状况下,拥有
db2package1 上的 EXECUTE 特权的用户会间接地得到 org 表上的 SELECT 特权和 test 表上的 INSERT 特权。