網際網路上DNS伺服器的事實標準就是ISC的BIND,BillManning對in-addr域的調查發現,有95%的域名伺服器(2的2000次方個伺服器中)使用的是各種版本的「bind」。這其中包括了所有的DNS根伺服器,而這些根伺服器對整個伺服器的正常運轉起著至關重要的作用。
DNS服務面臨的安全隱患主要包括:DNS欺騙(DNSSpoffing)、拒絕服務(Denialofservice,DoS)攻擊、分布式拒絕服務攻擊和緩衝區漏洞溢出攻擊(BufferOverflow)。
DNS欺騙即域名信息欺騙是最常見的DNS安全問題。當一個DNS伺服器掉入陷阱,使用了來自一個惡意DNS伺服器的錯誤信息,那麼該DNS伺服器就被欺騙了。DNS欺騙會使那些易受攻擊的DNS伺服器產生許多安全問題,例如:將用戶引導到錯誤的網際網路站點,或者發送一個電子郵件到一個未經授權的郵件伺服器。網絡攻擊者通常通過兩種方法進行DNS欺騙。
DDOS攻擊通過使用攻擊者控制的幾十臺或幾百臺計算機攻擊一臺主機,使得服務拒絕攻擊更難以防範:使服務拒絕攻擊更難以通過阻塞單一攻擊源主機的數據流,來防範服務拒絕攻擊。SynFlood是針對DNS伺服器最常見的分布式拒絕服務攻擊。SYNFlood攻擊利用的是IPv4中TCP協議的三次握手(Three-WayHandshake)過程進行的攻擊。大家知道協議規定,如果一端想向另一端發起TCP連接,它需要首先發送TCPSYN包到對方,對方收到後發送一個TCPSYN+ACK包回來,發起方再發送TCPACK包回去,這樣三次握手就結束了。我們把TCP連接的發起方叫作"TCP客戶機(TCPClient)",TCP連接的接收方叫作"TCP伺服器(TCPServer)"。
值得注意的是在TCP伺服器收到TCPSYNrequest包時,在發送TCPSYN+ACK包回TCP客戶機前,TCP伺服器要先分配好一個數據區專門服務於這個即將形成的TCP連接。一般把收到SYN包而還未收到ACK包時的連接狀態成為半開連接(Half-openConnection)。在最常見的SYNFlood攻擊中,攻擊者在短時間內發送大量的TCPSYN包給受害者,這時攻擊者是TCP客戶機,受害者是TCP伺服器。根據上面的描述,受害者會為每個TCPSYN包分配一個特定的數據區,只要這些SYN包具有不同的源地址(這一點對於攻擊者來說是很容易偽造的)。這將給TCP伺服器系統造成很大的系統負擔,最終導致系統不能正常工作。
黑客利用DNS伺服器軟體存在漏洞,比如對特定的輸入沒有進行嚴格檢查,那么有可能被攻擊者利用,攻擊者構造特殊的畸形數據包來對DNS伺服器進行緩衝區溢出攻擊。如果這一攻擊成功,就會造成DNS服務停止,或者攻擊者能夠在DNS伺服器上執行其設定的任意代碼。例如,前一陣子針對Linux平臺的BIND的攻擊(e.g.Lionworm)程序,就是利用某些版本的BIND漏洞,取得root權限,一旦入侵完成之後,入侵者就可以完全控制整個相關的網絡系統,影響非常嚴重。主要包括:
(1)更改MX記錄,造成郵件被截獲、修改或刪除。
(2)更改A記錄,使您的WWW伺服器的域名指向黑客的具有同樣WWW內容的主機,誘使訪問者登錄,獲取訪問者的密碼等相關信息。添加A記錄,使黑客的主機擁有被相信的域名,以此來入侵通過啟用域名信任機制的系統。
(3)利用這臺主機作為攻擊其他機器的「跳板」。
應對以上這些安全隱患方法有兩個最有效的原則:
BIND主要分為三個版本:
(1)v4,1998年多數UNIX捆綁的是BIND4,已經被多數廠商拋棄了,除了OpenBSD還在使
用。OpenBSD核心人為BIND8過於複雜和不安全,所以繼續使用BIND4。這樣一來BIND8/9
的很多優點都不包括在v4中。
(2)v8,就是如今使用最多最廣的版本,其詳細內容可以參閱「BIND8+域名伺服器安
全增強」<https://security.nsfocus.com/showQueryL.asp?libID=530>
(3)v9,最新版本的BIND,全部重新寫過,免費(但是由商業公司資助),BIND9在2000年十月份推出,根據調查v9版本的BIND是最安全的,它的最新安全版本在其官方網站:https://www.isc.org/下載下載原始碼安裝即可。例如使用Linux系統針對拒絕服務攻擊只要將BIND9升級為版本9.2.1即可。
這一點相對困難。Linux上的域名服務由named守護進程控制,該進程從主文件:/etc/named.conf中獲取信息。它包括一組將主機名稱映射為IP位址的各種文件。Linux下主要DNS配置文件見表一、二、三: named.conf時DNS中的核心它的配置見表三:
可以看到DNS配置文件是一個複雜的系統。伴隨DNS建立出現的許多問題都會引起相同的結果,但起因卻不同。但大多數問題是由於配置文件中的語法錯誤而導致的。DNS是一組文件構成的,所以需要不同工具檢查對應文件。一個配置存在缺陷的DNS伺服器會存在很大的安全漏洞。這裡可以通過一些工具:nslookup、dig、named-checkzone、host、named-checkconf、dlint等對DNS配置文件進行檢查。其中安裝BIND軟體包時自動安裝的工具包括:nslookup、dig、named-checkzone、host、named-checkconf。dlint是一個專門檢查DNS配置文件開放原始碼軟體。可以在
https://www.domtools.com/dns/dlint.shtml下載。
軟體下載和安裝:
運行軟體:
如果想查看通過eth0的DNS網絡流量可以使用命令
在運行dnstop的過程中,可以敲入如下命令:s,d,t,1,2,3,ctrl+r,ctrl+x,以交互方式來顯示不同的信息。
1-(TLD)記錄查詢的頂級域名,
2-(SLD)記錄查詢的二級域名,
3-(SLD)記錄查詢的三級域名,
s-(Source)記錄發送dns查詢的客戶端ip地址表,
d-(Destinations)記錄dns查詢的目的伺服器的ip地址表,
t-(QueryType)記錄查詢詳細類型。
ctrl+r-重新紀錄。
ctrl+x-退出。更詳細信息可以查看mandnstop。
下面以使用最為廣泛的Unix類DNS軟體BIND為例,介紹如何配置一個安全DNS伺服器。本文以RHEL4.0為工作平臺。
首先應該隔離BIND伺服器,不應該在DNS伺服器上跑其他服務,儘量允許普通用戶登陸。減少其它的服務可以縮小被攻擊的可能性,比如混合攻擊。
當DNS伺服器返回一個域的域名伺服器紀錄並且域名伺服器紀錄中沒有A紀錄,DNS伺服器會嘗試獲取一個紀錄。就稱為gluefetching,攻擊者可以利用它進行DNS欺騙。關閉gluefetching是一個好方法,修改配置文件:/etc/named.conf.加入一行:
上面的命令表示以nobody用戶身份運行BIND。使用nobody身份運行能夠降低緩衝區溢出攻擊所帶來的危險。
這樣只有IP位址為:從192.168.0.52到192.168.0.109的主機能夠同DNS伺服器進行區域傳輸。
這樣所有的用戶都可以訪問yourdomain.com的DNS伺服器,但是只有168.192.1.0網段的主機用戶可以請求DNS伺服器的任意服務。
另外也不要允許其他網段的主機進行遞歸詢問,在上面文件最後加入一行即可:
(1)使用存取控制清單(AccessControlLists),主要目的在於產生地址配對清單。
語法:acl「name」{address_match_list};
address_match_list:地址匹對清單。
例子:acl「mis」{192.168.200.15,192.168.143.192/26};
(2)使用Forwarders代詢伺服器機制,它將自己無法解析的查詢轉送到某特定的伺服器。
語法:forwardersip_address_liest
例子:以下是建議的forwarders設定(在/etc/named.conf中)
orwarders{//指定提供查詢的上層DNS。
www.twnic.net.tw;//到上層(twnic)的DNS查詢。
};
需注意的是通常我們指定的是到本身上一層dns,但也可能因dns緩存有誤而轉送到錯誤的伺服器上。
(3)使用allow-transfer:目的在於只允許授權的網域主機能更新、讀取DNS轄區內的記錄。
語法:allow-transfer{<address_match_list>};
例子:address_match_list:允許進行DNS轄區數據傳輸主機的IP列表。
(4)allow-update:目的在於指定能向本dns伺服器提交動態dns更新的主機
語法:allow-update{<address_match_list>};
例子:address_match_list:允許能向本DNS伺服器提交動態DNS更新的主機IP列表
DNSSEC主要依靠公鑰技術對於包含在DNS中的信息創建密碼籤名。密碼籤名通過計算出一個密碼hash數來提供DNS中數據的完整性,並將該hash數封裝進行保護。私/公鑰對中的私鑰用來封裝hash數,然後可以用公鑰把hash數譯出來。如果這個譯出的hash值匹配接收者剛剛計算出來的hash樹,那麼表明數據是完整的。不管譯出來的hash數和計算出來的hash數是否匹配,對於密碼籤名這種認證方式都是絕對正確的,因為公鑰僅僅用於解密合法的hash數,所以只有擁有私鑰的擁有者可以加密這些信息。
下載安裝:
命令格式:
dns_flood_detector[選項]
主要選項:
-iIFNAME監聽某一特定接口。
-tN當每秒查詢數量超過N值時發出警示.
-aN經過N秒後重置警示。
-wN每隔N秒顯示狀態。
-xN創建N個buckets。
-mN每隔N秒顯示所有狀態。
-b以後臺模式執行(bindsnap)。
-d以守護進程模式執行(daemon)。
-v顯示較多的輸出信息。
-h顯示使用方式。
應用實例:
dns_flood_detector-b-v-v–t3見下圖。
messages的紀錄:以守護進程模式執行,紀錄每秒超過3次查詢的紀錄,顯示最多信息,包含APTRMX紀錄等。
(1)惟高速存域名伺服器(Cache-onlyserver)
惟高速存域名伺服器(Cache-onlyserver)不包含域名資料庫。它從某個遠程伺服器取得每次域名伺服器查詢的回答,一旦取得一個回答,就將它放入高速緩存中。
(2)主域名伺服器(PrimaryNameserver)
主域名伺服器是特定域所有信息的權威來源。它從域管理員構造的本地文件中加載域信息,該「區文件」包含著伺服器具有管理權的部分域結構的最精確的信息。主域名伺服器需要配置包括一組完整的文件:主配置文件(named.conf)、正向域的區文件(named.hosts)、反向域的區文件(named.rev)、高速緩存初始化文件(named.ca)和回送文件(named.local)。
(3)輔助域名伺服器(SecondNameServer)
輔助域名伺服器用來從主伺服器中轉移一整套域信息。輔助域名伺服器是可選的配置選項。區文件是從主伺服器轉移出的,作為磁碟文件保存在輔助域名伺服器中。輔助域名伺服器不需配置本地區文件。
說明:多數域名伺服器要根據網絡實際情況將以上三種伺服器組合,進行合理配置。所有的域名伺服器都需要一個設置惟高速緩存伺服器提供名字解析。一個域只能建立一個主域名伺服器,另外至少要創建一個輔助域名伺服器作為主域名伺服器的備份。一個域的主伺服器可以是其他域的輔助域名伺服器。為了提高域名系統的可靠性,應建立輔域名伺服器。當主域名伺服器不能正常工作的情況下,能夠替代主域名伺服器對外提供不間斷的服務。
SYNCookie是對TCP伺服器端的三次握手協議作一些修改,專門用來防範SYNFlood攻擊的一種手段。它的原理是,在TCP伺服器收到TCPSYN包並返回TCPSYN+ACK包時,不分配一個專門的數據區,而是根據這個SYN包計算出一個cookie值。在收到TCPACK包時,TCP伺服器在根據那個cookie值檢查這個TCPACK包的合法性。如果合法,再分配專門的數據區進行處理未來的TCP連接。在linux下以root權限執行:
2.增大backlog
通過增加backlog的數值,可以一定程度減緩大量SYN請求導致TCP連接阻塞的狀況,一般這個數值系統默認是1024,可以增加到1280至2048:
這樣在強度不是很高的攻擊下,系統響應能力提高了一點。
3.縮短retries次數
Linux系統默認的tcp_synack_retries是5次,將這個數值減少可以提高系統響應能力,為2次:
修改後,SYN_RECV的數量有了少量減少,系統響應也快了一些。
4.限制SYN頻率
目前比較有效的是對SYN的頻率和次數進行限制,這樣最大限度的控制了單個IP位址發動攻擊的能力。例如將SYN請求的次數限制在30次每分鐘,系統默認是5次/秒可以將burst從默認的5個降低到2個。
進行此操作後正常的用戶無任何感覺上的差異,而並發的SYN請求量下降了不少,服務響應基本正常了。
5.防範SYNAttack攻擊
SYNAttack"是一種拒絕服務(DoS)的攻擊方式,會消耗掉系統中的所有資源,迫使伺服器重新啟動。使用下面的命令:
#echo1>/proc/sys/net/ipv4/tcp_syncookies
把這個命令加入"/etc/rc.d/rc.local"文件中,等下次系統重新啟動的時候就可以自動生效。
DNS是網絡服務的基礎建設,要長期不斷地保持其正常運作,每一個DNS伺服器都應該定期檢測。域名系統的配置和管理是一項比較複雜和繁瑣的系統管理任務,它對整個網絡的運行影響極大。為了保證DNS伺服器的安全運行,不僅要使用可靠的伺服器軟體版本,而且要對DNS伺服器進行安全配置,同時還要跟蹤伺服器軟體和作業系統的各種漏洞。