2012年7月13日 星期五

DNS 伺服器的安全性管理實務 (DNS Server Security Management)

DNS為網際網路上必備的服務,提供主機名稱的解析服務,除了少部份規模不大的企業組織採用DNS代管方式,大部份的企業組織均會有自行架設DNS伺服器的需求與必要,而BIND(Berkeley Internet Name Domain)與Microsoft DNS無疑是二個目前最常見的DNS服務版本

,不過由於DNS使用的必要性與高頻率,再加上DNS軟體本身設計和程式上存在不少的弱點,有關於DNS服務的攻擊手法從以前到現在一直持續且不斷翻新,本文將介紹這些DNS常見的攻擊手法,然後再分別針對BIND DNS和Microsoft DNS服務於安全性管理上應該如何有效的因應提出實務做法。

DNS伺服器常見的攻擊手法

網路攻擊者可能利用DNS服務本身設計上的弱點、管理員設定不當或DNS軟體程式本身撰寫不當而進行入侵攻擊,常見的攻擊手法如下:

  • 利用遞迴解析進行阻斷服務攻擊(Recursion Denial of Service Attacks)
    支援遞迴解析功能的DNS伺服器,易遭受駭客以大量的遞迴解析查詢來癱瘓DNS伺服器,而讓正常的用戶無法順利查詢。
  • DNS系統冒名欺騙攻擊(Spoofing Authoritative zone Answers)
    攻擊者透過假造的資料回應DNS服務的查詢,而讓DNS取得假冒資料,繼而連接到有問題的主機而導致安全性問題,此種DNS冒名攻擊經常應用於快取下毒或網路釣魚(Phishing)。

  • 區域轉送(Zone Transfer)攻擊
    駭客透過dig或nslookup工具執行區域轉送或列舉成功,可以取得組織整個網域和伺服器相關資訊,藉以確認攻擊目標,做為更進一步攻擊的依據。

  • 緩衝區溢位攻擊(Buffer Overflow Attack)
    某些舊版的DNS軟體,由於程式撰寫的漏洞而可被駭客利用執行緩衝區溢位攻擊,導致系統不正常運作或讓駭客取得管理員權限。

  • DNS快取下毒 (Dns Cache Poisoning)
    又稱為DNS快取污染(DNS Cache Pollution),攻擊者透過假冒的查詢回應來感染DNS伺服器的快取 (DNS Spoofing)。在快取中置入假造的資料,讓日後查詢解析的用戶端可能會連上一個偽裝有惡意企圖的網站,而這種DNS快取下毒的攻擊乃是利用DNS設計上的弱點而導致的,所以任何DNS伺服器如果沒有正確地驗證每個DNS回應是來自授權的來源,就有可能會發生。 有時也稱為DNS 轉稼 (DNS Pharming)。
  • DNS 反射/擴大攻擊(DNS reflection/amplification attack)
    攻擊者操控僵屍電腦(bot)對開放性 DNS解析伺服器送出假造來源為受害者 IP 位址的 DNS查詢(query)封包,因而讓這些提供服務的 DNS 伺服器將大量回應(response)封包送至受害者的 IP 位址以塞爆其頻寬來達到阻絶連線的目的。

DNS伺服器安全性管理原則

針對以上的DNS攻擊手法所利用的弱點分析,若要儘量降低DNS伺服器的攻擊風險,提升攻擊困難度,有效的因應原則為:

  1. DNS 伺服器必需為專屬性的DNS伺服器,降低可被攻擊的層面。
  2. 一定要有備援伺服器(Secondary Server),且分散在不同的網段與不同的線路,以確實避免單點失效。
  3. 隨時更新DNS服務軟體最新的安全性修正檔案。
  4. 嚴格的限制允許區域轉送(zone transfer)的機器,做好區域傳送的存取控制。
  5. 建議利用DNSSEC機制以數位簽章來驗證DNS 訊息的來源與完整性。
  6. 建議透過TSIG來確保名稱伺服器的交易安全性,特別是區域傳輸安全性。 
  7. 禁止DNS服務使用遞迴解析,或是只限制內部員工與授權者可以執行遞迴解析。
  8. 除非有特殊的理由,網際網路用途的DNS伺服器不要啟用動態更新(Dynamic Update)功能
  9. 整合防火牆及入侵偵測系統以保護DNS服務。

BIND DNS 安全性實務

