2013年12月1日 星期日

架設支援 DNSSEC 功能的Windows Server 2012 (R2) DNS 伺服器 (Implementing DNSSEC enabled Windows Server 2012 R2 DNS Server)

為了防範近年來日益猖獗的DNS記錄之偽裝、假造、轉稼與下毒等攻擊威脅,已有越來越多企業組織開始替自己的DNS伺服器部署DNSSEC功能,而微軟Windows 伺服器作業系統為了因應此種DNS安全性威脅的新趨勢並且延伸DNS安全性標準,從Windows Server 2008 R2的DNS伺服角色亦已開始支援這項DNSSEC延伸標準,包括了 RFC 4033、4034、4035等標準

,不過由於前版只支援命令列的設定方式,增加了管理人員部署的複雜度與困難度,新版的Windows Server 2012 (R2)作業系統則不僅提供了圖形介面精靈程式部署方式並且支援了更新的DNSSEC標準,本文將詳細說明如何透用Windows Server 2012 (R2)的DNS伺服器來部署與管理 DNSSEC功能以便可以降低網際網路上的各種DNS偽裝攻擊風險。

如果您對DNSSEC並無任何概念與基礎知識,那麼本文並不適當您直接閱讀,請先閱讀底下的DNSSEC簡介文章後再來學習本文的實作方法。

Windows Server 2012 DNSSEC新增與強化功能

Windows Server 2012 (R2)的DNS伺服器角色,相較起其前版Windows Server 2008 R2,強化並新增了以下的功能:

  1. 支援圖形介面精靈程式來部署與管理DNSSEC 。
  2. 支援以Powershell cmdlet 命令列方式部署與管理DNSSEC
  3. DNSSEC簽署區域可支援Active Directory整合和動態更新功能
  4. 支援新的DNSSEC標準以及更新的密碼學演算法,如NSEC3、RSA/SHA-2
  5. 可經由Active Directory輕易提取根信賴起點並自動分送信賴起源
  6. 支援自動信賴起點金鑰替換機制(Automated trust anchor rollover support; RFC 5011)

簽署 DNS 區域

