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