当前位置:首页 > 问答 > 正文

ORA-28111权限不够导致策略判断失败,远程帮忙修复故障方案分享

ORA-28111权限不够导致策略判断失败,远程帮忙修复故障方案分享

前几天,我接到一个紧急的远程支持请求,客户的开发人员报告说,他们的一个核心应用突然无法访问数据库中的某张重要表格了,一查询就报错,错误代码是ORA-28111,应用团队非常着急,因为这会直接影响线上业务。

我立刻通过远程工具连接上了客户的测试环境(出于安全,我们先在测试环境复现问题),我让开发人员执行了那条出错的查询语句,果然,数据库返回了“ORA-28111: 策略函数中权限不足导致策略判断失败”的错误,这个错误听起来有点绕,就是数据库里启用了一种叫做“虚拟私有数据库”(VPD)的安全功能,这个功能就像一个自动的、看不见的过滤器,每当有人查询某张表时,数据库会自动执行一个后台函数,这个函数会根据当前登录的用户是谁,动态地在查询语句后面加上一个限制条件(只能看自己部门的数据”)。

而现在的问题就出在这个后台函数上,ORA-28111错误明确告诉我们:数据库在执行这个策略函数时,函数本身“权限不够”了,导致它无法完成判断数据过滤条件的工作,所以整个查询就失败了。

接下来就是排查过程,我采取了以下几个步骤:

第一步,确认策略的存在,我以DBA权限登录数据库,查询了数据字典视图DBA_POLICIES,找到了应用表格上绑定的VPD策略名称以及对应的策略函数名称,这一步是为了确认问题确实是由VPD策略引起的,并且知道了是哪个函数出了问题。

第二步,检查策略函数的权限,这是最关键的一步,VPD策略函数有一个特殊要求:它必须由函数的所有者(通常是某个特定用户,比如SEC_USER)直接授权给执行者,并且不能通过角色来获得权限,这里就有一个常见的坑:很多时候,DBA会给应用用户授予一个角色,这个角色包含了执行策略函数的权限,大家以为这样就够了,但实际上,在VPD策略执行的特殊上下文中,数据库是不认可通过角色获得的权限的,它要求的是“直接权限”。

我让客户的DBA检查了策略函数的所有者,以及是否已经将函数的EXECUTE(执行)权限直接授予了正在执行查询的那个应用用户,果然,问题就出在这里,之前,函数的EXECUTE权限是通过一个角色授予应用用户的,最近因为一次安全审计,权限体系做了调整,那个角色被收回了,虽然应用用户通过其他方式仍然能连接到数据库,但已经失去了执行策略函数的直接权限。

第三步,修复问题,找到了根因,修复就很简单了,我让客户的DBA执行了一条简单的授权语句,格式类似于:GRANT EXECUTE ON SEC_USER.policy_function TO app_user;,这里的关键是,必须由函数的所有者SEC_USER来执行这个授权,或者由有足够权限的DBA来执行,并且确保授权是直接给app_user这个用户的,而不是给一个角色。

第四步,验证修复结果,授权完成后,我让开发人员再次执行之前失败的查询语句,这一次,查询成功返回了数据,没有再报ORA-28111错误,为了确保万无一失,我们还测试了不同应用用户登录,确认数据过滤(即VPD策略本身的功能)也是正常工作的,不同用户只能看到他们被授权看到的数据。

总结一下这次远程故障修复的经验:

  1. 理解错误含义:ORA-28111直接指向VPD策略函数的权限问题,而不是表格或应用的权限问题。
  2. 抓住关键点:VPD策略函数要求调用者(通常是会话用户)拥有该函数的“直接EXECUTE权限”,通过角色获得的权限无效,这是最容易出错的地方。
  3. 排查思路清晰:先定位策略和函数,再检查权限授予方式,重点检查是否是直接授权。
  4. 最小权限原则:在修复时,只授予解决问题所必需的最小权限,即直接将函数的EXECUTE权授予特定的应用用户。

这次故障也提醒我们,在进行数据库权限变更时,尤其是涉及角色调整时,需要特别留意那些依赖于直接权限的特殊对象,比如VPD策略函数、存储过程等,避免因权限丢失导致业务中断,通过这次远程协作,我们快速定位并解决了问题,客户对这次支持表示满意。

(注:本案例分享基于一次真实的Oracle数据库技术支持经历,涉及的用户名、表名等均为化名。)

ORA-28111权限不够导致策略判断失败,远程帮忙修复故障方案分享