建立支援DNSSEC功能的DNS伺服器,首先需要對區域進行簽署作業,雖然簽署一個 Windows Server 2012 DNS 區域的工作只需要利用『DNS管理員』工具所提供旳精靈程式即可輕鬆完成,不過區域簽署的過程通常會牽涉到建立金鑰簽署金鑰(KSK)與區域簽署金鑰(ZSK)二把金鑰,設定使用NSEC3或NSEC記錄、信賴起點與變換金鑰的發佈以及設定DS記錄參數等多項不易了解的工作,因此下將設定的詳細步驟與所需設定的參數敘述如下:

  1. 啟動【DNS管理員】管理工具。
  2. 利用滑鼠右鍵按一下想要簽署的區域,並於出現的右鍵功能表上選取『簽署區域』選項。
    DNSSEC1
  3. 接下來的畫面將會出現『區域簽署精靈』程式,請直接按『下一步』繼續。
    DNSSEC2
  4. Windows Server 2012 的DNS伺服器支援三種設定選項--自訂DNSSEC簽署參數、使用有區域的簽署參數以及預設簽署參數,其中第三項選為使用預設設定來簡化複雜的參數設定,因此適合不太需要了解DNSSEC各項設定參數或願意接受預設簽署組態的環境下採用,在此為了解說區域簽署所有牽涉到的設定參數,因此核選了第一個『自訂區域簽署參數』選項以便精靈程式可以顯示一切設定畫面與參數。
    DNSSEC3
  5. 接下來需要設定金鑰簽金鑰(KSK),KSK私密金鑰用來對其它區域簽署公開金鑰(ZSK)進行簽署以利驗證區域簽署金鑰的真偽,一般如無特殊需求,此金鑰的設定參數可直接接受預設值即可:
    • 預設的簽署公開金鑰和雜湊演算法分別為RSA和SHA256,
    • KSK的金鑰長度建議至少為2048位元(預設);因為金鑰長度越長越安全,但效率越差,若基於高度安全性考量可選擇4096位元長度的金鑰。
    • 預設DNSKEY簽署的有效期限為7天
    • 預設金鑰變換頻率(rollover frequency )為755天(二年又25天) , windows server 2012 預設上會啟用金鑰變換與簽署重新整理。

    DNSSEC4
  6. 接下來需要建立用以簽署區域的金鑰ZSK, 設定的參數與KSK相似:
    • 預設簽署區域的公開金鑰演算法和雜湊演算法與上面的KSK金鑰一樣,分別為RSA和SHA256,
    • 區域簽署金鑰ZSK的長度為1024位元
    • DNSKEY簽署和DS簽署的預設有效期限均為7天,而區域記錄的有效期間為10天
    • 預設金鑰變換頻率(rollover frequency )為90天(三個月)
    DNSSEC5
  7. NSEC記錄用以指向區域內下一個有效的名稱,藉以用來提供用戶請求的名稱並不存在的證明( authenticated denial of existence),但卻可能遭遇有心人士列舉區域記錄的攻擊,因此Windows Server 2012支援了避免此種攻擊的NSEC3 (RFC 5155)--替NSEC記錄加上雜湊的版本 ,因此接下來的畫面選取了預設安全性較高的NSEC3記錄。根據RFC 5155文件,您需要設定四個參數,除了雜湊函數固定採用SHA-1之外,其餘四個NSEC3參數如下:
    • 反覆次數(number of iterations):定義了已執行的雜湊函數需額外執行的次數,預設值為50,較多的次數提供了摘要值的彈性因而較能夠抵擋字典查詢攻擊,但相對的也會在解析的二端導致較多的計算負載。
    • salt:為了防範預算的字典攻擊法,需要在執行雜湊前以隨機產生的salt值附加在原始名稱以增長原始名稱,因而每增加一個位元的salt,有心人士企圖利用預先產生摘要值所實施的字典攻擊,其所需耗費的成本均會是雙倍,預設隨機的salt長度為8 (可設定範圍從0到255)
    • Opt-Out旗標:用來設定NSEC3記錄是否涵蓋未簽署的委派,在此,設定不使用取消篩選以令此區域不會有不安全的委派 (Opt Out disabled)。
      DNSSEC6
  8. 『信賴起點』(Trust Anchors)設定頁中, 啟用了自動更新信賴起點功能。此外,如果本機為Active Directory的網域控制站和DNS伺服器,則可啟用散發信賴起點功能。
    DNSSEC7
  9. 接下來,您需要設定DNSSEC簽署和輪詢相關的參數:
    • DS記錄產生演算法:預設上使用SHA-1和SHA-256二雜湊演算法來產生DS記錄(可選用的演算法有SHA-1、SHA-256、SHA-384)
    • DS記錄TTL與 DNSKEY 記錄的TTL:預設為3600秒
    • 安全委派輪詢時間:父層主要伺服器每隔多久向子層區域詢查是否需要更新委派 (子層的KSK被替換)
    • 簽署啟始時間:根據RFC4034,啟始時間為現在時間加減一個離差時間(offset),預設離差時間為一個小時
    DNSSEC8
  10. 完成一切精靈設定工作後,請重新檢視設定參數是否符合設計無誤,若無問題即可按『下一步』以 開始建立金鑰並執行區域簽署。
    DNSSEC9

 

檢查DNSSEC區域與相關記錄

檢查簽署過的區域,您會發現新增了不少DNSSEC相關的記錄--DNSKEY、RRSIG、NSEC3,要看得懂這些DNSSEC記錄,您需要先了解其記錄格式,詳細說明如下:

  • DNSKEY (DNS 金鑰)
    在『DNS管理員』工具內的已簽署區域中,您可以看到共有四把金鑰:二把KSK (Active 金鑰和Stand-by金鑰)以及另二把ZSK (Active金鑰和Stand-by金鑰) ,若開啟DNSKEY記錄的內容就可看到KSK與ZSK最大的不同在於是否啟用了『安全進入點』這個選項,如下圖所示:
    DNSSEC10
    而根據RFC 4034文件內容,一筆 DNSKEY記錄的格式與欄位如下:
    DNSKEY1
    另一方面,由於使用中的KSK與ZSK也會被簽署,因此您還可以看到二筆DNSKEY被簽署的RRSIG記錄,如果直接檢查位於 %windir%\system\dns目錄下的DNS區域檔案,您將看到如下的六筆金鑰相關的記錄:
    DNSKEY2
  • RRSIG 記錄
    網域區域中的大部份資源記錄均會被建立簽署的RRSIG記錄,但少部份如委派訊息(委派的NS記錄和相關的A/AAAA記錄)可能不會被簽署,因為其隸屬於子區域,而RRSIG的格式如下圖:
    rrsig1
    下圖範例乃擷取了本區域檔案一部份記錄的RRSIG簽署和欄位來說明:
    rrsig3
    若您檢視『DNS管理員』工具則可以看到許多主機記錄簽署後所產生的RRSIG記錄
    DNSSEC11
  • NSEC3 與NSEC3PARAM記錄
    原本的DNSSEC利用NSEC 記錄來處理負面請求,藉由回應網域的上一個與下一個記錄來表示該筆查詢之記錄並不存在,不過為了解決NSEC可能遭遇的列舉攻擊和不安全的委派簽署表性(Opt-Out)二項問題,所以新增了NSEC3來取代傳統的NSEC,而支援NSEC3的二種記錄類型--NSEC3和NSEC3PARA之格式欄位如下圖所示:
    DNSSEC13

    若從『DNS管理員』工具內,您也可以看到NSEC3和NSEC3PARAM這二種資源記錄及其內容:
    DNSSEC12 

