阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

使用技术手段限制DBA的危险操作—Oracle Database Vault

209次阅读
没有评论

共计 5678 个字符,预计需要花费 15 分钟才能阅读完成。

概述

众所周知,在业务高峰期,某些针对 Oracle 数据库的操作具有很高的风险,比如修改表结构、修改实例参数等等,如果没有充分评估和了解这些操作所带来的影响,这些操作很可能会导致故障,轻则导致应用错误,重则导致数据库服务不可用。

另外,在非业务高峰期,某些看似风险不大的操作也可能会导致严重后果,比如不按管理流程修改表结构,如果这个表正好是 Oracle GoldenGate 复制组的一部分,修改了源端结构而没有通知 OGG 的相关人员,没有在目标端进行相同的操作,而 DDL 复制功能也没有打开的情况下,就会导致复制进程故障,导致数据不一致,在某些应用场景下,这也是很严重的生产事故。

目前,传统的应对方法还是强调管理,不管是客户还是服务商都在不断强调制度和规范,希望从制度建设和工程师的职业素养上着手,防止 DBA 的这种随意的危险操作。

但是,管理制度毕竟是“软性”的,把希望寄托在工程师自觉地遵守制度和“自我修养”上,并不能保证万无一失。

Oracle 提供的安全组件,可以用来限制、阻断这种随意的危险操作,用技术手段保证管理制度被遵守。

Oracle Database Vault 简介

我们要讨论的是 Oracle 数据库的安全组件之一: Oracle Database Vault(DV),它的主要功能是保护敏感数据和职责分离。

DV 保护敏感数据主要通过 Realm(安全域),Realm 可以简单理解为敏感数据的集合,DV 通过 realm 的配置来指定用户是否可以访问 Realm 保护的数据,如果在 DV 中没有给访问权限,即使是 sysdba 也无权访问受 Realm 保护的数据,这是 DV 的核心功能,但不是本文的重点。

DV 还有一个很重要的功能,Command Rules,就是可以按一定的判断条件,允许或阻止数据库用户执行 DDL、DML 以及 DCL 命令,而且对特权用户,包括 sysdba 都有效。这个功能正好可以满足我们限制 dba 的需求。

使用技术手段限制 DBA 的危险操作—Oracle Database Vault

大家如果想详细了解 DV 的功能,可以访问 Oracle 官网:http://www.oracle.com/technetwork/database/options/database-vault/index-085211.html

Oracle Database Vault 最低支持的数据库版本是 9.2.0.8,早期是单独的一个安装包。从 11g 开始,Oracle 的数据库安装介质中包含了这个组件,想要使用这个组件的用户需要在安装时勾选 Database Vault 选项。除了安装相关的软件组件,还需要在创建数据库时,创建相关的数据库对象。

Database Vault 可以使用相关的存储过程来实现命令行方式的配置、管理,也可以通过 web 管理界面来管理,在早期,必须安装 EM,才能使用 web 管理界面,从 11gR2 起,数据库自带的 dbcontrol 也可以进行 web 界面的管理了。

除了前面讲到的 Realm 和 Command Rules,还有两个概念要介绍一下,一个是 Factor(认证因子),另一个是 Rule sets(规则集)。

Factor(认证因子)就是可以用于进行条件判断的因素,比如客户端主机名,客户端 IP 等等,Oracle 内置了一些常用的 Factor,用户也可以自己创建 Factor,Factor 可以是一个表达式,也可以是一个存储过程的返回值。

Rule Sets 简单说就是判断条件的集合,类似 SQL 的 where 之后的判断条件,当规则集的判断条件返回为 true 时,DV 允许用户访问数据或执行特定的命令。Rule sets 中的 Rule 可以引用 Factor 做判断。

示例 1:只允许在非业务时间执行 drop 命令

这个例子是最简单的,不需要使用 Factor,只使用 Rule Sets 和 Command Rules 就可以完成。我们用数据库用户 test 来示范:

登录 DV 的管理页面:

使用技术手段限制 DBA 的危险操作—Oracle Database Vault

创建一个 Rule Set,名字叫”Can not drop table in business time”,选择 Any True,意思是说规则集中的规则(判断条件)任何一个为 True,规则集判断结果就为 True。其实 All True 就相当于 and,Any True 就相当于 or

使用技术手段限制 DBA 的危险操作—Oracle Database Vault

使用技术手段限制 DBA 的危险操作—Oracle Database Vault

这两个 RULE 也很好理解,就是判断当前时间是否为业务时间,在这里,为了便于做实验,把业务时间定义为 11:45~11:55,这个规则集判断当前时间,如果当前时间不在业务时间内,规则集返回 True。

然后创建 Command Rule,如下图:

使用技术手段限制 DBA 的危险操作—Oracle Database Vault

这个 Command Rule 的意思就是指定的 Rule Set 返回 True 时,允许 drop test 用户下的表,否则即使是 sysdba 或表的 owner 也无权 drop table。

