网络安全

位置:IT落伍者 >> 网络安全 >> 浏览文章

Oracle FAQ 之网络与安全篇


发布日期:2023年02月14日
 
Oracle FAQ 之网络与安全篇

ORACLE网络与安全

[Q]如何限定特定IP访问数据库

[A]可以利用登录触发器cmgw或者是在$OREACLE_HOME/network/admin下新增一个protocolora文件(有些os可能是 protocolora)i可以直接修改sqlnetora

增加如下内容

tcpvalidnode_checking=yes

#允许访问的ip

tcpinited_nodes=(ipip……)

#不允许访问的ip

tcpexcluded_nodes=(ipip……)

[Q]如何穿过防火墙连接数据库

[A]这个问题只会在WIN平台出现UNIX平台会自动解决

解决方法

在服务器端的SQLNETORA应类似

SQLNETAUTHENTICATION_SERVICES= (NTS)

NAMESDIRECTORY_PATH= (TNSNAMES ONAMES HOSTNAME)

TRACE_LEVEL_CLIENT =

注册表的HOME加[HKEY_LOCAL_MACHINE]

USE_SHARED_SOCKET=TRUE

[Q]如何利用hostname方式连接数据库

host name方式只支持tcp/ip协议的小局域网

修改listenerora中的如下信息

(SID_DESC =

(GLOBAL_DBNAME = ur_hostname) 你的机器名

(ORACLE_HOME = E:\oracle\ora) oracle home

(SID_NAME = orcl) sid name

)

然后在客户端

的sqlnetora中确保有

NAMESDIRECTORY_PATH= (HOSTNAME)

你就可以利用数据库服务器的名称访问数据库了

[Q]dbms_repcat_admin能带来什么安全隐患

[A]如果一个用户能执行dbms_repcat_admin包将获得极大的系统权限

以下情况可能获得该包的执行权限

在sys下grant execute on dbms_repcat_admin to public[|user_name]

用户拥有execute any procedure特权(仅限于i以下i必须显示授权)

如果用户通过执行如下语句

exec sysdbms_repcat_admingrant_admin_any_schema(user_name);

该用户将获得极大的系统特权

可以从user_sys_privs中获得详细信息

[Q]在不知道用户密码的时候怎么样跳转到另外一个用户执行操作后并不影响该用户?

[A]我们通过如下的方法可以安全使用该用户然后再跳转回来在某些时候比较有用

需要Alter user权限或DBA权限

SQL> select password from dba_users where username=SCOTT;

PASSWORD

FCB

SQL> alter user scott identified by lion;

User altered

SQL> connect scott/lion

Connected

REM Do whatever you like

SQL> connect system/manager

Connected

SQL> alter user scott identified by values FCB;

User altered

SQL> connect scott/tiger

Connected

[Q]如何加固你的数据库

[A]要注意以下方面

修改sys system的口令

Lock修改删除默认用户 dbsnmpctxsys等

把REMOTE_OS_AUTHENT改成False防止远程机器直接登陆

把O_DICTIONARY_ACCESSIBILITY改成False

把一些权限从PUBLIC Role取消掉

检查数据库的数据文件的安全性不要设置成之类的检查其他dba 用户

把一些不需要的服务(比如ftp nfs等关闭掉)

限制数据库主机上面的用户数量

定期检查Metalink/OTN上面的security Alert比如

把你的数据库与应用放在一个单独的子网中要不然你的用户密码很容易被sniffer去或者采用advance security对用户登录加密

限止只有某些ip才能访问你的数据库

lsnrctl 要加密码要不然别人很容易从外面关掉你的listener

如果可能不要使用默认端口

[Q]如何检查用户是否用了默认密码

[A]如果使用默认密码很可能就对你的数据库造成一定的安全隐患那么可以使用如下的查询获得那些用户使用默认密码

select username User(s) with Default Password!

from dba_users

where password in

(EDDCCC dbsnmp

ABABBBC ctxsys

ABADAF mdsys

CEFAAF odm

AACDDCED odm_mtr

ABCF ordplugins

EFAECEABF ordsys

ABAEC outln

FCB scott

FFBDD wk_proxy

DFABDCF wk_sys

CBAF wmsys

DFCEAF xdb

FDABB tracesvr

CDDCE oas_public

ACEDEE websys

ACFDFEB lbacsys

EBDCE rman

ACDE perfstat

FEFC exfsys

BCBCADFA si_informtn_schema

DCBDCA sys

DDFABE) system