刪除或變更已簽署區域

對於一個已經簽署的DNS區域,您可以進行一些基本的維護管理工作,包括:

  • 變更大部份精靈程式所設定的參數,包括ZSK、KSK、NSEC等設定參數
  • 移除簽署功能

您只需要在『DNS 管理員』工具上,以滑鼠右鍵按一下簽署的區域,並選取『移除區域簽署』或『內容』選項後,再依據如下圖的畫面指示即可完成刪除簽署及變更設定的工作。

DNSSEC14

此外,爾後管理人員在區域中新增的記錄將會自動產生其簽署的記錄(RRSIG),而被刪除的記錄,其簽署記錄也會被自動一併移除。

註冊 DS 記錄

ICANN 於2009 年開始在全球根伺服器推行 DNSSEC 功能,而國內的TWNIC 也已於 2010 年和國際接軌,順利部署了 .tw 網域名稱的 DNSSEC 伺服器,由於 DNSSEC 是透過DS記錄負責建立起DNSSEC的信任鏈(chain of trust),它通常將下層的公開金鑰利用雜湊函數計算的摘要值來呈現,所以為了完成您已建立簽署網域區域之記錄可以順利在網際網路上被確認為有效,您還需要透過您的網域名稱註冊商,上傳或設定 DS 記錄,以完成這項信任鏈關係的建立,亦即一旦完成上傳或設定DS記錄後,你的授權伺服器就受到DNSSEC 信任鏈的保護,而能夠避免眾多駭客的偽裝、假造與轉嫁攻擊。

下圖為DNSSEC的DS記錄的欄位格式,有標籤、演算法、摘要類型與摘要值等欄位:

DNSSEC25

管理人員需要先確認您的DNS網域申請註冊的服務商有提供DS註冊功能,然後可以利用C:\Windows\System32\dns目錄內的 "dsset-網域名稱" 這個檔案,請將其內的key tag及DS紀錄拷貝後,再貼上DNS申請服務業者所提供的DNS管理網站的DNSSEC設定頁面內即可(不過您需要留意不同的網路服務業者可支援的簽署演算法可能不同)。
DNSSEC15

一旦DS記錄註冊完成後,請等待一段時間,再確認您所註冊的DS記錄已經正確生效而可以形成DNSSEC信任鏈,如果您有dig工具,直接執行 dig domainname ds 指令就可確認DS註冊是否已經生效,如果正確的話,您將會看到如 "dsset-網域名稱" 檔案一樣格式的結果:
DNSSEC24

若您需要更進一步完整的驗證伺服器的DNSSEC記錄與功能是否完全正確無誤,則網路上也有許多可協助驗證的工具與網站,底下介紹二個作者常使用的DNSSEC網站分析或驗證工具。

◎ VeriSign Labs. DNSSEC Analyzer Tool

一個簡單快速的DNSSEC分析工具為VeriSign Labs. DNSSEC Analyzer Tool,請透過瀏覽器連至 http://dnssec-debugger.verisignlabs.com/ 這個網站,輸入您的網域名稱即可分析網域的DNSSEC的功能是否設定正確無讓而可以在網際網路上正常使用。