效果:

使用技术手段限制 DBA 的危险操作—Oracle Database Vault

使用技术手段限制 DBA 的危险操作—Oracle Database Vault

其他我们想控制的 Alter Table 等 Command Rule 的设置方法类似。

更多详情见请继续阅读下一页的精彩内容 :http://www.linuxidc.com/Linux/2016-12/138472p2.htm

实例 2:只允许用户使用特定工具(应用)登录数据库

实际工作中,我们经常遇到这样的情况:应用开发人员都有应用用户的口令,他们可以随意用 SQL*PLUS 或 PL/SQL Developer 这样的工具连接到生产库上,如果一时搞混了生产库和测试库,就可能有悲剧发生。最好的解决方法就是限制应用用户所用的工具,应该只允许中间件以这个用户连接,其他工具都不允许连接。

这个例子会用到 Factor,首先我们创建一个 Factor,取用户会话的 Module:

使用技术手段限制 DBA 的危险操作—Oracle Database Vault

用 SQL*PLUS 登录数据库,验证这个 Factor 取出的值:

使用技术手段限制 DBA 的危险操作—Oracle Database Vault

引用 Factor 的方法就是 DVF.F$+Factor name,在 Linux 本机登录,Module 就是上面显示的那样,在 windows 上远程登录,Module 的值是“SQLPLUS.EXE”。

下面创建 Rule Set,名字叫“Limit SQL*PLUS“,

使用技术手段限制 DBA 的危险操作—Oracle Database Vault

注意是“Any True”

创建 RULE:

使用技术手段限制 DBA 的危险操作—Oracle Database Vault

创建 Command Rule:

使用技术手段限制 DBA 的危险操作—Oracle Database Vault

按照这种规则,除了 SYS,SYSTEM,DV_MANAGER 之外的用户,不管是本地还是远程,都不能用 SQL*PLUS 登录。

使用技术手段限制 DBA 的危险操作—Oracle Database Vault

用 SQL Developer 登录正常:

clip_image028

概述

众所周知,在业务高峰期,某些针对 Oracle 数据库的操作具有很高的风险,比如修改表结构、修改实例参数等等,如果没有充分评估和了解这些操作所带来的影响,这些操作很可能会导致故障,轻则导致应用错误,重则导致数据库服务不可用。

另外,在非业务高峰期,某些看似风险不大的操作也可能会导致严重后果,比如不按管理流程修改表结构,如果这个表正好是 Oracle GoldenGate 复制组的一部分,修改了源端结构而没有通知 OGG 的相关人员,没有在目标端进行相同的操作,而 DDL 复制功能也没有打开的情况下,就会导致复制进程故障,导致数据不一致,在某些应用场景下,这也是很严重的生产事故。

目前,传统的应对方法还是强调管理,不管是客户还是服务商都在不断强调制度和规范,希望从制度建设和工程师的职业素养上着手,防止 DBA 的这种随意的危险操作。

但是,管理制度毕竟是“软性”的,把希望寄托在工程师自觉地遵守制度和“自我修养”上,并不能保证万无一失。

Oracle 提供的安全组件,可以用来限制、阻断这种随意的危险操作,用技术手段保证管理制度被遵守。

Oracle Database Vault 简介

我们要讨论的是 Oracle 数据库的安全组件之一: Oracle Database Vault(DV),它的主要功能是保护敏感数据和职责分离。

DV 保护敏感数据主要通过 Realm(安全域),Realm 可以简单理解为敏感数据的集合,DV 通过 realm 的配置来指定用户是否可以访问 Realm 保护的数据,如果在 DV 中没有给访问权限,即使是 sysdba 也无权访问受 Realm 保护的数据,这是 DV 的核心功能,但不是本文的重点。

DV 还有一个很重要的功能,Command Rules,就是可以按一定的判断条件,允许或阻止数据库用户执行 DDL、DML 以及 DCL 命令,而且对特权用户,包括 sysdba 都有效。这个功能正好可以满足我们限制 dba 的需求。

使用技术手段限制 DBA 的危险操作—Oracle Database Vault

大家如果想详细了解 DV 的功能,可以访问 Oracle 官网:http://www.oracle.com/technetwork/database/options/database-vault/index-085211.html

Oracle Database Vault 最低支持的数据库版本是 9.2.0.8,早期是单独的一个安装包。从 11g 开始,Oracle 的数据库安装介质中包含了这个组件,想要使用这个组件的用户需要在安装时勾选 Database Vault 选项。除了安装相关的软件组件,还需要在创建数据库时,创建相关的数据库对象。

Database Vault 可以使用相关的存储过程来实现命令行方式的配置、管理,也可以通过 web 管理界面来管理,在早期,必须安装 EM,才能使用 web 管理界面,从 11gR2 起,数据库自带的 dbcontrol 也可以进行 web 界面的管理了。

除了前面讲到的 Realm 和 Command Rules,还有两个概念要介绍一下,一个是 Factor(认证因子),另一个是 Rule sets(规则集)。

Factor(认证因子)就是可以用于进行条件判断的因素,比如客户端主机名,客户端 IP 等等,Oracle 内置了一些常用的 Factor,用户也可以自己创建 Factor,Factor 可以是一个表达式,也可以是一个存储过程的返回值。

Rule Sets 简单说就是判断条件的集合,类似 SQL 的 where 之后的判断条件,当规则集的判断条件返回为 true 时,DV 允许用户访问数据或执行特定的命令。Rule sets 中的 Rule 可以引用 Factor 做判断。

示例 1:只允许在非业务时间执行 drop 命令

这个例子是最简单的,不需要使用 Factor,只使用 Rule Sets 和 Command Rules 就可以完成。我们用数据库用户 test 来示范:

登录 DV 的管理页面:

使用技术手段限制 DBA 的危险操作—Oracle Database Vault

创建一个 Rule Set,名字叫”Can not drop table in business time”,选择 Any True,意思是说规则集中的规则(判断条件)任何一个为 True,规则集判断结果就为 True。其实 All True 就相当于 and,Any True 就相当于 or

使用技术手段限制 DBA 的危险操作—Oracle Database Vault

使用技术手段限制 DBA 的危险操作—Oracle Database Vault

这两个 RULE 也很好理解,就是判断当前时间是否为业务时间,在这里,为了便于做实验,把业务时间定义为 11:45~11:55,这个规则集判断当前时间,如果当前时间不在业务时间内,规则集返回 True。

然后创建 Command Rule,如下图:

使用技术手段限制 DBA 的危险操作—Oracle Database Vault

这个 Command Rule 的意思就是指定的 Rule Set 返回 True 时,允许 drop test 用户下的表,否则即使是 sysdba 或表的 owner 也无权 drop table。

效果:

使用技术手段限制 DBA 的危险操作—Oracle Database Vault

使用技术手段限制 DBA 的危险操作—Oracle Database Vault

其他我们想控制的 Alter Table 等 Command Rule 的设置方法类似。

更多详情见请继续阅读下一页的精彩内容 :http://www.linuxidc.com/Linux/2016-12/138472p2.htm

实例 3:使用 Dual Key 安全功能

现实场景中,我们希望 DBA 遵守制度,比如在修改表结构之前,通知 OGG 相关人。或者为了增加安全性,要求 DBA 做的重大操作,必须得到老板的批准。DV 可以利用 Dual Key 功能满足这种需求。

简单说,我们可以写一个存储过程,判断流程中需要通知的人是否在线,如果在线,才允许执行相应的操作。而那个需要被通知的人,只要拥有 connect 数据库的权限就行,他(她)的登录动作就变成了一种授权或被通知后的确认。

具体步骤:

首先给 DV 的管理员授权,让用户可以访问字典视图和编写存储过程:

SQL> GRANT CREATE PROCEDURE TO dv_manager;

Grant succeeded.

SQL> GRANT SELECT ON V_$SESSION TO dv_manager;

Grant succeeded.

我们假设授权的用户是“BOSS“,而执行操作的用户是”TEST“,相应的判断 BOSS 是否在线的存储过程如下:

CREATE OR REPLACE FUNCTION check_boss_logged_in

return varchar2

authid definer as

v_session_number number := 0;

v_allow varchar2(10) := ‘TRUE’;

v_deny varchar2(10) := ‘FALSE’;

BEGIN

SELECT COUNT(*) INTO v_session_number

FROM SYS.V_$SESSION

WHERE USERNAME = ‘BOSS’;

IF v_session_number > 0

THEN RETURN v_allow;

ELSE

RETURN v_deny;

END IF;

END check_boss_logged_in;

/

使用 DV 管理员创建这个 Function,然后授权给 DVSYS:

SQL>GRANT EXECUTE ON check_boss_logged_in to DVSYS;

创建 Rule Set:

Name:Dual Key

Evaluation Options:Any True

规则如下:

使用技术手段限制 DBA 的危险操作—Oracle Database Vault

创建 Command Rule:

使用技术手段限制 DBA 的危险操作—Oracle Database Vault

这个 Command Rule 达到的效果是,如果 test 用户想 alter owner 为 test 的 table,必须 boss 用户同时在线,否则报错,无权限。如果是其他人修改 test 用户下的表,不受这个限制。

最后的效果:

BOSS 用户没有在线,那么 TEST 用户 alter table 报错

使用技术手段限制 DBA 的危险操作—Oracle Database Vault

只有在 test 用户通知了 boss 用户,或者按照流程,得到了 boss 用户的批准,boss 用户用登录数据库这个动作来代表确认,test 用户才可以修改表结构:

使用技术手段限制 DBA 的危险操作—Oracle Database Vault

更多 Oracle 相关信息见 Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12

本文永久更新链接地址 :http://www.linuxidc.com/Linux/2016-12/138472.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计5678字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中