熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

Oracle FAQ 之網絡與安全篇

2013-11-13 15:38:40  來源: Oracle 

  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跳過
From:http://tw.wingwit.com/Article/program/Oracle/201311/17066.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.