使用 Amazon Route 53 Resolver DNS Firewall 进行出口控制

学习如何确保您的基础设施安全并降低成本
发布时间:2023 年 9 月 28 日
成本优化
安全性
亚马逊云科技网络防火墙
教程
亚马逊云科技
Olawale Olaleye
亚马逊云科技使用经验
200 - 中级
完成所需时间
30 分钟
所需费用

少于 5 美元(试验完成后及时清理资源)

前提条件

注册 / 登录 亚马逊云科技账户

示例代码

本教程中使用的示例代码来自 GitHub

上次更新时间
2023 年 9 月 28 日

您是否曾考虑过基础设施安全性与成本效益之间的联系?二者实际上是相辅相成的。谈及安全,我们脑海中浮现的往往是对抗和风险、控制和监管、合规和审计。然而,关注安全态势并了解网络流量状况——无论是预期的还是非预期的——有助于在云环境中设计高成本效益的架构。

本教程将介绍如何使用 Amazon Route 53 Resolver DNS Firewall 来控制出口流量。我们的首要目标是提供一个安全的环境,确保只允许预期的出口流量。其次是通过启用相关功能有效降低出口流量的云计算成本。

 
在本教程中,出口流量指的是从 VPC 内受保护的子网中流出的流量,离开 VPC 并被路由至互联网。
 

实验中,我们需要使用 Amazon Route 53 Resolver DNS Firewall、Amazon EC2 实例和 Amazon Virtual Private Cloud。

学习内容

  • 如何在 Amazon Route 53 Resolver DNS Firewall 中配置自定义域名列表,并在过滤规则中使用该列表。
  • 如何使用 Amazon Route 53 Resolver DNS Firewall 中的管理的域名列表。
  • 如何启用日志功能查看根据指定规则阻止的 DNS 查询。

什么是 Amazon Route 53 Resolver DNS Firewall?

使用 Amazon Route 53 Resolver DNS Firewall,您可以定义与您的 VPC 关联的域名过滤规则。您可以指定允许或阻止的域名列表,并可以自定义阻止 DNS 查询后返回的响应内容。

Route 53 Resolver DNS Firewall 主要用于阻止与已知的恶意域名的通信,和/或只允许与受信任域名的通信。本教程中将具体介绍如何配置这一功能。

Route 53 Resolver DNS Firewall 不仅可以阻止解析不信任域名(以及与之通信所需的 IP 地址),还可以帮助您防止数据 DNS 泄露。当有恶意访问攻破您的 VPC 中的资源时,可能会导致 DNS 泄露。然后,攻击者就可以使用 DNS 查询来发送数据或建立其他网络协议隧道将数据从您的 VPC 中发送到恶意 DNS 服务器。

使用 Route 53 Resolver DNS Firewall,您可以监控和控制您的应用工作负载可以查询的域名。您可以禁止访问在亚马逊云科技中标记为恶意的域名,而允许其他查询通过。

或者,您可以建立一个 DNS 白名单模型,默认拒绝除了明确信任的域名之外的所有域名。

如何结合使用 Route 53 Resolver DNS Firewall 和 Amazon Network Firewall?

Route 53 Resolver DNS Firewall 和 Amazon Network Firewall 都提供域名过滤功能,但适用于不同类型的流量。结合使用 Route 53 Resolver DNS Firewall 和 Amazon Network Firewall,您可以基于域名过滤两个不同的网络出口路径上的流量。

DNS 防火墙过滤从您的 VPC 中通过 Route 53 Resolver 的出站 DNS 查询。您还可以配置 DNS 防火墙阻止域名查询后发送的自定义响应。

Amazon Network Firewall 过滤通过防火墙端点路由的所有网络流量,但无法监视对 Route 53 Resolver 的查询。

本教程将重点介绍如何过滤 Amazon Network Firewall 通常无法监视到的初始 DNS 请求。以下图片中的示例架构展示了这一点的重要性。

本教程中使用的简化分布式部署

上图是一个简化的、单可用区的分布式部署架构。

了解流量流向