BIND DNS為全球占有率最高的DNS服務軟體,從四版、八版到目前的九版均顯示著安全性的重要與提升,所以從安全性的角度來看,使用九版的BIND DNS應是較安全的版本,不過為了確保DNS安全性,管理設計上應儘量遵循下列的實務做法:

一. 使用 chroot
安裝 bind-chroot套件並設定chroot,以便將BIND服務範圍限制在chroot後的根目錄,即使BIND有漏洞而被入侵,可以限制存取範圍和數量,進而將損害降至最小。
以CentOS Linux為例,您需要先安裝bind-chroot套件,然後編輯/etc/sysconfig/named檔案以修改BIND DNS根目錄的位置(ROOTDIR=…)以限制BIND處理程序的範圍。

二. 隱藏BIND版本訊息
為了提升DNS攻擊困難度,所以建議將DNS版本資訊變更或隱藏,以避免駭客可以輕易的透過 "dig @名稱或IP version.bind chaos txt" 指令取得版本資訊,利用以進行下一步攻擊的依據。
dig chaos
變更或隱藏BIND DNS的版本訊很容易,只要在BIND組態檔 named.conf內的options{}段,新增或修改version一行:

options{
………………….
version "My DNS Version";
};

三. 設定允許名稱查詢的用戶電腦

設定只有內部的機器可以向DNS查詢

options{
………………….
allow-query{192.168.1.0/24; 192.168.2.0/24;};
};

四. 設定忽略用戶端查詢

建議新增一個名稱為 "bogonnets" 的 ACL 來阻止經常有心人士用於執行欺騙偽裝性攻擊的位址空間,然後利用options段內的blackhole敘述來設定忽略(不回應)其任何請求,範例如下:

acl bogonnets{ 0.0.0.0/8; 1.0.0.0/8; 2.0.0.0/8; 192.0.2.0/24; 224.0.0.0/3; 10.0.0.0/8; 172.16.0.0/12; 192.168.0.0/16; };
options{
………………….
blackhole { bogonnets; };
};

五. 禁止 DNS 伺服器遞迴查詢
如果您只希望DNS伺服器解析特定網域的名稱,而不必負責解析所有名稱 (authoritative only server ),則基於安全性考量,請停用遞迴解析功能,請在BIND的組態檔named.conf內容的options節中增加或修改一行:

options{
………………….
recursion no;
};

六. 只允許特定的用戶執行遞迴查詢
上面的做法限制了DNS伺服器無法執行遞迴名稱解析查詢,這在很多場合或環境下並不實用,一個較實用的做法乃是只允許內部的用戶端使用遞迴解析:

acl lan {192.168.1.0/24; 192.168.2.0/24;};        # 定義內部用戶
options{
………………….
allow-recursion{lan;};                # 限制遞迴查詢的用戶
};

七. 限制允許區域轉送(Zone Transfer)的機器

基於安全性考量,建議在區域中使allow-transfer{}設定只允許次要伺服器和管理員的電腦可以區域傳送:

zone "abc.com" {
        type master;
        file "/var/named/abc.com.hosts";
       allow-transfer { 210.56.7.8; 210.56.17.9; };

};

八. 檢查是否啟用來源埠隨機化(Source port randomization)

新版的BIND DNS預設上啟用了來源埠隨機化功能,可以讓快取下毒攻擊更加困難,不過由於Linux的版本繁多,再加以預設的named.conf組態檔在不同的版本亦不同,所以您最好測試一下您的DNS是否啟用了較安全的來源埠隨機化功能。下圖 192.168.2.1這部DNS未使用來源埠隨機化功能,您可能需要新Bind版本或是在named.conf檔的options{}段中找到類似 『query-source address * port 53;』一行,然後加以移除或將 "53" 改為 "*",重新啟動named即可。

bind_port_random

Microsoft DNS 安全性實務

由於微軟的Windows Server 作業系統的普及性,所以Microsoft 的DNS是另一個常見的DNS服務版本,本節說明微軟Windows Server 2008 R2的DNS服務的安全性管理工作。

一. 隱藏Microsoft DNS版本訊息
如同BIND DNS一般,Microsoft DNS預設上會曝露其版本資訊,您只需利用Windows nslookup 指令就可以了解是否為Microsoft DNS以及其版本數,如下圖例可知透過 "nslookup -q=txt -class=CHAOS version.bind 主機名稱或IP位址" 即可獲知此部DNS為Microsft DNS版本為6.1 (Windows Server 2008 R2的版本)
nslookup_chaos
為了避免Microsoft DNS版本資訊外洩,所以必需利用 "dnscmd /config /EnableVersionQuery 0" 指令,下圖說明了停止回應版本資訊的指令與結果。
msdns_disablever

