全面提升BINDDNS服务器安全
|
DNS服务面临的安全隐患主要包括:DNS欺骗(DNSSpoffing)、拒绝服务(Denialofservice,DoS)攻击、分布式拒绝服务攻击和缓冲区漏洞溢出攻击(BufferOverflow)。 DNS欺骗即域名信息欺骗是最常见的DNS安全问题。当一个DNS服务器掉入陷阱,使用了来自一个恶意DNS服务器的错误信息,那么该DNS服务器就被欺骗了。DNS欺骗会使那些易受攻击的DNS服务器产生许多安全问题,例如:将用户引导到错误的互联网站点,或者发送一个电子邮件到一个未经授权的邮件服务器。网络攻击者通常通过两种方法进行DNS欺骗。 DDOS攻击通过使用攻击者控制的几十台或几百台计算机攻击一台主机,使得服务拒绝攻击更难以防范:使服务拒绝攻击更难以通过阻塞单一攻击源主机的数据流,来防范服务拒绝攻击。SynFlood是针对DNS服务器最常见的分布式拒绝服务攻击。SYNFlood攻击利用的是IPv4中TCP协议的三次握手(Three-WayHandshake)过程进行的攻击。大家知道协议规定,如果一端想向另一端发起TCP连接,它需要首先发送TCPSYN包到对方,对方收到后发送一个TCPSYN+ACK包回来,发起方再发送TCPACK包回去,这样三次握手就结束了。我们把TCP连接的发起方叫作"TCP客户机(TCPClient)",TCP连接的接收方叫作"TCP服务器(TCPServer)"。 值得注意的是在TCP服务器收到TCPSYNrequest包时,在发送TCPSYN+ACK包回TCP客户机前,TCP服务器要先分配好一个数据区专门服务于这个即将形成的TCP连接。一般把收到SYN包而还未收到ACK包时的连接状态成为半开连接(Half-openConnection)。在最常见的SYNFlood攻击中,攻击者在短时间内发送大量的TCPSYN包给受害者,这时攻击者是TCP客户机,受害者是TCP服务器。根据上面的描述,受害者会为每个TCPSYN包分配一个特定的数据区,只要这些SYN包具有不同的源地址(这一点对于攻击者来说是很容易伪造的)。这将给TCP服务器系统造成很大的系统负担,最终导致系统不能正常工作。 黑客利用DNS服务器软件存在漏洞,比如对特定的输入没有进行严格检查,那幺有可能被攻击者利用,攻击者构造特殊的畸形数据包来对DNS服务器进行缓冲区溢出攻击。如果这一攻击成功,就会造成DNS服务停止,或者攻击者能够在DNS服务器上执行其设定的任意代码。例如,前一阵子针对Linux平台的BIND的攻击(e.g.Lionworm)程序,就是利用某些版本的BIND漏洞,取得root权限,一旦入侵完成之后,入侵者就可以完全控制整个相关的网络系统,影响非常严重。主要包括: (1)更改MX记录,造成邮件被截获、修改或删除。 (2)更改A记录,使您的WWW服务器的域名指向黑客的具有同样WWW内容的主机,诱使访问者登录,获取访问者的密码等相关信息。添加A记录,使黑客的主机拥有被相信的域名,以此来入侵通过启用域名信任机制的系统。 BIND主要分为三个版本: (1)v4,1998年多数UNIX捆绑的是BIND4,已经被多数厂商抛弃了,除了OpenBSD还在使 (2)v8,就是如今使用最多最广的版本,其详细内容可以参阅“BIND8+域名服务器安 (3)v9,最新版本的BIND,全部重新写过,免费(但是由商业公司资助),BIND9在2000年十月份推出,根据调查v9版本的BIND是最安全的,它的最新安全版本在其官方网站:http://www.isc.org/下载下载源代码安装即可。例如使用Linux系统针对拒绝服务攻击只要将BIND9升级为版本9.2.1即可。 这一点相对困难。Linux上的域名服务由named守护进程控制,该进程从主文件:/etc/named.conf中获取信息。它包括一组将主机名称映射为IP地址的各种文件。Linux下主要DNS配置文件见表一、二、三: |
可以看到DNS配置文件是一个复杂的系统。伴随DNS建立出现的许多问题都会引起相同的结果,但起因却不同。但大多数问题是由于配置文件中的语法错误而导致的。DNS是一组文件构成的,所以需要不同工具检查对应文件。一个配置存在缺陷的DNS服务器会存在很大的安全漏洞。这里可以通过一些工具:nslookup、dig、named-checkzone、host、named-checkconf、dlint等对DNS配置文件进行检查。其中安装BIND软件包时自动安装的工具包括:nslookup、dig、named-checkzone、host、named-checkconf。dlint是一个专门检查DNS配置文件开放源代码软件。可以在
http://www.domtools.com/dns/dlint.shtml下载。
软件下载和安装:
运行软件:
如果想查看通过eth0的DNS网络流量可以使用命令
在运行dnstop的过程中,可以敲入如下命令:s,d,t,1,2,3,ctrl+r,ctrl+x,以交互方式来显示不同的信息。
1-(TLD)记录查询的顶级域名,
2-(SLD)记录查询的二级域名,
3-(SLD)记录查询的三级域名,
s-(Source)记录发送dns查询的客户端ip地址表,
d-(Destinations)记录dns查询的目的服务器的ip地址表,
t-(QueryType)记录查询详细类型。
ctrl+r-重新纪录。
ctrl+x-退出。更详细信息可以查看mandnstop。
下面以使用最为广泛的Unix类DNS软件BIND为例,介绍如何配置一个安全DNS服务器。本文以RHEL4.0为工作平台。
首先应该隔离BIND服务器,不应该在DNS服务器上跑其他服务,尽量允许普通用户登陆。减少其它的服务可以缩小被攻击的可能性,比如混合攻击。
当DNS服务器返回一个域的域名服务器纪录并且域名服务器纪录中没有A纪录,DNS服务器会尝试获取一个纪录。就称为gluefetching,攻击者可以利用它进行DNS欺骗。关闭gluefetching是一个好方法,修改配置文件:/etc/named.conf.加入一行:
上面的命令表示以nobody用户身份运行BIND。使用nobody身份运行能够降低缓冲区溢出攻击所带来的危险。
这样只有IP地址为:从192.168.0.52到192.168.0.109的主机能够同DNS服务器进行区域传输。
这样所有的用户都可以访问yourdomain.com的DNS服务器,但是只有168.192.1.0网段的主机用户可以请求DNS服务器的任意服务。
另外也不要允许其他网段的主机进行递归询问,在上面文件最后加入一行即可:
(1)使用存取控制清单(AccessControlLists),主要目的在于产生地址配对清单。
语法:acl“name”{address_match_list};
address_match_list:地址匹对清单。
例子:acl“mis”{192.168.200.15,192.168.143.192/26};
(2)使用Forwarders代询服务器机制,它将自己无法解析的查询转送到某特定的服务器。
语法:forwardersip_address_liest
例子:以下是建议的forwarders设定(在/etc/named.conf中)
orwarders{//指定提供查询的上层DNS。
www.twnic.net.tw;//到上层(twnic)的DNS查询。
};
需注意的是通常我们指定的是到本身上一层dns,但也可能因dns缓存有误而转送到错误的服务器上。
(3)使用allow-transfer:目的在于只允许授权的网域主机能更新、读取DNS辖区内的记录。
语法:allow-transfer{<address_match_list>};
例子:address_match_list:允许进行DNS辖区数据传输主机的IP列表。
(4)allow-update:目的在于指定能向本dns服务器提交动态dns更新的主机
语法:allow-update{<address_match_list>};
例子:address_match_list:允许能向本DNS服务器提交动态DNS更新的主机IP列表
DNSSEC主要依靠公钥技术对于包含在DNS中的信息创建密码签名。密码签名通过计算出一个密码hash数来提供DNS中数据的完整性,并将该hash数封装进行保护。私/公钥对中的私钥用来封装hash数,然后可以用公钥把hash数译出来。如果这个译出的hash值匹配接收者刚刚计算出来的hash树,那么表明数据是完整的。不管译出来的hash数和计算出来的hash数是否匹配,对于密码签名这种认证方式都是绝对正确的,因为公钥仅仅用于解密合法的hash数,所以只有拥有私钥的拥有者可以加密这些信息。
下载安装:
命令格式:
dns_flood_detector[选项]
主要选项:
-iIFNAME监听某一特定接口。
-tN当每秒查询数量超过N值时发出警示.
-aN经过N秒后重置警示。
-wN每隔N秒显示状态。
-xN创建N个buckets。
-mN每隔N秒显示所有状态。
-b以后台模式执行(bindsnap)。
-d以守护进程模式执行(daemon)。
-v显示较多的输出信息。
-h显示使用方式。
应用实例:
dns_flood_detector-b-v-v–t3见下图。
messages的纪录:以守护进程模式执行,纪录每秒超过3次查询的纪录,显示最多信息,包含APTRMX纪录等。
(1)惟高速存域名服务器(Cache-onlyserver)
惟高速存域名服务器(Cache-onlyserver)不包含域名数据库。它从某个远程服务器取得每次域名服务器查询的回答,一旦取得一个回答,就将它放入高速缓存中。
(2)主域名服务器(PrimaryNameserver)
主域名服务器是特定域所有信息的权威来源。它从域管理员构造的本地文件中加载域信息,该“区文件”包含着服务器具有管理权的部分域结构的最精确的信息。主域名服务器需要配置包括一组完整的文件:主配置文件(named.conf)、正向域的区文件(named.hosts)、反向域的区文件(named.rev)、高速缓存初始化文件(named.ca)和回送文件(named.local)。
(3)辅助域名服务器(SecondNameServer)
辅助域名服务器用来从主服务器中转移一整套域信息。辅助域名服务器是可选的配置选项。区文件是从主服务器转移出的,作为磁盘文件保存在辅助域名服务器中。辅助域名服务器不需配置本地区文件。
说明:多数域名服务器要根据网络实际情况将以上三种服务器组合,进行合理配置。所有的域名服务器都需要一个设置惟高速缓存服务器提供名字解析。一个域只能建立一个主域名服务器,另外至少要创建一个辅助域名服务器作为主域名服务器的备份。一个域的主服务器可以是其他域的辅助域名服务器。为了提高域名系统的可靠性,应建立辅域名服务器。当主域名服务器不能正常工作的情况下,能够替代主域名服务器对外提供不间断的服务。
SYNCookie是对TCP服务器端的三次握手协议作一些修改,专门用来防范SYNFlood攻击的一种手段。它的原理是,在TCP服务器收到TCPSYN包并返回TCPSYN+ACK包时,不分配一个专门的数据区,而是根据这个SYN包计算出一个cookie值。在收到TCPACK包时,TCP服务器在根据那个cookie值检查这个TCPACK包的合法性。如果合法,再分配专门的数据区进行处理未来的TCP连接。在linux下以root权限执行:
2.增大backlog
通过增加backlog的数值,可以一定程度减缓大量SYN请求导致TCP连接阻塞的状况,一般这个数值系统默认是1024,可以增加到1280至2048:
这样在强度不是很高的攻击下,系统响应能力提高了一点。
3.缩短retries次数
Linux系统默认的tcp_synack_retries是5次,将这个数值减少可以提高系统响应能力,为2次:
修改后,SYN_RECV的数量有了少量减少,系统响应也快了一些。
4.限制SYN频率
目前比较有效的是对SYN的频率和次数进行限制,这样最大限度的控制了单个IP地址发动攻击的能力。例如将SYN请求的次数限制在30次每分钟,系统默认是5次/秒可以将burst从默认的5个降低到2个。
进行此操作后正常的用户无任何感觉上的差异,而并发的SYN请求量下降了不少,服务响应基本正常了。
5.防范SYNAttack攻击
SYNAttack"是一种拒绝服务(DoS)的攻击方式,会消耗掉系统中的所有资源,迫使服务器重新启动。使用下面的命令:
#echo1>/proc/sys/net/ipv4/tcp_syncookies
把这个命令加入"/etc/rc.d/rc.local"文件中,等下次系统重新启动的时候就可以自动生效。
DNS是网络服务的基础建设,要长期不断地保持其正常运作,每一个DNS服务器都应该定期检测。域名系统的配置和管理是一项比较复杂和繁琐的系统管理任务,它对整个网络的运行影响极大。为了保证DNS服务器的安全运行,不仅要使用可靠的服务器软件版本,而且要对DNS服务器进行安全配置,同时还要跟踪服务器软件和操作系统的各种漏洞。
源代码网供稿.