第11章 构建DNS安全Word下载.docx
《第11章 构建DNS安全Word下载.docx》由会员分享,可在线阅读,更多相关《第11章 构建DNS安全Word下载.docx(33页珍藏版)》请在冰豆网上搜索。
域(Domains)即为树状域名空间中的一棵子树,域的域名同该子树根节点的域名一样。
也就是说,域的名字就是该域中最高层节点的名字。
图1给出了DNS分层结构的图示:
图1
DNS域名空间的分层结构
DNS基于C/S(Client/Server,客户机/服务器)模式,因而分为Client和Server两种角色。
Client扮演询问的角色,也就是向Server询问一个DomainName,而Server必须要回答此DomainName所对应的真正IP地址。
而当地的DNS先会查自己的资料库。
如果自己的资料库没有,则会往该DNS上所设的的其他DNS进行求助询问,依此得到答案之后,将收到的答案存起来,并回答客户。
DNS服务器会根据不同的授权区(Zone),记录所属该网域下的各名称资料,这个资料包括网域下的次网域名称及主机名称。
在每一个名称服务器中都有一个高速缓存区(Cache),这个高速缓存区的主要目的是将该名称服务器所查询出来的名称及相对的IP地址记录在高速缓存区中,这样当下一次还有另外一个客户端到次服务器上去查询相同的名称时,服务器就不用在到别台主机上去寻找,而直接可以从缓存区中找到该名称记录资料,传回给客户端,以加速客户端对名称查询的速度。
举个例子,当DNS客户端向指定的DNS服务器查询网Internet上的某一台主机名称时,DNS服务器会在该资料库中找寻用户所指定的名称。
如果没有,该服务器会先在自己的高速缓存区中查询有无该条纪录,如果找到该条名称记录后,会从DNS服务器直接将所对应到的IP地址传回给客户端;
如果DNS务器在资料记录查不到且高速缓存区中也没有时,服务器才会向别的DNS服务器查询所要的名称。
例如,本地的DNS服务器会向最接近(比如属于同一个IP地址段或者同一个ISP)的DNS服务器去要求帮忙找寻该名称的IP地址.在另一台服务器上也有相同的动作的查询,当查询到后会回复原本要求查询的服务器,该DNS服务器在接收到另一台DNS服务器查询的结果后,先将所查询到的主机名称及对应IP地址记录到高速缓存区中,最后在将所查询到的结果回复给客户端。
这样就成功地完成了一次标准的DNS查询-应答过程。
2.DNS系统的组成
DNS系统基于客户机/服务器模式,从概念上说他主要由三个部分组成:
(1)域名空间:
域名空间中的记录标识一组主机并提供他们的有关信息。
域中的每一个节点都有它的有关信息的数据库。
查询命令试图从这个数据库中提取适当的信息。
简单地说,域名空间是所有不同类型信息的列表,这些信息是域名、IP地址、邮件别名和那些在DNS系统中能查到的内容。
(2)域名服务器:
保持并维护域名空间中的数据的程序。
每个域名服务器含有一个域名空间子集的完整信息,并保存其它有关部分的信息。
一个域名服务器拥有它控制范围的完整信息。
控制的信息按区进行划分,区可以分布在不同的域名服务器上,以便为每个区提供服务。
每个域名服务器都知道所有负责其他区的域名服务器。
如果来了一个请求,它请求给定域名服务器负责的那个区的信息,那么这个域名服务器只是简单地返回信息。
但是,如果请求是不同区的信息,那么这个域名服务器就要与控制该区的相应服务器联系。
(3)解析器:
解析器是简单的程序或子程序库,它从服务器中提取信息以响应对域名空间内主机的查询。
DNS是一个很复杂的概念,下表列出了常用的DNS术语。
?
◆域:
代表网络一部分的逻辑实体或组织。
◆域名:
主机名的一部分,它代表包含这个主机的域。
它可以和域交换使用。
◆主机:
网络上的一台计算机。
◆节点:
◆域名服务器:
提供DNS服务的计算机,它将DNS名字转化为IP地址。
◆解析:
把一个域名转化为与其相应的IP地址的过程。
◆解析器:
从域名服务器中提取DNS信息的程序或库子程序。
◆反向解析:
将给出的IP地址转化为其相应的DNS名字。
◆欺骗:
使网络看上去好象具有不同的IP地址或域名的行为。
3.DNS服务器的类型
DNS域名服务器是用来存储主机-域名映射信息的,这些服务器具体又可以分为3类:
(1)主DNS服务器(primarynameserver):
它是特定域所有信息的权威性信息源。
它从域管理员构造的本地磁盘文件中加载域信息,该文件(区文件)包含着该服务器具有管理权的一部分域结构的最精确信息。
主服务器是一种权威性服务器,因为它以绝对的权威去回答对其管辖域的任何查询。
(2)辅助DNS服务器(secondarynameserver):
它可从主服务器中复制一整套域信息。
区文件是从主服务器中复制出来的,并作为本地磁盘文件存储在辅助服务器中。
这种复制称为“区文件复制”。
在辅助域名服务器中有一个所有域信息的完整拷贝,可以有权威地回答对该域的查询。
因此,辅助域名服务器也称作权威性服务器。
配置辅助域名服务器不需要生成本地区文件,因为可以从主服务器中下载该区文件。
(3)高速缓存服务器(caching-onlyserver):
可运行域名服务器软件,但是没有域名数据库软件。
它从某个远程服务器取得每次域名服务器查询的结果,一旦取得一个,就将它放在高速缓存中,以后查询相同的信息时就用它予以回答。
高速缓存服务器不是权威性服务器,因为它提供的所有信息都是间接信息。
对于高速缓存服务器只需要配置一个高速缓存文件,但最常见的配置还包括一个回送文件,这或许是最常见的域名服务器配置。
二、DNS服务管理中存在的问题和面临的威胁
1.DNS设计中存在的问题
在系统设计方面,DNS的设计受到当时条件限制,因而存在许多设计缺陷问题。
(1)单点故障。
DNS采用层次化的树形结构,由树叶走向树根就可以形成—个全域名(FullyQualifiedDomainName,FQDN),DNS服务器作为该FQDN唯一对外的域名数据库和对内部提供递归域名查询的系统,因而其安全和稳定就存在单点故障风险。
(2)无认证机制。
DNS没有提供认证机制,查询者在收到应答时无法确认应答信息的真假,就容易导致DNS欺骗。
假设当提交给某个域名服务器的域名解析请求的数据包被黑客截获,然后黑客将一个虚假的IP地址作为应答信息返回给请求者,那么原始请求者就会把这个虚假的IP地址作为它所要请求的域名而进行连接,显然它被欺骗到了别处而连接不上原本想要连接的那个域名,这样就导致了DNS欺骗。
如图2所示。
图2
DNS欺骗原理示意
(4)访问量和维护量巨大以及远距离集中式数据库。
单个名字服务器不得不处理所有DNS查询消息,并保存所有因特网主机的记录,数据库会相当巨大,需要为每台新增的主机频繁更新,而且单台名字服务器主机不可能在所有请求查询的客户主机附近,就可能导致相当大的延迟。
(5)BIND(BerkeleyIntemetNameDomain)的漏洞:
BIND是域名软件,它在提供高效服务的同时也存在许多的安全性漏洞。
现已证明在BIND版本4和8上存在缺陷,攻击者利用这些缺陷能成功地进行DNs欺骗攻击,这些漏洞可以被利用取得系统最高权限。
构成严重威胁的漏洞主要有两种:
一种是缓冲区溢出漏洞,严重的可以使攻击者在DNS服务器上执行任意指令,如BINDSIGCachedRROvemowDoS(CAN.2002-1219)在BIND4和BIND8中存在一个远程缓冲溢出缺陷,该缺陷使得攻击者可以在DNS服务器上运行任意指令。
另一种是DoS漏洞,受攻击后DNS服务器不能提供正常服务,而且其所辖的子网无法正常工作。
2.DNS面临的网络威胁
(1)内部攻击:
攻击者在非法或合法地控制一台DNS服务器后,可以直接操作域名数据库,修改指定域名所对应的IP为自己所控制的主机IP,当客户发出对指定域名的查询请求后,将得到伪造的IP地址。
(2)序列号攻击:
DNS协议格式中定义了用来匹配请求数据包和响应数据报序列ID,欺骗者利用序列号伪装成DNS服务器向客户端发送DNS响应数据包,在DNS服务器发送的真实DNS响应数据报之前到达客户端,从而将客户端带到攻击者所希望的网站,进行DNS欺骗。
(3)信息插入攻击:
攻击者可以在DNS应答报文中随意添加某些信息,指示权威域名服务器的域名及IP,那么在被影响的域名服务器上查询该域的请求都会被转向攻击者所指定的域名服务器上去,从而威胁到网络数据的完整性。
(4)缓存(cache)中毒:
DNS使用超高速缓存,即当一个名字服务器收到有关域名和IP的映射信息时,它会将该信息存放在高速缓存中。
当再次遇到相同的映射请求,能直接使用缓存中的结果,这种映射表是动态更新的,刷新也是有时限的,这样假冒者如果在下次更新之前成功地修改了DNS服务器上的映射缓存,就可以进行DNS欺骗或者DoS(DenialofService)拒绝服务攻击了。
(5)信息泄漏:
BIND的缺省设置允许任何人进行区传送,区传送可能会造成信息泄漏,区传送一般用于主服务器和辅服务器之间的数据同步,辅服务器可以从主服务器获取最新区数据文件的副本,也就可以获得整个授权区域内的所有主机信息。
一旦这些信息泄漏,攻击者就可以根据它轻松地推测主服务器的网络结构,并从这些信息中判断其功能或发现那些防范措施较弱的机器。
(6)不安全的动态更新:
随着动态主机配置协议(DHCP)的出现,客户计算机由DHCP服务器动态分配IP地址,使原来手工更新其A记录和PTR记录变得很难管理。
因此在RFC2136中提出了DNS动态更新,使得DNS客户端在IP地址或名称出现更改的任何时候都可利用DNS服务器来注册和动态更新其资源记录。
尽管DNS动态更新协议规定只有经过授权的主机才能动态更新服务器的zonefile,但是攻击者还是可以利用IP欺骗伪装成DNS服务器信任的主机对区数据进行添加、删除和替换。
三、正确配置DNS相关文件
(1)几个重要的DNS服务器配置文件类型
在使用DNS服务器之前,需要对与之相关的配置文件进行安全配置,因而首先需要了解这些基本文件,表1详细给出了几种主要的与DNS有关的文件以及详细描述:
表1
DNS相关配置文件介绍
(2)named.conf主配置文件
在使用named.conf进行配置时,需要了解如下常用的配置语句,如表2所示。
表2
named.conf主配文件配置语句说明
根据在实际应用中的广泛程度和重要性,下面我们着重对option语句和zone声明的使用进行介绍。
1.使用option语句
option语句的使用语法为:
option{
配置子句1;
配置子句2;
};
在上述语法中,其配置子句常用的主要有如下两类:
◆directory:
该子句后接目录路径,主要用于定义服务器区配置文件的工作目录,如/home等;
◆forwarders:
该子句后接IP地址,定义转发器;
2.使用zone声明
区声明是主配置文件中非常常用而且是最重要的部分,它一般要说明域名、服务器类型以及域信息源三个重要部分。
它的语法为:
zone“zone_name”IN{
type子句;
file
子句;
其他子句;
那么,围绕上述三个重要部分,区声明语句有如下两类子句:
◆type:
其主要有如下三种,master(说明一个区为主域名服务器)、slave(说明一个区为辅助域名服务器)和hint(说明一个区为启动时初始化高速缓存的域名服务器)。
◆file:
后接文件路径,主要说明一个区的域信息源的路径。
3.使用ACL(访问控制列表)
访问控制列表(ACL,AccessControlList)就是一个被命名的地址匹配列表。
使用访问控制列表可以使配置简单而清晰,一次定义之后可以在多处使用,不会使配置文件因为大量的IP地址而变得混乱。
要定义访问控制列表,可以在BIND的主配置文件/etc/named.conf中使用acl语句来实现。
acl语句的语法为:
acl
acl_name{
address_match_list;
BIND里默认预定义了4个名称的地址匹配列表,他们可以直接使用,分别为:
◆Any:
表示所有主机;
◆Localhost:
表示本机;
◆Localnets:
表示本地网络上的所有主机;
◆None:
表示不匹配任何主机。
需要注意的是:
acl是named.conf中的顶级语句,不能将其嵌入其他的语句。
要使用用户自己定义的访问控制列表,必须在使用之前定义。
因为可以在options语句里使用访问控制列表,所以定义访问控制列表的acl语句应该位于options语句之前。
另外,为了便于维护管理员定义的访问控制列表,可以将所有定义acl的语句存放在单独的文件/etc/named.conf.acls中,然后在主配置文件/etc/named.conf中如下语句:
include"
/etc/named.conf.options"
;
之前添加如下的配置行
/etc/named.conf.acls"
定义了ACL之后,可以在如下的子句中使用:
◆allow-query
options,zone:
指定哪主机或网络可以查询本服务器或区,默认的是允许所有主机进行查询。
◆allow-transfer
指定哪些主机允许和本地服务器进行域传输,默认值是允许和所有主机进行域传输。
?
◆allow-recursion
options:
指定哪些主机可以进行递归查询。
如果没有设定,缺省是允许所有主机进行递归查询的。
注意禁止一台主机的递归查询,并不能阻止这台主机查询已经存在于服务器缓存中的数据。
◆allow-update
zone:
指定哪些主机允许为主域名服务器提交动态DNS更新。
默认为拒绝任何主机进行更新。
◆blackhole
指定不接收来自哪些主机的查询请求和地址解析。
默认值是none。
上面列出的一些配置子句既可以出现在全局配置options语句里,又可以出现在zone声明语句里,当在两处同时出现时,zone声明语句中的配置将会覆盖全局配置options语句中的配置。
(3)区文件
区文件定义了一个区的域名信息,通常也称域名数据库文件。
每个区文件都是由若干个资源记录(RR,resourcerecords)和区文件指令所组成。
1.资源记录
每个区域文件都是由SOARR开始,同时包括NSRR。
对于正向解析文件还包括ARR、MXRR、CNAMERR等等;
而对于反向解析文件还包括PTRRR。
RR具有基本的格式。
标准资源记录的基本格式是:
[name]
[ttl]
IN
type
redata
各个自字节之间由空格或制表符分隔。
表3描述了这些字段的含义:
表3
标准资源纪录中的字段
2.区文件指令
表4列出了可以在区文件中使用的4个区文件指令。
表4
区文件指令
为了方便读者对DNS服务器配置文件的使用有个详细的了解,本节将针对一个实际的配置文件例子来进行讲解。
该配置文件如下所示。
我们虚构了一个域来举例说明主服务器的配置,下面是定义域的主服务器的named.conf文件:
//generatedbynamed-bootconf.pl
options{
directory"
/var/named"
/*
*Ifthereisafirewallbetweenyouandnameserversyouwant
*totalkto,youmightneedtouncommentthequery-source
*directivebelow.PreviousversionsofBINDalwaysasked
*questionsusingport53,butBIND8.1usesanunprivileged
*portbydefault.
*/
//query-sourceaddress*port53;
//acachingonlynameserverconfig
//
zone"
."
{
typehint;
file"
named.ca"
{
typemaster;
0.0.127.in-addr.arpa"
named.local"
132.211.in-addr.arpa"
named.rev"
上例中第一个master告诉我们这是域的主服务器。
该域的数据是从named.hosts文件中加载的。
在我们这个例子中,我们将文件名named.hosts作为区文件名。
第三个master语句指向能将IP地址211.132.0.0映射为主机名的文件。
它假定本地服务器是反向域132.211.in-addr.arpa的主服务器,该域的数据从文件named.rev中加载。
除了定义上述的主文件外,还需要定义如下的区文件(/var/named/):
$TTL
86400
$ORIGIN.
@
1DINSOA
@root(
42
serial(d.adams)
3H
refresh
15M
retry
1W
expiry
1D)
minimum
@INNS
@INA
127.0.0.1
wwwINA
211.132.211.80
ftpINA
211.132.211.68
webINCNAME
www
(5)使用Dlint工具进行DNS配置文件检查
Dlint是一个专门检查DNS配置文件开放源代码的软件,用户可以从网站上自行下载安装,目前该网站上的最新版本为Dlint1.4.1。
需要注意:
使用该软件前要求系统安装支持Perl语言和Dig命令(BIND中一个软件包)的相关软件包。
Dlint软件的安装步骤如下所示,系统会将Dlint安装在/usr/bin/目录下:
(1)解压缩软件包
#tardlint1.4.1.tar.gz
(2)切换到解压缩的目录下,执行安装命令
#cddlint1.4.1
#make
Dlint主要针对DNS配置文件进行如下检查:
◆检查配置文件是否存在拼写错误;
◆检查配置文件中是否有A(Address)记录的主机名称都有配套的PTR(反向解析记录的简称)记录。
如果有A记录的主机名称没有PTR,则配置文件不能通过。
另外,Dlint可以在用户配置文件中为A记录查找丢失的PTR记录;
◆记录in-addr.arpa区的每一条PTR记录是否有对应的A记录存在,并以递归的方式检查子区,查找它们的配置问题;
如下显示了使用Dlint工具进行DNS配置文件检查的运行结果:
#dlintlocalhost.localhost
dlintversion1.4.1,Copyright(C)1998PaulA.Balyoz<
pab@>
DlintcomeswithABSOLUTELYNOWARRANTY.;
Thisisfreesoftware,andyouarewelcometoredistributeit
undercertainconditions.
Type'
mandlint'
fordetails.
commandline:
/usr/local/bin/dlintlocalhost.localhost
flags:
normal-domainrecursive.
usingdigversion9.2.1
runstarting:
涓?
4鏈?
1507:
08:
18CST2009
============================================================
Nowlintinglocalhost.localhost
ERROR:
nonameserversfoundfordomainlocalhost.localhost
Thatdomaini