︿
Top

1、前言

DNS,Domain Name Service 主要目地為解決 Domain Name 與 IP Address 之間相互的對應問題,在網路世界間中的溝通其實就是使用 IP Address 來溝通 (就像是人類使用的身份證),但一連串的數字這樣對人類來說太過於麻煩,因此便出現 Domain Name Service 服務來將 IP Address 轉換成人類可方便閱讀的 Domain Name,簡單來說就是例如: 您輸入的 Yahoo 網址 http://tw.yahoo.com 轉成 IP Address 以便連結到 Yahoo 的網頁伺服器,關於網域名稱服務可參考站內文章 DNS 伺服器的原理與運作流程




從 FreeBSD 5.3-RELEASE 起內建 Bind9 不但安全性相對提高,並也把 Chroot 功能給加了進來,比較不習慣的可能就是設定檔的路徑
 /etc/namedb/               //原本設定檔實際路徑
 /var/named/etc/namedb/     //Bind 9 設定檔的實際路徑




文章目錄

1、前言
2、實作環境
3、安裝及設定
          步驟1.本機反解範例檔案 (localhost.rev)
          步驟2.修改 DNS 設定檔 (named.conf)
          步驟3.建立 named.weithenn.for 檔案 (Forward)
          步驟4.修改服務設定檔 (rc.conf)
          步驟5.修改本機 DNS 查詢設定檔 (resolv.conf)
          步驟6.啟動 DNS 服務
4、安全性設定測試
          測試1.隱藏 BIND DNS 版本
          測試2.Zone Transfer 限制
5、參考
6、Me FAQ
          Q1.logging channel 'security_log' file '/var/log/named/dns-security.log': file not found?
          Q2.the working directory is not writable?
          Q3.connection timed out; no servers could be reached?
          Q4.failed while receiving responses: file not found?



2、實作環境

  • FreeBSD 6.x-RELEASE
  • FreeBSD 5.x-RELEASE
  • BIND 9.3.x

3、安裝及設定

步驟 1. 本機反解範例檔案 (localhost.rev)

執行下列指令產生本機反解範例檔案 localhost.rev,產生的範例檔案 (localhost.rev 及 localhost-v6.rev) 將產生於 /var/named/etc/namedb/master 目錄下。
cd /var/named/etc/namedb/       //切換路徑              
sh make-localhost               //產生範例檔




步驟 2. 修改 DNS 設定檔 (named.conf)

修改 DNS 設定檔 named.conf。
vi /var/named/etc/namedb/named.conf      //編輯 named.conf 內容

步驟 2-1. 安全性設定 - 隱藏 BIND DNS 版本

