摘要:
本文将通过一个实际示例展示如何利用 IBM DB2 for Linux, UNIX, and Windows
的可信上下文特性来保护数据库免受未经授权的访问,或者经授权的数据库用户的不当使用。
问题说明
安全管理员要求仅允许来自一组特定的 IP 地址的最终用户连接数据库。本文将展示如何利用数据库角色和可信上下文来解决这个问题。出于演示的目的,我们假设安全管理员希望保证用户
Einstein 仅能通过 IP 地址 9.26.120.62 连接到数据库。
数据库角色
角色 就是一种数据库对象,组织了可以分配给用户、分组、特殊分组 PUBLIC、其他角色或可信上下文的一种或多种特权。角色简化了特权的管理,允许安全管理员在一个角色中组织授权和特权,并将角色授予需要这些授权和特性才能完成其工作的用户。此外,由于角色位于
DB2 数据库系统内,因此并非与分组具有相同的约束。
可以在一个数据库内授予的所有 DB2 特权和授权均可授予一个角色。举例来说,可为一个角色授予对某个表的
CONNECT 授权和 SELECT 特权。
可信上下文
可信上下文 是一种数据库对象,定义了数据库与一个外部实体(例如应用服务器)之间的连接的一种信任关系。
这种信任关系基于以下一组属性:
系统授权 ID:代表建立数据库连接的用户
IP 地址(或域名):代表建立了数据库连接的主机
数据流加密:代表数据库服务器与数据库客户端之间的数据通信加密设置(如果有)
在用户建立数据库连接时,DB2 数据库系统将检查连接是否与数据库内的可信上下文对象的定义匹配。如果匹配,则将这样的数据库连接称为可信的。
可信上下文提供了一种功能,让可信上下文的用户能够继承一个数据库角色。举例来说,一名安全管理员可以选择将薪资表的
SELECT 特权授予一个角色,并确保该角色仅通过可信上下文可用。这也就是说,如果用户在可信上下文的范围之外操作,那么就无法利用这个角色(当然也无法获得薪资表的
SELECT 特权)。
解决方案描述
在 DB2 9.7 FixPak 3 之前,在数据库连接时检查 CONNECT
授权时不会考虑通过可信上下文发生的角色继承。如今,DB2 9.7 FP3 已经消除了这样的限制。这项增强的一项直接应用就是能够限制最终用户能够通过何处连接到数据库。
示例
我们有一名常规用户 Einstein,我们希望仅允许他通过 IP 9.26.120.62
(hotel46) 连接到位于 9.26.120.64 (hotel48) 的 T1 数据库。
第 1 步:在 9.26.120.64 (hotel48) 创建 T1
数据库
db2start db2 create database T1 |
验证数据库已创建: db2 list db directory。
图 1. 系统数据库目录
第 2 步:配置 TCPIP 通信协议
在服务器端 9.26.120.64 hotel48,运行以下命令:
清单 1. 配置通信协议以及 TCPIP 的配置
db2set DB2COMM=TCPIP db2 update dbm cfg using SVCENAME xziskind db2stop db2start |
在客户端 9.26.120.62 hotel46,运行以下命令:
清单 2. 分类 TCPIP 节点和数据库
db2 catalog tcpip node NT1 remote hotel48 server xziskind db2 terminate db2 catalog database T1 at node NT1 db2 terminate |
验证用户 Einstein 能否连接到 T1 数据库
图 2. 从 9.26.120.64 hotel48
连接
图 3. 从 9.26.120.62 hotel46
连接
用户 Einstein 可以通过两个 IP 地址连接到 T1 数据库。
让我们来验证一下 Einstein 的授权。为此,我们要利用 AUTH_LIST_AUTHORITIES_FOR_AUTHID
表函数。这将返回可在数据库配置文件内找到的授权 ID 所拥有的全部授权,或者通过分组或角色直接或间接授予一个授权
ID 的全部授权。
清单 3. Einstein 拥有的授权
db2 SELECT AUTHORITY, D_USER, D_GROUP, D_PUBLIC, ROLE_USER, ROLE_GROUP, ROLE_PUBLIC, D_ROLE FROM TABLE (SYSPROC.AUTH_LIST_AUTHORITIES_FOR_AUTHID ('EINSTEIN', 'U') ) AS T ORDER BY AUTHORITY
AUTHORITY D_USER D_GROUP D_PUBLIC ROLE_USER ROLE_GROUP
ROLE_PUBLIC D_ROLE
------------------------- ------ ------- --------
--------- ---------- ----------- ------
ACCESSCTRL N N N N N N *
BINDADD N N Y N N N *
CONNECT N N Y N N N *
CREATETAB N N Y N N N *
CREATE_EXTERNAL_ROUTINE N N N N N N *
CREATE_NOT_FENCED_ROUTINE N N N N N N *
DATAACCESS N N N N N N *
DBADM N N N N N N *
EXPLAIN N N N N N N *
IMPLICIT_SCHEMA N N Y N N N *
LOAD N N N N N N *
QUIESCE_CONNECT N N N N N N *
SECADM N N N N N N *
SQLADM N N N N N N *
SYSADM * N * * * * *
SYSCTRL * N * * * * *
SYSMAINT * N * * * * *
SYSMON * N * * * * *
WLMADM N N N N N N *
19 record(s) selected. |
用户 Einstein 通过特殊分组 PUBLIC 获得了 CONNECT 授权
第 3 步:撤销 PUBLIC 的 CONNECT 授权
db2 revoke connect on database from public |
再次验证 Einstein 的授权:
清单 4. 在撤销了 PUBLIC 的 CONNECT 授权之后,Einstein 的授权
db2 SELECT AUTHORITY, D_USER, D_GROUP, D_PUBLIC, ROLE_USER, ROLE_GROUP, ROLE_PUBLIC, D_ROLE FROM TABLE (SYSPROC.AUTH_LIST_AUTHORITIES_FOR_AUTHID ('EINSTEIN', 'U') ) AS T ORDER BY AUTHORITY
AUTHORITY D_USER D_GROUP D_PUBLIC ROLE_USER ROLE_GROUP
ROLE_PUBLIC D_ROLE
------------------------- ------ ------- --------
--------- ---------- ----------- ------
ACCESSCTRL N N N N N N *
BINDADD N N Y N N N *
CONNECT N N N N N N *
CREATETAB N N Y N N N *
CREATE_EXTERNAL_ROUTINE N N N N N N *
CREATE_NOT_FENCED_ROUTINE N N N N N N *
DATAACCESS N N N N N N *
DBADM N N N N N N *
EXPLAIN N N N N N N *
IMPLICIT_SCHEMA N N Y N N N *
LOAD N N N N N N *
QUIESCE_CONNECT N N N N N N *
SECADM N N N N N N *
SQLADM N N N N N N *
SYSADM * N * * * * *
SYSCTRL * N * * * * *
SYSMAINT * N * * * * *
SYSMON * N * * * * *
WLMADM N N N N N N *
19 record(s) selected. |
用户 Einstein 不再拥有来自任何来源的 CONNEC
现在尝试再次连接。
图 4. 从 9.26.120.64 hotel48
连接
图 5. 从 9.26.120.62 hotel46
连接
用户 Einstein 通过任何 IP 地址都不再能够连接。
第 4 步:创建角色和可信上下文
作为拥有 SECADM 授权的用户运行以下命令:
创建角色:db2 create role connect_role
将 CONNECT 授权授予角色:db2 grant CONNECT on database to role
connect_role
创建可信上下文:
db2 create trusted context connect_tc based upon connection using system authid einstein attributes(address '9.26.120.62') default role connect_role enable |
图 6. 创建角色,连接并创建可信上下文
第 5 步:测试
严重用户 Einstein 是否能够通过 IP 9.26.120.62
(hotel46) 连接,但不能通过 IP 9.26.120.64 (hotel48) 连接。
图 7. 从 9.26.120.62 hotel46
连接
图 8. 从 9.26.120.64 hotel48
连接
结束语
将可信上下文、角色和 CONNECT 授权的能力相结合,我们即可控制常规用户可从何处连接到数据库。请注意,这种解决方案并不适用于超级用户
SYSADM、SYSCTRL、SYSMAINT、SYSMON、DBADM 和 SECADM。这些用户具有隐式的
CONNECT 授权。
|