BIND簡易教程(3):DNSSec配置


目錄:
BIND簡易教程(1):安裝及基本配置
BIND簡易教程(2):BIND視圖配置
BIND簡易教程(3):DNSSec配置 (本篇)

 

DNSSec,有個半英半中的名字叫DNS安全擴展。說的好聽一點,它是對域名進行簽名認證,保證域名的完整性和正確性,不會被修改。DNSSec不能防御對DNS服務器的攻擊,也不會對請求和應答的數據進行加密,甚至如果你不知道DNSSec這個東西的話,域名是不是完整正確的你也不知道。

實際上,給我的感覺就是,DNSSec是在花很大的力氣去配置一個不怎么有用的東西。然並卵。該用還是得用。當然,也有可能是我才疏學淺,蜩與學鳩笑鵬起不知若何

好了不拽文了,還是說正事。大概要分好幾步:

1、開啟DNSSec功能:

(1)要在options里面添加幾個選項,開啟DNSSec功能:

options {
    dnssec-enable yes;
    dnssec-validation auto;
    dnssec-lookaside auto;
    notify yes;
    allow-transfer { none; };
};

之前有dnssec-enable no;這個選項,改為yes,其余4個是新增的。

(2)建立目錄留作生成key放置:

mkdir -p views/dnssec_keys

(3)zone中添加相關參數:

zone “apple.tree” IN {
    type master;
    auto-dnssec maintain;
    update-policy local;
    file “/etc/bind/views/zones/dianxin.apple.tree.zone”;
    key-directory “/etc/bind/views/dnssec_keys”;
};

其中type和file是原來就有的,其余幾個選項是新增的。但是,file后面的文件一會是要改的。暫時先不改放在這兒。

2,生成密鑰

在新增的dnssec_keys目錄中生成密鑰

sudo dnssec-keygen -f KSK -a RSASHA1 -r /dev/urandom -b 512 -n ZONE apple.tree.
sudo dnssec-keygen -a RSASHA1 -r /dev/urandom -b 512 -n ZONE apple.tree.

分別采用KSK和RSA加密。關於dnssec-keygen的使用方法,有時候需要百度查一下,或者用-h看看。比如-r /dev/urandom,這是隨機數生成器,如果不加的話,生成key的時候可能要等上好幾分鍾都沒結果。

之后在dnssec_keys目錄中可以看到4個文件:

Kapple.tree.+005+54124.key
Kapple.tree.+005+54124.private
Kapple.tree.+005+61152.key
Kapple.tree.+005+61152.private

兩個公鑰和兩個私鑰,一會配置解析庫的時候會用到>

3,簽名

(1)將前面生成的兩個公鑰添加到區域配置文件末尾

$TTL 86400
@   IN  SOA apple.tree. apple.apple.tree. (
          2016090100     ; Serial
               28800     ; Refresh
                7200     ; Retry
              604800     ; Expire
               86400     ; Negative Cache TTL
)

@   IN  NS  apple.tree.
@   IN  A   192.168.4.135
aaa     IN      A       192.168.4.100
bbb     IN      A       192.168.4.101
ccc     IN      CNAME   bbb

$INCLUDE "/etc/bind/views/dnssec_keys/Kapple.tree.+005+54124.key" $INCLUDE "/etc/bind/views/dnssec_keys/Kapple.tree.+005+61152.key"

(2)對zone簽名

sudo dnssec-signzone -K /etc/bind/views/dnssec_keys -o apple.tree. /etc/bind/views/zones/dianxin.apple.tree.zone

會生成一個后綴為.signed的文件,這個就是簽名后的zone。把這個zone文件的名字寫到前面zone一節的file選項中。zone變為

zone "apple.tree" IN {
    type master;
    auto-dnssec maintain;
    update-policy local;
    file "/etc/bind/views/zones/dianxin.apple.tree.zone.signed";
    key-directory "/etc/bind/views/dnssec_keys";
};

4,生成信任錨

(1)生成信任錨文件:查看剛才生成的兩個公鑰

$ ls
Kccgslb.bokecs.com.+005+54124.key
Kccgslb.bokecs.com.+005+54124.private
Kccgslb.bokecs.com.+005+61152.key
Kccgslb.bokecs.com.+005+61152.private
$ sudo cat Kapple.tree.+005+54124.key
; This is a key-signing key, keyid 54124, for apple.tree.
; Created: 20160825061813 (Thu Aug 25 14:18:13 2016)
; Publish: 20160825061813 (Thu Aug 25 14:18:13 2016)
; Activate: 20160825061813 (Thu Aug 25 14:18:13 2016)
apple.tree. IN DNSKEY 257 3 5 AwEAAbfkw0jfR6MAIInduMR1WAj6XZIRj3Zso8xyiOSmeQRNVVyS9dOz tBemhoCWhOk5RnEZpu/ITJVEzSZHY3bA1Tc=
$ sudo cat Kapple.tree.+005+61152.key
; This is a zone-signing key, keyid 61152, for apple.tree.
; Created: 20160825062349 (Thu Aug 25 14:23:49 2016)
; Publish: 20160825062349 (Thu Aug 25 14:23:49 2016)
; Activate: 20160825062349 (Thu Aug 25 14:23:49 2016)
apple.tree. IN DNSKEY 256 3 5 AwEAAb8mO4dN8I1mCt/f575aACdeSr+Q0igouAWrJa5DGJNZfAoX39eW z3QfG6nmiDdgtT/CoPL+uqH46BERgqk9POc=

在 /etc/bind 目錄下生成文件 sec-trust-anchors.conf

trusted-keys {
    apple.tree. 257 3 5 "AwEAAbfkw0jfR6MAIInduMR1WAj6XZIRj3Zso8xyiOSmeQRNVVyS9dOz tBemhoCWhOk5RnEZpu/ITJVEzSZHY3bA1Tc=";
    apple.tree. 256 3 5 "AwEAAb8mO4dN8I1mCt/f575aACdeSr+Q0igouAWrJa5DGJNZfAoX39eW z3QfG6nmiDdgtT/CoPL+uqH46BERgqk9POc=";
};

這里面的兩條內容是剛才生成的兩個密鑰的內容。用公鑰比較方便(也就是.key的文件)。注意復制的時候去掉“IN”和“DNSKEY”這兩個詞,以及后面的key要加引號。

(2)在named.conf中添加
include "/etc/bind/sec-trust-anchors.conf";

5,重啟bind

sudo service bind9 restart

如果重啟成功,就可以測試了

$ dig +dnssec aaa.apple.tree @192.168.4.43
; <<>> DiG 9.9.5-3ubuntu0.8-Ubuntu <<>> aaa.apple.tree @192.168.4.43
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 53833
;; flags: qr aa rd; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;aaa.apple.tree. IN A
;; ANSWER SECTION:
aaa.apple.tree. 86400 IN A 192.168.4.100
aaa.apple.tree. 86400 IN RRSIG CNAME 5 6 86400 20160924084355 20160825075619 61152 apple.tree. PLHn/VCVSb6mcvYZgM66qH2/19gKxrrfogCDWMWj3n5ZU+iqpu4W5XoY 9osK/d9BM9LM3YfltEubmCDlFBrUKw==
;; Query time: 4 msec
;; SERVER: 192.168.4.43#53(192.168.4.43)
;; WHEN: Fri Jan 08 14:47:48 CST 2016
;; MSG SIZE rcvd: 59

我們看到除了正常的一行解析到192.168.4.100之外,還有一行亂七八糟的字符串,這個就是對aaa.apple.tree的簽名。出現這個就代表DNSSec配好了。OK,至此,三篇BIND的介紹就算完成了。其實對於整個BIND來說,這只是冰山一角。但是我的精力也有限,只能寫這么點東西了。

 

題外話:

(1)開始以為BIND的效率挺差的,但是后來真正用起來發現還是相當快的,加上功能多,真不愧是當今世界上應用最廣泛的DNS服務器。我關閉日志,測試了一下QPS,有將近12萬的表現。比PowerDNS要高出一大截。而且,開啟DNSSec后效率並沒有降低,我估計是因為緩存的關系。

(2)DNS安全問題是個挺嚴肅的問題。我所知道的極少,又片面,所以不敢寫。前幾天跟群里的一位同學談到了“分布式放大攻擊”,簡直恐慌。簡單說下,比如有攻擊者A和受害者B,A將自己的IP地址偽裝成B,然后向DNS服務器發送請求。請求是精心准備的,這個請求的應答要比請求本身要大上很多倍。之后,DNS服務器向B發送了應答包。從外部看起來,就是A利用DNS服務器作為放大器,向B發動攻擊。當然,一個DNS包再大也不會有什么問題。但是很多的DNS應答包就會出問題了——受害者的計算機畢竟不是服務器,能不能承受住如此大量的網絡數據包?這就是放大攻擊。而所謂的分布式就是,A可以向很多很多DNS服務器發送請求,這樣就會成為N多服務器攻擊同一台計算機(服務器:我是冤枉的/(ㄒoㄒ)/~~)。別看我,我也不知道這怎么解決。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM