﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Alex-文章分类-系统配置</title><link>http://www.cppblog.com/alexhappy/category/10784.html</link><description>Faith First</description><language>zh-cn</language><lastBuildDate>Wed, 10 Jun 2009 09:53:54 GMT</lastBuildDate><pubDate>Wed, 10 Jun 2009 09:53:54 GMT</pubDate><ttl>60</ttl><item><title>Linux应用使用TSIG和DNSSEC加固域名服务器</title><link>http://www.cppblog.com/alexhappy/articles/86748.html</link><dc:creator>alexhappy</dc:creator><author>alexhappy</author><pubDate>Thu, 04 Jun 2009 06:15:00 GMT</pubDate><guid>http://www.cppblog.com/alexhappy/articles/86748.html</guid><wfw:comment>http://www.cppblog.com/alexhappy/comments/86748.html</wfw:comment><comments>http://www.cppblog.com/alexhappy/articles/86748.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/alexhappy/comments/commentRss/86748.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/alexhappy/services/trackbacks/86748.html</trackback:ping><description><![CDATA[<p>此篇文章为转载！<br><br>一、DNS服务器的重要性</p>
<p>DNS是因特网建设的基础，几乎所有的网络应用，都必须依赖DNS系统做网址查询的指引动作。如果DNS系统运作不正常，即使Web服务器都完好如初，防火墙系统都善尽其职，相关的后端应用服务器以及数据库系统运作正常，因为无法在期限时间内查得到网址，将会导致电子邮件无法传递，想要使用网域名称去连接某个网页，也会因查不出网络地址，以致联机失败。2001年1月24日，美国微软公司所管理的相关网络系统，遭受网络黑客的拒绝服务攻击后导致全球各地的用户接近24小时的时间无法连上该公司相关的网站，造成该公司相当严重的商业损失。根据以往的经验之中，网络攻击的对象多数主要集中在控制网络路由的设备(路由器，防火墙等)和各类应用服务器(Web、邮件等)。因此，目前多数的网络系统安全保护，通常都集中在路由设备和应用服务器本身。然而，这一次的微软公司被攻击事件，与以往其它网站攻击事件的最大不同，就在于这一次被攻击的对象是DNS服务器而不是WEB服务器本身。这次的事件宣告另一种新型的网络攻击类别，往后将可能成为常态。</p>
<p>互联网上DNS服务器的事实标准就是ISC（<a href="http://www.isc.org/">http://www.isc.org/</a> ）公司的Berkeley Internert Name Domain(BIND)，它具有广泛的使用基础，互联网上的绝大多数DNS服务器都是基于这个软件的。Netcraft在域名服务器上的统计(<a href="http://www.netcraft.com/">http://www.netcraft.com/</a> )显示 2003年第二季度进行的一个调查发现，在互联网上运行着的DNS服务器中，ISC的BIND占据了95%的市场份额。互联网是由很多不可见的基础构件组成。这其中就包含了DNS，它给用户提供了易于记忆的机器名称(比如sina.com)，并且将它们翻译成数字地址的形式。对于那些用于公共服务的机器一般还提供&#8220;反向查询&#8221;的功能，这种功能可以把数字转换成名字。由于历史的原因，这种功能使用的是被隐藏的&#8220;in-addr.arpa&#8221;域。对in-addr域的调查，可以让我们更加了解整个Internet是如何运作的。Bill Manning对in-addr域的调查发现，有95%的域名服务器(2的2000次方个服务器中)使用的是各种版本的&#8220;bind&#8221;。这其中包括了所有的DNS根服务器，而这些根服务器对整个服务器的正常运转起着至关重要的作用。如何能加强确保 DNS 系统的运作正常， 或者当DNS系统在遭受网络攻击时候， 能够让管理者及早发现是日益重要的系统安全的课题。首先我们要了解DNS服务面临的安全问题。</p>
<p>二、DNS服务面临的安全问题：</p>
<p>DNS服务面临的安全问题主要包括：DNS欺骗（DNS Spoffing）、拒绝服务（Denial of service，DoS）攻击、分布式拒绝服务攻击和缓冲区漏洞溢出攻击（Buffer Overflow）。</p>
<p>1、DNS欺骗</p>
<p>DNS欺骗即域名信息欺骗是最常见的DNS安全问题。当一个DNS服务器掉入陷阱，使用了来自一个恶意DNS服务器的错误信息，那么该DNS服务器就被欺骗了。DNS欺骗会使那些易受攻击的DNS服务器产生许多安全问题，例如：将用户引导到错误的互联网站点，或者发送一个电子邮件到一个未经授权的邮件服务器。网络攻击者通常通过三种方法进行DNS欺骗。图1是一个典型的DNS欺骗的示意图。</p>
<p><img height=243 alt="" src="http://www.cppblog.com/images/cppblog_com/alexhappy/1.jpg" width=400 border=0></p>
<p>图1 典型DNS欺骗过程</p>
<p>（1）缓存感染</p>
<p>黑客会熟练的使用DNS请求，将数据放入一个没有设防的DNS服务器的缓存当中。这些缓存信息会在客户进行DNS访问时返回给客户，从而将客户引导到入侵者所设置的运行木马的Web服务器或邮件服务器上，然后黑客从这些服务器上获取用户信息。</p>
<p>（2）DNS信息劫持</p>
<p>入侵者通过监听客户端和DNS服务器的对话，通过猜测服务器响应给客户端的DNS查询ID。每个DNS报文包括一个相关联的16位ID号，DNS服务器根据这个ID号获取请求源位置。黑客在DNS服务器之前将虚假的响应交给用户，从而欺骗客户端去访问恶意的网站。</p>
<p>（3）DNS复位定向</p>
<p>攻击者能够将DNS名称查询复位向到恶意DNS服务器。这样攻击者可以获得DNS服务器的写权限。</p>
<p>2、拒绝服务攻击</p>
<p>黑客主要利用一些DNS软件的漏洞，如在BIND 9版本（版本9.2.0以前的 9系列）如果有人向运行BIND的设备发送特定的DNS数据包请求，BIND就会自动关闭。攻击者只能使BIND关闭，而无法在服务器上执行任意命令。如果得不到DNS服务，那么就会产生一场灾难：由于网址不能解析为IP地址，用户将无方访问互联网。这样，DNS产生的问题就好像是互联网本身所产生的问题，这将导致大量的混乱。</p>
<p>3、分布式拒绝服务攻击</p>
<p>DDOS 攻击通过使用攻击者控制的几十台或几百台计算机攻击一台主机，使得服务拒绝攻击更难以防范：使服务拒绝攻击更难以通过阻塞单一攻击源主机的数据流，来防范服务拒绝攻击。Syn Flood是针对DNS服务器最常见的分布式拒绝服务攻击。</p>
<p>4、缓冲区漏洞</p>
<p>Bind软件的缺省设置是允许主机间进行区域传输（zone transfer）。区域传输主要用于主域名服务器与辅域名服务器之间的数据同步，使辅域名服务器可以从主域名服务器获得新的数据信息。一旦起用区域传输而不做任何限制，很可能会造成信息泄漏，黑客将可以获得整个授权区域内的所有主机的信息，判断主机功能及安全性，从中发现目标进行攻击。</p>
<p>应对以上这些安全问题有两个比较有效方法：TSIG和DNSSEC技术。</p>
<p>二、TSIG技术</p>
<p>DNS的事务签名分为 TSIG (Transaction Signatures) 与 SIG0 (SIGnature)两种。该如何选择呢? 首先，要先判断客户端与服务器间的信任关系为何，若是可信任者，可选择对称式的 TSIG。TSIG 只有一组密码，并无公开/私密金钥之分；若是非完全信任者，可选择非对称式金钥的 SIG0，虽有公开/私密金钥之分，相对的，设定上也较复杂。至于要选用哪种较适合，就由自己来判断。通常区带传输是主域名服务器到辅助域名服务器。通常在主域名服务器配置文件/etc/named.conf的dns-ip-list的访问控制列表（ACL，access control list）会列出一些IP地址，它们只能为主域进行传输区带信息。一个典型例子如下：<br>以下为引用的内容：<br>acl &#8220;dns-ip-list&#8221; { <br>172.20.15.100; <br>172.20.15.123; <br>}; <br>zone &#8220;yourdomain.com&#8221; { <br>type master; <br>file &#8220;mydomain.dns&#8221;; <br>allow-query { any; }; <br>allow-update { none; }; <br>allow-transfer { dns-ip-list; }; };</p>
<p>&nbsp;</p>
<p>都是黑客会利用IP欺骗一个DNS服务器，迫使其进行非法区带传输。TSIG技术可以进行有效防范。<br>&nbsp;<br>1、TSIG技术</p>
<p>交易签章 (TSIGRFC 2845)，是为了保护 DNS安全而发展的。从BIND 8.2版本开始引入 TSIG 机制，其验证 DNS 讯息方式是使用共享金钥(Secret Key) 及单向杂凑函式(One-way hash function) 来提供讯息的验证和数据的完整性。主要针对区带传输（ZONE Transfer）进行保护的作用，利用密码学编码方式为通讯传输信息加密以保证 DNS 讯息的安全，特别是响应与更新的讯息数据。也就是说在DNS服务器之间进行辖区传送时所提供保护的机制，以确保传输数据不被窃取及监听。下面以BIND 9.21为例：</p>
<p>首先在开始设置，必须为主域名服务器（master DNS）和辅助域名（ slave DNS） 进行时间同步，否则会造成区带传输的失败。可以使用ntp或者rdate工具进行服务器时间同步。</p>
<p>假设要限制yourdomain.com的主域到IP地址分别是172.20.15.100 (ns1.yourdomain. com) 和 172.20.15.123 (ns2.yourdomain.com). 的两个辅助域名服务器之间进行区带传输。在此将详述 TSIG 的实际操作，可以防止DNS服务器和黑客的DNS服务器之间不会发生IP欺骗。</p>
<p>步骤一：执行 dnssec-keygen function 产生加密金钥，一个为 public key 文件，另一个为 private key 文件：</p>
<p>产生加密金钥：</p>
<p>dnssec-keygen -a hmac-md5 -b 128 -n HOST zone-xfr-key</p>
<p>该文件中公开金钥（public key）是： Kzone-xfr-key.+157+08825.key；私有金钥（private key）是Kzone-xfr-key.+157+08825.private。此时查看文件通常包括以下内容：<br>以下为引用的内容：<br>Private-key-format: v1.2 <br>Algorithm: 157 (HMAC_MD5) <br>Key: YH8Onz5x0/twQnvYPyh1qg==</p>
<p><br>步骤二：使用TSIG 金钥在主域名服务器和辅助域名服务器的设置文件named.conf设定：<br>以下为引用的内容：<br>key zone-xfr-key { <br>algorithm hmac-md5; <br>secret &#8220;YH8Onz5x0/twQnvYPyh1qg==&#8221;; <br>};</p>
<p>&nbsp;</p>
<p>步骤三：将下面的声明加入服务器ns1.yourdomain.com的设置文件/etc/named.conf中：<br>以下为引用的内容：<br>server 172.20.15.123 { <br>keys { zone-xfr-key; }; <br>};</p>
<p><br>步骤四：将下面的声明加入服务器ns2.yourdomain.com的设置文件/etc/named.conf中：<br>以下为引用的内容：<br>server 172.20.15.100 { <br>keys { zone-xfr-key; }; <br>};</p>
<p>&nbsp;</p>
<p>步骤五：为主域名服务器ns1.yourdomain.com的yourdomain.com区带的设置文件/etc/named.conf写入以下配置：<br>以下为引用的内容：<br>acl &#8220;dns-ip-list&#8221; { <br>172.20.15.100; <br>172.20.15.123; <br>}; <br>key zone-xfr-key { <br>algorithm hmac-md5; <br>secret &#8220;YH8Onz5x0/twQnvYPyh1qg==&#8221;; <br>}; <br>server 172.20.15.123 { <br>keys { zone-xfr-key; }; <br>}; <br>zone &#8220;yourdomain.com&#8221; { <br>type master; <br>file &#8220;mydomain.dns&#8221;; <br>allow-query { any; }; <br>allow-update { none; }; <br>allow-transfer { dns-ip-list; }; <br>};</p>
<p><br>步骤六：为辅助域名服务器ns2.yourdomain.com的yourdomain.com区带的设置文件/etc/named.conf写入以下配置：<br>以下为引用的内容：<br>acl &#8220;dns-ip-list&#8221; { <br>172.20.15.100; <br>172.20.15.123; <br>}; <br>key zone-xfr-key { <br>algorithm hmac-md5; <br>secret &#8220;YH8Onz5x0/twQnvYPyh1qg==&#8221;; <br>}; <br>server 172.20.15.100 { <br>keys { zone-xfr-key; }; <br>}; <br>zone &#8220;yourdomain.com&#8221; { <br>type master; <br>file &#8220;mydomain.dns&#8221;; <br>allow-query { any; }; <br>allow-update { none; }; <br>allow-transfer { dns-ip-list; }; <br>};</p>
<p>&nbsp;</p>
<p>步骤七：再次重新启动主域名服务器和辅助域名服务器。</p>
<p>说明为确保安全性的问题，TSIG 可确认 DNS 之信息是由某特定 DNS Server 所提供。通常TSIG 应用于域名服务器间的区带传输，确保数据不会被篡改或产生 dns spoofing。</p>
<p>步骤八：</p>
<p>验证TSIG技术是否生效，步骤如下：</p>
<p>删除辅助域名服务器(ns2.yourdomain.com)的区带文件。</p>
<p>重新启动辅助域名服务器。</p>
<p>检查辅助域名服务器的区带文件是否自动建立。辅助域名服务器用来从主服务器中转移一整套域信息。区带文件是从主服务器转移出的，作为磁盘文件保存在辅助域名服务器中。</p>
<p>注意事项：如果为域名服务器配置了TSIG，那么要确保普通用户不能接触主域名服务器和辅助域名服务器的配置文件/etc/named.conf。另外也不能修改两台服务器的共享的TSIG密钥。</p>
<p>2、SIG0 技术简介</p>
<p>SIG0是一九九九年三月 由 IBM公司的D. Eastlake 提出成为标准。其是利用公开金钥机制为辖区资料进行数字签章的动作，以保证每笔传输的 source record 具有可验证性与不可否认性。实际上 SIG0 才是防止 DNS Spoofing 发生最主要的技术，SIG0 是使用公开金钥加密法，让辖区管理者为其辖区数据加上数字签章，由此证明辖区资料的可信赖性。除此之外，SIG0 保有是否选择认证机制的弹性，以及可灵活地配合自订的安全机制。</p>
<p>三、DNSSEC技术</p>
<p>DNS欺骗是对目前网络应用，最大的冲击在于冒名者借着提供假的网域名称与网址的对照信息，可以将不知情用户的网页联机，导引到错误的网站，原本属于用户的电子邮件也可能因而遗失，甚而进一步空开成为阻断服务的攻击。所幸，目前较新的 BIND 版本，针对这一类问题，已经有加入许多改进的方法，不过真正的解决方案，则有赖封包认证机制的建立与推动。DNSSEC就是试图解决这一类问题的全新机制， BIND9 已经完整加以设计并完成。DNSSEC引入两个全新的资源记录类型：KEY和SIG，允许客户端和域名服务器对任何DNS数据的来源进行密码验证。</p>
<p>DNSSEC主要依靠公钥技术对于包含在DNS中的信息创建密码签名。密码签名通过计算出一个密码hash数来提供DNS中数据的完整性，并将该hash 数封装进行保护。私/公钥对中的私钥用来封装hash数，然后可以用公钥把hash数译出来。如果这个译出的hash值匹配接收者刚刚计算出来的hash树，那么表明数据是完整的。不管译出来的hash数和计算出来的hash数是否匹配，对于密码签名这种认证方式都是绝对正确的，因为公钥仅仅用于解密合法的hash数，所以只有拥有私钥的拥有者可以加密这些信息。下面我们看看如何为名称是domain.com的域建立DESSEC配置。</p>
<p>步骤一：为 domain.com 域建立一对密钥。在 /var/named 目录下，使用命令： &#8220;/usr/local/sbin/dnssec-keygen -a DSA -b 768 -n ZONE domain.com&#8221; 这个命令产生一对长度768位DSA算法的私有密钥（Kdomain.com.+003+29462.private）和公共密钥（Kdomain.com.+003+29462.key）。其中29462称作密钥标签（ key tag）。 </p>
<p>步骤二：使用命令：&#8220; /usr/local/sbin/dnssec-makekeyset -t 3600 -e now+30 Kdomain.com.+003+29462&#8220;建立一个密钥集合。该命令以3，600 seconds 的生存时间（time-to-live）建立密钥集合，有效期限三十天，并且创建一个文件：domain.com.keyset。</p>
<p>步骤三：使用命令&#8220; /usr/local/sbin/dnssec-signkey domain.com.keyset Kdomain.com.+003+29462 &#8220;为密钥集合签字。然后建立一个签字文件：domain.com.signedkey。</p>
<p>步骤四：使用命令 &#8220;/usr/local/sbin/dnssec-signzone -o domain.com domain.db command， where domain.db &#8221;为区带文件签字。然后建立一个签字文件： domain.db.signed。</p>
<p>步骤五：替换 配置文件/etc/named.conf中 domain.com的区带文件部分。清单如下：<br>以下为引用的内容：<br>zone &#8220;domain.com&#8221; IN { <br>type master; <br>file &#8220;domain.db.signed&#8221;; <br>allow-update { none; }; }; </p>
<p><br>从上面的配置过程我们也看到DNSSEC的一些缺点：</p>
<p>除了配置负责，还有标记和校验DNS数据显然会产生额外的开销，从而影响网络和服务器的性能。签名的数据量很大，这就加重了域名服务器对互联网骨干以及一些非骨干连接的负担。产生和校验签名也占用了很多中央处理器的时间。有时候，不得不把单处理器的DNS服务器换成多处理器的DNSSEC服务器。签名和密钥占用的磁盘空间和RAM容量达到它们表示的数据所占容量的10倍。同时数据库和管理系统也不得不进行相应的升级和扩容。</p>
<p>总结：域名系统的配置和管理是一项比较复杂和繁琐的系统管理任务，它对整个网络的运行影响极大。为了保证DNS服务器的安全运行，不仅要使用可靠的服务器软件版本，而且要对DNS服务器进行安全配置，本文介绍了TISG和DNSSEC技术有助于减少 DNS Spoofing 攻击的发生，增进网络使用者对因特网使用的信任，杜绝信息系统遭受入侵与攻击的产生。</p>
<img src ="http://www.cppblog.com/alexhappy/aggbug/86748.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/alexhappy/" target="_blank">alexhappy</a> 2009-06-04 14:15 <a href="http://www.cppblog.com/alexhappy/articles/86748.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>