首页 游戏 软件 资讯 排行榜 专题
首页
数据库
Oracle如何撤销PUBLIC的默认权限_安全加固指南

Oracle如何撤销PUBLIC的默认权限_安全加固指南

热心网友
85
转载
2026-04-29

直接撤销PUBLIC默认权限需分步验证、按包评估并保留回退路径;盲目执行REVOKE可能导致STANDARD包失效、对象INVALID及ORA-06553错误,甚至数据库无法登录。

直接撤销 PUBLIC 的默认权限,这可不是什么“一键清理”的轻松活儿。它更像是一场需要精心策划的权限收敛行动:必须分步验证、按包评估,并且时刻准备好回退路径。如果盲目执行 REVOKE 命令,后果可能相当严重——STANDARD 包失效、大量对象状态变为 INVALID、应用抛出 ORA-06553 错误,甚至可能导致数据库完全无法登录。

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

哪些 EXECUTE 权限必须优先回收

那么,哪些权限是必须优先处理的高危目标呢?Oracle 官方早已给出明确建议,应该从 PUBLIC 撤销以下这些包的执行权限。原因很简单,它们可能被任意用户利用,成为文件读写、网络外连甚至代码注入等攻击链条中的一环:

  • UTL_FILE:直接读写数据库服务器本地的文件系统。
  • UTL_HTTPUTL_TCPUTL_SMTP:能够发起任意的 HTTP、TCP 或 SMTP 请求,常被用于服务器端请求伪造(SSRF)或建立反向 Shell。
  • DBMS_RANDOM:看起来似乎无害,但若结合其他漏洞,可能被用来预测或绕过某些逻辑校验。
  • CTX_DOCDBMS_EXPORT_EXTENSIONDBMS_SQL:历史上存在多个提权相关的 CVE 漏洞,非必要绝不开放。

具体的执行示例如下(注意,这需要 SYSDBA 权限):

REVOKE EXECUTE ON sys.utl_file FROM PUBLIC;
REVOKE EXECUTE ON sys.utl_http FROM PUBLIC;
REVOKE EXECUTE ON sys.utl_tcp FROM PUBLIC;

这里有个关键细节:REVOKE 语句中必须显式指定 schema(通常是 sys),否则你会遇到恼人的 ORA-00942: table or view does not exist 错误。

撤销 SELECT ANY TABLE 后的连锁反应

接下来要说的,可能是最容易踩坑的操作。一旦你执行了 REVOKE SELECT ANY TABLE FROM PUBLIC,连锁反应会立刻发生。所有依赖数据字典视图的内置包(比如 STANDARDDBMS_STANDARD)会立即变为 INVALID 状态。随后,任何 PL/SQL 编译或数据库登录尝试都可能失败,典型的错误信息就是:

ORA-06553: PLS-213: STANDARD package not accessible

这并非系统 bug,而是 Oracle 的设计机制使然:许多核心包在编译时,隐式引用了 ALL_*DBA_* 这类视图,而这些视图的访问权限链恰恰依赖于 SELECT ANY TABLE

一旦发生这种情况,补救措施通常只有两种:

  • 立即运行 @?/rdbms/admin/utlrp.sql 脚本,尝试重新编译所有无效对象(这要求数据库在线,且无法保证100%成功)。
  • 如果已经无法登录,那就只剩下从 RMAN 备份恢复,或者冒险重建数据字典(执行 @?/rdbms/admin/catalog.sql@?/rdbms/admin/catproc.sql),后者的风险极高。

所以,结论非常明确:除非你完全掌控所有应用逻辑,并且能百分百确认没有任何自定义包依赖数据字典,否则,绝对不要轻易去动授予 PUBLICSELECT ANY TABLE 权限。

如何安全地批量检查与清理

别依赖记忆或者陈旧的文档去猜测——最可靠的方式是用 SQL 语句精确识别当前的安全暴露面。

首先,检查 PUBLIC 目前拥有哪些高危的 EXECUTE 权限:

