說句實話,你公司中安裝的大多數的SQL Server都可歸結為以下兩種中的一種。第一種類型就是安裝了SQL Server的開發人員用的機器(即,多種安裝類型中的一種――桌面版本,標准版本,企業版本或者明顯的開發版)。第二種類型就是微軟的SQL Server桌面引擎(MSDE)的供各種應用程序使用的各種安裝,其中包括使用MSDE作為信息存儲的備份、網絡管理或者其他的工具包。這兩種類型的變化之中有一個共同點,就是大多數都完全不需要外在的連接,除了通過主機上駐留的應用程序。
現在,做個簡單測試:有多少不需要接受來自網絡中其他機器的連接的安裝總是在監聽那些連接?答對了――幾乎全部都是。在最近的一項滲透測試活動中,我發現公司中大約有90%的SQL Server安裝只被安裝在同一台機器上的軟件使用,從來沒有接受過網絡中其他機器的連接。此外,在這90%裡面,除了2台機器之外都同時有TCP/IP和netlibs (命名管道網絡庫)在啟用和監聽。
這裡我們有一個非常好的有關過分表面領域的例子。就是說,當機器暴露在這個層次上的時候沒有調用任何的相關措施,那麼遇到偶然的發現、暴力攻擊,以及可能的遠程緩沖溢出攻擊就是明顯了。最近,對於MSDE Release A ,微軟開始在缺省情況下安裝MSDE的時候不再啟用任何的netlibs ,以便於幫助您最小化暴露的表面區域。然而,許多MSDE較老的安裝仍舊如此,並且持續監聽。
過分的netlib 支持問題的解決方案是簡單的。任何不需要外界連接的SQL Server或者MSDE實例都應該禁用所有的netlibs ,除非是共享內存netlibs ,這個在缺省情況是開啟的。共享內存netlib只在與使用它們的應用程序在同一台機器上,並且不允許來自外界主機的連接的SQL Server環境中存在。
如果你使用的是SQL Server,修正是非常簡單的。只要為你想要保護的每個SQL Server實例中載入Server Network Utility並且禁用所有的netlibs (在“啟用協議”中)即可。然後,停止並重新開始SQL Server實例,以便於修改生效。
如果你使用的是MSDE,你就得費一點事。當然,如果在同一台機器上存在SQL Server安裝,並且Server Network Utility也是安裝的,你就可以在下拉列表中看到MSDE實例。然而,你可以用與前面描述的針對SQL Server實例完全一樣的方式刪除netlibs 。
如果你沒有訪問主機上的Server Nerwork Utility,那麼你需要編輯注冊表鍵值來直接控制對netlib 的支持。這個鍵位於
HKEY_LOCAL_MacHINESOFTWAREMicrosoftMSSQLServerMSSQLServerSuperSocketNetLibProtocolList
只是編輯那裡的REG_MULTI_SZ ,刪除任何數值數據(TCP/IP 和命名管道在默認情況下是“tcp np”)。再一次,你需要停止並重新開始MSDE實例,以便於修改生效。
將所有的netlibs 都禁用了之後,只有共享內存netlib還能夠與SQL Server進行通信。這對於理解netlib 和你的應用程序非常重要:為了連接到本地SQL Server/MSDE實例上,你不能再使用本地機器的名字(或者IP地址)作為連接字符串中的服務器的名字。你需要用點“.”或者單詞"(local)"來置換服務器名字或者IP地址。一些應用程序的行為彼此不同,那麼需要確保徹底地進行測試。使用那些字符串中的某一個作為服務器的名字可以告訴本地SQL Server客戶端網絡子系統使用共享內存netlib 來替代基於網絡的庫。
現在你知道了如何移動netlib ,同時還仍然連接到SQL Server實例上,你應該告訴你的開發人員這是如何完成的,因為他們很有可能安裝本地SQL Server/MSDE環境的次數最多。讓環境不再監聽可以保護他們在遠程位置、熱點或者其他公共環境中的時候不受到攻擊,而在這些環境中,他們很有可能會受到攻擊。最小化表面區域是安全難題中的一個關鍵部分,讓這個方法成為所有的新的SQL Server/MSDE安裝的默認選擇可以很大限度的堅固你的基礎設施。