DNS服務(wù)面臨的安全
DNS 服務(wù)面臨的安全隱患主要包括:DNS 欺騙(DNS Spoffing)、拒絕服務(wù)(Denial of service,DoS )攻擊、分布式拒絕服務(wù)攻擊和緩沖區(qū)漏洞溢出攻擊(Buffer Ove
DNS 服務(wù)面臨的安全隱患主要包括:DNS 欺騙(DNS Spoffing)、拒絕服務(wù)(Denial of service,DoS )攻擊、分布式拒絕服務(wù)攻擊和緩沖區(qū)漏洞溢出攻擊(Buffer Overflow)。
1. DNS欺騙
DNS 欺騙即域名信息欺騙是最常見的DNS 安全問題。當(dāng)一個(gè)DNS 服務(wù)器掉入陷阱,使用了來(lái)自一個(gè)惡意DNS 服務(wù)器的錯(cuò)誤信息,那么該DNS 服務(wù)器就被欺騙了。DNS 欺騙會(huì)使那些易受攻擊的DNS 服務(wù)器產(chǎn)生許多安全問題,例如:將用戶引導(dǎo)到錯(cuò)誤的互聯(lián)網(wǎng)站點(diǎn),或者發(fā)送一個(gè)電子郵件到一個(gè)未經(jīng)授權(quán)的郵件服務(wù)器。網(wǎng)絡(luò)攻擊者通常通過兩種方法進(jìn)行DNS 欺騙。
(1)緩存感染
黑客會(huì)熟練的使用DNS 請(qǐng)求,將數(shù)據(jù)放入一個(gè)沒有設(shè)防的DNS 服務(wù)器的緩存當(dāng)中。這些緩存信息會(huì)在客戶進(jìn)行DNS 訪問時(shí)返回給客戶,從而將客戶引導(dǎo)到入侵者所設(shè)置的運(yùn)行木馬的Web 服務(wù)器或郵件服務(wù)器上,然后黑客從這些服務(wù)器上獲取用戶信息。
(2)DNS 信息劫持
入侵者通過監(jiān)聽客戶端和DNS 服務(wù)器的對(duì)話,通過猜測(cè)服務(wù)器響應(yīng)給客戶端的DNS 查詢ID 。每個(gè)DNS 報(bào)文包括一個(gè)相關(guān)聯(lián)的16位ID 號(hào),DNS 服務(wù)器根據(jù)這個(gè)ID 號(hào)獲取請(qǐng)求源位置。黑客在DNS 服務(wù)器之前將虛假的響應(yīng)交給用戶,從而欺騙客戶端去訪問惡意的網(wǎng)站。
(3)DNS 重定向
攻擊者能夠?qū)NS 名稱查詢重定向到惡意DNS 服務(wù)器。這樣攻擊者可以獲得DNS 服務(wù)器的寫權(quán)限。
2. 拒絕服務(wù)攻擊
黑客主要利用一些DNS 軟件的漏洞,如在BIND 9版本(版本9.2.0以前的 9系列)如果有人向運(yùn)行BIND 的設(shè)備發(fā)送特定的DNS 數(shù)據(jù)包請(qǐng)求,BIND 就會(huì)自動(dòng)關(guān)閉。攻擊者只能使BIND 關(guān)閉,而無(wú)法在服務(wù)器上執(zhí)行任意命令。如果得不到DNS 服務(wù),那么就會(huì)產(chǎn)生一場(chǎng)災(zāi)難:由于網(wǎng)址不能解析為IP 地址,用戶將無(wú)方訪問互聯(lián)網(wǎng)。這樣,DNS 產(chǎn)生的問題就好像是互聯(lián)網(wǎng)本身所產(chǎn)生的問題,這將導(dǎo)致大量的混亂。
3、分布式拒絕服務(wù)攻擊
DDOS 攻擊通過使用攻擊者控制的幾十臺(tái)或幾百臺(tái)計(jì)算機(jī)攻擊一臺(tái)主機(jī),使得服務(wù)拒絕攻擊更難以防范:使服務(wù)拒絕攻擊更難以通過阻塞單一攻擊源主機(jī)的數(shù)據(jù)流,來(lái)防范服務(wù)拒絕攻擊。Syn Flood是針對(duì)DNS 服務(wù)器最常見的分布式拒絕服務(wù)攻擊。SYN Flood 攻擊利用的是IPv4中TCP 協(xié)議的三次握手(Three-Way Handshake)過程進(jìn)行的攻擊。大家知道協(xié)議規(guī)定,如果一端想向另一端發(fā)起TCP 連接,它需要首先發(fā)送TCP SYN 包到對(duì)方,對(duì)方收到后發(fā)送一個(gè)TCP SYN ACK包回來(lái),發(fā)起方再發(fā)送TCP ACK 包回去,這樣三次握手就結(jié)束了。我們把TCP 連接的發(fā)起方叫作"TCP 客戶機(jī)(TCP Client)" ,TCP 連接的接收方叫作"TCP 服務(wù)器(TCP Server)" 。
值得注意的是在TCP 服務(wù)器收到TCP SYN request包時(shí),在發(fā)送TCP SYN ACK包回TCP 客戶機(jī)前,
,TCP 服務(wù)器要先分配好一個(gè)數(shù)據(jù)區(qū)專門服務(wù)于這個(gè)即將形成的TCP 連接。一般把收到SYN 包而還未收到ACK 包時(shí)的連接狀態(tài)成為半開連接(Half-open Connection)。在最常見的SYN Flood攻擊中,攻擊者在短時(shí)間內(nèi)發(fā)送大量的TCP SYN包給受害者,這時(shí)攻擊者是TCP 客戶機(jī),受害者是TCP 服務(wù)器。根據(jù)上面的描述,受害者會(huì)為每個(gè)TCP SYN包分配一個(gè)特定的數(shù)據(jù)區(qū),只要這些SYN 包具有不同的源地址(這一點(diǎn)對(duì)于攻擊者來(lái)說(shuō)是很容易偽造的)。這將給TCP 服務(wù)器系統(tǒng)造成很大的系統(tǒng)負(fù)擔(dān),最終導(dǎo)致系統(tǒng)不能正常工作。
4. 緩沖區(qū)漏洞溢出攻擊
黑客利用DNS 服務(wù)器軟件存在漏洞,比如對(duì)特定的輸入沒有進(jìn)行嚴(yán)格檢查,那幺有可能被攻擊者利用,攻擊者構(gòu)造特殊的畸形數(shù)據(jù)包來(lái)對(duì)DNS 服務(wù)器進(jìn)行緩沖區(qū)溢出攻擊。如果這一攻擊成功,就會(huì)造成DNS 服務(wù)停止,或者攻擊者能夠在DNS 服務(wù)器上執(zhí)行其設(shè)定的任意代碼。例如, 前一陣子針對(duì) Linux 平臺(tái)的 BIND 的攻擊(e.g. Lion worm)程序, 就是利用某些版本的 BIND 漏洞, 取得root 權(quán)限, 一旦入侵完成之后, 入侵者就可以完全控制整個(gè)相關(guān)的網(wǎng)絡(luò)系統(tǒng), 影響非常嚴(yán)重。主要包括:
(1) 更改MX 記錄,造成郵件被截獲、修改或刪除。
(2)更改A 記錄,使您的WWW 服務(wù)器的域名指向黑客的具有同樣WWW 內(nèi)容的主機(jī),誘使訪問者登錄,獲取訪問者的密碼等相關(guān)信息。添加A 記錄,使黑客的主機(jī)擁有被相信的域名,以此來(lái)入侵通過啟用域名信任機(jī)制的系統(tǒng)。
(3)利用這臺(tái)主機(jī)作為攻擊其他機(jī)器的“跳板”。
應(yīng)對(duì)以上這些安全隱患方法有兩個(gè)最有效的原則:
1. 選擇安全沒有缺陷的DNS 版本:
BIND 主要分為三個(gè)版本:
(1)v4,1998年多數(shù)UNIX 捆綁的是BIND4,已經(jīng)被多數(shù)廠商拋棄了,除了OpenBSD 還在使 用。OpenBSD 核心人為BIND8過于復(fù)雜和不安全,所以繼續(xù)使用BIND4。這樣一來(lái)BIND8/9 的很多優(yōu)點(diǎn)都不包括在v4中。
(2)v8,就是如今使用最多最廣的版本,其詳細(xì)內(nèi)容可以參閱“BIND 8 域名服務(wù)器安
全增強(qiáng)”
(3)v9,最新版本的BIND ,全部重新寫過,免費(fèi)(但是由商業(yè)公司資助),BIND9在2000年十月份推出, 根據(jù)調(diào)查v9版本的BIND 是最安全的,它的最新安全版本在其官方網(wǎng)站:http://www.isc.org/ 下載下載源代碼安裝即可。例如使用Linux 系統(tǒng)針對(duì)拒絕服務(wù)攻擊只要將BIND 9升級(jí)為版本9.2.1即可。
2. 保持DNS 服務(wù)器配置正確、可靠
這一點(diǎn)相對(duì)困難。Linux 上的域名服務(wù)由named 守護(hù)進(jìn)程控制,該進(jìn)程從主文件:/etc/named.conf中
,獲取信息。它包括一組將主機(jī)名稱映射為IP 地址的各種文件。Linux 下主要DNS 配置文件見表一、二、三:

表-1 DNS主要配置文件

表-2 named配置文件族
named.conf 時(shí)DNS 中的核心它的配置 見表三:
,
表-3 named.conf文件的配置
可以看到DNS 配置文件是一個(gè)復(fù)雜的系統(tǒng)。伴隨DNS 建立出現(xiàn)的許多問題都會(huì)引起相同的結(jié)果,但起因卻不同。但大多數(shù)問題是由于配置文件中的語(yǔ)法錯(cuò)誤而導(dǎo)致的。DNS 是一組文件構(gòu)成的,所以需要不同工具檢查對(duì)應(yīng)文件。一個(gè)配置存在缺陷的DNS 服務(wù)器會(huì)存在很大的安全漏洞。這里可以通過一些工具:nslookup 、dig 、named-checkzone 、host 、named-checkconf 、dlint 等對(duì)DNS 配置文件進(jìn)行檢查。其中安裝BIND 軟件包時(shí)自動(dòng)安裝的工具包括:nslookup 、dig 、named-checkzone 、host 、named-checkconf 。dlint 是一個(gè)專門檢查DNS 配置文件開放源代碼軟件??梢栽?/p>
詳細(xì)DNS 服務(wù)器工作狀態(tài)
在維護(hù)DNS 服務(wù)器時(shí),網(wǎng)管員希望知道到底是哪些用戶在使用DNS 服務(wù)器,同時(shí)也希望能對(duì)DNS 狀態(tài)查詢做一個(gè)統(tǒng)計(jì)。這里我們可以使用dnstop 查詢DNS 服務(wù)器狀態(tài):
軟件下載和安裝:

運(yùn)行軟件:
如果想查看通過eth0的DNS 網(wǎng)絡(luò)流量可以使用命令
,
在運(yùn)行dnstop 的過程中,可以敲入如下命令: s ,d ,t ,1,2,3, ctrl r,ctrl x,以交互方式來(lái)顯示不同的信息。
1-(TLD )記錄查詢的頂級(jí)域名,
2-(SLD )記錄查詢的二級(jí)域名,
3-(SLD )記錄查詢的三級(jí)域名,
s -(Source )記錄發(fā)送dns 查詢的客戶端ip 地址表,
d -(Destinations )記錄dns 查詢的目的服務(wù)器的ip 地址表 ,
t -(Query Type)記錄查詢?cè)敿?xì)類型。
ctrl r-重新紀(jì)錄。
ctrl x-退出。更詳細(xì)信息可以查看man dnstop。
下面以使用最為廣泛的Unix 類DNS 軟件BIND 為例,介紹如何配置一個(gè)安全DNS 服務(wù)器。本文以RHEL 4.0為工作平臺(tái)。
1. 隔離DNS 服務(wù)器
首先應(yīng)該隔離BIND 服務(wù)器,不應(yīng)該在DNS 服務(wù)器上跑其他服務(wù),盡量允許普通用戶登陸。減少其它的服務(wù)可以縮小被攻擊的可能性,比如混合攻擊。
2. 隱藏BIND 的版本號(hào)
通常軟件的BUG 信息是和特定版本相關(guān)的,因此版本號(hào)是黑客尋求最有價(jià)值的信息。黑客使用dig 命令可以查詢BIND 的版本號(hào),然后黑客就知道這個(gè)軟件有那些漏洞。因此隨意公開版本號(hào)是不明智的。隱藏BIND 版本號(hào)比較簡(jiǎn)單,修改配置文件:/etc/named.conf,在option 部分添加version 聲明將BIND 的版本號(hào)信息覆蓋。例如使用下面的配置聲明,當(dāng)有人請(qǐng)求版本信息時(shí),迫使nmaed 顯示:“Unsupported on this platform ”