受保护工作负载发往互联网的流量通过默认路由 (0.0.0.0/0) 到达一个网络防火墙端点,而后者又有一个默认路由指向一个 NAT 网关端点。简化分布式部署图片的标记 1 和 2 号部分展示了这一点。

NAT 网关所在的公有子网有一个默认路由指向 VPC 的互联网网关,并且还有一个特定路由将返回到受保护工作负载的流量指向网络防火墙端点。这确保了流量对称,便于全面检查。标记 3 和 4 部分展示了这一点。在专有公共子网中部署了 NAT 网关后,私有子网中的实例就可以与互联网上的资源通信。

这是部署了网络防火墙时的典型出口流量流向。但是,上图中没有显示 VPC 内 DNS 查询的流量流向。

下图展示 DNS 解析的流量流向。

DNS 查询的流量流向

Amazon Route 53 Resolver 作用于每个 VPC 子网中的 .2 地址。因此,DNS 防火墙评估 DNS 查询,因为这些查询不会离开私有子网并跨越防火墙子网。

高效成本架构

以下几个场景适合构建高成本效益的架构:

  1. DNS 流量不经过 VPC。

    DNS 流量不经过 VPC,也不需要经过互联网。在本地执行 DNS 就不会因出口数据产生额外费用。

  2. DNS 控制确保不会有从 VPC 外建立的恶意连接,从而减少计算和数据成本。

    不法分子常用的一种手段是从内部资源建立命令和控制连接。然后使用这些计算资源发起 DDoS 攻击、入侵挖矿和执行其他恶意行为。通过阻止已知恶意顶级域名 (TLD) 的 DNS 请求就能阻止这种命令和控制通道的发生。这样可以降低计算成本和数据成本。

  3. 修改当前架构以便使用集中的 inspection VPC。

    您可以对防火墙配置进行微调,使用集中的 inspection VPC 而不是分布式 VPC。这将最大化降低跨 VPC 分布防火墙端点的相关成本。

设置环境

首先,配置基线。本教程示例中,使用一个 Amazon CloudFormation 模板构建基线,您可以在示例代码库中获取该模板。您需要在您的亚马逊云科技环境中部署该模板:Egress-Controls-Tutorial.yaml。

部署 CloudFormation 模板后,检查环境的基线态势,确认可以离开该环境的流量。验证后,配置 Amazon Route 53 Resolver DNS Firewall来阻止不允许的出站流量,并启用日志记录功能。

 
注意:在环境中部署 CloudFormation 模板将产生费用。您使用此模板意味着您需要承担相应的费用,并需要在使用后手动清理环境。本教程会指导您如何操作,但请务必清理环境。
 

首先,连接本次试验用的 EC2 实例,并运行测试出站流量的脚本。

设置默认出口基准

  • 从亚马逊云科技管理控制台导航至 CloudFormation 控制台。

导航至 CloudFormation

  • 点击 Create stack(创建堆栈),然后添加从代码库中获得的 Egress-Controls-Tutorial.yaml 堆栈。

  • 命名堆栈,选择可用区,然后点击 Next(下一步)。

命名堆栈

  • 当堆栈创建完成后,点击堆栈名称进入堆栈。

导航至堆栈

  • 点击 Outputs(输出),然后检查所创建的资源。

  • 在 key 列中找到 TestHostSession。TestHostSession 的 URL 链接着一个 Amazon Network Firewall 保护的子网内的 Amazon EC2 实例(前图中的 TestInstance1)的交互式 Shell。该 Shell 可用于发送测试流量。

  • 点击链接,跳转至该 Shell。建议您在新标签页中打开此页面,这样可以方便您快速回到当前页面使用其他快捷入口链接,包括指向 Amazon Network Firewall、Route 53 Resolver DNS Firewall 和 CloudWatch Logs 服务的链接。

CloudFormation 输出

  • 在交互式 Shell 中,运行 cd ~/ 命令切换到 ssm-user 主文件夹。

  • 运行 git clone https://github.com/build-on-aws/testing-egress-controls-for-cloud-workloads.git命令将 git 库 克隆到 ssm-user 的主目录中。

  • 运行 cd 命令进入 testing-egress-controls-for-cloud-workloads 目录。

  • 运行 sh egress-check.sh 命令运行测试脚本。响应内容中应该显示没有任何内容被阻止。

