oracle faq----5

第五部分、ORACLE网络与安全
[Q]
如何限定特定 IP 访问数据库
[A]
可以利用登录触发器、 cmgw 或者是在 $OREACLE_HOME/network/admin 下新增一个 protocol.ora 文件(有些 os 可能是 . protocol.ora ), 9i 可以直接修改 sqlnet.ora
增加如下内容:
tcp.validnode_checking=yes
#
允许访问的 ip
tcp.inited_nodes=(ip1,ip2,……)
#
不允许访问的 ip
tcp.excluded_nodes=(ip1,ip2,……)

[Q]
如何穿过防火墙连接数据库
[A]
这个问题只会在 WIN 平台出现, UNIX 平台会自动解决。
解决方法:
在服务器端的 SQLNET.ORA 应类似
SQLNET.AUTHENTICATION_SERVICES= (NTS)
NAMES.DIRECTORY_PATH= (TNSNAMES, ONAMES, HOSTNAME)
TRACE_LEVEL_CLIENT = 16
注册表的 HOME0 [HKEY_LOCAL_MACHINE]
USE_SHARED_SOCKET=TRUE

[Q]
如何利用 hostname 方式连接数据库
host name
方式只支持 tcp/ip 协议的小局域网
修改 listener.ora 中的如下信息
(SID_DESC =
(GLOBAL_DBNAME = ur_hostname) --
你的机器名
(ORACLE_HOME = E:/oracle/ora92) --oracle home
(SID_NAME = orcl) --sid name
)
然后在客户端
sqlnet.ora 中,确保有
NAMES.DIRECTORY_PATH= (HOSTNAME)
你就可以利用数据库服务器的名称访问数据库了

[Q]dbms_repcat_admin
能带来什么安全隐患
[A]
如果一个用户能执行 dbms_repcat_admin 包,将获得极大的系统权限。
以下情况可能获得该包的执行权限:
1
、在 sys grant execute on dbms_repcat_admin to public[|user_name]
2
、用户拥有 execute any procedure 特权(仅限于 9i 以下, 9i 必须显示授权)
如果用户通过执行如下语句:
exec sys.dbms_repcat_admin.grant_admin_any_schema('user_name');
该用户将获得极大的系统特权
可以从 user_sys_privs 中获得详细信息

[Q]
在不知道用户密码的时候,怎么样跳转到另外一个用户执行操作后并不影响该用户 ?
[A]
我们通过如下的方法,可以安全使用该用户,然后再跳转回来,在某些时候比较有用
需要 Alter user 权限或 DBA 权限:
SQL> select password from dba_users where username='SCOTT';
PASSWORD
-----------------------------
F 894844C 34402B67
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 'F 894844C 34402B67';
User altered.
SQL> connect scott/tiger
Connected.

[Q]
如何加固你的数据库
[A]
要注意以下方面
1.
修改 sys, system 的口令。
2. Lock
,修改,删除默认用户: dbsnmp,ctxsys 等。
3.
REMOTE_OS_AUTHENT 改成 False ,防止远程机器直接登陆。
4.
O7_DICTIONARY_ACCESSIBILITY 改成 False
5.
把一些权限从 PUBLIC Role 取消掉。
6.
检查数据库的数据文件的安全性。不要设置成 666 之类的。检查其他 dba 用户。
7.
把一些不需要的服务(比如 ftp, nfs 等关闭掉)
8.
限制数据库主机上面的用户数量。
9.
定期检查 Metalink/OTN 上面的 security Alert 。比如: http://otn.oracle.com/deploy/security/alerts.htm
10.
把你的数据库与应用放在一个单独的子网中,要不然你的用户密码很容易被 sniffer 去。或者采用 advance security ,对用户登录加密。
11.
限止只有某些 ip 才能访问你的数据库。
12. lsnrctl
要加密码,要不然别人很容易从外面关掉你的 listener
13.
如果可能,不要使用默认 1521 端口

[Q]
如何检查用户是否用了默认密码
[A]
如果使用默认密码,很可能就对你的数据库造成一定的安全隐患,那么可以使用如下的查询获得那些用户使用默认密码
select username "User(s) with Default Password!"
from dba_users
where password in
('E066D214D5421CCC', -- dbsnmp
'24ABAB8B06281B 4C ', -- ctxsys
' 72979A 94BAD2AF80', -- mdsys
'C252E8FA117AF049', -- odm
'A 7A 32CD03D3CE8D5', -- odm_mtr
' 88A 2B 2C 183431F 00', -- ordplugins
'7EFA02EC7EA6B 86F ', -- ordsys
' 4A 3BA55E 08595C 81', -- outln
'F 894844C 34402B67', -- scott
' 3F 9FBD883D787341', -- wk_proxy
'79DF 7A 1BD138CF11', -- wk_sys
' 7C 9BA 362F 8314299', -- wmsys
'88D8364765FCE6AF', -- xdb
'F9DA8977092B7B81', -- tracesvr
' 9300C 0977D7DC75E', -- oas_public
'A97282CE3D94E29E', -- websys
'AC9700FD 3F 1410EB', -- lbacsys
'E7B5D 92911C 831E1', -- rman
'AC98877DE1297365', -- perfstat
' 66F 4EF 5650C 20355', -- exfsys
'84B8CBCA4D477FA3', -- si_informtn_schema
'D 4C 5016086B2DC 6A ', -- sys
'D4DF7931AB130E37') -- system
/