為何要隱藏您的 BIND DNS 版本呢? 原因在於有心人士可以透過先瞭解您 DNS 主機所運作的 BIND 版本來尋找相關漏洞攻擊程式,因此在 ISC BIND 建議下可透過設定來 隱藏  BIND 系統版本。
 options {
        directory       "/etc/namedb";
        pid-file        "/var/run/named/pid";
        dump-file       "/var/dump/named_dump.db";
        statistics-file "/var/stats/named.stats";
        version         "None of your business";


步驟 2-2. 安全性設定 - 存取控制清單 ACLs

我們可以利用設定 存取控制清單 (ACL,Access Control List) 功能來限制外來對 Domain 的查詢要求並且配合 Allow-Query 參數來限制所有或特定 Zone 的查詢要求。
 acl "dns1.weithenn.org" { 61.60.59.58; };
 acl "dns2.weithenn.org" { 61.60.59.57; };


步驟 2-3. 限制來源查詢要求 (allow-query)

DNS Server 僅回應列表中 IP Address 的查詢要求,這裡的 allow-query 限制為針對 DNS Server。
 options {
          allow-query { 168.95.192.1/32; 168.95.1.1/32; dns1.weithenn.org; dns2.weithenn.org; };
 };


步驟 2-4. 限制來源查詢要求 (allow-recursion)

允許哪些來源可以使用 DNS Server 進行遞迴查詢動作。簡單說就是透過這台 DNS 來查詢任何資料,包含不是該 DNS 主機負責的 Zone 也代為查詢,您應該不想讓別人用您的 DNS Server 去探查別人的 DNS 主機資訊吧?
 options {
          allow-recursion { 127.0.0.1/32; 61.60.59.58/32; };
 };


步驟 2-5. 限制特定 Zone 查詢要求 (allow-query)

DNS Server 僅回應列表中 IP Address 的查詢要求,這裡的 allow-query 限制為針對區域 (Zone),當您設定限制所有或特定 Zone 的查詢要求時,其特定 Zone 設定優先權將大為限制所有查詢要求。
 zone "weithenn.org" {
        type master;
        file "master/named.weithenn.for";
        allow-query { dns2.weithenn.org; };  //僅回應這個 IP 的查詢要求
 };


步驟 2-6. 安全性設定 - Zone Transfer 限制

DNS 架構下常需透過更新 Zone File 動作來更新 DNS Master 及 DNS Slave 間 Zone File 的資料,在信任網域下將 Zone File 資料列出是 OK 的,但若是能由外界進行查詢您 Zone 資料時將會演變為具有危險的行為,想想若有人知道您 Zone File 設定都一清二楚那他即可針對特定主機進行攻擊行為,因此限制您的 Zone Transfer 將更顯重要。比較常被忘記的部份為會記得設定 DNS Master 其 allow-transfer 對象為 DNS Slave,但別忘記了 DNS Slave 必須設定 allow-transfer { "none"; }; 避免您的 Zone File 從 DNS Slave 端被傳送出去這是比較容易被忘記的設定。
 zone "weithenn.org" {
        type master;
        file "master/named.weithenn.for";
        allow-transfer { 61.60.59.57; };        //僅此 IP 能 Zone Transfer 此 Zone File
        allow-transfer { dns2.weithenn.org; };  //可配合 ACLs 使用
 };


步驟 2-7. 進階性設定 - 代詢伺服器機制

代詢伺服器 (Forwarders) 機制為當您為您的站台指派代詢伺服器後,那麼所有對外的 DNS 查詢都會先送到您所指定的代詢伺服器,讓代詢伺服器利用快取資訊幫您快速回應 DNS 查詢,在台灣我們可設定全台最大的 DNS 快取伺服器其設定內容如下:
 forwarders {
                168.95.192.1;
                168.95.1.1;
 };

設定好 named.conf 後可利用 BIND 9 新增加的指令 named-checkconf 來檢查 named.conf 設定檔語法是否正確,若語法正確則執行完指令後將不會有任何訊息,若語法有錯會顯示錯誤訊息及行數。
 /usr/sbin/named-checkconf     //檢查 named.conf 語法是否有錯
                           -v  //顯示 named-checkconf 版本




步驟 3. 建立 named.weithenn.for 檔案 (Forward)

建議您可複製剛才建立的反解範例檔案 localhost.rev 再進行修改可避免 keyin 錯誤。

SOA: 為標準區域中的第一筆記錄,之後括號 () 內為與次要 DNS 溝通的相關資訊,其數值單位為 (秒)
  • Serial: 區域版本編號
  • Refresh: 同步更新時間
  • Retry: 重試同步時間
  • Expire: 同步到期時間
  • Minimum: 最小快取存活時間
vi /var/named/etc/namedb/master/named.weithenn.for   //建立正解檔內容如下
 $TTL      86400
 @       IN      SOA     user.weithenn.org. hostmaster.weithenn.org. (
                                      2005042601 ; Serial
                                      28800      ; Refresh
                                      14400      ; Retry
                                      3600000    ; Expire
                                      86400 )    ; Minimum
           IN      NS      gateway
           IN      A       61.60.59.58
 gateway   IN      A       61.60.59.58
 www       IN      A       61.60.59.58
 mail      IN      A       61.60.59.58
 @         IN      MX  10  mail 

設定好 named.weithenn.for 後可利用 BIND 9 新增加的指令 named-checkzone 來檢查 named.weithenn.for 設定檔語法是否正確,若語法正確則執行完指令後將不會有任何訊息,若語法有錯會顯示錯誤訊息及行數。
 /usr/sbin/named-checkzone weithenn.org named.weithenn.for     //檢查語法是否有錯
 /usr/sbin/named-checkzone -d weithenn.org named.weithenn.org  //開啟除錯功能
                                           -v                  //顯示 named-checkconf 版本




步驟 4. 修改服務設定檔 (rc.conf)

修改 /etc/rc.conf 中加入下列的設定以便在系統重新開機時時會啟動 DNS 服務。
vi /etc/rc.conf         //編輯rc.conf內容如下
 named_enable="YES"        //啟動 named 服務
 named_flags="-u bind"     //採用 bind 這個帳號來啟動 DNS 服務 (安全性設定) 




步驟 5. 修改本機 DNS 查詢設定檔 (resolv.conf)

修改本機 DNS 查詢設定檔 /etc/resolv.conf 加上 Domain Name 及本機 IP Address,關於此設定檔詳細內容可參考站內文章 resolv.conf。
vi /etc/resolv.conf       //修改設定檔加入如下三行
 domain weithenn.org
 nameserver 127.0.0.1                                            
 nameserver 61.60.59.58 




步驟 6. 啟動 DNS 服務

請鍵入如下指令啟動 DNS 服務
/etc/rc.d/named start      //啟動 DNS 服務
                 stop          //停止 DNS 服務
                 restart       //重新啟動 DNS 服務
                 rcvar         //顯示應該填入 rc.conf 的內容
                 reload        //重新讀取 DNS 設定檔
                 status        //顯示目前 DNS 狀態






4、安全性設定測試

剛才上面的安全性設定完成後,我們測試一下剛才的安全性設定是否生效。

測試 1. 隱藏 BIND DNS 版本

透過下列指令來測試是否無法查詢到 BIND 版本 (DNS_Server就是您要測那一台的 domain name 或是 IP 也可以),不過隱藏 BIND DNS 版本不代表就絕對安全,只是讓攻擊者無法馬上得知您的 BIND DNS 版本 (好讓他方便找該版本漏洞)。
# dig -t txt -c chaos VERSION.BIND DNS_Server
若設定正確則可看到回應 VERSION.BIND 就是您填入的內容,若沒設定好當然版本就被順利查詢到啦。
 ;; ANSWER SECTION:
 VERSION.BIND.   0   CH   TXT     "None of your business" //隱藏版本成功
 VERSION.BIND.   0   CH   TXT     "9.3.0"                 //隱藏版本失敗




測試 2. Zone Transfer 限制

檢測方式 (以 nslookup 為例 )
nslookup                         //進入 nslookup 交談模式
 > server weithenn.org           //指定以 weithenn.org 為 NS 做查詢
 Default Server: weithenn.org
 Address: 61.60.59.58  
 > ls -d weitenn.org             //檢查是否限制無法查尋 Zone File
 weithenn.org ***
  Can't list domain weitenn.org: Unspecified error






5、參考




6、Me FAQ

Q1. logging channel 'security_log' file '/var/log/named/dns-security.log': file not found?

Error Message:
啟動 DNS 服務後,在系統訊息中看見如下錯誤訊息
tail /var/log/messages
 Jul 14 13:21:06 ms1 named59648: starting BIND 9.4.3-P2 -u bind -t /var/named -u bind
 Jul 14 13:21:06 ms1 named59648: command channel listening on 127.0.0.1#953
 Jul 14 13:21:06 ms1 named59648: the working directory is not writable
 Jul 14 13:21:06 ms1 named59648: logging channel 'default_log' file '/var/log/named/dns-default.log': file not found
 Jul 14 13:21:06 ms1 named59648: logging channel 'lamer_log' file '/var/log/named/dns-lamer.log': file not found
 Jul 14 13:21:06 ms1 named59648: logging channel 'query_log' file '/var/log/named/dns-query.log': file not found
 Jul 14 13:21:06 ms1 named59648: logging channel 'security_log' file '/var/log/named/dns-security.log': file not found
 Jul 14 13:21:06 ms1 named59648: isc_log_open '/var/log/named/dns-default.log' failed: file not found
 Jul 14 13:21:07 ms1 named59648: isc_log_open '/var/log/named/dns-query.log' failed: file not found
 Jul 14 13:21:13 ms1 named59648: isc_log_open '/var/log/named/dns-lamer.log' failed: file not found

Ans:
原因在於設定檔中指定的路徑並非實體路徑,而是相對於 Chroot 服務的相對路徑,可看到 DNS 執行序為 -t /var/named 配合 named.conf 中指定的相對路徑才是最後 Log 寫入路徑。
ps aux |grep named
 bind     59648  0.0  0.5 20724 16852  ??  Ss    1:21PM   0:00.12 /usr/sbin/named -u bind -t /var/named -u bind

而 named.conf 設定檔中內容如下
 logging {
    category lame-servers { lamer_log; };  //在本DNS上查不到的記錄(遞迴查詢)
    category security{ security_log;};     //安全記錄
    category queries { query_log;};        //查詢記錄
    category default {default_log;};       //BIND啟動記錄
    channel default_log {
        file "/var/log/named/dns-default.log" versions 10 size 20m;  //預設值
        file "/var/log/dns-default.log" versions 10 size 20m;        //修改後
        severity info;
    };

Q2. the working directory is not writable?

Error Message:
啟動 DNS 服務後,在系統訊息中看見如下錯誤訊息
tail /var/log/messages
 Jul 14 15:18:01 ms1 named64145: starting BIND 9.4.3-P2 -t /var/named -u bind
 Jul 14 15:18:01 ms1 named64145: command channel listening on 127.0.0.1#953
 Jul 14 15:18:01 ms1 named64145: the working directory is not writable

Ans:
若您確定在 /var/named 下權限設定正確 (owner bind) 後啟動 DNS 服務仍看到錯誤訊息,請依如下步驟進行修改後再重新啟動 DNS 服務即可解決。
vi /etc/mtree/BIND.chroot.dist
 /set type=dir uname=root gname=wheel mode=0755   //預設值
 /set type=dir uname=bind gname=wheel mode=0755   //修改後
/etc/rc.d/named restart                       //修改完成後重新啟動 DNS 服務




Q3. connection timed out; no servers could be reached?

Error Message:
架設好 DNS 服務後使用 nslookup 去 Hinet DNS (168.95.1.1) 時回應如下錯誤訊息
 connection timed out; no servers could be reached
Ans:
此次的狀況為該網域 (Domain) 中設定的 DNS Server 指向不正確所造成,所以雖然 Bind 設定皆正確但找不到相對應的 Name Server,所以仍然無法正確查找到相關的 DNS Record,更改為 Domain 中正確的 Name Server 指向後運作即正常。



Q4.failed while receiving responses: file not found?

Error Message:
設定好 DNS Slave 相關設定後,從 DNS Master 中有看到 DNS Slave 來進行 Zone Transfer 的動作 (資訊如下)
 client 61.60.59.58#45080: transfer of 'weithenn.org/IN': AXFR started
 client 61.60.59.58#45080: transfer of 'weithenn.org/IN': AXFR ended

但是在 DNS Slave 中「/var/named/etc/namedb/slave」資料夾內就是沒有 Zone File,查看 Log 之後發現如下錯誤訊息:
 transfer of 'weithenn.org/IN' from 71.70.69.68#53: failed while receiving responses: file not found
Ans:
當然在「Firewall」以及「相關權限部份」我都已經檢查過沒問題,但是 Zone File 就是無法同步過來,後來在仔細檢查一下 named.conf 內容後,發現個問題照理來說應該是「directory "/etc/namedb";」 才對,但我新裝的 FreeBSD 8.3 其預設值居然是 「directory "/etc/namedb/working";」,沒錯!! 就是這個問題導致,經過修改後問題就解決了!!
文章標籤: