基于区块链的 DNS 安全平台
域名系统 ( DNS )主要设计用于将主机名查询解析为 IP 地址。互联网用户需要有域名,比如 www.packtpub.com 的,但是互联网需要一个 IP 地址来将请求路由到想要的目的地。这样,DNS 就成了互联网的电话簿,允许每个人在全球范围内使用它;然而,这也留下了它被滥用的高可能性。在本章中,我们将了解 DNS 基础设施、核心组件、现有系统面临的挑战,以及区块链如何转变其当前的功能。
在本章中,我们将讨论以下主题:
- 域名服务器(Domain Name Server)
- DNS 结构和层次结构
- 大型企业的 DNS 拓扑
- 当前 DNS 解决方案面临的挑战
- 基于区块链的 DNS 解决方案
- 实验室
域名服务器(Domain Name Server)
域名系统是互联网的心脏。如果 DNS 不可用,我们每个人都将很难在互联网上找到资源。作为一个巨大的互联网电话簿,我们的整个在线系统严重依赖于域名系统。因为有了 DNS 名称空间,我们没有人需要记住 IP 地址的列表;相反,我们只需要记住网页的名称。
对于 it 和安全专业人员来说,了解 IT 的基本结构、功能和操作非常重要。DNS 是一个具有授权的分层数据库。根据本章的范围,我们将考虑企业 DNS 部署及其功能。组织可以通过两种方式管理他们的 DNS 基础设施——允许他们的互联网服务提供商进行管理,或者在内部进行管理。ISP 网络中的任何配置错误或故障都可能导致组织的互联网基础设施瘫痪。
随着互联网用户数量的增长,DNS 成为互联网上组织的主干,因此它给了组织一个强有力的理由来控制他们自己的 DNS。通过高效的 DNS 部署,组织甚至可以实现更好的垃圾邮件过滤系统和优化的网络拓扑。以下是 DNS 在组织中发挥重要作用的几种方式:
- 反垃圾邮件:一些 DNS 机制,包括发件人策略框架 ( SPF )和域名密钥识别邮件 ( DKIM ),确保只允许预定义的域名列表代表特定组织发送电子邮件。如果组织中的 DNS 正常工作,这些机制是有效的。
- 负载共享 : DNS 服务可以通过与其他未充分利用的服务器负载共享高利用率服务器的流量来优化服务器基础设施。
- 隐私 : DNS 服务通过根据从网络内部还是外部访问地址来屏蔽不同名称的地址,从而确保组织名称空间信息的隐私,帮助实现更强的网络安全性。
了解 DNS 组件
DNS 不仅仅是一个协议,它由几个独立的实体组成,这些实体共同提供一个可扩展的、可靠的域名数据库。在其最简单的形式中,DNS 有三个核心组件——名称空间、服务器和解析器。
**# 命名空间
名称空间是 DNS 数据库的一种结构。它以倒置树的形式表示,其根节点位于顶部。树中的每个节点都有一个标签,根节点有一个空标签。请看下图:
域名是从节点到根的标签序列,由点分隔。名称空间的最大深度为 127 层,域名的长度不超过 255 个字符:
名服务程序
名称服务器负责以区域的形式存储有关名称空间的信息。可以有多个名称服务器,加载一个完整区域的服务器被称为该区域的权威。通常,有多个名称服务器用作单个区域的权威,以确保更好的冗余和分担负载:
名称服务器主要有两种类型——权威服务器和缓存服务器:
- 权威名称服务器:提供对 DNS 查询的响应。它负责为每个 DNS 查询提供原始和明确的答案。有两种类型的权威名称服务器:
- 主服务器(主名称服务器):存储所有区域记录的原始副本。管理员只能对主服务器区域数据库进行更改。
- 从服务器(辅助名称服务器):从服务器保存主服务器文件的副本。它用于分担 DNS 服务器负载和提高 DNS 区域可用性。
- 缓存名称服务器:它让名称服务更贴近用户,提高了整体的名称查找性能。它还提供了一种全面的机制,通过允许用户从本地缓存中获取所有名称映射,为本地用户提供私有名称空间。
分解器
名称解析器帮助名称服务器在名称空间中查找数据。需要名称解析器来找出根区域的名称服务器的名称和 IP 地址。根域名服务器存储关于顶级域名的信息,并指导所有顶级域名 ( 顶级域名)联系的服务器。解析器基本上从右到左将名称分解成标签。使用根服务器查询第一个组件,即 TLD,以获得指定的权威服务器。
DNS 结构和层次结构
与互联网的 DNS 基础设施类似,组织也部署其内部 DNS 基础设施。为了部署内部 DNS 基础设施,组织可以选择任何域层次结构;然而,一旦连接到互联网,他们必须遵循共同的 DNS 框架。让我们了解一下名称服务器的层次结构。
根名称服务器
由于整个互联网的名称空间一致,根域名服务器直接响应根区域中的记录请求,并通过返回相应 TLD 的权威域名服务器列表来回答其他请求。
为了修改根区域,必须首先通过互联网发布区域文件。根区域文件通过互联网发布在从 A 到 M 的 13 个服务器上。
根区域包含以下信息:
- 通用顶级域名,如
.com
、.net
和.org
- 全球公认的顶级域名
- 国家代码 TLD,每个国家的双字母代码,如
.in
代表印度,或.no
代表挪威 - 全球公认的顶级域名,通常类似于国家代码 TLD 域名
根区域包含为 TLD 内容提供服务的域名服务器的数字地址,当 TLD 询问时,根服务器使用这些地址进行回答。
当组织获得一个新域名时,注册服务商可能会代表他们配置 DNS 记录,并为他们提供一个域名服务器 ( NS )。组织需要一个名称服务器来告诉互联网的 DNS 目录他们的 web 服务器和相应服务的 IP 地址。
当前 TLD 结构
TLD 是 DNS 层次结构中最高级别的域之一。TLD 安装在名称空间的根区域中。系统最后部分中的域必须用完全限定的域名来识别。互联网名称与数字地址分配机构 ( ICANN )确保顶级域名由授权组织管理。互联网号码分配机构 ( IANA )由 ICANN 运营,负责管理 DNS 根区域。
IANA 负责管理以下顶级域名:
- cctld—国家代码 TLDs
- gTLD—通用顶级域名
- 。arpa—基础设施顶级域名
此分层图解释了现有的 TLD 结构:
注册管理机构、注册服务商和注册人
DNS 存储了大量的域名数据库。为了执行注册,有三个实体一起工作— 注册管理机构、注册服务商和注册人:
- Registry :维护名称空间数据库的组织,对该数据库具有编辑权限。注册中心运行名称空间的权威 ns,并管理 TLD 名称。他们的职责是创建域名扩展、制定域名规则,并与注册服务商合作向公众提供域名。例如, Verisign 管理
.com
域名及其 DNS 的注册。 - 注册商:保留域名并被授权向公众出售域名的机构。该注册服务商必须得到通用顶级域名 ( gTLD )注册管理机构或国家代码顶级域名 ( ccTLD )注册管理机构的认可。注册服务商根据域名注册管理机构提供的指导方针开展工作。
只有指定的注册服务商才能修改或删除中央注册数据库中的域名信息。最终用户直接从注册服务商处购买域名,最终用户完全有权更换注册服务商,在注册服务商之间调用域名迁移流程。一些最受欢迎的注册商有 GoDaddy、HostGator、BigRock 等等。
- 注册人:这只是拥有域名权利的最终用户。作为域名注册人,每个人都有一定的权利和责任,包括从用户的注册服务商处获取有关注册、管理、转让、续展和恢复域名注册流程的信息。
下图显示了所有三个实体的协同工作:
DNS 记录
DNS 记录是与 DNS 服务器相关联的映射文件,无论每个域与哪个 IP 地址相关联,它们处理发送到每个域的请求。各种字母串被用作类似于 DNS 服务器动作的组件,这些命令串被称为 DNS 语法。这些语法是 A、规范名 ( CNAME )、邮件交换器 ( MX )、指针 ( PTR )、名称服务器 ( NS )、授权开始 ( SOA )、服务 ( 让我们详细研究一下这些 DNS 记录。
- SOA:SOA 记录记录了一个区域文件的开始。它由区域名称、技术联系点、NS、序列号和超时值组成:
- NS:NS 记录标识区域的授权名称服务器。NS 还将子域委托给区域文件上的其他组织。在上例中,我们可以清楚地看到 www.google.com 的的 NSE 列表。
- 记录:地址记录建立了姓名到地址的正向绑定。在本例中,我们有一个 IP 地址映射到域【www.google.com T2】:
- MX 记录:这些记录标识了可以交换邮件的服务器。优先级总是与每个记录相关联,因此用户可以选择主邮件服务器和备份邮件服务器。
- TXT 记录:这些记录提供了一种方法来扩展通过 DNS 提供的信息。此文本记录存储有关 SPF 的信息,该信息可以识别代表您的组织发送电子邮件的授权服务器。
- CNAME:cname 本质上是绑定流量的域名和子域文本别名。它们表明安全文件传输协议 ( SFTP )服务器和邮件服务器在同一个系统上。CNAME 扮演着重要的角色,尤其是当服务器不受组织控制时,例如托管或管理的 web 服务器。
- PTR 记录:这些记录提供了从地址到名字的反向绑定。PTR 记录应该与前方地图完全匹配。
大型企业的 DNS 拓扑
对于 IT 专业人员来说,理解 DNS 查询和域名服务器的类型是我们了解组织 DNS 最佳实践的主要途径:
- 网络拓扑:冗余在域基础设施中起着至关重要的作用。即使一台服务器出现故障,另一台服务器也会接管控制权,保持服务正常运行。 BIND (广泛使用的 DNS 软件)通过主从关系支持高冗余。主 NS 通过区域转移机制将映射中的变化更新到一个或多个从服务器。
- 配置文件 : BIND 的配置存储在一个名为
named.conf
的文件中。这个named.conf
文件帮助服务器识别权威和/或缓存服务器,以及它是任何特定区域的主服务器还是从服务器。该文件指向包含实际映射数据库的区域文件。它包含定义特定域的名称到地址和地址到名称映射的行或记录。
体系结构
随着不断变化的技术和网络转型,DNS 必须随着时间的推移进行升级。有 DNS 运营分析研究中心(DNS-OARC)互联网系统联盟 ( ISC )等机构。在下图中,我们可以看到为优化 DNS 基础架构而构建的标准 DNS 架构:
前面的标准 DNS 架构可以描述如下:
- 主 DNS 区域:主区域包含区域数据的读/写副本。一个网络中只允许有一个主区域。所有 DNS 记录必须手动或自动写入主区域。然后,这些数据被存储在一个标准的文本文件中。
- 从 DNS 区域:从区域是区域数据的只读副本。通常,它是主区域的复制版本。如果试图更改辅助区域上的 DNS 记录,它可以重定向到另一个具有读/写访问权限的区域。从属 DNS 区域用于备份 DNS 区域文件。
- 聚合缓存转发器(ACF) :它基本上是转发请求,而不是处理请求。当服务器发送一个响应时,它会将它传递回自己的客户机。在某些情况下,解析器也可以是转发器或缓存转发器。它可能会也可能不会缓存数据;然而,它对于像小型办公室家庭办公室 ( SOHO )网关这样的系统是有用的,这些系统想要向没有预先定义的 DNS 服务器地址的 DHCP 客户端提供 DNS 数据。
当前 DNS 面临的挑战
今天,DNS 已经成为互联网和组织网络的主干。DNS 是任何组织都离不开的关键基础设施。然而,尽管在网络和信息安全方面的投资不断增加,攻击者仍然设法入侵网络,DNS 仍然是网络基础设施中易受攻击的组件,经常被用作攻击媒介。防火墙保持端口53
打开,从不查看每个查询的内部。让我们来看看最广泛使用的基于 DNS 的攻击之一:
DNS 欺骗
当 DNS 服务器的记录被更改以将流量重定向到攻击者的服务器时,DNS 就会被劫持。这种流量重定向使得攻击者能够通过网络传播恶意软件。DNS 欺骗可以通过以下三种方式之一进行:
- DNS 缓存中毒:攻击者可以利用缓存的 DNS 记录,然后通过向 DNS 服务器注入伪造的 DNS 条目来执行欺骗。因此,所有用户现在都将使用该伪造的 DNS 条目,直到 DNS 缓存过期。
- 危及 DNS 服务器:DNS 服务器是整个 DNS 基础设施的核心。攻击者可以使用几个攻击媒介来危害 DNS 服务器,并可以针对每个合法的 DNS 查询提供恶意 web 服务器的 IP 地址。
- 中间人(MITM)攻击:在这种类型的攻击中,威胁者一直在监听客户端和 DNS 服务器之间的对话。在收集信息和序列参数后,它开始伪装成实际的 DNS 服务器来欺骗客户端,并提供恶意网站的 IP 地址。
基于区块链的 DNS 解决方案
区块链技术有能力改变几个行业,在本章中,我们将使用它来管理名称服务器,以克服一些最关键的 DNS 挑战。 DNSChain 是改造 DNS 框架并保护其免受欺骗挑战的最活跃项目之一。
DNSChain 是一个基于区块链的 DNS 软件套件,它取代了 X.509 公钥基础设施 ( PKI )并提供 MITM 认证证明。它允许互联网用户为 DNS 查询设置一个公共 DNSChain 服务器,并访问域名以.bit
结尾的服务器。
X.509 PKI 替换
X.509 是一个标准框架,它定义了 PKI 的格式,以便在 internet 上识别用户和实体。它有助于互联网用户了解特定网站的连接是否安全。DNSChain 有能力提供不依赖于第三方的可扩展和分散的替代方案。
防 MITM 的 DNS 基础设施
这使用公钥锁定技术来消除 MITM 攻击问题。公钥锁定指定两个 pin-sha256 值;也就是说,它固定两个公钥(一个是当前证书链中任何公钥的 pin,另一个是不在当前证书链中的任何公钥的 pin):
- 它与现有的 DNS 服务器并行工作
- 网站和个人将其公钥存储在区块链中
- 密钥通过 DNSChain 软件框架共享
基于以太坊的安全 DNS 基础设施实验室
DNS 基础设施已经成为组织最有针对性的资产。传统 DNS 容易受到几种复杂威胁的攻击。当前的 DNS 系统是分层的,系统根服务器成为高价值的攻击媒介。由于整个基础设施都是集中的,即使是轻微的故障也会导致整个系统的故障。一组工程师——格雷格·西帕克和安德里亚·德弗斯开发了一个基于以太坊的 DNS 平台,在没有第三方参与的情况下连接客户端和域名服务器。这个项目被命名为 DNSChain ,在 GitHub 上托管,链接【https://github.com/okTurtles/dnschain】T2。
实验室准备
在 Ubuntu 中配置 DNSChain 服务器。。它将运行 PowerDNS Recursor,如你所料,发布对.com
和.net
域名的 DNS 查询,但会咨询本地域名币区块链来解析.bit
域名。
我们将从 Ubuntu LTS 的新版本开始。在我们的实验室中,我们将在亚马逊的 AWS 云上部署这个 Ubuntu 系统。
这里的一些例子可能会使用过期的域名,所以最好在你个人在 Namecoin 的区块链上注册的域名上测试域名解析。从 Ubuntu 16.04 LTS 的最新版本开始。我在亚马逊云上用的是 Ubuntu 16.04 LTS。
我们将使用以下命令来准备基础架构:
sudo sh -c "echo 'deb
http://download.opensuse.org/repositories/home:/p_conrad:/coins/xUbuntu_16.04/ /' >> /etc/apt/sources.list.d/namecoin.list"
wget http://download.opensuse.org/repositories/home:p_conrad:coins/xUbuntu_16.04/Release.key
sudo apt-key add - < Release.key
sudo apt-get update
Namecoin blockchain 安装
在这一节中,我们将开始安装硬币区块链。
- 安装:我们需要在本地系统中安装
namecoin
区块链:
sudo apt-get install namecoin
要配置namecoin
,请遵循快速入门指南。本教程将使用当前用户,而不是创建多个用户。
- 配置:name coin 安装完成后,我们需要用以下命令配置区块链:
mkdir -p ~/.namecoin \
&& echo "rpcuser=`whoami`" >> ~/.namecoin/namecoin.conf \
&& echo "rpcpassword=`openssl rand -hex 30/`" >> ~/.namecoin/namecoin.conf \
&& echo "rpcport=8336" >> ~/.namecoin/namecoin.conf \
&& echo "daemon=1" >> ~/.namecoin/namecoin.conf
我们将继续运行namecoind
来开始工作。让我们使用namecoind getinfo
检查下载区块链的进度。
对于 Ubuntu,我们用upstart
代替systemd
。我们需要将这个文件写入/etc/init/namecoind.conf
,记得替换你的用户名;我的情况是ubuntu
:
我们现在必须使用namecoind stop
来停止这个过程。之后,我们需要发出sudo initctl reload-configuration
命令,然后使用sudo shutdown -r
重启。最后,namecoin
自动重启。
- 验证:如前所述,
namecoind
即将开始下载区块链。在取得一些进展之前,我们将无法从区块链查找域名。稍后,当我们再次访问 Namecoin 时,我们可以尝试以下命令:
namecoind getinfo
在输出中,我们可以清楚地看到关于 Namecoin 的详细信息,以及关于难度、连接、时间偏移、创建的块、平衡甚至任何错误的详细信息:
此外,我们将使用以下命令获取 Namecoin 交易 ID 和地址的详细信息:
namecoind name_show d/okturtles
以下屏幕截图显示了运行上述命令的输出:
此外,我们还可以检查 RPC 接口(使用namecoin.conf
的rpcuser
和rpcpassword
):
现在,我们将使用curl
命令获取关于通过http://127.0.0.1:8336
托管的内容的 web 信息:
curl --user ubuntu:b17401a7fcc7a3db10c8efcac65ff96db56bfad6cc199f3a08e1b2cf6805 --data-bina' -H 'content-type: text/plain;' http://127.0.0.1:8336
针对本地系统上托管的内容,我们可以看到下面的curl
命令输出:
此外,我们可以使用curl
命令提取 HTTP 站点发送给我们的头。下面的命令存储 HTTP 站点发送给我们的头。该命令将接收到的协议头写入指定文件:
curl -v -D - --user ubuntu:b17401a7fcc7a3db10c8efcac65ff96db56bfad6cc199f3a08e1b2cf6805 --darams":["d/okturtles"]}' -H 'content-type: text/plain;' http://127.0.0.1:8336
运行上述命令的输出如下所示:
安装 PowerDNS
PowerDNS 是开源 DNS 软件、服务和支持的主要供应商。PowerDNS 是一个 DNS 服务器,用 C++编写,在 GNU 通用公共许可证 ( GPL )下授权。它可以在大多数 Unix 衍生产品上运行。它有大量不同的后端,从简单的绑定到关系数据库。我们将使用以下命令在系统上安装 PowerDNS:
sudo apt-get install pdns-recursor
运行上述命令的输出如下所示:
- 配置:我们需要在本地环境中配置 PowerDNS。我们将命令 PowerDNS 将对
.bit
、.eth
和.p2p
域名的请求发送到端口5333
。
该配置在/etc/powerdns/recursor.conf
文件中指定:
forward-zones=bit.=127.0.0.1:5333,dns.=127.0.0.1:5333,eth.=127.0.0.1:5333,p2p.=127.0.0.1:5333
export-etc-hosts=off
allow-from=0.0.0.0/0
local-address=0.0.0.0
local-port=53
在下面的屏幕截图中,我们可以看到查询的转发区域文件的提取:
我们可以在下面的截图中找到托管在127.0.0.1:5333
上的转发区域信息:
请特别注意我们的前沿地带声明。确保此时使用sudo service pdns-recursor restart
重启 PowerDNS。然后,在我们继续之前,确认 PowerDNS 可以正确解析传统域名:
- 验证:要验证转发区域 PowerDNS 安装,我们需要运行以下命令:
dig @127.0.0.1 packtpub.com
我们将找到以下输出,其中包含为packtpub.com
找到的 IP 地址:
安装 DNSChain
首先,我们将更新apt-get
并安装一些先决条件。注意,当我们安装npm
(需要安装 Node.js)时,需要安装nodejs-legacy
。
- 安装依赖项:在这一步,我们将安装所有可依赖的脚本和命令:
sudo apt-get update
sudo apt-get install git npm
sudo apt-get install nodejs-legacy
sudo npm install -g coffee-script
``` **DNSChain 的安装:**现在可以使用以下命令安装 DNSChain:
sudo npm install -g dnschain
在下面的输出中,我们可以发现结果包括注册表文件`coffee-script-1.12.7.tgz`的提取:
![](img/00121.gif)
* **配置**:我们需要配置 DNSChain 以将其绑定到端口`5333`,但是您可以使用任何高端口号,只要它与 PowerDNS 将请求传递到的端口号匹配。这在前面的`/etc/powerdns/recursor.conf`中已经指定。DNSChain 的另一个很棒的特性是我们可以通过 HTTP 公开查找结果。我们将为此指定端口`8000`,但是您可以使用任何开放的高端口号端口。DNSChain 可以设置为由 web 服务器访问,例如通过端口`8000`。举个例子,写进`/home/ubuntu/.dnschain/dnschain.conf`:
![](img/00122.gif)
我们需要为 DNSChain 创建另一个`upstart`文件,并将该文件写入`/etc/init/dnschain.conf`:
![](img/00123.gif)
我们现在将运行`sudo initctl reload-configuration`,然后重启机器。最后,让我们通过尝试解析一个`.bit`域名来测试一下。
您可能需要等到加载了大量的区块链后才能工作。
* **验证**:最后,我们可以通过查找`hello.bit`地址来验证 DNSChain。在输出结果中,我们可以找到带有服务器`51.101.1.6`的期望 IP 地址的结果:
dig @127.0.0.1 okturtles.bit ```
以下屏幕截图显示了运行上述命令的输出:
摘要
在本章中,我们学习了 DNS 框架及其核心组件。我们知道任何受损的 DNS 服务器都会对基础设施造成巨大破坏,也知道区块链如何利用其基本优势解决这些关键挑战。
问题
DNS 是互联网的主干,也是最复杂的协议框架之一。随着每一个新的攻击媒介的出现,DNS 会变得更强大、更全面。读者可以查阅以下问题:
- 什么是 DNS 隧道攻击?
- 区块链可以用来部署整个 DNS 基础设施吗?如果可以,如何部署?
进一步阅读
阅读以下文章,了解有关 DNS-OARC 和 ISC 的更多信息: