为什么要写这篇文章?第一个原因当然就是前段时间出现的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)
5、要限制对DNS服务器进行域名查询的主机,在options(或特定的zone区域)节
中增加:
allow-query { <address_match_list> };
address_match_list是允许进行域名查询的主机IP列表,如"1.2.3.4; 5.6.7/24;"。
6、要限制对DNS服务器进行域名递归查询的主机,在options(或特定的zone区域)
节中增加:
allow-recursion { <address_match_list> };
address_match_list是允许进行域名递归查询的主机IP列表,如
"1.2.3.4; 5.6.7/24;"。
7、要指定允许哪些主机向本DNS服务器提交动态DNS更新,在options(或特定的
zone区域)节中增加:
allow-update { <address_match_list> };
address_match_list是允许向本DNS服务器提交动态DNS更新的主机IP列表,如
"1.2.3.4; 5.6.7/24;"。
缺省时为拒绝所有主机的提交。
8、要限制对DNS服务器进行区域记录传输的主机,在options(或特定的zone区域)
节中增加:
allow-transfer { <address_match_list> };
address_match_list是允许进行区域记录传输的主机IP列表,如"1.2.3.4;
5.6.7/24;"。
9、要指定不接受哪些服务器的区域记录传输请求,在options(或特定的zone区域
)节中增加:
blackhole { <address_match_list> };
address_match_list是不接受区域记录传输请求的主机IP列表,如"1.2.3.4;
5.6.7/24;"。
10、在options节中还有一些资源限制选项,不同用户可根据实际情况灵活设置,
但一定要注意不当的设置会损失DNS服务的性能。
coresize <size_spec> ; // core dump的最大值。缺省为default。
datasize <size_spec> ; // 服务器所使用的最大数据段内存。缺省为
default。
files <size_spec> ; // 服务器能同时打开的最大文件数。缺省为
// unlimited(不限制)。
// (注意,并非所有操作系统都支持这一选项。)
max-ixfr-log-size <size_spec> ; // (目前版本暂不使用。)限制增量区域
记
录传输时会话日志的大小。
stacksize <size_spec> ; // 服务器所使用的最大堆栈段内存。缺省为
default。
11、定义ACL地址名(即用于上面的<address_match_list>)。注意,如果要使用
这里定义的列表名,必须先定义,后使用!
例如:
acl intranet {
192.168/16;
};
acl partner {
!172.16.0.1;
172.16/12; // 除172.168.0.1外172.16.0.0/12网络中其它主机
};
BIND已内置以下四个ACL:
all // 允许所有主机
none // 禁止所有主机
localhost // 本机的所有网络接口
localnets // 本机所在网络
12、BIND域名服务器的一个有用功能(慎用!!!):
控制管理接口controls节语法格式:
controls {
[ inet ip_addr
port ip_port
allow { <address_match_list>; }; ]
[ unix path_name
perm number
owner number
group number; ]
};
controls节提供管理接口。如果使用第一种(inet),则在指定IP(接口)和端
口上监听,但只允许在allow中限定允许与其连接的IP地址列表。如果使用第二种
(unix),则产生一个FIFO的控制管道,权限、属主和用户组都由其参数限定。
---[[ 通过TSIG对区域记录传输进行认证和校验 ]]---------------------------
首先请确保你的BIND域名服务器软件已更新到最新版本!
在BIND 8.2+中,能够使用事务签名(Transaction Signatures,即TSIG!)
来对区域记录数据进行验证和校验。它要求在主域名服务器和辅助域名服务器上配
置好加密密钥,并通知服务器使用该密钥与其它域名服务器通讯。(注意,TSIG的
使用要求域名服务器必须进行时钟同步!)
A、如果需要用TSIG签名来进行安全的DNS数据库手工更新,具体操作步骤很简单:
1、使用BIND自带的dnskeygen工具生成TSIG密钥。
# dnskeygen -H 128 -h -n tsig-key.
则会生成两个文件。'Ktsig-key.+157+00000.key'内容如下:
tsig-key. IN KEY 513 3 157 awwLOtRfpGE+rRKF2+DEiw==
'Kvip-key.+157+00000.private'内容如下:
Private-key-format: v1.2 Algorithm: 157 (HMAC) Key: awwLOtRfpGE+rRKF2+DEiw==
注意这些密钥都已经过BASE64编码了。将它们放到本地域名服务器的配置文件中。例如
:
key tsig-key. { algorithm hmac-md5; secret "awwLOtRfpGE+rRKF2+DEiw=="; };
zone "dns.nsfocus.com" {
...
...
allow-update { key tsig-key. ; };
}
记住要重启named守护进程。
然后将这两个密钥文件复制到客户端系统(或辅助域名服务器),例如为/var
/named/tsig目录。最后运行如下命令即可:
nsupdate -k /var/named/tsig:tsig-key.
B、如果需要对区域记录传输(自动或手工)进行TSIG签名,则:
1、用dnskeygen生成TSIG密钥,方法同上。
2、主域名服务器配置文件的内容(节选)如下:
// 定义认证的方法和共享密钥
key master-slave {
algorithm hmac-md5;
secret "mZiMNOUYQPMNwsDzrX2ENw==";
};
// 定义辅助域名服务器的一些特性
server 192.168.8.18 {
transfer-format many-answers;
keys { master-slave; };
};
// 区域记录定义
zone "nsfocus.com" {
type master;
file db.nsfocus.com;
allow-transfer { 192.168.8.18; };
};
3、辅助域名服务器配置文件的内容(节选)如下:
// 定义认证的方法和共享密钥
key master-slave {
algorithm hmac-md5;
secret "mZiMNOUYQPMNwsDzrX2ENw==";
};
// 定义与主域名服务器通讯时的一些特性
server 192.168.8.19 {
transfer-format many-answers;
keys { master-slave; };
};
// 区域记录定义
zone "nsfocus.com" {
type slave;
file "bak.db.nsfocus.com";
masters { 192.168.8.19; };
allow-transfer { none; };
};
---[[ 实施DNSSec功能 ]]-------------------------------------------------
说实在的,我一直在考虑需不需要在目前的版本中实施DNSSec功能。因为虽然ISC
早已在BIND 8.1.x版本后增加了DNSSec的实现,但实际的应用却不常见,而且去年
公布的NXT远程安全漏洞和DNSSec有关(实际上NXT就属于DNSSec实现的功能之一)。
最后我决定在本文不讨论如何实施DNSSec安全功能。
但不可否认,DNSSec确实是一项很好的安全技术,它通过加密DNS数据来提高了DNS
服务的安全性。主加密密钥用于对第一级域名的加密密钥进行加密签字,第一级域
名(.com, .cn等)密钥用于对自身数据及其子域名密钥进行加密签名,以此类推。
例如,nsfocus.com的域名服务器由.com域密钥签名,nsfocus.com域密钥则用于对
www.nsfocus.com域名进行加密签名。
---[[ 实现BIND的chroot ]]---------------
(以FreeBSD系统平台为例)
步骤一:BIND-8的最新源代码版本获取和安装
请到ISC FTP站点下载BIND的最新版本。
BIND 8:http://www.isc.org/products/BIND/bind8.html
BIND 9:http://www.isc.org/products/BIND/bind9.html
步骤二:构造静态(static)的named和named-xfer二进制文件
在编译和安装后,你需要构造可执行文件的静态链接版本。只要对%BIND%/src
/port/freebsd目录下的Makefile.set文件稍加修改后即可。
修改文件内容:
'CDEBUG= -O2 -g'
替换为:
'CDEBUG= -O2 -static'
切换到BIND的源代码路径,执行"make clean"和"make"命令。在下面的步骤中
将会把这些文件复制到chroot()目录下。
# cd /tmp/bind/src
# make clean ; make
本步骤构造的静态链接执行文件在运行时无需装载动态链接库。在chroot()环
境中,这种“独立”可执行文件可避免出现缺少链接库文件问题。它在chroot()环
境中无需任何静态链接库,可使服务配置简单化。其它所有的网络守护进程也可以
编译和使用这种静态链接版本。
步骤三:构造BIND目录
为chroot()环境构造BIND目录。这个目录将在chroot()环境中被BIND当作系统
根目录。在这里我使用/chroot/bind作为chroot后的根目录。
# cd /chroot/bind
# mkdir /chroot
# mkdir /chroot/dev
# mkdir /chroot/etc
# mkdir /chroot/etc/namedb
# mkdir /chroot/usr
# mkdir /chroot/usr/sbin
# mkdir /chroot/var
# mkdir /chroot/var/run
需要复制以下文件到其下的相应子目录中,和进行一些必要的处理:
# cp /etc/namedb/named.conf /chroot/bind/etc/
# cp /etc/localtime /chroot/bind/etc/
# grep bind /etc/group > /chroot/bind/etc/group
# cp -R /etc/namedb/ /chroot/bind/etc/namedb/
# mknod /chroot/bind/dev/null c 2 2
# chmod 666 /chroot/bin/dev/null
# cp /tmp/bind/src/bin/named/named /chroot/bind/usr/sbin/
# cp /tmp/bind/src/bin/named-xfer/named-xfer /chroot/bind/
另外还可根据需要指定日志记录目录(如/var/log),请参考下面的章节或
named.conf的手册页。
步骤四:添加bind用户和组(如果没有的话。如果已经有bind或named之类的用户
和组,请跳过本步骤。)
在/etc/passwd和/etc/group文件中添加bind用户和组。它们是DNS服务器运行
时的UID/GID。
此时,你可以到chroot环境中执行"chown -R bind.bind /chroot/bind/etc/
namedb"命令。这样当你向系统发送中断信号(kill -INT )时,named进程能够保存
服务器缓存和统计信息。如果该目录为root所有则named进程无法将输出写到目录
中,但不会影响named服务器功能。另一个选择是仅改变目录权限(使named用户具
有写权限),而属主仍然是root。这种方法也是可行的,但必须小心设置,确保其
它用户不会修改named记录!
*** 重要警告***
不要用一个已存在的UID/GID(如"nobody")运行named。记住,以chroot环境
中使用任何已存在的UID/GID都可能会影响到服务的安全性。必须养成在chroot环
境中为每一个守护进程提供独立的UID/GID的习惯。
步骤五:其它必要调整
如果在named.conf中还指定了另外的目录和文件,也要相应地在chroot()环境
中(在本例中即/chroot/bind/目录)进行设置。
步骤六:调试
1、终止系统中原有的syslogd和named守护进程。
# killall syslogd named
2、用适当的参数重新启动syslogd守护进程。
# syslogd -s -p /chroot/bind/var/run/log
3、用适当参数重新启动named守护进程。
# /chroot/bind/named -u bind -g bind -t /chroot/bind
4、检查syslogd/named守护进程、监听端口是否正常,和/var/log/messages文件
中named进程启动时是否正常。
# ps auwx|grep syslogd
root 5896 0.0 1.7 896 508 ?? Ss 9:44PM 0:00.10 syslogd -s -p
/chroot/bind/var/run/log
# ps auwx|grep named
bind 5941 0.0 4.9 1652 1444 ?? Is 9:52PM 0:00.01
/chroot/bind/usr/sbin/named -u bind -g bind -t /chroot/bind
# netstat -an|grep 53
tcp4 0 0 127.0.0.1.53 *.* LISTEN
tcp4 0 0 192.168.8.19.53 *.* LISTEN
udp4 0 0 127.0.0.1.53 *.*
udp4 0 0 192.168.8.19.53 *.*
步骤七:修改系统启动脚本
对于FreeBSD系统,在/etc/rc.conf文件中增加如下内容即可:
syslogd_enable="YES"
# 如果希望禁止向外发送日志,将-s换成-ss。
syslogd_flags="-s -p /chroot/bind/var/run/log"
named_enable="YES"
named_program="/chroot/bind/usr/sbin/named"
named_flags="-u bind -g bind -t /chroot/bind"
注:如果在其它系统平台,如OpenBSD、Linux、Solaris,则可能会稍有不同。
主要是不同平台上的syslog实现不尽相同。例如对于OpenBSD和Linux系统,打开日
志别名socket的命令是"syslogd -a /chroot/bind/var/run/log",而Solaris的
syslogd守护进程则不支持别名。因此Solaris系统平台上的chroot需要通过另外的
方法实现,关于具体的实现过程我会在另外的文章中说明。
---[[ 结束语 ]]---------------------------------------------------------
安全增强配置的文章写完了,但并不是说只要你按本文提到的方法和技术实施
就能万无一失,高枕无忧了。其实以上设置对NXT和TSIG远程漏洞攻击并不没太多
的防御作用,充其量只不过是要编写更多的shellcode代码来突破chroot环境的限
制。即使用allow-query等极其严格地限制查询客户端(实际上在互联网上并不现
实),基于UDP协议的TSIG攻击技术也只需构造伪造IP地址的数据包即可绕过其限
制。
所以,在对BIND(还有其它应用服务)进行安全增强配置的基础上,安全管理
员仍然需要密切关注最新的安全公告、安全补丁和安全技术,经常与专业的计算机
安全专家交流知识和经验,再辅以必要的安全产品和安全服务,才能更充分地保护
好自己的网络和计算机用户,抵御各种恶意攻击。
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
相关专题
·路由安全配置专题 (10236篇文章)
·FTP服务器 (5104篇文章)
·IMail服务器 (4679篇文章)
·电子邮件安全 (7136篇文章)
·SSH安全技术 (7041篇文章)
·数据库安全技术专题 (11362篇文章)
·FreeBSD系统安全管理 (7551篇文章)
·局域网安全管理 (8156篇文章)
·Windows操作系统安全集 (15352篇文章)
·行业应用服务器 (4712篇文章)
·FTP服务器 (5104篇文章)
·IMail服务器 (4679篇文章)
·电子邮件安全 (7136篇文章)
·SSH安全技术 (7041篇文章)
·数据库安全技术专题 (11362篇文章)
·FreeBSD系统安全管理 (7551篇文章)
·局域网安全管理 (8156篇文章)
·Windows操作系统安全集 (15352篇文章)
·行业应用服务器 (4712篇文章)
·Red Hat Enterprise Linux AS 4 Update 3 ( (7371次浏览)
·Linux下的FTP服务器配置 (3068次浏览)
·Linux入门时必学60个文件处理命令 (3067次浏览)
·清爽漂亮 Ubuntu 7.04 新手指南 (3019次浏览)
·Linux系统中如何实现远程控制 (2834次浏览)
·RedHat7.2下ADSL双网卡共享上网实战 (2829次浏览)
·linux下安装软件的办法 (2775次浏览)
·菜鸟大学堂:一步一步配置WEB服务器 (2654次浏览)
·Linux下用vsftpd构建FTP服务器 (1102次浏览)
·Windows外衣Linux心 红旗桌面版详测 (1081次浏览)
·Linux下的FTP服务器配置 (3068次浏览)
·Linux入门时必学60个文件处理命令 (3067次浏览)
·清爽漂亮 Ubuntu 7.04 新手指南 (3019次浏览)
·Linux系统中如何实现远程控制 (2834次浏览)
·RedHat7.2下ADSL双网卡共享上网实战 (2829次浏览)
·linux下安装软件的办法 (2775次浏览)
·菜鸟大学堂:一步一步配置WEB服务器 (2654次浏览)
·Linux下用vsftpd构建FTP服务器 (1102次浏览)
·Windows外衣Linux心 红旗桌面版详测 (1081次浏览)
·更好用的Linux:Mandriva 2008正式发布 10-12
·Debian下系统时间比正常时间快8小时的问题 10-12
·开源空间:交叉编译Linux内核(2.6.22.6) 10-12
·新手学堂:类Linux中各种各样的编程语言 10-12
·用Tftp向目标板烧写Linux的系统内核过程 10-11
·RedHat Linux9.0 安装过程 10-11
·7大最有影响力的GNU/Linux发行版 10-11
·Linux系统下的C语言开发都需要学些什么 10-11
·Linux 技巧: 用cron 和at 调度作业 10-11
·各种Linux操作系统版本安装图解教程下载 10-11
·Debian下系统时间比正常时间快8小时的问题 10-12
·开源空间:交叉编译Linux内核(2.6.22.6) 10-12
·新手学堂:类Linux中各种各样的编程语言 10-12
·用Tftp向目标板烧写Linux的系统内核过程 10-11
·RedHat Linux9.0 安装过程 10-11
·7大最有影响力的GNU/Linux发行版 10-11
·Linux系统下的C语言开发都需要学些什么 10-11
·Linux 技巧: 用cron 和at 调度作业 10-11
·各种Linux操作系统版本安装图解教程下载 10-11
最新论坛文章
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
站内频道文章精选
百度推荐,商机无限
搜索您感兴趣的内容