运行测试脚本

 
注意:在本试验中,我们只检查该命令输出中的 R53 DNS FIREWALL CONTROLS 部分。此测试脚本也可以用于其他教程中的试验,所以该脚本包含其他教程涉及的操作。
 

在本试验的后面部分中,我们将配置 Amazon Route 53 Resolver DNS Firewall,用于过滤 DNS 查询和指向互联网的流量,并返回 BLOCKED 状态。

下面,配置 Amazon Route 53 Resolver DNS Firewall。

配置 Amazon Route 53 Resolver DNS Firewall

在 Amazon Route 53 DNS Firewall 中,创建一个自定义的已知滥用的顶级域名列表,并在出口 VPC 中屏蔽这些域名。

步骤 1 - 创建 DNS 防火墙自定义域名列表

域名列表是一组域名匹配规范。您可以在 Route 53 Resolver DNS 防火墙规则中添加域名,从而允许、阻止或告警与之匹配的域名。在单个规则组中,您可以添加多个规则,每个规则匹配不同的域名列表。您可以创建自己的列表,也有可以使用亚马逊云科技管理的域名列表。规则组与 VPC 关联后,Amazon Route 53 Resolver DNS Firewall 会将 DNS 查询的域名与规则中包含的域名列表进行比较,并根据所匹配的规则中指定的操作处理 DNS 查询。

在这一步,我们将创建一个黑名单域名列表来指定需要屏蔽的顶级域名的匹配模式。

创建已知滥用的顶级域名 (TLD) 列表

  • 导航至 VPC > DNS firewall(DNS 防火墙),然后点击 Domain lists(域名列表)。(在 CloudFormation 堆栈的 Outputs(输出) 中有一个标记为 R53DNSFWConsole 的快捷链接。)

  • 您可以看到您的自定义域名列表和亚马逊云科技管理的域名列表。

  • 点击 Add domain list(添加域名列表)

创建黑名单域名列表

  • 为该域名列表命名。
  • 按照所示格式输入顶级域名匹配模式(每行一个)(例如 [*.ru])。
  • * 是通配符,表示匹配这些顶级域名下的所有子域。
  • 您可以创建 ALLOW 规则来允许例外情况,可以随时为顶级域名匹配规则编写例外情况,并使其优先级高于 BLOCK 规则。
  • 本示例中,我们将在 VPC 中阻止列表中包含的十个已知的滥用顶级域名。
*.ru
*.cn
*.xyz
*.cyou
*.pw
*.ws
*.gq
*.surf
*.cf
*.ml

检查允许或阻止的域名列表

  • 输入域名后,点击 Add domain list(添加域名列表)

创建域名列表

步骤 2 - 创建规则组

DNS 防火墙规则组是一组规则,用于允许、拒绝或告警与相关域名匹配的 DNS 请求。在这一步,我们将创建一个规则组并关联刚刚创建的域名列表。

  • 在亚马逊云科技管理控制台中,导航至 VPC > DNS firewall(DNS 防火墙) > Rule groups(规则组),然后点击 Create rule group(创建规则组)

创建规则组

  • 为规则组命名并点击 Next(下一步)。

为规则组命名

  • 点击 Add rule(添加规则),然后添加先前创建的域名列表。

添加域名列表

  • 命名规则,从下拉列表中选择先前创建的域名列表,然后选择 BLOCK 作为匹配动作。

选择域名列表

  • 选择 OVERRIDE 作为 Block 动作后的响应类型,输入 dns-firewall-block 作为自定义响应,以及 CNAME 作为记录类型。
  • 响应中的 override 值使我们更容易确定查询被 DNS 防火墙阻止,因为 NXDOMAIN 或 NODATA 响应也可能表示查询记录缺失。CNAME 值可以用来将被阻止的请求重定向到一个指定地址,以提供查看域名解析被阻止的详细信息。
  • TTL 保留为 0,然后点击 Add rule(添加规则)(请勿点击 Next(下一步)。否则,会跳过添加已创建的规则这一步)。添加规则后,点击 Next.