SELECT table_name, owner FROM dba_tab_privs WHERE grantee = 'PUBLIC' AND privilege = 'EXECUTE' AND table_name IN ('UTL_FILE','UTL_HTTP','UTL_TCP','UTL_SMTP','DBMS_RANDOM');

其次,排查是否有敏感对象被误授给了 PUBLIC

SELECT owner, table_name FROM dba_tab_privs WHERE grantee = 'PUBLIC' AND privilege = 'SELECT' AND owner NOT IN ('SYS','SYSTEM','XDB','CTXSYS');

在这个过程中,有几个关键点必须牢记:

  • 只对那些你明确知晓用途的对象执行 REVOKE,切忌进行无差别的批量操作。
  • 每次执行 REVOKE 之后,立刻查询 SELECT object_name FROM dba_objects WHERE status = 'INVALID',以确认影响范围。
  • 生产环境务必在计划好的维护窗口内执行,并提前备份权限快照:CREATE TABLE public_privs_bak AS SELECT * FROM dba_tab_privs WHERE grantee = 'PUBLIC';

为什么不能直接删掉 PUBLIC 角色

最后,需要澄清一个常见的误解:PUBLIC 并非普通角色,它是 Oracle 内置的一个隐式组,无法通过 DROP ROLEDROP USER 命令删除。如果试图用 REVOKE CONNECT FROM PUBLICREVOKE CREATE SESSION FROM PUBLIC 来操作,可能会导致整个数据库无法建立新的会话——连 sqlplus / as sysdba 这样的管理连接都可能失败。

问题的核心在于,我们真正能控制的是“授权的内容”,而不是“角色本身”。安全加固的本质是做减法:只保留对 DUALSYSDATE 这类无副作用对象的公共访问权限,其余所有权限,一律按需、显式地授予具体的用户或角色。

还有一个最容易被忽略的环节:撤销权限之后,必须全面验证所有中间件连接池、定时任务脚本、以及 DBA 管理工具(如 OEM、Toad、DBea ver)是否还能正常工作。因为它们很可能隐式依赖了某些刚刚被撤掉的包或视图。

来源:https://www.php.cn/faq/2320253.html
免责声明: 游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关攻略

为什么Oracle触发器中不能直接执行Commit操作_解析自治事务应用
数据库
为什么Oracle触发器中不能直接执行Commit操作_解析自治事务应用

ORA-04092错误:触发器中直接COMMIT会报此错,因Oracle禁止在触发器内提交事务,自治事务需显式声明PRAGMA AUTONOMOUS_TRANSACTION并手动COMMIT,否则自动回滚。 Oracle触发器里执行COMMIT会报什么错 如果你在触发器里直接写上 COMMIT 或

热心网友
04.29
如何提升Oracle查询速度_Java中创建并使用索引
数据库
如何提升Oracle查询速度_Java中创建并使用索引

Ja va不创建Oracle索引,索引须在数据库中由有权限用户执行DDL创建;Ja va仅可执行CREATE INDEX语句或通过ORM间接调用,但运行时建索引易引发事务、性能及安全问题。 先说一个核心事实:Ja va本身并不创建Oracle索引。索引是数据库层面的对象,必须在Oracle数据库内部

热心网友
04.29
如何通过静默方式删除Oracle 11g实例_使用dbca及响应文件执行卸载
数据库
如何通过静默方式删除Oracle 11g实例_使用dbca及响应文件执行卸载

Oracle 11g 静默删除数据库:避开响应文件与状态校验的“坑” 在 Oracle 11g 环境下,使用 dbca -silent 命令删除数据库,可不是一句简单的 -deleteDatabase 就能搞定的事儿。直接敲命令行?多半会碰壁。核心原因在于,11g 的静默模式设计上完全依赖响应文件驱

热心网友
04.29
Oracle Data Guard如何处理备库ORA-01110报错_修复数据文件损坏
数据库
Oracle Data Guard如何处理备库ORA-01110报错_修复数据文件损坏

