分享
 
 
 

BIND8+ 域名服务器安全增强

王朝other·作者佚名  2006-12-16
窄屏简体版  字體: |||超大  

为什么要写这篇文章?第一个原因当然就是前段时间出现的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 和-g :定义域名服务器运行时所使用的UID和GID。

这用于丢弃启动时所需要的root特权。

-t :指定当服务器进程处理完命令行参数后所要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是允许进行域名查询的主机IP列表,如"1.2.3.4; 5.6.7/24;"。

6、要限制对DNS服务器进行域名递归查询的主机,在options(或特定的zone区域)节中增加:

allow-recursion { };

address_match_list是允许进行域名递归查询的主机IP列表,如

"1.2.3.4; 5.6.7/24;"。

7、要指定允许哪些主机向本DNS服务器提交动态DNS更新,在options(或特定的 zone区域)节中增加:

allow-update { };

address_match_list是允许向本DNS服务器提交动态DNS更新的主机IP列表,如"1.2.3.4; 5.6.7/24;"。

缺省时为拒绝所有主机的提交。

8、要限制对DNS服务器进行区域记录传输的主机,在options(或特定的zone区域)节中增加:

allow-transfer { };

address_match_list是允许进行区域记录传输的主机IP列表,如"1.2.3.4;

5.6.7/24;"。

9、要指定不接受哪些服务器的区域记录传输请求,在options(或特定的zone区域 )节中增加:

blackhole { };

address_match_list是不接受区域记录传输请求的主机IP列表,如"1.2.3.4;

5.6.7/24;"。

||||||

10、在options节中还有一些资源限制选项,不同用户可根据实际情况灵活设置,但一定要注意不当的设置会损失DNS服务的性能。

coresize ; // core dump的最大值。缺省为default。

datasize ; // 服务器所使用的最大数据段内存。缺省为

default。

files ; // 服务器能同时打开的最大文件数。缺省为

// unlimited(不限制)。

// (注意,并非所有操作系统都支持这一选项。)

max-ixfr-log-size ; // (目前版本暂不使用。)限制增量区域

录传输时会话日志的大小。

stacksize ; // 服务器所使用的最大堆栈段内存。缺省为

default。

11、定义ACL地址名(即用于上面的)。注意,如果要使用 这里定义的列表名,必须先定义,后使用!

例如:

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 { ; }; ]

[ 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(还有其它应用服务)进行安全增强配置的基础上,安全管理员仍然需要密切关注最新的安全公告、安全补丁和安全技术,经常与专业的计算机安全专家交流知识和经验,再辅以必要的安全产品和安全服务,才能更充分地保护好自己的网络和计算机用户,抵御各种恶意攻击。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有