添加规则

  • 您可以在此页面设置规则的优先级,控制规则执行的顺序。域名查询匹配的第一个规则中定义操作的将生效。创建 BLOCK 规则的 ALLOW 例外规则时,也需要在这个页面上提高 ALLOW 规则的优先级。
  • 可以保留默认值,点击 Next(下一步)

检查优先级

  • 添加标签。这一步是可选的。您可以留空并点击 Next(下一步)
  • 在 Review and create(检查并创建)页面上检查确认设置,然后点击 Create rule group(创建规则组)
  • 您现在可以在控制台中看到已创建的规则组,但它目前未关联任何 VPC。

查看已创建的规则组

步骤 3 - 将 DNS 防火墙规则组与出口 VPC 关联

  • 把 VPC 与新创建的规则组关联起来。点击规则组名称,然后关联 VPC。

将规则组与 VPC 关联

  • 从下拉菜单中,选择 EgressVPC 对应的 VPC。选择 VPC 后,点击 Associate 将 VPC 与该规则组关联。

选择 VPC

  • 关联成功后,您可以看到与规则组关联的 VPC。

查看 VPC 关联状态

步骤 4 - 验证域名查询解析

您已部署并创建了一个 DNS 防火墙规则组,配置了一个根据指定域名列表阻止访问的规则,并将此规则与出口 VPC 关联。

  • 导航至 EC2 会话并执行测试脚本。您可以看到 Resolution of domains in Abused Top Level Domains 的状态已从 Allowed(允许)更改为 Blocked(阻止)。
  • 如果仍有一些包含在自定义域名列表中的顶级域名被解析,请仔细核对您在自定义域名列表中输入的域名。确认该自定义域名列表中包含所有需要被阻止的顶级域名的匹配模式(每行一个)。
  • *.ru *.cn *.xyz *.cyou *.pw *.ws *.gq *.surf *.cf *.ml

使用 egress-check.sh 脚本来进行验证

至此,我们已成功创建了 DNS 防火墙域名列表和规则组,并已将它们与 VPC 关联,用于阻止来自已知的滥用顶级域名的流量。

在下一节中,我们将使用亚马逊云科技管理的的域名列表。

DNS Firewall 管理的域名列表

Amazon Route 53 Resolver DNS Firewall 提供了一些与恶意活动或其他潜在威胁有关的域名列表。

所有使用 Route 53 Resolver DNS Firewall 的用户可以根据对应的区域使用亚马逊云科技提供的以下域名列表。

  • AWSManagedDomainsMalwareDomainList:与发送恶意软件、托管恶意软件或分发恶意软件相关的域名。

  • AWSManagedDomainsBotnetCommandandControl:与在计算机网络中控制垃圾邮件的恶意软件有关的域名。

  • AWSManagedAggregateThreatList:与多个 DNS 威胁类有关的域名,包括恶意软件、勒索软件、僵尸网络、间谍软件和 DNS 隧道。这个域名列表可以帮助您阻止多种类型的威胁。

  • AWSManagedDomainsAmazonGuardDutyThreatList:来自 Amazon GuardDuty 的与 DNS 安全威胁相关的域名,例如恶意软件、指令和控制或与加密货币相关活动的域名。

亚马逊云科技管理的域名列表不能下载或浏览。为了保护知识产权,您不能查看或编辑亚马逊云科技管理的域名列表中的域名规范。虽然这似乎有些不方便,但好处是有助于防止攻击者们专门设计绕过公开列表的威胁。因此,我们不公开这些列表。

在本节中,我们不需要手动编写域名列表,而是使用由亚马逊云科技创建和维护的域名列表来过滤出站 DNS 查询。

再次返回 EC2 会话中运行测试脚本,查看 testergress 的输出结果。在 EC2 会话中运行脚本的返回结果显示当前允许解析僵尸网络、恶意软件和 Amazon GuardDuty 威胁列表中的域名。

 
注意:egress-check.sh 脚本使用由亚马逊云科技管理的控制/测试域名,可以用来验证满足亚马逊云科技管理的域名列表相关规则的响应。
 

在接下来的步骤中,我们将创建一个新的规则组,其中包含阻止亚马逊云科技管理的域名列表的规则。

创建规则组

  • 在亚马逊云科技管理控制台中,导航至 Rule Groups (规则组)页面,然后点击 add rule group(添加规则组)。输入规则组名称,点击 Next(下一步)。

创建规则组

  • 点击 Add rule(添加规则)。

添加规则

  • 添加僵尸网络域名列表。输入规则名称,选择 Add AWS managed domain list(添加亚马逊云科技管理的域名列表) 并从域名列表下拉菜单中选择 AWSManagedDomainsBotnetCommandandControl。

创建规则组

  • 选择 Block 操作,选择 OVERRIDE 作为响应类型,并设置 dns-firewall-block 作为响应内容。选择 CNAME 作为记录类型,TTL 值保留为 0,然后点击 Add rule(添加规则)。在某些测试沙盒环境中,如果选择 CNAME,会收到一个规则创建失败的错误提示。如果出现这种情况,您也可以选择 NODATA 或 NXDOMAIN 选项。

添加托管规则组

  • 执行相同的步骤,根据 AWSManagedDomainsAmazonGuardDutyThreatList 和 AWSManagedDomainsMalwareDomainList添加两条规则。添加完成后,规则组中包含的三条规则。点击 Next(下一步)。

添加托管规则组

  • 在 Set rule priority(设置规则优先级)和 Add tags(添加标签)页面保留默认设置,点击 Next(下一步)。在 Review and create(检查并创建)页面确认配置,然后点击 Create rule group(添加规则组)。

创建规则组

  • 新创建的规则组尚未与 VPC 关联。点击 Associate the VPC(关联 VPC)。

创建规则组

  • 选择 EgressVPC,然后点击 Associate(关联)。

创建规则组

我们现在已创建一个新的规则组,并关联了域名列表来阻止列表中的恶意完全限定域名 (FQDN)。

  • 请注意,我们已将两个独立的 DNS 防火墙规则组与出站 VPC 关联。
  • 第一个关联的规则组具有更高的优先级(数字较小)。您可以在 Associated VPCs(关联的 VPC)标签页上查看每个规则组的优先级。
  • 单个 VPC 关联的多个规则组的优先级由它们与 VPC 关联的顺序决定,先关联的规则组具有更高的优先级。
  • 在大多数情况下,将规则合并成一个规则组是管理规则优先级最简单的方法。
  • 登录此次试验使用的 EC2 实例并执行 egress-check.sh 测试新配置。

测试出站结果

  • 如果任何域名检查仍显示为 ALLOWED,请再次检查规则组中的规则。
  • 显示为 ALLOWED 的一个可能原因是本地缓存了域名设置。如果这次执行距上次执行 egress-check.sh 的时间很短,可能会发生这种情况。
  • 您可以运行以下命令来查询此次试验中涉及的域名:cat egress-check.sh | grep controldomain。您可以针对这些域名运行 dig 命令,查看响应是否来自缓存。重复运行 dig 并观察 TTL 值是否减小,直到 TTL 值为 0 后,再次运行 egress-check.sh 验证是否更改为 BLOCKED。

现在,我们已成功使用 DNS 防火墙阻止了指定列表中的域名解析。

配置查询日志记录

要记录源自您的 VPC 中的 DNS 防火墙规则过滤的 DNS 查询操作日志,需要在 Route 53 中配置查询日志记录。

根据最佳实践,我们建议您在您的亚马逊云科技环境中启动日志功能(包括未使用 Route 53 Resolver DNS Firewall 的 VPC 中)。查询日志记录功能会记录基于 DNS 防火墙规则的操作。

 
Route 53 > Resolver(解析器)> Query logging(查询日志)页面上,默认区域为 N. Virginia (us-east-1)。请根据需要选择运行区域。如果您未选择正确的区域,受访问权限影响,您可能会遇到错误。
 

步骤 1 - 设置查询日志记录

  • 配置查询日志记录启动日志功能记录 DNS 防火墙过滤的查询。打开亚马逊云科技管理控制台,导航至 Route 53 > Resolver(解析器)> Query logging(查询日志)进行设置。

配置查询日志记录

  • 点击 Configure query logging(配置查询日志)。

配置查询日志记录

  • 将该配置命名为 [egress-query-logging]。您可以将这些日志保存到 CloudWatch 日志组、S3 存储桶或 Kinesis Data Firehose 传输流。选择 CloudWatch Logs log group(CloudWatch Logs 日志组),并选择将日志发送到一个新建的日志组 /aws/route53/egress-wf-query-logging。

命名配置

  • 将 egressVPC 添加至此查询日志记录配置。

选择要启用查询日志功能的 VPC

  • 点击 Configure query logging(配置查询日志)完成设置。

完成查询日志记录配置

  • 完成配置后,可以查看查询日志记录配置的详细信息。

查看查询日志记录

步骤 2 - 在 CloudWatch 中验证 DNS 查询日志

  • 导航至 EC2 会话,然后执行 nslookup google.cn 命令。由于解析此域名的 DNS 查询被阻止,响应为服务器找不到该域名。

执行 nslookup 测试

  • 导航至 Amazon CloudWatch 控制台。点击 Logs(日志)> Log groups(日志组),然后点击刚才创建的日志组。

查看 CloudWatch 日志组

  • 点击新建的日志组。

查看 CloudWatch 日志组

  • 在搜索栏中搜索 google.cn 并查看结果。

查看 CloudWatch 日志组

  • 日志中显示流量被阻止。响应内容为创建 DNS 规则组时设置的自定义响应:dns-firewall-block。

查看 CloudWatch 日志事件

这一步中,我们使用 CloudWatch Logs 的查询日志功能评验证了 DNS 防火墙规则。

清理资源

删除 DNS 防火墙规则

  • 首先,前往 VPC -> DNS Firewall -> Rule Groups 取消各个规则与 VPC 的关联。

取消 VPC 关联

  • 接下来,从之前创建的两个规则组中删除规则。

删除规则

  • 导航至 VPC -> DNS Firewall -> Rule groups。选择规则组,然后点击 Delete(删除)。

删除规则组

  • 前往 VPC -> DNS Firewall -> Domain Lists。选择域名列表,并点击 Delete(删除)。

删除自定义域名列表

删除 CloudFormation 模板

  • 导航至 CloudFormation 控制台,选择我们在试验过程中创建的 CloudFormation 堆栈,然后点击 Delete(删除)。

删除 CloudFormation 堆栈

  • 该操作将永久性删除堆栈。系统会弹出提示相关提示信息。点击提示中的 Delete(删除),确认删除。

永久删除提示

  • 删除资源可能需要几分钟。堆栈删除后,会显示 DELETE_COMPLETE 状态。

删除完成

删除 CloudWatch 日志

  • 导航至 CloudWatch 控制台,点击 Log groups(日志组),选择此实验过程中创建的日志组,然后点击 Delete(删除)。

删除日志组

  • 接下来导航至 Route 53 > Resolver(解析器)> Query Logging(查询日志),选择 egress-query-logging,然后点击 Delete(删除)。

删除查询日志配置

  • 点击 Stop logging queries(停止记录查询)。

删除查询日志记录

  • 输入 delete,然后点击 Delete(删除)。

删除日志

总结

大功告成!

在本教程中,我们学习了如何使用 Route 53 DNS 防火墙来保证安全的 VPC 出口流量。我们配置了一个自定义的黑名单顶级域名列表,阻止云资源与列表中的域名通信。通过阻止解析相关域名,我们不仅保护了我们的账户,也控制了出口流量的成本。我们还创建了基于亚马逊云科技管理的黑名单域名列表的出口流量控制规则。使用亚马逊云科技管理的域名列表,我们就不必自己创建域名列表。亚马逊云科技的专家会维护和管理这些列表。最后,我们启用了日志记录功能,使我们能够查看被阻止的 DNS 查询流量信息。

本教程中只介绍了控制出口流量的一个方法。通过这种简单的 DNS 流量过滤方法可以提高安全性,有效降低出站流量的成本。如果您对管理安全态势和控制成本的其他方面感兴趣,请查看教程:通过 Amazon Organizations 管理整体资源安全和成本。