監聽器簡介html
Oracle監聽器是Oracle服務器軟件的一個組件,它負責管理Oracle數據庫和客戶端之間的通信,它在一個特定的網卡端口(默認是TCP 1521端口)上監聽鏈接請求,並將鏈接轉發給數據庫,由兩個二進制文件組成:tnslsnr和lsnrctl。其中tsnlsnr就是監聽器自己,它運行在數據庫服務器端,lsnrctl是監聽器控制程序,用於在服務器上或遠程管理監聽器。與監聽器相關的還有兩個配置文件:sqlnet.ora和 listener.ora。tnslsnr啓動時就會讀取這兩個配置文件中的信息,如端口號,數據庫服務名。node
Oracle監聽器在默認安裝和配置狀況下,有許多著名的漏洞和缺陷,黑客利用這些缺陷能夠製造拒絕服務攻擊,偷竊數據庫鏈接密碼,進一步竊取機密數據。最大的風險來自監聽器的配置,Oracle官方提供了一些推薦的配置,每每可以達到保護監聽器的目的。本文就是想仔細列出現有的已知保護Oracle監聽器的方法,這些方法對於黑客而言都很熟悉,因此做爲DBA也必需要清楚才行。web
爲何要保護監聽器?sql
DBA對於爲何要保護監聽器每每不太關心,他們認爲黑客不太可能經過控制監聽器進而控制整個數據庫,在Oracle 10g以前的全部版本,Oracle監聽器容許任何一我的利用lsnrctl從遠程發起對監聽器的管理,但幸運的是,從Oracle 10.1開始嚴格限制在遠程對監聽器的管理了。下面列出一些對Oracle 8/9i默認安裝配置時可能有效的攻擊手段,即便是打上最新的安全補丁,而沒有進行安全配置加固,這些攻擊手段也仍然有效:shell
注意:本文假設監聽器使用的是TCP/IP,而且使用的是本地命名管理(即tnsnames.ora),本文所描述的Oracle版本在8i/9i/10g上作過測試,但相信對其餘低版本或更高的版本也有必定的參考價值。數據庫
怎麼保護監聽器?windows
既然監聽器有這麼多可供黑客利用的地方,那有沒有什麼方法來保護它,辦法是有的,並且還不少,總結起來,大概有下面11種方法來保護Oracle監聽器:瀏覽器
一、 設備監聽器密碼安全
經過設置監聽器密碼能夠阻止大部分的菜鳥黑客的進攻,設置密碼有兩種方法,一種是經過lsnrctl命令來設置,另外一種是直接修改 listener.ora文件,第一種方法設置的密碼是通過加密後存儲在listener.ora中,而第二種方法是以明文的形式放在 listener.ora中的,因此推薦使用第一種方式。具體命令以下:LSNRCTL> set current_listener <監聽器名>服務器
LSNRCTL> change_password
old password: <若是以前沒有設置密碼就直接按回車>
New password: <輸入新密碼>
Reenter new password: <再次輸入新密碼>
LSNRCTL> set password Password: <輸入剛剛設置的新密碼>
LSNRCTL> save_config
設置好密碼後,打開listener.ora,看是否有一條PASSWORDS_<監聽器名>的記錄,相似於PASSWORDS_LISTENER = F4BAA4A006C26134。爲監聽器設置了密碼後,必須到客戶端從新配置鏈接。
二、 開啓監聽器日誌
開啓監聽器日誌功能是爲了捕獲監聽器命令和防止密碼被暴力破解。開啓監聽器日誌功能的命令爲:LSNRCTL> set current_listener <監聽器名>
LSNRCTL> set password Password: <輸入監聽器密碼>
LSNRCTL> set log_directory /network/admin
LSNRCTL> set log_file .log
LSNRCTL> set log_status on
LSNRCTL> save_config
經過運行上面的命令,監聽器將會在/network/admin目錄下建立一個.log日誌文件,之後能夠打開該文件查看一些常見的ORA-錯誤信息。
三、在listener.ora中設置ADMIN_RESTRICTIONS
在listener.ora文件中設置了ADMIN_RESTRICTIONS參數後,當監聽器在運行時,不容許執行任何管理任何,屆時,set命令將不可用,不管是在服務器本地仍是從遠程執行都不行,這時若是要修改監聽器設置就只有手工修改listener.ora文件了,經過手工修改 listener.ora,要使修改生效,只能使用lsnrctl reload命令或lsnrctl stop/start命令從新載入一次監聽器配置信息。在listener.ora文件中手動加入下面這樣一行:ADMIN_RESTRICTIONS_<監聽器名> = ON
四、 打上最新的監聽器補丁
這一點就與操做系統相似,數據庫也有bug,也有漏洞,黑客會在漏洞發現第一時間掃描未打補丁的服務器,因此做爲一個稱職的DBA要隨時關注Oracle 的CPU(呵呵,不是處理器,是關鍵補丁升級的意思),這裏要說明的是Oracle的補丁是自動累加的,就像windows xp sp2的內容包括了sp1的全部內容同樣,因此只須要按照最新的補丁集就能夠了,還有一點要注意的是在生產系統上應用任何補丁前都須要先在測試環境進行測試,保證升級後不影響正常業務才進行升級。最後要說明的是,只有購買了Oracle的正式許可才能夠登錄下載補丁,不然就只有從第三方地址下載,其完整性就不能保證了。
五、 利用防火牆阻止SQL*NET
除非的確須要,不然不該該讓SQL*NET通信經過防火牆,在設計防火牆規則時,應設計爲只容許通過認證的Web服務器和應用程序經過防火牆進行 SQL*NET通訊。並且放在防火牆DMZ區域的應用服務器使用SQL*NET通訊時,應只容許它與特定的數據庫服務器進行通訊。
一般不多有應用會從Internet直接訪問數據庫,由於這種方式的延遲很是明顯,通用的作法是配置應用服務器與數據庫通訊,Internet客戶端經過瀏覽器訪問應用服務器便可,這時配置防火牆時也只需設置應用服務器和數據庫服務器之間的通訊規則便可。
六、 保護$TNS_ADMIN目錄
$TNS_ADMIN目錄即咱們一般看到的ORACLE_HOME/network/admin目錄,它下面包含有 listener.ora,tnsnames.ora,sqlnet.ora,protocol.ora等重要配置文件,前面已經提到,監聽器的密碼就是保存在listener.ora中的,若是不保護好,可能形成密碼泄露,或整個文件被修改,這個目錄下的 listener.ora,sqlnet.ora,protocol.ora文件應該只開放給Oracle主帳戶(一般是oracle或 Administrator),而其餘帳戶不能有任何權限,tnsnames.ora文件在Linux或Unix系統上權限能夠設置爲0644,在 windows上能夠設置其餘用戶爲瀏覽,讀取權限。
七、 保護TNSLSNR和LSNRCTL
在Linux或Unix服務器上,應該將這兩個文件的權限設爲0751,若是想更嚴格一點,能夠設爲0700,這樣就只有安裝oracle時指定的宿主用戶能夠執行它們了,這兩個文件位於ORACLE_HOME/bin目錄下。保護這兩個文件的目的是爲了防止黑客直接破壞它們,若是tnslsnr被破壞,監聽器確定不能啓動,若是lsnrctl被破壞,可能植入惡意代碼,在運行lsnrctl時就會執行其它黑客行爲。
八、 移除不用的服務
默認安裝時,會安裝一個PL/SQL外部程序(ExtProc)條目在listener.ora中,它的名字一般是ExtProc或 PLSExtProc,但通常不會使用它,能夠直接從listener.ora中將這項移除,由於對ExtProc已經有多種攻擊手段了。有時可能會在多個實例之間拷貝listener.ora,請檢查拷貝來的文件中是否含有不須要的服務,確保只留下的確須要的服務項目,減小監聽器受攻擊的面。
九、 改變默認的TNS端口號
改變監聽器監聽的端口號與修改ftp服務器默認的21端口,web服務器的80端口相似,由於Oracle默認的監聽端口是1521(Oracle還正式註冊了兩個新的端口號2483和2484,說不定哪一個新版本發佈後,可能默認的端口號就會是這兩個了,其中2484用於SSL類型的鏈接),幾乎全部的掃描器均可以直接掃描這個端口是否打開,若是設置爲一個不經常使用的端口號,可能會給人一種假象,並且即便掃描到端口打開,也還要猜想該端口運行是到底是什麼服務,攻擊難度就加大了。在修改端口的時候也不要設在1521-1550和1600-1699範圍內,雖然經過修改默認端口並不算什麼高級防禦技術,但至少能夠防止自動攻擊,以及在端口1521上的簡單掃描。
可直接編輯listener.ora中端口號,也能夠經過netca程序進行修改,固然在客戶端也要作對應的修改才行。同時要設置初始化參數LOCAL_LISTENER,這樣在監聽端口發生變化後,數據庫纔會自動進行監聽器從新註冊。
十、 設置節點驗證
根據應用程序和網絡配置狀況,採用節點驗證對於保護監聽器是一種強有力的方法,大部分Web應用程序都只須要從應用服務器訪問監聽器,以及一臺管理客戶端,對於Oracle 8/8i,在$ORACLE_HOME/network/admin/protocol.ora文件中添加節點檢查語句,對於Oracle 9i/10g,在$ORACLE_HOME/network/admin/sqlnet.ora文件中添加節點檢查語句,語句的格式都同樣,如:tcp.validnode_checking = yes
tcp.invited_nodes = ( x.x.x.x | name, x.x.x.x | name)
tcp.excluded_nodes=( x.x.x.x | name, x.x.x.x | name)
注意:這裏要麼使用invited_nodes語句,要麼使用excluded_nodes,不能同時都使用,也不能使用通配符,子網等,只能使用明確的 ip地址或主機名。這裏的x.x.x.x指的就是如192.168.1.100這樣的ip地址,name就是主機名,若是有多個ip地址或主機名,使用逗號進行分隔。
設置了節點驗證後,監聽器須要從新啓動纔會生效。使用這種方法進行節點驗證會消耗必定的系統資源和網絡帶寬,若是要驗證的地址過多,靠手工添加也很麻煩,這時可使用Oracle Connection Manager,若是是有許多客戶端經過SQL*NET訪問數據庫,使用這種節點驗證的方法也不可行,那會至關的慢。
十一、 監視日誌
在前面的方法中開啓了監聽器日誌功能,在產生了日誌信息後,要對其進行分析,常見的可在日誌文件中查找是否有TNS-01169,TNS- 01189,TNS-01190或TNS-12508錯誤,若是有這些錯誤,至少能夠說明要麼有人攻擊,要麼有異常活動,進一步可使用shell基本或一些簡單的管理工具將這些有用的日誌信息按期發送給DBA,實現實時監控效果。
下面是對前面提到的幾個常見錯誤的描述:
小結
經過上面這11種方法對Oracle監聽器進行保護後,想要經過監聽器進行破壞活動基本上就很困難了,不能保證100%攔截攻擊,也至少有99%的效果,另外那1%可能就是DBA自己犯的一些低級錯誤了,如不當心將監聽器密碼泄露給他人,或將配置信息暴露在Internet上。
「七」樂無窮,盡在新浪新版博客,快來體驗啊~~~請點擊進入~