一个容易忽视的Oracle安全问题

数据库安全至关重要,Oracle数据库采用多种手段保障安全。典型安装后会自动创建DBSNMP用户,其缺省密码为“DBSNMP”,若未修改,任何人可借此存取数据库。该用户有系统级权限,可写脚本用垃圾数据填满系统致其瘫痪,建议管理员修改默认口令。
数据库安全问题一直是人们关注的焦点之一,我们知道一个企业或者机构的数据库如果遭到黑客的攻击,而这些数据库又保存着非常重要的数据,象银行、通信等数据库,后果将不堪设想。Oracle数据库使用了多种手段来保证数据库的安全性,如密码,角色,权限等等。

作为Oracle的数据库管理员都知道,数据库系统典型安装后,一般sys和system以及internal这三个用户具有默认的口令,数据库安装成功后,系统管理员作的第一件工作就是修改这些用户的口令,保证数据库的安全性。然而,众多管理员往往忽视了其中的一个安全问题,下面我们就将详细讨论这个问题。

Oracle数据库系统如果采用典型安装后,除了创建前面介绍的几个用户外,另外还自动创建了一个叫做DBSNMP的用户,该用户负责运行Oracle系统的智能代理(Intelligent Agent),该用户的缺省密码也是“DBSNMP”。如果忘记修改该用户的口令,任何人都可以通过该用户存取数据库系统。现在我们来看一下该用户具有哪些权限和角色,然后来分析一下该用户对数据库系统可能造成的损失。

启动SQL/PLUS程序,使用该用户登录进入:

SQL> select * from session_privs;
CREATE SESSION
ALTER SESSION
UNLIMITED TABLESPACE
CREATE TABLE
CREATE CLUSTER
CREATE SYNONYM
CREATE PUBLIC SYNONYM
CREATE VIEW
CREATE SEQUENCE
CREATE DATABASE LINK
CREATE PROCEDURE
CREATE TRIGGER
ANALYZE ANY
CREATE TYPE
CREATE OPERATOR
CREATE INDEXTYPE
可以看到该用户不是SYS或SYSTEM管理用户,然而,它却具有两个系统级权限:UNLIMITED TABLESPACE和CREATE PUBLIC SYNONYM。

看到这两个权限你应该马上想到,这些都是安全隐患,尤其是UNLIMITED TABLESPACE,它是破坏数据库系统的攻击点之一。如果这时候你还依然认为,即使有人利用这个没有修改的口令登录进数据库也造成不了什么损失的话,我就不得不提醒你:该用户具有UNLIMITED TABLESPACE的系统权限,它可以写一个小的脚本,然后恶意将系统用垃圾数据填满,这样数据库系统也就无法运行,并将直接导致最终的瘫痪。目前很多数据库系统都要求7X24的工作,如果出现了系统用垃圾数据填满的情况,那么,等数据库系统恢复时,恐怕不可挽回的损失已经造成了。