二. 限制DNS伺服器只傾聽在所指定的IP介面
將Microsoft DNS設定只傾聽在所指定的IP介面是另一項有效的安全性做法,因為只有相同網段或可經由路由器連接至此網段的主機才能夠使用DNS服務。您可以在DNS管理員工具的伺服器內容對話方塊,按一下『介面』索引標籤,然後勾選適當IP即可。
dnsinter
此外,您也可以利用命令列指令dnscmd完成同樣的設定工作。
dnscmd_listen

三. 限制只有次要伺服器和管理員機器可以區域轉送

與BIND DNS一樣,Microsoft DNS也必需設定只允許次要伺服器和管理員的電腦可以區域傳送。您只需要透過區域的內容對話方塊,選擇『區域轉送』設定頁,勾選『只到下列伺服器』後,再輸入允許區域轉送的機器即可。

msdns_zonetr

四. 停用遞迴查詢

如果Microsoft DNS只是為了提供自己授權區域的查詢,則停用遞迴查詢為較安全的做法,利用DNS管理員的伺服器內容對話方塊,於『進階』設定頁中勾選『停用遞迴(同時停用轉寄站)』。

disable_recur
您也可以使用命令列指令來停用Microsoft DNS的遞迴查詢功能— "dnscmd ServerName /Config /NoRecursion 1"。

Windows Server DNS 伺服器目前並沒有功能可以讓您限制或控制遞迴查詢的用戶端,相對的解決方案為:先建立一部唯有快取(Cache-only)的DNS伺服器以提供內部用戶遞歸解析之用,並在防火牆規則上禁止外部連入此部唯有快取的DNS伺服器,然後再將公司網際網路上授權的DNS名稱伺服器功能建立在另一部伺服器並設定停用遞迴查詢功能,換言之,將遞迴查詢伺服器與授權DNS伺服器分開即可降低攻擊和被利用的風險。

五. 保護快取以防侵害 (Secure Cache against Pollution)

為了避免有心人士向DNS快取下毒,Microsoft DNS於預設上啟用了一項『保護快取以防侵害 』功能,防範未經授權或有惡意資料的DNS回應均不能存放快取區,而此項安全性功能預設為啟用中,您只需在伺服器內容的『進階』設定頁確認沒有被清除選項即可。

六. 確認與設定快取鎖定 (cache locking)

Windows Server 2008 R2的DNS為了加強快取下毒的防範能力,新增了快取鎖定功能,這項功能預設上已啟用,您只需要確認啟用並且於必要時才調整其設定值即可。

當啟用了 DNS快取鎖定功能,DNS伺服器將不會允許已快取的記錄在TTL內的一段比率的時間內被覆蓋,這降低了快取下毒的風險,預設是TTL的100%時間內均不允許覆蓋,您可以使用dnscmd來檢查和修改快取鎖定的TTL時間百分比值。

msdns_cachelock1

七. 確認與設定來源埠隨機化

Windows Server 2008 另一項新增以因應快取下毒與假造的功能為來源埠隨機化,這項功能預設上是被啟用,所以當DNS服務啟動時會從一開啟的Socket Pool中隨機取得查詢所需的來源埠,這將使得攻擊者難以猜測目前連線使用那個Socket,您可以使用dnscmd命令來設定socket pool大小,可以設定的範圍為0-10000,預設值為2500,此值設定的越大,保護防範力越高,但也越浪費記憶體,而目前Windows Server 2008 R2使用的動態連接埠範圍介於49152-65535之間,底下dnscmd指令顯示與設定來源埠隨機化所使用的socket pool size值。

dns_port_random1

後記

本文探討DNS伺服器安全性管理問題,涵蓋了最著名的BIND DNS與微軟的DNS服務,但上述的實作方法均只不過降低遭受攻擊的風險以及強化攻擊的困難度,並無法保證絕對安全,而以現今的各種DNS伺服器攻擊手法分析,實施 Domain Name System Security Extensions(DNSSEC)將有其必要性,不過本文中並沒有探討DNSSEC這項重要議題,主要是因為DNSSEC牽涉到公開金鑰密碼和簽署技術,再加以信任鏈結的問題,所以複雜度較高,應於本文之外,再行另外闢寫文章來特別探討。

相關文章