DNSSEC16

◎ DNSViz DNS visualization tool

顧名思義,這是一個視覺化的網站工具,用以分析並顯示DNSSEC的信任鏈和相關的詳細記錄,您需要連上http://dnsviz.net/這個網址,然後輸入網域名稱,網站工具會以網域階層式的圖形方式顯示上下層之間的DS、DNSKEY記錄的關連性。

DNSSEC22

啟用DNSEC驗證

架設一部支援DNSSEC功能的網際網路DNS伺服器,除了啟用區域簽署,還需再將DNS伺服器的金鑰簽署金鑰向上層註冊DS記錄,此外,為了讓DNS伺服器也能夠於網際網路查詢時順利地驗證DNSSEC區域之記錄,您還需要啟用DNSSEC簽署記錄的驗證功能以及匯入根網域區域的DNSKEY做為信任起點。

啟用DNSSEC 驗證功能

為了讓DNS伺服器可以支援向其它網域進行DNSSEC查詢,所以您需要開啟『DNS管理員』工具中的伺服器內容對話方塊,並利用『進階』索引標籤來確認或勾選『啟用遠端回應的DNSSEC驗證』選項來確保是否已經啟用了DNSSEC驗證功能。

DNSSEC17

新增根區域信賴起點 (Add root zone as a trust anchor)

接下來,您可以新增根網域區域的公開DNSSEC金鑰(KSK,旗標值為257)做為信賴起點,在Windows Server 2012 (R2)的DNS管理環境下有多種方式來新增信賴起點:

使用 dnscmd /retrieveroottrustanchors 命令 這是最簡單的新增根區域金鑰為信賴起點,如下圖示:
DNSSEC18一旦dnscmd 命令執行成功後,您可以透過『DNS 管理員』工具內的『信任點』來檢視命令所擷取到的根區域使用的DNSKEY。
DNSSEC19
由特定格式的檔案匯入 第二種新增根區域DNSKEY的方式是由特定格式的檔案來匯入,不過匯入的檔案格式需要和DNS伺服器在%systemroot%\system32\dns目錄下所產生的keyset-dommainname檔案一樣,Windows Server 本身似乎並無工具可以直接產生此格式的檔案,所以作者的方法是先下載 Windows 版本的 dig工具,然後利用dig +multi +noall +answer 指令選項來產生符合格式的檔案,然後再使用『DNS 管理員』,由『信任點』的右鍵功能表選取『匯入-->DNSKEY』選項來匯入檔案即可,步驟順序如下圖所示:
DNSSEC20
手動新增金鑰 手動的新增金需要您利用『DNS 管理員』工具,由『信任點』的右鍵功能表選取『新增-->DNSKEY』選項,再由出現的『新增 DNSKEY信賴起點』對話方塊中,於最上頭的名稱欄位中輸入 "." 代表根網域,再於下方的『公開金鑰』貼上金鑰值,不過特別值得留意的是,在此要貼上的公開金鑰格式需要是完整的一整行,中間不能有空白或斷行字元出現,否則會出現錯誤而無法成功的新增,您可以使用 dig +noall + answer DNSKEY > filename 然後再將整行的KSK金鑰中間的空白(大約六個)刪除即可。
DNSSEC21

結語

面對網際網路上層出不窮的DNS偽裝、假造攻擊,利用密碼學數位簽署技術為基礎的DNSSEC功能無非是目前因應此種類型攻擊所制定出來的安全性規格,而Windwos Server2012 的DNS伺服器是微軟第一個支援圖形介面管理和新版DNSSEC規格的伺服平台,本文詳細說明如何新增DNSSEC區域簽署功能、如何向上層伺服器註冊DS記錄,新增根區域信賴起點以完成信任鏈,而成為一部支援DNSSEC功能的網際網路DNS伺服器,但啟用DNSSEC並非完美的安全性功能,您需要留意它使用上時的經常遭遇到的一些問題與限制:

  • DNSSEC利用簽署技術驗證DNS查詢來源正確無誤,但並不會加密查詢流量
  • 產生較大的DNS查詢回應流量,不僅耗費頻寬,也降低了查詢速度
  • DNSKEY的二把金鑰有不同的生命週期,因此有重新簽署和重新註冊的維護問題
  • 目前並所所有的DNS網域服務提供商與TLD均支援DNSSEC