(1)限制名字伺服器遞迴查詢功能
關閉遞迴查詢可以使名字伺服器進入被動模式,它再向外部的DNS發送查詢請求時,只會回答自己授權域的查詢請求,而不會緩衝任何外部的資料,所以不可能遭受緩衝中毒攻擊,但是這樣做也有負面的效果,降低了DNS的網域名稱解析速度和效率。
以下語句僅允許172.168.10網段的主機進行遞迴查詢:
allow-recusion {172.168.10.3/24; }
(2)限制區傳送(zone transfer)
如果沒有限制區傳送,那麼DNS伺服器允許對任何人都進列區域傳輸,因此網路架構中的主機名稱、主機IP列表、路由器名和路由IP列表,甚至包括各主機所在的位置和硬體設定等情況都很容易被入侵者得到在DNS設定檔中通過設定來限制允許區傳送的主機,從一定程度上能減輕資訊洩漏。但是,需要提醒使用者注意的是:即使封鎖整個區傳送也不能從根本上解決問題,因為攻擊者可以利用DNS工具自動查詢網域名稱空間中的每一個IP地址,從而得知哪些IP地址還沒有分配出去,利用這些閑置的IP地址,攻擊者可以通過IP欺騙偽裝成系統信任網路中的一台主機來請求區傳送。
以下語句僅允許IP地址為172.168.10.1和172.168.10.2的主機能夠同DNS伺服器進列區域傳輸:
acl list { 221.3.131.5; 221.3.131.6;
zone "test.com" { type master; file "test.com ";
allow-transfer { list; };
};
};
(3)限制查詢(query)
如果任何人都可以對DNS伺服器發出請求,那麼這是不能接受的。限制DNS伺服器的服務涵蓋範圍很重要,可以把許多入侵者據之門外。修改BIND的設定檔:/etc/named.conf加入以下內容即可限制只有210.10.0.0/8和211.10.0.0/8網段的查詢本機伺服器的所有區資訊,可以在options語句裡使用如下的allow-query子句:
options {
allow-query { 210.10.0.0/8; 211.10.0.0/8;};
};
(4)分離DNS(split DNS)
採用split DNS(分離DNS)技術把DNS系統劃分為內部和外部兩部分,外部DNS系統位於公用服務區,負責正常對外解析工作;內部DNS系統則專門負責解析內部網路的主機,當內部要查詢Internet上的網域名稱時,就把查詢任務轉寄到外部DNS伺服器上,然後由外部DNS伺服器完成查詢任務。把DNS系統分成內外兩個部分的好處在於Internet上其它使用者只能看到外部DNS系統中的伺服器,而看不見內部的伺服器,而且只有內外DNS伺服器之間才交換DNS查詢資訊,從而保證了系統的安全性。並且,採用這種技術可以有效地防止資訊洩漏。
在BIND 9中可以使用view語句進行配置分離DNS。view語句的文法為:
view view_name {
match-clients { address_match_list };
[ view_option; ...]
zone_statement; ...
};
其中:
match-clients:該子句非常重要,它用於指定誰能看到本view。可以在view語句中使用一些選項;
zone_statement:該子句指定在當前view中可見的區聲明。如果在設定檔中使用了view語句,則所有的zone語句都必須在view中出現。對同一個zone而言,配置內網的view應該置於外網的view之前。
下面是一個使用view語句的例子,它來自於BIND9的標準說明文檔:
view "internal" { match-clients { our-nets; };
// 匹配內網客戶的訪問
recursion yes;
// 對內網客戶允許執行遞迴查詢 zone "example.com" {
// 定義內網客戶可見的區聲明
type master; file "example.com.hosts.internal";
};
};
view "external" { match-clients { any; };
// 匹配 Internet 客戶的訪問
recursion no;
// 對 Internet 客戶不允許執行遞迴查詢 zone "example.com" {
// 定義 Internet 客戶可見的區聲明 type master;
file "exa
mple.com.hosts.external"; };
};
接下來,需要在example.com.hosts.internal中建立內網客戶可見的區檔案,並在 example.com.hosts.external中建立Internet客戶可見的區檔案。該區檔案的編寫可以根據使用者的實際情況,可以參看上面介紹的內容,此處不再贅述。
(5)隱藏BIND的版本資訊
通常軟體的漏洞和風險資訊是和特定版本相關的,因此版本號碼是駭客進行攻擊所需要搜集的最有價值的資訊之一。駭客使用dig命令可以查詢BIND的版本號碼,然後駭客就能夠通過版本號碼查詢知道這個軟體有那些漏洞,並尋求相應的工具來針對該漏洞進行攻擊。因此,隨意公開 BIND版本號碼是不明智的,具有很大的風險。其實,隱藏BIND版本號碼比較簡單,只需要修改設定檔/etc/named.conf,在option部分添加version聲明將BIND的版本號碼資訊進行覆蓋即可。使用下面的配置聲明將BIND版本號碼覆蓋,當有人請求版本資訊時,將無法得到有用的版本資訊:
options {
version “Unkown”
};
(6)使用非root許可權運行BIND
在Linux核心2.3.99以後的版本中,可以以-u選項以非root許可權運行BIND。該命令表示以 nobody使用者身份運行BIND,使用nobody身份運行能夠降低緩衝區溢位攻擊所帶來的危險。命令如下:
#/usr/local/sbin/named –u nobody
(7)刪除DNS上不必要的其他服務
刪除DNS機器上不必要的其他服務。網路服務是造成系統安全的重要原因,常見的DoS攻擊、弱指令碼攻擊以及緩衝區溢位攻擊都是由於系統存在網路服務所引起的。在安裝DNS運行所依賴的作業系統前,就應該確定在系統中啟動並執行服務的最小集合,建立一個DNS伺服器系統就不應該安裝Web、POP、gopher、NNTP News等服務。建議不安裝以下軟體包:
(1)X-Windows及相關的軟體包;
(2)多媒體應用軟體包;
(3)任何不需要的編譯器和指令碼解釋語言;
(4)任何不用的文字編輯器;
(5)不需要的客戶程式;
(6)不需要的其他網路服務。
(8)合理配置DNS的查詢方式
DNS的查詢方式有兩種,遞迴查詢和迭代查詢。合理配置這兩種查詢方式,能夠在實踐中取得較好的效果。
其中,遞迴查詢是最常見的查詢方式,工作方式是:網域名稱伺服器將代替提出請求的客戶機(下級DNS伺服器)進行網域名稱查詢,若網域名稱伺服器不能直接回答,則網域名稱伺服器會在域各樹中的各分支的上下進行遞迴查詢,最終將返回查詢結果給客戶機,在網域名稱伺服器查詢期間,客戶機將完全處於等待狀態。
迭代查詢又稱重指引查詢。其工作方式為:當伺服器使用迭代查詢時能夠使其他伺服器返回一個最佳的查詢點提示或主機地址,若此最佳的查詢點中包含需要查詢的主機地址,則返回主機地址資訊,若此時伺服器不能夠直接查詢到主機地址,則是按照提示的指引依次查詢,直到伺服器給出的提示中包含所需要查詢的主機地址為止,一般的,每次指引都會更靠近根伺服器(向上),查尋到根網域名稱伺服器後,則會再次根據提示向下尋找。
綜合上面兩點,我們可以看出來,遞迴查詢就是客戶機會等待最後結果的查詢,而迭代查詢是客戶機等到的不一定是最終的結果,而可能是一個查詢提示。因而存在如下兩個問題:
二級DNS向一級DNS發起遞迴查詢,會對一級DNS造成效能壓力,所有跨域查詢都要經過一級DNS響應給對應二級DNS;
二級DNS向一級DNS發起遞迴查詢,再由一級向歸屬DNS發起遞迴的模式查詢響應會有一定延時