BIND8+ 域名服务器安全增强(1)


为什么要写这篇文章?第一个原因当然就是前段时间出现的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; };

};为什么要写这篇文章?第一个原因当然就是前段时间出现的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; };

};

本文作者:
« 
» 
快速导航

Copyright © 2016 phpStudy | 豫ICP备2021030365号-3