Oracle監聽器簡介
Oracle監聽器是Oracle伺服器軟體的一個組件,它負責管理Oracle資料庫和用戶端之間的通訊,它在一個特定的網卡連接埠(預設是TCP 1521連接埠)上監聽串連請求,並將串連轉寄給資料庫,由兩個二進位檔案組成:tnslsnr和lsnrctl。其中tsnlsnr就是監聽器本身,它運行在資料庫伺服器端,lsnrctl是監聽器控製程序,用於在伺服器上或遠端管理監聽器。與監聽器相關的還有兩個設定檔:sqlnet.ora和listener.ora。tnslsnr啟動時就會讀取這兩個設定檔中的資訊,如連接埠號碼,資料庫服務名。
Oracle監聽器在預設安裝和配置情況下,有許多著名的漏洞和缺陷,駭客利用這些缺陷可以製造拒絕服務的攻擊,偷竊資料庫連接密碼,進一步竊取機密資料。最大的風險來自監聽器的配置,Oracle官方提供了一些推薦的配置,往往能夠達到保護監聽器的目的。本文就是想仔細列出現有的已知保護Oracle監聽器的方法,這些方法對於駭客而言都很熟悉,所以作為DBA也必須要清楚才行。
為什麼要保護監聽器?
DBA對於為什麼要保護監聽器往往不太關心,他們認為駭客不太可能通過控制監聽器進而控制整個資料庫,在Oracle 10g之前的所有版本,Oracle監聽器允許任何一個人利用lsnrctl從遠程發起對監聽器的管理,但幸運的是,從Oracle 10.1開始嚴格限制在遠程對監聽器的管理了。下面列出一些對Oracle 8/9i預設安裝配置時可能有效攻擊手段,即使是打上最新的安全補丁,而沒有進行安全配置加固,這些攻擊手段也仍然有效:
注意:本文假設監聽器使用的是TCP/IP,並且使用的是本地命名管理(即tnsnames.ora),本文所描述的Oracle版本在8i/9i/10g上做過測試,但相信對其他低版本或更高的版本也有一定的參考價值。
怎麼保護監聽器?
既然監聽器有這麼多可供駭客利用的地方,那有沒有什麼方法來保護它,辦法是有的,而且還很多,總結起來,大概有下面11種方法來保護Oracle監聽器:
1、 裝置監聽器密碼
通過設定監聽器密碼可以阻止大部分的菜鳥駭客的進攻,設定密碼有兩種方法,一種是通過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。為監聽器設定了密碼後,必須到用戶端重新設定串連。
2、 開啟監聽器日誌
開啟監聽器日誌功能是為了捕獲監聽器命令和防止密碼被暴力破解。開啟監聽器日誌功能的命令為:
LSNRCTL> set current_listener <監聽器名>
LSNRCTL> set password Password: <輸入監聽器密碼>
LSNRCTL> set log_directory <oracle_home路徑>/network/admin
LSNRCTL> set log_file <sid名稱>.log
LSNRCTL> set log_status on
LSNRCTL> save_config
通過運行上面的命令,監聽器將會在<ORACLE_HOME>/network/admin目錄下建立一個<sid>.log記錄檔,以後可以開啟該檔案查看一些常見的ORA-錯誤資訊。
3、 在listener.ora中設定ADMIN_RESTRICTIONS
在listener.ora檔案中設定了ADMIN_RESTRICTIONS參數後,當監聽器在運行時,不允許執行任何管理任何,屆時,set命令將不可用,不論是在伺服器本地還是從遠程執行都不行,這時如果要修改監聽器設定就只有手工修改listener.ora檔案了,通過手工修改listener.ora,要使修改生效,只能使用lsnrctl reload命令或lsnrctl stop/start命令重新載入一次監聽器配置資訊。在listener.ora檔案中手動加入下面這樣一行:
ADMIN_RESTRICTIONS_<監聽器名> = ON
4、 打上最新的監聽器補丁
這一點就與作業系統類似,資料庫也有bug,也有漏洞,駭客會在漏洞發現第一時間掃描未打補丁的伺服器,所以作為一個稱職的DBA要隨時關注Oracle的CPU(呵呵,不是處理器,是關鍵補丁升級的意思),這裡要說明的是Oracle的補丁是自動累加的,就像windows xp sp2的內容包括了sp1的所有內容一樣,所以只需要按照最新的補丁集就可以了,還有一點要注意的是在生產系統上應用任何補丁前都需要先在測試環境進行測試,保證升級後不影響正常業務才進行升級。最後要說明的是,只有購買了Oracle的正式許可才可以登陸下載補丁,否則就只有從第三方地址下載,其完整性就不能保證了。
5、 利用防火牆阻止SQL*NET
除非的確需要,否則不應該讓SQL*NET通訊通過防火牆,在設計防火牆規則時,應設計為只允許經過認證的Web伺服器和應用程式通過防火牆進行SQL*NET通訊。而且放在防火牆DMZ地區的應用伺服器使用SQL*NET通訊時,應只允許它與特定的資料庫伺服器進行通訊。
通常很少有應用會從Internet直接存取資料庫,因為這種方式的延遲非常明顯,通用的做法是配置應用伺服器與資料庫通訊,Internet用戶端通過瀏覽器訪問應用伺服器即可,這時配置防火牆時也只需設定應用伺服器和資料庫伺服器之間的通訊規則即可。
6、 保護$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上可以設定其他使用者為瀏覽,讀取許可權。
7、 保護TNSLSNR和LSNRCTL
在Linux或Unix伺服器上,應該將這兩個檔案的許可權設為0751,如果想更嚴格一點,可以設為0700,這樣就只有安裝oracle時指定的宿主使用者可以執行它們了,這兩個檔案位於ORACLE_HOME/bin目錄下。保護這兩個檔案的目的是為了防止駭客直接破壞它們,如果tnslsnr被破壞,監聽器肯定不能啟動,如果lsnrctl被破壞,可能植入惡意代碼,在運行lsnrctl時就會執行其它駭客行為。
8、 移除不用的服務
預設安裝時,會安裝一個PL/SQL外部程式(ExtProc)條目在listener.ora中,它的名字通常是ExtProc或PLSExtProc,但一般不會使用它,可以直接從listener.ora中將這項移除,因為對ExtProc已經有多種攻擊手段了。有時可能會在多個執行個體之間拷貝listener.ora,請檢查拷貝來的檔案中是否含有不需要的服務,確保只留下的確需要的服務項目,減少監聽器受攻擊的面。
9、 改變預設的TNS連接埠號碼
改變監聽器監聽的連接埠號碼與修改ftp伺服器預設的21連接埠,web伺服器的80連接埠類似,因為Oracle預設的監聽連接埠是1521(Oracle還正式註冊了兩個新的連接埠號碼2483和2484,說不定哪個新版本發布後,可能預設的連接埠號碼就會是這兩個了,其中2484用於SSL類型的串連),幾乎所有的掃描器都可以直接掃描這個連接埠是否開啟,如果設定為一個不常用的連接埠號碼,可能會給人一種假象,而且即使掃描到連接埠開啟,也還要猜測該連接埠運行是究竟是什麼服務,攻擊難度就加大了。在修改連接埠的時候也不要設在1521-1550和1600-1699範圍內,雖然通過修改預設連接埠並不算什麼進階防護技術,但至少可以防止自動攻擊,以及在連接埠1521上的簡單掃描。
可直接編輯listener.ora中連接埠號碼,也可以通過netca程式進行修改,當然在用戶端也要做對應的修改才行。同時要設定初始化參數LOCAL_LISTENER,這樣在監聽連接埠發生變化後,資料庫才會自動進行監聽器重新註冊。
10、 設定節點驗證
根據應用程式和網路設定情況,採用節點驗證對於保護監聽器是一種強有力的方法,大部分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訪問資料庫,使用這種節點驗證的方法也不可行,那會相當的慢。
11、 監視日誌
在前面的方法中開啟了監聽器日誌功能,在產生了日誌資訊後,要對其進行分析,常見的可在記錄檔中尋找是否有TNS-01169,TNS-01189,TNS-01190或TNS-12508錯誤,如果有這些錯誤,至少可以說明要麼有人攻擊,要麼有異常活動,進一步可以使用shell基本或一些簡單的管理工具將這些有用的日誌資訊定期發送給DBA,實現即時監控效果。
下面是對前面提到的幾個常見錯誤的描述:
小結
通過上面這11種方法對Oracle監聽器進行保護後,想要通過監聽器進行破壞活動基本上就很困難了,不能保證100%攔截攻擊,也至少有99%的效果,另外那1%可能就是DBA本身犯的一些低級錯誤了,如不小心將監聽器密碼泄露給他人,或將配置資訊暴露在Internet上。