0

0

如何监控被授予DBA角色的非系统用户_定期检查DBA_ROLE_PRIVS防后门

P粉602998670

P粉602998670

发布时间:2026-03-13 16:58:03

|

926人浏览过

|

来源于php中文网

原创

最准确的方法是查询DBA_ROLE_PRIVS视图并排除Oracle内置用户,再结合ROLE_ROLE_PRIVS递归检查嵌套授权,同时校验V$PWFILE_USERS和组合权限风险。

查哪些用户被授予了DBA角色

直接查 dba_role_privs 视图是最准的,它记录所有角色授予关系,不依赖当前会话权限。重点筛出非系统用户(即用户名不是 oracle 内置账户),避免把 systemsysoutln 这类账号混进来。

常见错误是只查 SESSION_ROLES 或靠 CURRENT_USER 判断——这只能看到当前登录用户的权限,漏掉其他账号;还有人用 DBA_USERSACCOUNT_STATUS 过滤,但状态正常≠不该有DBA权限。

  • 执行:
    SELECT grantee FROM dba_role_privs WHERE granted_role = 'DBA' AND grantee NOT IN ('SYS','SYSTEM','OUTLN','DBSNMP','ORDDATA','ORDSYS','MDSYS','CTXSYS','XDB','WMSYS','APPQOSSYS','DVSYS','AUDSYS','GSMADMIN_INTERNAL');
  • 更稳妥的做法是排除所有以 Oracle 默认前缀开头的用户:grantee NOT LIKE 'APEX\_%' ESCAPE '\'NOT LIKE 'FLOWS\_%'NOT LIKE 'MDDATA'
  • 注意:GRANTEE 可能是角色名(比如某应用角色被授了DBA),所以还得递归查该角色下有哪些用户——但日常监控优先盯住直接授予DBA的用户

为什么不能只看DBA_ROLE_PRIVS就完事

因为 DBA 权限可能通过嵌套角色间接获得。比如用户 A 没被直授 DBA,但被授了角色 R,而 R 被授了 DBA——这种链式授权 DBA_ROLE_PRIVS 本身不展开,得靠 ROLE_ROLE_PRIVS 追踪。

典型踩坑场景:安全扫描工具只扫一层授权,报告“无非系统用户持DBA”,结果上线后发现某中间件账号通过自定义运维角色拿到了等效DBA权限。

  • 简单递归检查命令(需有访问 ROLE_ROLE_PRIVS 权限):
    SELECT DISTINCT r1.grantee FROM dba_role_privs r1 JOIN role_role_privs r2 ON r1.granted_role = r2.role WHERE r2.granted_role = 'DBA';
  • 如果数据库版本 ≥ 12c,可用 WITH RECURSIVE 查完整路径,但多数巡检脚本用两层 JOIN 就够用
  • 注意性能:ROLE_ROLE_PRIVS 数据量小,但嵌套过深(>3 层)时建议加 LEVEL <= 3 限制,避免误触发全表扫描

定期自动检查的最小可行方案

不用上 ELK 或商业审计平台,一个带时间戳的 SQL 脚本 + cron 就能跑通。关键是输出要包含「谁、什么时候、怎么拿到的」三要素,否则出问题回溯不了。

容易被忽略的是权限回收后的残留痕迹:比如用户已被 DROP USER,但 DBA_ROLE_PRIVS 里还留着记录(实际已失效),或者用户被 ALTER USER ... ACCOUNT LOCK 但权限没清理。

Rose.ai
Rose.ai

一个云数据平台,帮助用户发现、可视化数据

下载
  • 推荐组合查询(含来源和状态):
    SELECT d.grantee, d.granted_role, d.admin_option, u.account_status, SYSDATE AS check_time FROM dba_role_privs d LEFT JOIN dba_users u ON d.grantee = u.username WHERE d.granted_role = 'DBA' AND d.grantee NOT IN (/*同上系统用户列表*/);
  • 把结果重定向到文件时,务必加 SET PAGESIZE 0 LINESIZE 32767 TRIMSPOOL ON FEEDBACK OFF VERIFY OFF,不然 spool 出来全是格式符
  • 别用 TO_DATE(SYSDATE) 当检查时间——会丢精度;直接用 SYSDATESYSTIMESTAMP

DBA权限后门的真实风险点

很多人以为只要没开远程登录就没事,其实 DBA 角色自带 CREATE ANY PROCEDUREALTER SYSTEM,意味着能写存储过程调用 UTL_FILE 写 shell 脚本、或通过 ORACLE_HOME 下的外部程序提权。真正的高危动作不是“连得上”,而是“改得了”。

最常被绕过的检查是密码文件用户(REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE 时):这类用户即使不在 DBA_ROLE_PRIVS 里,也可能凭 SYSDBA 登录后直接赋权——所以必须同步查 V$PWFILE_USERS

  • 顺手加一条检查:
    SELECT username FROM v$pwfile_users WHERE sysdba = 'TRUE' AND username NOT IN ('SYS','INTERNAL');
  • 注意:19c 后 INTERNAL 已废弃,但某些老迁移库还残留,别漏判
  • 如果数据库启用了 Oracle Wallet 或 TDE,还要确认 ENCRYPTION_WALLET_LOCATION 配置没被恶意覆盖——DBA 用户可改这个参数

真正难防的不是明面上的DBA账号,而是那些被悄悄赋予 SELECT_CATALOG_ROLE + EXECUTE_CATALOG_ROLE + CREATE ANY TRIGGER 的组合权限。它们凑一起,能力逼近DBA,却不会出现在 DBA_ROLE_PRIVS 的 ‘DBA’ 行里。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

1134

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

340

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

381

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2194

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

380

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

1703

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

586

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

440

2024.04.29

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

26

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号