加強(qiáng)linux系統(tǒng)的DNS服務(wù)的安全防御能力
M8-1 加強(qiáng)Linux 系統(tǒng)的DNS 服務(wù)的安全防御能力1.1場(chǎng)景描述1.1.1 學(xué)習(xí)目的學(xué)生通過該能力模塊的學(xué)習(xí), 能夠獨(dú)立完成和熟練掌握安全配臵DNS 服務(wù)器,加強(qiáng)Linux 系統(tǒng)的DNS 服務(wù)
M8-1 加強(qiáng)Linux 系統(tǒng)的DNS 服務(wù)的安全防御能力
1.1場(chǎng)景描述
1.1.1 學(xué)習(xí)目的
學(xué)生通過該能力模塊的學(xué)習(xí), 能夠獨(dú)立完成和熟練掌握安全配臵DNS 服務(wù)器,加強(qiáng)Linux 系統(tǒng)的DNS 服務(wù)的安全防御能力。
1.1.2 學(xué)習(xí)要求
理解:DNS 服務(wù)存在安全風(fēng)險(xiǎn)
掌握:DNS 服務(wù)安全選項(xiàng)配臵
掌握:DNS 服務(wù)TSIG 配臵
1.1.3 學(xué)習(xí)重點(diǎn)和難點(diǎn)
1. 學(xué)習(xí)重點(diǎn)
? 保護(hù)DNS 服務(wù)器本身安全
? 保護(hù) Zone Transfer 的安全
? 保護(hù) DNS 免于 Spoofed攻擊
? 使用 TSIG保護(hù)DNS 服務(wù)器
? 保護(hù)Dynamic Update的安全
2. 學(xué)習(xí)難點(diǎn)
? 使用 TSIG保護(hù)DNS 服務(wù)器
1.2 知識(shí)準(zhǔn)備
1.2.1 Zone Transfer
DNS 的區(qū)域傳輸目的是為了DNS 的備份,當(dāng)DNS 服務(wù)器壞了,它的數(shù)據(jù)不會(huì)丟失。注意在配臵區(qū)域傳輸是一定要注意輔助服務(wù)器上建立的區(qū)域是輔助區(qū)域且與主服
,務(wù)器的域名相同,而且區(qū)域傳輸是雙向的,不但需要在輔助服務(wù)器上配臵還要在主服務(wù)器上進(jìn)行相應(yīng)的配臵。
1.2.2 DNS威脅
DNS 服務(wù)面臨的安全問題主要包括:DNS 欺騙(DNS Spoffing )、拒絕服務(wù)(Denial of service,DoS )攻擊、分布式拒絕服務(wù)攻擊和緩沖區(qū)漏洞溢出攻擊(Buffer Overflow )。
1. DNS 欺騙
DNS 欺騙即域名信息欺騙是最常見的DNS 安全問題。當(dāng)一個(gè)DNS 服務(wù)器
掉入陷阱,使用了來自一個(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是一個(gè)典型的DNS 欺騙的示意圖。
2.
TuPkVGdvW6tl
(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 復(fù)位定向
攻擊者能夠?qū)NS 名稱查詢復(fù)位向到惡意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ù)器上執(zhí)行任意命令。如果得不到DNS 服務(wù),那么就會(huì)產(chǎn)生一場(chǎng)災(zāi)難:由于網(wǎng)址不能解析為IP 地址,用戶將無方訪問互聯(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ù)流,來防范服務(wù)拒絕攻擊。Syn Flood是針對(duì)DNS 服務(wù)器最常見的分布式拒絕服務(wù)攻擊。
4. 緩沖區(qū)漏洞
Bind 軟件的缺省設(shè)臵是允許主機(jī)間進(jìn)行區(qū)域傳輸(zone transfer)。區(qū)域傳輸主要用于主域名服務(wù)器與輔域名服務(wù)器之間的數(shù)據(jù)同步,使輔域名服務(wù)器可以從主域名服務(wù)器獲得新的數(shù)據(jù)信息。一旦起用區(qū)域傳輸而不做任何限制,很可能會(huì)造成信息泄漏,黑客將可以獲得整個(gè)授權(quán)區(qū)域內(nèi)的所有主機(jī)的信息,判斷主機(jī)功能及安全性,從中發(fā)現(xiàn)目標(biāo)進(jìn)行攻擊。
1.2.3 TSIG
DNS 的事務(wù)簽名分為 TSIG (Transaction Signatures) 與 SIG0 (SIGnature)兩種。該如何選擇呢? 首先,要先判斷客戶端與服務(wù)器間的信任關(guān)系為何,若是可信任者,可選擇對(duì)稱式的 TSIG。TSIG 只有一組密碼,并無公開/私密金鑰之分;若是
,非完全信任者,可選擇非對(duì)稱式金鑰的 SIG0,雖有公開/私密金鑰之分,相對(duì)的,設(shè)定上也較復(fù)雜。至于要選用哪種較適合,就由自己來判斷。通常區(qū)帶傳輸是主域名服務(wù)器到輔助域名服務(wù)器。
1.TSIG 技術(shù)
交易簽章 (TSIGRFC 2845),是為了保護(hù) DNS安全而發(fā)展的。從BIND 8.2版本開始引入 TSIG 機(jī)制,其驗(yàn)證 DNS 訊息方式是使用共享金鑰 (Secret Key) 及單向雜湊函式(One-way hash function) 來提供訊息的驗(yàn)證和數(shù)據(jù)的完整性。主要針對(duì)區(qū)帶傳輸(ZONE Transfer)進(jìn)行保護(hù)的作用,利用密碼學(xué)編碼方式為通訊傳輸信息加密以保證 DNS 訊息的安全,特別是響應(yīng)與更新的訊息數(shù)據(jù)。也就是說在DNS 服務(wù)器之間進(jìn)行轄區(qū)傳送時(shí)所提供保護(hù)的機(jī)制,以確保傳輸數(shù)據(jù)不被竊取及監(jiān)聽。
2.SIG0 技術(shù)簡(jiǎn)介
SIG0是一九九九年三月 由 IBM公司的D. Eastlake 提出成為標(biāo)準(zhǔn)。其是利用公開金鑰機(jī)制為轄區(qū)資料進(jìn)行數(shù)字簽章的動(dòng)作,以保證每筆傳輸?shù)?source record 具有可驗(yàn)證性與不可否認(rèn)性。實(shí)際上 SIG0 才是防止 DNS Spoofing 發(fā)生最主要的技術(shù),SIG0 是使用公開金鑰加密法,讓轄區(qū)管理者為其轄區(qū)數(shù)據(jù)加上數(shù)字簽章,由此證明轄區(qū)資料的可信賴性。除此之外,SIG0 保有是否選擇認(rèn)證機(jī)制的彈性,以及可靈活地配合自訂的安全機(jī)制。
1.3 注意事項(xiàng)
在對(duì)DNS 進(jìn)行安全配臵之前,需要確認(rèn)DNS 是否能夠正常解析。
1.4 操作步驟
1.4.1選擇沒有安全缺陷的DNS 版本
BIND 主要分為三個(gè)版本:
(1)v4:1998年多數(shù)unix 捆綁
(2)v8:如今使用最多最廣大版本
安全信息:http://security.nsfocus.com/showQueryL.asp?libID=530
(3)v9:最新版本,免費(fèi)(http://www.isc.org)
,2. 保持DNS 服務(wù)器配臵正確、可靠
dlint 是專門檢查DNS 配臵文件開源代碼軟件:
dnstop 可以查詢DNS 服務(wù)器狀態(tài):
1.4.2保護(hù)DNS 服務(wù)器本身安全
第一步:隔離DNS 服務(wù)器
DNS 服務(wù)器要專用,不要在DNS 服務(wù)器上運(yùn)行其它服務(wù),盡量允許普通用戶登錄。 第二步:隱藏DNS 服務(wù)器
網(wǎng)絡(luò)攻擊者對(duì)DNS 服務(wù)進(jìn)行攻擊前,首先要知道BIND 有版本號(hào),根據(jù)BIND 版本號(hào)找到漏洞來確定攻擊DNS 服務(wù)器方法,攻擊者使用dig 命令可以查詢到BIND 的版本號(hào)。為了保障DNS 服務(wù)器安全的首先要隱藏DNS 服務(wù)器。下面是沒有隱藏DNS 服務(wù),攻擊者查詢到的DNS 服務(wù)器的版本。
[root@centos ~]# dig @192.168.123.11 txt chaos version.bind
; <<>> DiG 9.3.4-P1 <<>> @192.168.123.11 txt chaos version.bind
; (1 server found)
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 10122
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0 ;; QUESTION SECTION:
;version.bind. CH TXT
;; ANSWER SECTION:
version.bind. 0 CH TXT "9.2.4"
;; AUTHORITY SECTION:
version.bind. 0 CH NS version.bind.
;; Query time: 20 msec
;; SERVER: 192.168.123.11#53(192.168.123.11)
,;; WHEN: Thu Jan 14 18:33:27 2010
;; MSG SIZE rcvd: 62
[root@centos ~]#
通過下面對(duì)服務(wù)器進(jìn)行安全配臵,攻擊者無法查詢到DNS 服務(wù)地版本信息,編輯BIND 配臵文件,如下所示。
[root@lab2 ~]# vi /etc/named.conf
//
// named.conf for Red Hat caching-nameserver
//
options {
directory "/var/named";
version "unknow on this platform";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
/*
* If there is a firewall between you and nameservers you want * to talk to, you might need to uncomment the query-source * directive below. Previous versions of BIND always asked * questions using port 53, but BIND 8.1 uses an unprivileged * port by default.
*/
// query-source address * port 53;
};
//
// a caching only nameserver config
//
"/etc/named.conf" 79L, 1572C
在配臵文件中加入“version "unknow on this platform";”,保存配臵文件,然后 退出,重啟DNS 服務(wù)器。
,[root@lab2 ~]# service named restart
停止 named:[ 確定 ]
啟動(dòng) named:[ 確定 ]
[root@lab2 ~]#
再使用dig 命令進(jìn)行測(cè)試,如下所示:
[root@centos ~]# dig @192.168.123.11 txt chaos version.bind
; <<>> DiG 9.3.4-P1 <<>> @192.168.123.11 txt chaos version.bind ; (1 server found)
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 61670
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0 ;; QUESTION SECTION:
;version.bind. CH TXT
;; ANSWER SECTION:
version.bind. 0 CH TXT "unknow on this platform"
;; AUTHORITY SECTION:
version.bind. 0 CH NS version.bind. ;; Query time: 16 msec
;; SERVER: 192.168.123.11#53(192.168.123.11)
;; WHEN: Thu Jan 14 18:40:23 2010
;; MSG SIZE rcvd: 80
通過上面測(cè)試,可以看到攻擊者無法查詢到DNS 的版本信息。
第三步:避免透露DNS 服務(wù)器信息
和版本號(hào)一樣,也不要輕易透露服務(wù)器其他信息。為了讓潛在的攻擊者更難得手,盡量不要在DNS 配臵文件中使用這HINFO 和 TXT兩個(gè)資源記錄。
第四步:以最小的權(quán)限及使用chroot()方式運(yùn)行BIND
,以 root 使用者的身分執(zhí)行BIND 有安全隱患,攻擊者若找到BIND 的安全漏洞,可能獲取 root 的身分,從而進(jìn)行對(duì)服務(wù)器攻擊。
BIND 8.1.2 允許在啟動(dòng)DNS 服務(wù)器後,變更其UID 和GID ,可以使用命令 named -u named
以 chroot() 的方式執(zhí)行BIND 可將危害減至最低
設(shè)臵 chroot 之后的環(huán)境:設(shè)臵dev/zero、dev/random、dev/log或etc/localtime,可以使用命令修改運(yùn)行用戶。
named -u named -t /var/named
1.4.3保護(hù) DNS 免于 Spoofed 攻擊
DNS 服務(wù)器若接受來自Internet 的遞歸詢問要求,易遭受Spoofing 的攻擊,導(dǎo)致攻擊者修改DNS 服務(wù)器區(qū)域文件,其它用戶解析域名的時(shí)候,取回的是假造的名稱信息。
第一步:關(guān)閉rescursion 的功能
關(guān)閉 rescursion 功能后,DNS 服務(wù)器只會(huì)響應(yīng)非遞歸的詢問要求
無遞歸功能的DNS 服務(wù)器不易易遭受 Spoofing 的攻擊,因?yàn)樗粫?huì)送出查詢要求,所以也不會(huì)攝取所管區(qū)域以外的任何數(shù)據(jù)
如果DNS 服務(wù)器還提供服務(wù)給合法的解析器(resolver ),或是充當(dāng)其他D NS服務(wù)器的代詢服務(wù)器(forwarder ),就不應(yīng)該關(guān)閉 rescursion 的功能。如果無法關(guān)閉 rescursion 的功能,應(yīng)該限制查詢要求的服務(wù)對(duì)象
修改配臵文件:/etc/named.conf.加入一行:
[root@lab2 ~]# vi /etc/named.conf
//
// named.conf for Red Hat caching-nameserver
//
options {
,directory "/var/named";
version "unknow on this platform";
recursion no;
fetch-glue no;
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
/*
* If there is a firewall between you and nameservers you want * to talk to, you might need to uncomment the query-source * directive below. Previous versions of BIND always asked * questions using port 53, but BIND 8.1 uses an unprivileged * port by default.
"/etc/named.conf" 81L, 1603C
第二步:關(guān)閉 glue fetching 的功能
修當(dāng)DNS 服務(wù)器為響應(yīng)詢問的 DNS 封包建立 additional data 區(qū)段的數(shù)據(jù)時(shí),會(huì)自動(dòng)解析 NS 紀(jì)錄中任何DNS 服務(wù)器的域名,這稱為 glue fetching, 易遭受 Spoofing 的攻擊。
關(guān)閉 glue fetching 的功能,可避免DNS 服務(wù)器送出任何的查詢要求,所以也不會(huì)攝取所管區(qū)域以外的任何數(shù)據(jù)。
當(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.加入一行:
[root@lab2 ~]# vi /etc/named.conf
//
// named.conf for Red Hat caching-nameserver
//
options {
directory "/var/named";
,version "unknow on this platform";
recursion no;
fetch-glue no;
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
/*
* If there is a firewall between you and nameservers you want * to talk to, you might need to uncomment the query-source * directive below. Previous versions of BIND always asked * questions using port 53, but BIND 8.1 uses an unprivileged * port by default.
"/etc/named.conf" 81L, 1603C
第三步:限制查詢要求的服務(wù)對(duì)象
如果無法關(guān)閉 rescursion 的功能,應(yīng)該限制查詢要求的服務(wù)對(duì)象
限制詢問要求的來源(IP 地址)
限制可以查詢的區(qū)域范圍
DNS 服務(wù)器應(yīng)該拒絕來自以下網(wǎng)絡(luò)的詢問要求
私有網(wǎng)絡(luò)(除非你自己在使用)
實(shí)驗(yàn)性網(wǎng)絡(luò)
群播網(wǎng)絡(luò)
一般的DNS 服務(wù)器
對(duì)所管區(qū)域的名稱信息,可以服務(wù)來自任何 IP 地址的查詢要求,因?yàn)樗墙?jīng)授權(quán)而來管理該區(qū)域的權(quán)威DNS 服務(wù)器
對(duì)于所管區(qū)域以外的名稱信息,只應(yīng)該服務(wù)來自內(nèi)部或可信賴之 IP 地址的查詢要求
cahing-only DNS服務(wù)器
應(yīng)該只服務(wù)來自特定 IP 地址的解析器
authoritative-only DNS服務(wù)器
必須服務(wù)來自任何IP 地址的詢問要求,但是應(yīng)該拒絕任何遞歸的詢問要求。具