/

[Q]如何修改默认的XDB监听端口

[A] Oraclei默认的XML DB把HTTP的默认端口设为这是一个太常用的端口了很多别的WebServer都会使用这个端口

如果我们安装了它最好修改一下避免沖突如果不使用呢就最好不要安装

提供三种修改的方法

dbca选择你的数据库然后Standard Database Features>Customize>Oracle XML DB option进入这个画面你应该就知道怎么改了

OEM console在XML Database 的配置里面修改

用oracle提供的包

把HTTP/WEBDAV端口从改到

SQL> call dbms_xdbcfg_update(updateXML(dbms_xdbcfg_get()

/xdbconfig/sysconfig/protocolconfig/httpconfig/httpport/text()))

/

把FTP端口从改到

SQL> call dbms_xdbcfg_update(updateXML(dbms_xdbcfg_get()

/xdbconfig/sysconfig/protocolconfig/ftpconfig/ftpport/text()))

/

SQL> commit;

SQL> exec dbms_xdbcfg_refresh;

检查修改是否已经成功

SQL> select dbms_xdbcfg_get from dual;

[Q]怎么捕获用户登录信息如SIDIP地址等

[A]可以利用登录触发器

CREATE OR REPLACE TRIGGER tr_login_record

AFTER logon ON DATABASE

DECLARE

miUserSid NUMBER;

mtSession v$session%ROWTYPE;

CURSOR cSession(iiUserSid IN NUMBER) IS

SELECT * FROM v$session

WHERE sid=iiUserSid;

BEGIN

SELECT sid INTO miUserSid FROM v$mystat WHERE rownum<=;

OPEN cSession(miUserSid);

FETCH cSession INTO mtSession;

if user exists then insert data

IF cSession%FOUND THEN

INSERT INTO log$information(login_userlogin_timeip_adressausidterminal

osusermachineprogramsidserial#)

VALUES(ora_login_userSYSDATESYS_CONTEXT (USERENVIP_ADDRESS)

userenv(SESSIONID)

mtSessionTerminalmtSessionOsuser

mtSessionMachinemtSessionProgram

mtSessionSidmtSessionSerial#);

ELSE

if user dont exists then return error

sp_write_log(Session Information Error:||SQLERRM);

CLOSE cSession;

raise_application_error(Login ExceptionFALSE);

END IF;

CLOSE cSession;

EXCEPTION

WHEN OTHERS THEN

sp_write_log(Login Trigger Error:||SQLERRM);

END tr_login_record;

在以上触发器中需要注意以下几点

该用户有v_$session与v_$mystat的对象查询权限可以在sys下对该拥护显式授权

sp_write_log原本是一个写日志的过程可以置换为自己的需要如null跳过

必须在创建该触发器之前创建一个log$information的表记录登录信息

[Q]怎么捕获整个数据库的DDL语句或者是说对象结构变化与修改

[A]可以采用DDL触发器

CREATE OR REPLACE TRIGGER tr_trace_ddl

AFTER DDL ON DATABASE

DECLARE

sql_text ora_name_list_t;

state_sql ddl$traceddl_sql%TYPE;

BEGIN

FOR i IN ora_sql_txt(sql_text) LOOP

state_sql := state_sql||sql_text(i);

END LOOP;

INSERT INTO ddl$trace(login_userddl_timeip_addressaudsid

schema_userschema_objectddl_sql)

VALUES(ora_login_userSYSDATEuserenv(SESSIONID)

sys_context(USERENVIP_ADDRESS)

ora_dict_obj_ownerora_dict_obj_namestate_sql);

EXCEPTION

WHEN OTHERS THEN

sp_write_log(Capture DDL Excption:||SQLERRM);

END tr_trace_ddl;

在创建以上触发器时要注意几点

必须创建一个ddl$trace的表用来记录ddl的记录

sp_write_log原本是一个写日志的过程可以置换为自己的需要如null跳过               

上一篇:不能启动EasyConfig时如何创建一个新的网络服务

下一篇:Oracle监听口令及监听器安全