ORACLE網絡與安全
[Q]如何限定特定IP訪問數據庫
[A]可以利用登錄觸發器
cmgw或者是在$OREACLE_HOME/network/admin下新增一個protocol
ora文件(有些os可能是
protocol
ora)
i可以直接修改sqlnet
ora
增加如下內容
tcp
validnode_checking=yes
#允許訪問的ip
tcp
inited_nodes=(ip
ip
……)
#不允許訪問的ip
tcp
excluded_nodes=(ip
ip
……)
[Q]如何穿過防火牆連接數據庫
[A]這個問題只會在WIN平台出現
UNIX平台會自動解決
解決方法
在服務器端的SQLNET
ORA應類似
SQLNET
AUTHENTICATION_SERVICES= (NTS)
NAMES
DIRECTORY_PATH= (TNSNAMES
ONAMES
HOSTNAME)
TRACE_LEVEL_CLIENT =
注冊表的HOME
加[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\ora
)
oracle home
(SID_NAME = orcl)
sid name
)
然後在客戶端
的sqlnet
ora中
確保有
NAMES
DIRECTORY_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 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
C
B
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
C
B
;
User altered
SQL> connect scott/tiger
Connected
[Q]如何加固你的數據庫
[A]要注意以下方面
修改sys
system的口令
Lock
修改
刪除默認用戶
dbsnmp
ctxsys等
把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
(
E
D
D
CCC
dbsnmp
ABAB
B
B
C
ctxsys
A
BAD
AF
mdsys
C
E
FA
AF
odm
A
A
CD
D
CE
D
odm_mtr
A
B
C
F
ordplugins
EFA
EC
EA
B
F
ordsys
A
BA
E
C
outln
F
C
B
scott
F
FBD
D
wk_proxy
DF
A
BD
CF
wk_sys
C
BA
F
wmsys
D
FCE
AF
xdb
F
DA
B
B
tracesvr
C
D
DC
E
oas_public
A
CE
D
E
E
websys
AC
FD
F
EB
lbacsys
E
B
D
C
E
rman
AC
DE
perfstat
F
EF
C
exfsys
B
CBCA
D
FA
si_informtn_schema
D
C
B
DC
A
sys
D
DF
AB
E
)
system
/
[Q]如何修改默認的XDB監聽端口
[A] Oracle
i默認的XML DB把HTTP的默認端口設為
這是一個太常用的端口了
很多別的WebServer都會使用這個端口
如果我們安裝了它
最好修改一下
避免沖突
如果不使用呢
就最好不要安裝
提供三種修改的方法
dbca
選擇你的數據庫
然後Standard Database Features
>Customize
>Oracle XML DB option
進入這個畫面你應該就知道怎麼改了
OEM console
在XML Database 的配置裡面修改
用oracle提供的包
把HTTP/WEBDAV端口從
改到
SQL> call dbms_xdb
cfg_update(updateXML(dbms_xdb
cfg_get()
/xdbconfig/sysconfig/protocolconfig/httpconfig/http
port/text()
))
/
把FTP端口從
改到
SQL> call dbms_xdb
cfg_update(updateXML(dbms_xdb
cfg_get()
/xdbconfig/sysconfig/protocolconfig/ftpconfig/ftp
port/text()
))
/
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<=
;
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
terminal
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(
Login Exception
FALSE);
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$trace
ddl_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_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;
在創建以上觸發器時要注意幾點
必須創建一個ddl$trace的表
用來記錄ddl的記錄
sp_write_log原本是一個寫日志的過程
可以置換為自己的需要
如null跳過
From:http://tw.wingwit.com/Article/program/Oracle/201311/17066.html