[Q]
如何修改默认的 XDB 监听端口
[A] Oracle9i
默认的 XML DB HTTP 的默认端口设为 8080 ,这是一个太常用的端口了,很多别的 WebServer 都会使用这个端口,
如果我们安装了它,最好修改一下,避免冲突,如果不使用呢,就最好不要安装
提供三种修改的方法
1.dbca
,选择你的数据库,然后 Standard Database Features->Customize->Oracle XML DB option ,进入这个画面你应该就知道怎么改了。
2.OEM console
,在 XML Database 的配置里面修改
3.
oracle 提供的包:
--
HTTP/WEBDAV 端口从 8080 改到 8081
SQL> call dbms_xdb.cfg_update(updateXML(dbms_xdb.cfg_get(),
'/xdbconfig/sysconfig/protocolconfig/httpconfig/http-port/te xt()',8081))
/
--
FTP 端口从 2100 改到 2111
SQL> call dbms_xdb.cfg_update(updateXML(dbms_xdb.cfg_get(),
'/xdbconfig/sysconfig/protocolconfig/ftpconfig/ftp-port/text ()',2111))
/
SQL> commit;
SQL> exec dbms_xdb.cfg_refresh;
--
检查修改是否已经成功
SQL> select dbms_xdb.cfg_get from dual;

[Q]
怎么捕获用户登录信息,如 SID IP 地址等
[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<=1;
OPEN cSession(miUserSid);
FETCH cSession INTO mtSession;
--if user exists then insert data
IF cSession%FOUND THEN
INSERT INTO log$information(login_user,login_time,ip_adress,ausid,termin al,
osuser,machine,program,sid,serial#)
VALUES(ora_login_user,SYSDATE,SYS_CONTEXT ('USERENV','IP_ADDRESS'),
userenv('SESSIONID'),
mtSession.Terminal,mtSession.Osuser,
mtSession.Machine,mtSession.Program,
mtSession.Sid,mtSession.Serial#);
ELSE
--if user don't exists then return error
sp_write_log('Session Information Error:'||SQLERRM);
CLOSE cSession;
raise_application_error(-20099,'Login Exception',FALSE);
END IF;
CLOSE cSession;
EXCEPTION
WHEN OTHERS THEN
sp_write_log('Login Trigger Error:'||SQLERRM);
END tr_login_record;
在以上触发器中需要注意以下几点
1
、该用户有 v_$session v_$mystat 的对象查询权限,可以在 sys 下对该拥护显式授权。
2
sp_write_log 原本是一个写日志的过程,可以置换为自己的需要,如 null 跳过。
3
、必须在创建该触发器之前创建一个 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$trace.ddl_sql%TYPE;
BEGIN
FOR i IN 1..ora_sql_txt(sql_text) LOOP
state_sql := state_sql||sql_text(i);
END LOOP;
INSERT INTO ddl$trace(login_user,ddl_time,ip_address,audsid,
schema_user,schema_object,ddl_sql)
VALUES(ora_login_user,SYSDATE,userenv('SESSIONID'),
sys_context('USERENV','IP_ADDRESS'),
ora_dict_obj_owner,ora_dict_obj_name,state_sql);
EXCEPTION
WHEN OTHERS THEN
sp_write_log('Capture DDL Excption:'||SQLERRM);
END tr_trace_ddl;
在创建以上触发器时要注意几点
1
、必须创建一个 ddl$trace 的表,用来记录 ddl 的记录
2
sp_write_log 原本是一个写日志的过程,可以置换为自己的需要,如 null 跳过。

[Q]
怎么捕获表上的 DML 语句(不包括 select) 语句)
[A]
可以采用 dml 触发器,如
CREATE OR REPLACE TRIGGER tr_capt_sql
BEFORE DELETE OR INSERT OR UPDATE
ON manager.test
DECLARE
sql_text ora_name_list_t;
state_sql capt$sql.sql_text%TYPE;
BEGIN
FOR i IN 1..ora_sql_txt(sql_text) LOOP
state_sql := state_sql || sql_text(i);
END LOOP;
INSERT INTO capt$sql(login_user,capt_time,ip_address,audsid,owner,table_ name,sql_text)
VALUES(ora_login_user,sysdate,sys_context('USERENV','IP_ADDR ESS'),
userenv('SESSIONID'),'MANAGER','TEST',state_sql);
EXCEPTION
WHEN OTHERS THEN
sp_write_log('Capture DML Exception:'||SQLERRM);
END tr_capt_sql;
在创建以上触发器时要注意几点
1
、必须创建一个 capt$sql 的表,用来记录 ddl 的记录
2
sp_write_log 原本是一个写日志的过程,可以置换为自己的需要,如 null 跳过。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值