3. 避免透露服務(wù)器信息
和版本號(hào)一樣,也不要輕易透露服務(wù)器其他信息。為了讓潛在的黑客更難得手,建議不要在DNS 配置文件中使用這HINFO 和 TXT 兩個(gè)資源記錄。
4. 關(guān)閉DNS 服務(wù)器的glue fetching選項(xiàng)
當(dāng)DNS 服務(wù)器返回一個(gè)域的域名服務(wù)器紀(jì)錄并且域名服務(wù)器紀(jì)錄中沒有A 紀(jì)錄,DNS 服務(wù)器會(huì)嘗試獲取一個(gè)紀(jì)錄。就稱為glue fetching,攻擊者可以利用它進(jìn)行DNS 欺騙。關(guān)閉glue fetching是一個(gè)好方法,修改配置文件:/etc/named.conf.加入一行:

5. 使用非root 權(quán)限運(yùn)行BIND
在Linux 內(nèi)核2.3.99以后的版本中,可以以-u 選項(xiàng)以非root 權(quán)限運(yùn)行BIND 。命令如下:

上面的命令表示以nobody 用戶身份運(yùn)行BIND 。使用nobody 身份運(yùn)行能夠降低緩沖區(qū)溢出攻擊所帶來(lái)的危險(xiǎn)。
6. 控制區(qū)域(zone)傳輸
默認(rèn)情況下BIND 的區(qū)域(zone)傳輸是全部開放的,如果沒有限制那么DNS 服務(wù)器允許對(duì)任何人都進(jìn)行區(qū)域傳輸?shù)脑?,那么網(wǎng)絡(luò)架構(gòu)中的主機(jī)名、主機(jī)IP 列表、路由器名和路由IP 列表,甚至包括各主機(jī)所在的位置和硬件配置等情況都很容易被入侵者得到。因此,要對(duì)區(qū)域傳輸進(jìn)行必要的限制。可以通過在/etc /named .conf 文件當(dāng)中添加以下語(yǔ)句來(lái)限制區(qū)域傳輸:
,
這樣只有IP 地址為:從192.168.0.52到192.168.0.109的主機(jī)能夠同DNS 服務(wù)器進(jìn)行區(qū)域傳輸。
7. 請(qǐng)求限制
如果任何人都可以對(duì)DNS 服務(wù)器發(fā)出請(qǐng)求,那么這是不能接受的。限制DNS 服務(wù)器的服務(wù)范圍很重要,可以把許多入侵者據(jù)之門外。修改BIND 的配置文件:/etc/named.conf加入以下內(nèi)容:

這樣所有的用戶都可以訪問yourdomain.com 的DNS 服務(wù)器,但是只有168.192.1.0網(wǎng)段的主機(jī)用戶可以請(qǐng)求DNS 服務(wù)器的任意服務(wù)。
另外也不要允許其他網(wǎng)段的主機(jī)進(jìn)行遞歸詢問,在上面文件最后加入一行即可:

8. 其他強(qiáng)化措施:
(1)使用存取控制清單 (Access Control Lists),主要目的在于產(chǎn)生地址配對(duì)清單。
,語(yǔ)法:acl “name” { address_match_list };
address_match_list:地址匹對(duì)清單。
例子:acl “mis”{192.168.200.15,192.168.143.192/26};
(2)使用Forwarders 代詢服務(wù)器機(jī)制,它將自己無(wú)法解析的查詢轉(zhuǎn)送到某特定的服務(wù)器。
語(yǔ)法:forwarders ip_address_liest
例子:以下是建議的 forwarders 設(shè)定(在/etc/named.conf中)
orwarders { // 指定提供查詢的上層 DNS 。
www.twnic.net.tw ; // 到上層 (twnic) 的 DNS 查詢。
};
需注意的是通常我們指定的是到本身上一層 dns ,但也可能因 dns 緩存有誤而轉(zhuǎn)送到錯(cuò)誤的服務(wù)器上。
(3)使用allow-transfer :目的在于只允許授權(quán)的網(wǎng)域主機(jī)能更新、讀取 DNS 轄區(qū)內(nèi)的記錄。 語(yǔ)法:allow-transfer { };
例子:address_match_list:允許進(jìn)行 DNS 轄區(qū)數(shù)據(jù)傳輸主機(jī)的 IP 列表。
(4)allow-update :目的在于指定能向本 dns 服務(wù)器提交動(dòng)態(tài) dns 更新的主機(jī)
語(yǔ)法:allow-update { };
例子:address_match_list:允許能向本 DNS 服務(wù)器提交動(dòng)態(tài) DNS 更新的主機(jī) IP 列表
9. 使用DNSSEC
DNS 欺騙spoofing 對(duì)目前網(wǎng)絡(luò)應(yīng)用, 最大的沖擊在于 冒名者借著提供假的網(wǎng)域名稱與網(wǎng)址的對(duì)照信息, 可以將不知情用戶的網(wǎng)頁(yè)聯(lián)機(jī), 導(dǎo)引到錯(cuò)誤的網(wǎng)站, 原本屬于用戶的電子郵件也可能因而遺失, 甚而進(jìn)一步空開成為阻斷服務(wù)的攻擊。所幸, 目前較新的 BIND 版本, 針對(duì)這一類問題, 已經(jīng)有加入許多改進(jìn)的方法, 不過真正的解決方案, 則有賴封包認(rèn)證機(jī)制的建立與推動(dòng)。DNSSEC 就是試圖解決這一類問題的全新機(jī)制, BIND9 已經(jīng)完整加以設(shè)計(jì)并完成。DNSSEC 引入兩個(gè)全新的資源記錄類型:KEY 和SIG ,允許客戶端和域名服務(wù)器對(duì)任何DNS 數(shù)據(jù)的來(lái)源進(jìn)行密碼驗(yàn)證。
DNSSEC 主要依靠公鑰技術(shù)對(duì)于包含在DNS 中的信息創(chuàng)建密碼簽名。密碼簽名通過計(jì)算出一個(gè)密碼hash 數(shù)來(lái)提供DNS 中數(shù)據(jù)的完整性,并將該hash 數(shù)封裝進(jìn)行保護(hù)。私/公鑰對(duì)中的私鑰用來(lái)封裝hash 數(shù),然后可以用公鑰把hash 數(shù)譯出來(lái)。如果這個(gè)譯出的hash 值匹配接收者剛剛計(jì)算出來(lái)的hash 樹,那么表明數(shù)據(jù)是完整的。不管譯出來(lái)的hash 數(shù)和計(jì)算出來(lái)的hash 數(shù)是否匹配,對(duì)于密碼簽名這種認(rèn)證方式都是絕對(duì)正確的,因?yàn)楣€僅僅用于解密合法的hash 數(shù),所以只有擁有私鑰的擁有者可以加密這些信息。
10. 為DNS 服務(wù)器配置DNS Flood Detector
DNS Flood Detector是針對(duì)DNS 服務(wù)器的Syn Flood攻擊檢測(cè)工具,用于偵測(cè)惡意的使用DNS 查詢功能。它利用libpcap 的網(wǎng)絡(luò)數(shù)據(jù)包捕獲函數(shù)功能檢測(cè)網(wǎng)絡(luò)流量來(lái)判斷是否受到Syn Flood攻擊, DNS Flood Detctor運(yùn)行方式分成:守護(hù)進(jìn)程(daemon )模式 和后臺(tái)( bindsnap ) 模式。以守護(hù)進(jìn)程模式運(yùn)行時(shí)它 會(huì)通過syslog 發(fā)出警示(/var/log/messages),以后臺(tái)模式運(yùn)行時(shí)可以得到實(shí)時(shí)的查詢狀態(tài)。
,下載安裝:

命令格式:
dns_flood_detector [選項(xiàng)]
主要選項(xiàng):
-i IFNAME 監(jiān)聽某一特定接口。
-t N 當(dāng)每秒查詢數(shù)量超過N 值時(shí)發(fā)出警示.
-a N 經(jīng)過 N 秒后重置警示。
-w N 每隔 N 秒顯示狀態(tài)。
-x N 創(chuàng)建 N 個(gè) buckets 。
-m N 每隔N 秒顯示所有狀態(tài)。
-b 以后臺(tái)模式執(zhí)行(bindsnap)。
-d 以守護(hù)進(jìn)程模式執(zhí)行(daemon)。
-v 顯示較多的輸出信息。
-h 顯示使用方式。
應(yīng)用實(shí)例:
dns_flood_detector -b -v -v –t3 見下圖。

dns_flood_detector工作界面
messages 的紀(jì)錄:以守護(hù)進(jìn)程模式執(zhí)行, 紀(jì)錄每秒超過3次查詢的紀(jì)錄, 顯示最多信息, 包含A PTR MX 紀(jì)錄等。
11. 建立完整的域名服務(wù)器
Linux 下的DNS 服務(wù)器用來(lái)存儲(chǔ)主機(jī)的域名信息。包括三種:
,