為什麽要寫這篇文章?第一個原因當然就是前段時間出現的BIND 8.2.x TSIG安全漏洞(還有去年公布的BIND 8.1.x/8.2.x NXT安全漏洞),直到目前為止,國內也還沒有關於DNS服務安全配置方面的較為完整的文章(即使是國外也不多見)。另一個原因是經過調查發現,幾乎任何一種Unix家族的操作系統,都使用BIND軟件作為其DNS的唯一實現,比起其它諸如ftp/http/pop3等網絡服務有各種各樣的發行版本,所以一旦被發現有安全問題,則受影響的主機之多也是其它漏洞很難比擬的。所以覺得應該寫一份針對BIND DNS服務軟件的安全配置資料,充分利用BIND自身已經實現的保護功能,加強BIND安全性,從而能抵禦目前已知的BIND安全漏洞,並使潛在的安全漏洞所可能對服務器造成的影響盡可能地減少。
配置環境:
FreeBSD 4.1-RELEASE
BIND 8.2.3
---[[ 啟動安全選項 ]]---------------------------------------------------
named進程啟動選項:
-r:關閉域名服務器的遞歸查詢功能(缺省為打開)。該選項可在配置文件的options中使用"recursion"選項覆蓋。
-u <user_name>和-g <group_name>:定義域名服務器運行時所使用的UID和GID。這用於丟棄啟動時所需要的root特權。
-t <directory>:指定當服務器進程處理完命令行參數後所要chroot()的目錄。
---[[ 配置文件中的安全選項 ]]-------------------------------------------
1、假如希望記錄安全事件到文件中,但同時還希望保持原有的日誌模式,可以添加以下內容:
logging {
channel my_security_channel {
file "my_security_file.log" versions 3 size 20m;
severity info;
};
category security {
my_security_channel;
default_syslog; default_debug; };
}
其中my_security_channel是用戶自定義的channel名字,my_security_file.log 是安全事件日誌文件,可包含全路徑(否則是以named進程工作目錄為當前目錄)。安全事件日誌文件名為my_security_file.log,保存三個最近的備份(my_security_file.log0、my_security_file.log1、my_security_file.log2),日誌文件的最大容量為20MB(如果達到或超這一數值,直到該文件被再次打開前,將不再記錄任何日誌消息。缺省(省略)時是沒有大小限制。)
2、在options節中增加自定義的BIND版本信息,可隱藏BIND服務器的真正版本號。
version "Who knows?";
// version 9.9.9;
此時如果通過DNS服務查詢BIND版本號時,返回的信息就是"Who knows?"。^_^
3、要禁止DNS域名遞歸查詢,在options(或特定的zone區域)節中增加:
recursion no;
fetch-glue no;
4、要增加出站查詢請求的ID值的隨機性,在options節中增加:
use-id-pool yes;
則服務器將跟蹤其出站查詢ID值以避免出現重復,並增加隨機性。註意這將會使服務器多占用超過128KB內存。(缺省值為no)