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跳过