【IT168 技術(shù)文檔】
監(jiān)聽器簡(jiǎn)介
Oracle監(jiān)聽器是Oracle服務(wù)器軟件的一個(gè)組件,它負(fù)責(zé)管理Oracle數(shù)據(jù)庫和客戶端之間的通訊,它在一個(gè)特定的網(wǎng)卡端口(默認(rèn)是TCP 1521端口)上監(jiān)聽連接請(qǐng)求,并將連接轉(zhuǎn)發(fā)給數(shù)據(jù)庫,由兩個(gè)二進(jìn)制文件組成:tnslsnr和lsnrctl。其中tsnlsnr就是監(jiān)聽器本身,它運(yùn)行在數(shù)據(jù)庫服務(wù)器端,lsnrctl是監(jiān)聽器控制程序,用于在服務(wù)器上或遠(yuǎn)程管理監(jiān)聽器。與監(jiān)聽器相關(guān)的還有兩個(gè)配置文件:sqlnet.ora和listener.ora。tnslsnr啟動(dòng)時(shí)就會(huì)讀取這兩個(gè)配置文件中的信息,如端口號(hào),數(shù)據(jù)庫服務(wù)名。
Oracle監(jiān)聽器在默認(rèn)安裝和配置情況下,有許多著名的漏洞和缺陷,黑客利用這些缺陷可以制造拒絕服務(wù)攻擊,偷竊數(shù)據(jù)庫連接密碼,進(jìn)一步竊取機(jī)密數(shù)據(jù)。最大的風(fēng)險(xiǎn)來自監(jiān)聽器的配置,Oracle官方提供了一些推薦的配置,往往能夠達(dá)到保護(hù)監(jiān)聽器的目的。本文就是想仔細(xì)列出現(xiàn)有的已知保護(hù)Oracle監(jiān)聽器的方法,這些方法對(duì)于黑客而言都很熟悉,所以作為DBA也必須要清楚才行。
為什么要保護(hù)監(jiān)聽器?
DBA對(duì)于為什么要保護(hù)監(jiān)聽器往往不太關(guān)心,他們認(rèn)為黑客不太可能通過控制監(jiān)聽器進(jìn)而控制整個(gè)數(shù)據(jù)庫,在Oracle 10g之前的所有版本,Oracle監(jiān)聽器允許任何一個(gè)人利用lsnrctl從遠(yuǎn)程發(fā)起對(duì)監(jiān)聽器的管理,但幸運(yùn)的是,從Oracle 10.1開始嚴(yán)格限制在遠(yuǎn)程對(duì)監(jiān)聽器的管理了。下面列出一些對(duì)Oracle 8/9i默認(rèn)安裝配置時(shí)可能有效的攻擊手段,即使是打上最新的安全補(bǔ)丁,而沒有進(jìn)行安全配置加固,這些攻擊手段也仍然有效:
![]() |
怎么保護(hù)監(jiān)聽器?
既然監(jiān)聽器有這么多可供黑客利用的地方,那有沒有什么方法來保護(hù)它,辦法是有的,而且還很多,總結(jié)起來,大概有下面11種方法來保護(hù)Oracle監(jiān)聽器:
1、 設(shè)備監(jiān)聽器密碼
通過設(shè)置監(jiān)聽器密碼可以阻止大部分的菜鳥黑客的進(jìn)攻,設(shè)置密碼有兩種方法,一種是通過lsnrctl命令來設(shè)置,另一種是直接修改listener.ora文件,第一種方法設(shè)置的密碼是經(jīng)過加密后存儲(chǔ)在listener.ora中,而第二種方法是以明文的形式放在listener.ora中的,所以推薦使用第一種方式。具體命令如下:
設(shè)置好密碼后,打開listener.ora,看是否有一條PASSWORDS_<監(jiān)聽器名>的記錄,類似于PASSWORDS_LISTENER = F4BAA4A006C26134。為監(jiān)聽器設(shè)置了密碼后,必須到客戶端重新配置連接。
2、 開啟監(jiān)聽器日志
開啟監(jiān)聽器日志功能是為了捕獲監(jiān)聽器命令和防止密碼被暴力破解。開啟監(jiān)聽器日志功能的命令為:
通過運(yùn)行上面的命令,監(jiān)聽器將會(huì)在<ORACLE_HOME>/network/admin目錄下創(chuàng)建一個(gè)<sid>.log日志文件,以后可以打開該文件查看一些常見的ORA-錯(cuò)誤信息。
3、 在listener.ora中設(shè)置ADMIN_RESTRICTIONS
在listener.ora文件中設(shè)置了ADMIN_RESTRICTIONS參數(shù)后,當(dāng)監(jiān)聽器在運(yùn)行時(shí),不允許執(zhí)行任何管理任何,屆時(shí),set命令將不可用,不論是在服務(wù)器本地還是從遠(yuǎn)程執(zhí)行都不行,這時(shí)如果要修改監(jiān)聽器設(shè)置就只有手工修改listener.ora文件了,通過手工修改listener.ora,要使修改生效,只能使用lsnrctl reload命令或lsnrctl stop/start命令重新載入一次監(jiān)聽器配置信息。在listener.ora文件中手動(dòng)加入下面這樣一行:
4、 打上最新的監(jiān)聽器補(bǔ)丁
這一點(diǎn)就與操作系統(tǒng)類似,數(shù)據(jù)庫也有bug,也有漏洞,黑客會(huì)在漏洞發(fā)現(xiàn)第一時(shí)間掃描未打補(bǔ)丁的服務(wù)器,所以作為一個(gè)稱職的DBA要隨時(shí)關(guān)注Oracle的CPU(呵呵,不是處理器,是關(guān)鍵補(bǔ)丁升級(jí)的意思),這里要說明的是Oracle的補(bǔ)丁是自動(dòng)累加的,就像windows xp sp2的內(nèi)容包括了sp1的所有內(nèi)容一樣,所以只需要按照最新的補(bǔ)丁集就可以了,還有一點(diǎn)要注意的是在生產(chǎn)系統(tǒng)上應(yīng)用任何補(bǔ)丁前都需要先在測(cè)試環(huán)境進(jìn)行測(cè)試,保證升級(jí)后不影響正常業(yè)務(wù)才進(jìn)行升級(jí)。最后要說明的是,只有購買了Oracle的正式許可才可以登陸下載補(bǔ)丁,否則就只有從第三方地址下載,其完整性就不能保證了。
5、 利用防火墻阻止SQL*NET
除非的確需要,否則不應(yīng)該讓SQL*NET通訊通過防火墻,在設(shè)計(jì)防火墻規(guī)則時(shí),應(yīng)設(shè)計(jì)為只允許經(jīng)過認(rèn)證的Web服務(wù)器和應(yīng)用程序通過防火墻進(jìn)行SQL*NET通信。而且放在防火墻DMZ區(qū)域的應(yīng)用服務(wù)器使用SQL*NET通信時(shí),應(yīng)只允許它與特定的數(shù)據(jù)庫服務(wù)器進(jìn)行通信。
通常很少有應(yīng)用會(huì)從Internet直接訪問數(shù)據(jù)庫,因?yàn)檫@種方式的延遲非常明顯,通用的做法是配置應(yīng)用服務(wù)器與數(shù)據(jù)庫通信,Internet客戶端通過瀏覽器訪問應(yīng)用服務(wù)器即可,這時(shí)配置防火墻時(shí)也只需設(shè)置應(yīng)用服務(wù)器和數(shù)據(jù)庫服務(wù)器之間的通信規(guī)則即可。
6、 保護(hù)$TNS_ADMIN目錄
$TNS_ADMIN目錄即我們通??吹降腛RACLE_HOME/network/admin目錄,它下面包含有l(wèi)istener.ora,tnsnames.ora,sqlnet.ora,protocol.ora等重要配置文件,前面已經(jīng)提到,監(jiān)聽器的密碼就是保存在listener.ora中的,如果不保護(hù)好,可能造成密碼泄露,或整個(gè)文件被修改,這個(gè)目錄下的listener.ora,sqlnet.ora,protocol.ora文件應(yīng)該只開放給Oracle主賬戶(通常是oracle或Administrator),而其他賬戶不能有任何權(quán)限,tnsnames.ora文件在Linux或Unix系統(tǒng)上權(quán)限可以設(shè)置為0644,在windows上可以設(shè)置其他用戶為瀏覽,讀取權(quán)限。
7、 保護(hù)TNSLSNR和LSNRCTL
在Linux或Unix服務(wù)器上,應(yīng)該將這兩個(gè)文件的權(quán)限設(shè)為0751,如果想更嚴(yán)格一點(diǎn),可以設(shè)為0700,這樣就只有安裝oracle時(shí)指定的宿主用戶可以執(zhí)行它們了,這兩個(gè)文件位于ORACLE_HOME/bin目錄下。保護(hù)這兩個(gè)文件的目的是為了防止黑客直接破壞它們,如果tnslsnr被破壞,監(jiān)聽器肯定不能啟動(dòng),如果lsnrctl被破壞,可能植入惡意代碼,在運(yùn)行l(wèi)snrctl時(shí)就會(huì)執(zhí)行其它黑客行為。
8、 移除不用的服務(wù)
默認(rèn)安裝時(shí),會(huì)安裝一個(gè)PL/SQL外部程序(ExtProc)條目在listener.ora中,它的名字通常是ExtProc或PLSExtProc,但一般不會(huì)使用它,可以直接從listener.ora中將這項(xiàng)移除,因?yàn)閷?duì)ExtProc已經(jīng)有多種攻擊手段了。有時(shí)可能會(huì)在多個(gè)實(shí)例之間拷貝listener.ora,請(qǐng)檢查拷貝來的文件中是否含有不需要的服務(wù),確保只留下的確需要的服務(wù)項(xiàng)目,減少監(jiān)聽器受攻擊的面。
9、 改變默認(rèn)的TNS端口號(hào)
改變監(jiān)聽器監(jiān)聽的端口號(hào)與修改ftp服務(wù)器默認(rèn)的21端口,web服務(wù)器的80端口類似,因?yàn)镺racle默認(rèn)的監(jiān)聽端口是1521(Oracle還正式注冊(cè)了兩個(gè)新的端口號(hào)2483和2484,說不定哪個(gè)新版本發(fā)布后,可能默認(rèn)的端口號(hào)就會(huì)是這兩個(gè)了,其中2484用于SSL類型的連接),幾乎所有的掃描器都可以直接掃描這個(gè)端口是否打開,如果設(shè)置為一個(gè)不常用的端口號(hào),可能會(huì)給人一種假象,而且即使掃描到端口打開,也還要猜測(cè)該端口運(yùn)行是究竟是什么服務(wù),攻擊難度就加大了。在修改端口的時(shí)候也不要設(shè)在1521-1550和1600-1699范圍內(nèi),雖然通過修改默認(rèn)端口并不算什么高級(jí)防護(hù)技術(shù),但至少可以防止自動(dòng)攻擊,以及在端口1521上的簡(jiǎn)單掃描。
可直接編輯listener.ora中端口號(hào),也可以通過netca程序進(jìn)行修改,當(dāng)然在客戶端也要做對(duì)應(yīng)的修改才行。同時(shí)要設(shè)置初始化參數(shù)LOCAL_LISTENER,這樣在監(jiān)聽端口發(fā)生變化后,數(shù)據(jù)庫才會(huì)自動(dòng)進(jìn)行監(jiān)聽器重新注冊(cè)。
10、 設(shè)置節(jié)點(diǎn)驗(yàn)證
根據(jù)應(yīng)用程序和網(wǎng)絡(luò)配置情況,采用節(jié)點(diǎn)驗(yàn)證對(duì)于保護(hù)監(jiān)聽器是一種強(qiáng)有力的方法,大部分Web應(yīng)用程序都只需要從應(yīng)用服務(wù)器訪問監(jiān)聽器,以及一臺(tái)管理客戶端,對(duì)于Oracle 8/8i,在$ORACLE_HOME/network/admin/protocol.ora文件中添加節(jié)點(diǎn)檢查語句,對(duì)于Oracle 9i/10g,在$ORACLE_HOME/network/admin/sqlnet.ora文件中添加節(jié)點(diǎn)檢查語句,語句的格式都一樣,如:
注意:這里要么使用invited_nodes語句,要么使用excluded_nodes,不能同時(shí)都使用,也不能使用通配符,子網(wǎng)等,只能使用明確的ip地址或主機(jī)名。這里的x.x.x.x指的就是如192.168.1.100這樣的ip地址,name就是主機(jī)名,如果有多個(gè)ip地址或主機(jī)名,使用逗號(hào)進(jìn)行分隔。
設(shè)置了節(jié)點(diǎn)驗(yàn)證后,監(jiān)聽器需要重新啟動(dòng)才會(huì)生效。使用這種方法進(jìn)行節(jié)點(diǎn)驗(yàn)證會(huì)消耗一定的系統(tǒng)資源和網(wǎng)絡(luò)帶寬,如果要驗(yàn)證的地址過多,靠手工添加也很麻煩,這時(shí)可以使用Oracle Connection Manager,如果是有許多客戶端通過SQL*NET訪問數(shù)據(jù)庫,使用這種節(jié)點(diǎn)驗(yàn)證的方法也不可行,那會(huì)相當(dāng)?shù)穆?br>
11、 監(jiān)視日志
在前面的方法中開啟了監(jiān)聽器日志功能,在產(chǎn)生了日志信息后,要對(duì)其進(jìn)行分析,常見的可在日志文件中查找是否有TNS-01169,TNS-01189,TNS-01190或TNS-12508錯(cuò)誤,如果有這些錯(cuò)誤,至少可以說明要么有人攻擊,要么有異常活動(dòng),進(jìn)一步可以使用shell基本或一些簡(jiǎn)單的管理工具將這些有用的日志信息定期發(fā)送給DBA,實(shí)現(xiàn)實(shí)時(shí)監(jiān)控效果。
下面是對(duì)前面提到的幾個(gè)常見錯(cuò)誤的描述:
![]() |
聯(lián)系客服