为了保证Oracle数据库系统运行的绝对安全,强烈建议数据库管理员修改该用户的默认口令,不要为不怀好意的人留下“方便之门”。
<think>好的,我需要编写一个Shell脚本来监视Oracle数据库的关键指标。首先,我得确定哪些指标是重要的,比如连接数、表空间使用情况、等待事件、锁冲突和性能统计等。然后,我需要找到获取这些指标的方法,通常可以通过SQL查询来获取。 接下来,我需要考虑如何连接到Oracle数据库。通常可以使用sqlplus命令行工具,所以脚本中需要包含连接字符串,包括用户名、密码和服务名。不过,硬编码密码不安全,可能需要使用外部配置文件或者提示用户输入,但为了简化示例,可能暂时先写在脚本里,后面再优化。 然后,编写SQL查询语句。每个指标对应一个SQL查询,例如检查当前连接数可以用SELECT COUNT(*)FROM v$session,表空间使用情况可能需要计算已用空间和总空间的百分比。需要确保这些查询在Oracle中有效,并且返回的数据格式便于处理。 在脚本中,可能需要多次调用sqlplus执行不同的查询。为了提高效率,可以将所有查询合并到一个SQL文件中,或者在一个sqlplus会话中执行多个查询。这里可能需要使用Here Document的方式在Shell脚本中嵌入SQL语句。 处理输出结果也是一个挑战。sqlplus默认的输出可能包含表头和其他格式内容,需要通过设置pagesize、linesize和feedback off来禁用这些格式,以便更容易解析结果。然后,可以使用grep、awk等工具提取所需的数据。 还需要考虑日志记录功能,将监控结果输出到日志文件中,并加上时间戳。可能需要使用date命令获取当前时间,并重定向输出到日志文件。 错误处理也不能忽视,比如数据库连接失败、SQL执行错误等情况,脚本应该能够捕获这些错误并做出相应处理,比如输出错误信息并退出。 最后,可能需要设置定时任务,比如使用cron定期执行这个脚本,实现自动化监控。同时,脚本的参数化和配置文件的集成也是后续改进的方向,比如从外部文件读取数据库连接信息,提高脚本的灵活性和安全性。现在将这些思路整合成一个Shell脚本,结构大致如下:1. 定义数据库连接参数。2. 定义SQL查询语句。3. 使用sqlplus执行查询,并处理输出。 4.记录结果到日志文件。 5.添加错误处理。 编写具体的代码部分,注意转义字符和变量替换,确保SQL语句正确执行。例如,在HereDocument中使用变量时需要小心,可能需要关闭变量替换或者在变量前加上转义符。 测试脚本,检查各个指标是否正确获取,日志文件是否生成,以及错误处理是否有效。可能需要调整SQL查询或输出处理步骤,确保数据的准确性和可读性。 最后,考虑扩展性和维护性,比如添加更多的监控指标,或者将脚本模块化,方便后续修改和扩展。</think>是一个通过Shell脚本实现Oracle数据库指标监视的解决方案,包含连接数、表空间使用率等关键指标的监控: ```bash #!/bin/bash # 配置数据库连接信息 ORACLE_USER="system" ORACLE_PASS="your_password" ORACLE_SERVICE="ORCLCDB" LOG_FILE="/var/log/oracle_monitor.log" # 获取时间戳 timestamp=$(date "+%Y-%m-%d %H:%M:%S") # 定义监控SQL语句 MONITOR_SQL=$(cat <<EOF SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF -- 当前连接数 SELECT 'ACTIVE_SESSIONS:' || COUNT(*) FROM v\$session WHERE status = 'ACTIVE'; -- 表空间使用率 SELECT 'TABLESPACE:' || tablespace_name || ':' || ROUND(used_percent,2) FROM ( SELECT a.tablespace_name, (a.bytes - NVL(b.bytes, 0)) / a.bytes * 100 used_percent FROM (SELECT tablespace_name, SUM(bytes) bytes FROM dba_data_files GROUP BY tablespace_name) a, (SELECT tablespace_name, SUM(bytes) bytes FROM dba_free_space GROUP BY tablespace_name) b WHERE a.tablespace_name = b.tablespace_name(+) ); -- 等待事件TOP 5 SELECT 'TOP_WAIT:' || event || ':' || total_waits FROM ( SELECT event, total_waits FROM v\$system_event WHERE wait_class != 'Idle' ORDER BY total_waits DESC ) WHERE ROWNUM <= 5; -- 锁冲突检测 SELECT 'LOCKS:' || COUNT(*) FROM v\$lock WHERE block = 1; -- 缓冲区命中率 SELECT 'BUFFER_HIT_RATIO:' || ROUND((1 - (phy.value / (cur.value + con.value)))*100, 2) FROM v\$sysstat cur, v\$sysstat con, v\$sysstat phy WHERE cur.name = 'db block gets' AND con.name = 'consistent gets' AND phy.name = 'physical reads'; EXIT; EOF ) # 执行监控并记录日志 echo "===== ${timestamp} Oracle Monitoring Start =====" >> ${LOG_FILE} sqlplus -S "${ORACLE_USER}/${ORACLE_PASS}@${ORACLE_SERVICE}" <<< "${MONITOR_SQL}" | \ while read line do case $line in ACTIVE_SESSIONS:*) echo "Active Sessions: ${line#*:}" >> ${LOG_FILE} ;; TABLESPACE:*) IFS=':' read -ra ts_info <<< "$line" echo "Tablespace ${ts_info[1]} Usage: ${ts_info[2]}%" >> ${LOG_FILE} ;; TOP_WAIT:*) IFS=':' read -ra wait_info <<< "$line" echo "Top Wait Event: ${wait_info[1]} (Count: ${wait_info[2]})" >> ${LOG_FILE} ;; LOCKS:*) echo "Current Locks: ${line#*:}" >> ${LOG_FILE} ;; BUFFER_HIT_RATIO:*) echo "Buffer Hit Ratio: ${line#*:}%" >> ${LOG_FILE} ;; esac done echo "===== ${timestamp} Oracle Monitoring End =====" >> ${LOG_FILE} ``` 代码解释: 1. 配置数据库连接信息和日志路径 2. 定义包含多个监控指标的SQL语句 3. 使用sqlplus连接数据库执行监控SQL 4. 解析不同监控指标的输出并记录到日志文件 5. 每个监控周期记录开始和结束时间戳 6. 监控指标包括: - 活跃会话数 - 表空间使用率 - 前5等待事件 - 当前锁数量 - 缓冲区命中率
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值