ORA-01110:那个“文件不可用”的最终提示,到底在说什么? 先明确一个核心判断:ORA-01110本身从来不是独立错误。它更像是一个最终的系统提示,告诉你“有个文件出问题了,操作到此为止”。真正的病根,得往前翻看日志里紧挨着的ORA-01578、ORA-01157、ORA-01111或ORA-

热心网友
04.29
Oracle RMAN恢复时磁盘空间不足如何办_清理旧数据或调整挂载点
数据库
Oracle RMAN恢复时磁盘空间不足如何办_清理旧数据或调整挂载点

RMAN恢复失败报ORA-19809 ORA-19804?根本原因不是磁盘满,而是闪回恢复区配额耗尽 遇到RMAN恢复时抛出ORA-19809或ORA-19804错误,很多人的第一反应是去查操作系统磁盘空间。但真相往往并非如此。问题的核心,通常在于闪回恢复区(FRA)的配额(db_recovery_

热心网友
04.29

最新APP

宝宝过生日
宝宝过生日
应用辅助 04-07
台球世界
台球世界
体育竞技 04-07
解绳子
解绳子
休闲益智 04-07
骑兵冲突
骑兵冲突
棋牌策略 04-07
三国真龙传
三国真龙传
角色扮演 04-07

热门推荐

MongoDB 3.6旧版本如何平滑迁移GridFS数据_使用mongodump与mongorestore
数据库
MongoDB 3.6旧版本如何平滑迁移GridFS数据_使用mongodump与mongorestore

MongoDB 3 6旧版本如何平滑迁移GridFS数据 在MongoDB 3 6版本中,使用mongodump进行数据备份时,默认会忽略GridFS存储所使用的fs files和fs chunks集合,因为它们被系统视为内部命名空间。为确保GridFS文件数据的完整迁移,必须显式指定导出这两个集合

热心网友
04.29
Redis如何批量删除特定前缀的Key_使用Lua脚本避免阻塞主线程
数据库
Redis如何批量删除特定前缀的Key_使用Lua脚本避免阻塞主线程

生产环境禁用 KEYS+DEL,因其会阻塞 Redis 主线程;应使用带游标和分批的 SCAN+DEL Lua 脚本或 Ja va 中通过 RedisConnection 执行 SCAN 迭代删除,避免连接泄漏。 直接使用 KEYS 配合 DEL 来批量删除特定前缀的 Key,听起来很直接,对吧?但

热心网友
04.29
Redis为什么会出现内存泄漏的假象_排查Lua脚本中未设置过期的临时变量
数据库
Redis为什么会出现内存泄漏的假象_排查Lua脚本中未设置过期的临时变量

Redis为什么会出现内存泄漏的假象?排查Lua脚本中未设置过期的临时变量 Redis内存持续上涨可能源于Lua脚本中未设置过期时间的临时键,如set、hset、zadd写入后遗漏expire,导致“孤儿键”累积;需用redis-cli --scan结合object freq和ttl定位,并按业务语

热心网友
04.29
如何用SQL实现多级分组的排名统计_窗口函数扩展
数据库
如何用SQL实现多级分组的排名统计_窗口函数扩展

多级分组排名应选rank()或dense_rank()而非row_number():rank()跳过重复名次,dense_rank()连续编号;必须配合PARTITION BY和ORDER BY,且WHERE筛选需用子查询避免破坏分组。 rank() 和 dense_rank() 在多级分组中行为差

热心网友
04.29
Redis如何实现基于发布订阅的配置热更新_发布配置变更通知触发服务重载
数据库
Redis如何实现基于发布订阅的配置热更新_发布配置变更通知触发服务重载

Redis如何实现基于发布订阅的配置热更新 Redis Pub Sub 能否可靠用于配置热更新? 直接拿来用?恐怕不行。Redis 的 PUBLISH SUBSCRIBE 本质上是一种“即发即弃”的模型:消息不持久、没有确认机制、订阅者离线期间的消息会彻底丢失。想象一下,你的服务因为重启或者网络短暂

热心网友
04.29