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为您为用户设置的密码。