AWS Network Firewall for Ingress/Egress Traffic

实验环境

本实验部署了两个 VPC,一个是 SpokeVPC,另一个是 MaliciousVPC。SpokeVPC 有两个私有实例,NAT 网关部署在专用的公有子网中,以允许私有实例与互联网上的资源通信。AWS Network Firewall 部署在需要保护的 Spoke VPC 中。这两个 VPC 无需互相连接。AWS Network Firewall 部署在有权访问互联网网关 (IGW) 的专用防火墙子网中。对于自互联网网关 (IGW) 返回的流量,使用连接到 IGW 的入口路由表返回到防火墙弹性网络接口 (ENI)。这样可以确保流量对称,便于全面检查。我们为本实验预填充了一个部署在 MaliciousVPC 中的 MaliciousInstance,该实例执行各种活动,当您配置安全控制和监控时,将会检测到这些活动。下面的架构图中不包含 MaliciousVPC 及其资源。

本实验中使用的服务

Amazon VPC (Virtual Private Cloud)

Amazon VPC 服务允许用户在 AWS 基础设施中创建和管理隔离的虚拟网络。借助 Amazon VPC,客户可以配置他们自己的 IP 地址范围、创建子网以及设置路由表和网络网关。这样一来,客户可以在企业的云环境中更好地控制网络安全、流量路由和资源访问。

Amazon EC2 (Elastic Compute Cloud)

Amazon EC2 是一项可扩展的计算服务,可让用户在 AWS 云中运行虚拟服务器。借助 EC2,客户可以快速预置和配置实例来满足他们的特定需求,包括选择操作系统、存储和网络设置。该服务提供各种实例类型和定价选项,因此适用于广泛的应用程序,从小规模的 Web 托管到大规模的数据处理和分析均涵盖在内。

Amazon CloudWatch

Amazon CloudWatch 是一项监控服务,适用于 AWS 云资源和在 AWS 上运行的应用程序。您可以使用 Amazon CloudWatch 收集和跟踪指标、收集和监控日志文件,以及设置警报。Amazon CloudWatch 可以监控各种 AWS 资源,例如 Amazon EC2 实例、Amazon DynamoDB 表、Amazon RDS 数据库实例、应用程序和服务生成的自定义指标以及应用程序生成的所有日志文件。您可以使用 Amazon CloudWatch 全面地了解系统的资源利用率、应用程序性能和运行状况。您可以利用这些见解采取应对措施,保证应用程序顺畅运行。

AWS Network Firewall

AWS Network Firewall 是一项高度可用的托管网络防火墙服务,适用于 Amazon Virtual Private Cloud (Amazon VPC)。借助该服务,您可以轻松部署和管理有状态检测、入侵防御和检测以及 Web 筛选,以保护您在 AWS 上的虚拟网络。AWS Network Firewall 可根据您的流量自动扩展,确保高可用性,而无需客户在安全基础设施方面进行额外投资。虽然 AWS Network Firewall 可以保护流向应用程序的网络流量,但 Route 53 DNS Firewall 通过执行筛选并保护流向 Route 53 Resolver 的 DNS 查询流量来对其进行补充。

AWS Network Firewall 包含以下 3 个关键组件:

  • 规则组:保存可重复使用的标准集合,用于检查流量,以及处理与检查标准匹配的数据包和流量。

  • 策略:定义一组可重复使用的无状态和有状态规则组,以及一些策略级别的行为设置。

  • 防火墙:对于受防火墙策略中的检查规则保护的 VPC 强制执行这些规则。每个防火墙都需要一个防火墙策略。防火墙还定义了一些设置,例如如何记录有关网络流量的信息以及防火墙的有状态流量筛选。

Amazon Route 53 Resolver DNS Firewall (DNS Firewall)

Amazon Route 53 Resolver DNS Firewall (DNS Firewall) 帮助您阻止向已知恶意域发出的 DNS 查询,同时允许对可信域进行 DNS 查询。DNS Firewall 保护的主要用途是帮助防止 DNS 泄露您的数据。如果恶意攻击者攻击了 VPC 中的应用程序实例,然后使用 DNS 查找将数据从 VPC 发送到他们控制的域,会发生 DNS 泄露。DNS Firewall 有一个简单的部署模型,让您可以使用托管域列表和自定义域列表直接开始保护您的 VPC。使用 DNS Firewall,您可以筛选和监管出站 DNS 请求。该服务检查 Route 53 Resolver 处理的 DNS 请求,并应用您定义的允许或阻止请求的操作。

Route 53 Resolver DNS Firewall 包含以下 3 个组件:

  • 域列表:定义一个可重复使用的命名域规范集合,用于 DNS 筛选。规则组中的每个规则都需要一个域列表。

  • 规则组:定义一个可重复使用的命名 DNS Firewall 规则集合,用于筛选 DNS 查询。使用筛选规则填充规则组,然后将规则组与一个或多个 VPC 关联。

  • 规则:在 DNS Firewall 规则组中定义用于 DNS 查询的筛选规则。每个规则都指定一个域列表以及一项要对其域与列表中的域规范匹配的 DNS 查询执行的操作。您可以允许、阻止匹配的查询或就其发送提醒。您还可以针对被阻止的查询定义自定义响应。

DNS Firewall 如何与 AWS Network Firewall 协同工作

DNS Firewall 和 AWS Network Firewall 都提供域名筛选,但用于不同类型的流量。同时使用 DNS Firewall 和 AWS Network Firewall,您可以为流经两个不同网络路径的应用程序层流量配置基于域的筛选。

DNS Firewall 提供的筛选用于出站 DNS 查询,这些查询来自 VPC 中的应用程序,并通过 Route 53 Resolver。对于被阻止的域名查询,您还可以将 DNS Firewall 配置为发送自定义响应。

AWS Network Firewall 提供的筛选可同时用于网络和应用程序层流量,但不会显示对 Route 53 Resolver 的查询。

任务 1:验证防火墙资源

由于我们已经为本实验预置了 AWS Network Firewall,所以您的第一个任务是验证防火墙资源。

任务 1.1 - 列出防火墙

验证本实验中预置的防火墙策略和规则组。

  1. 在页面顶部的统一搜索栏中,搜索并选择 VPC。

  2. 在左侧导航窗格的 Network Firewall 下方,选择 Firewalls(防火墙)。

  3. 找到了预配置的防火墙:SpokeVPC-InspectionFirewall

任务 1.2 - 防火墙详细信息

选择 SpokeVPC-InspectionFirewall 防火墙,查看更多详细信息。

在这一步中,请查看以下信息:

  • 该防火墙的当前状态是什么?

  • 与该防火墙关联的策略是什么?

  • 默认的无状态操作是什么?

  • 上面提到的策略中配置了哪些有状态规则?

选择 Firewall details(防火墙详细信息)选项卡,此选项卡提供了以下详细信息:

  • 防火墙终端节点和状态的详细信息。

  • 显示了流/提醒类型和 CloudWatch 日志组配置的日志记录配置。

  • 标签。

任务 1.3 - 防火墙监控详细信息

选择 Monitoring(监控)选项卡,此选项卡提供了有关防火墙指标的以下详细信息,例如:

  • 防火墙无状态检查接收/通过/丢弃了多少数据包?

  • 防火墙有状态检查接收/通过/丢弃了多少数据包?

任务 1.4 - 列出并验证 EC2 实例

  1. 在页面顶部的统一搜索栏中,搜索并选择 EC2。

  2. 在左侧导航窗格的 Instances(实例)下方,选择 Instances(实例)。

  3. 选择实例 SpokeVPC-TestInstance1。

  4. 从导航栏中选择 Connect(连接)。

  5. 选择 Session Manager(会话管理器)选项卡后,选择 Connect(连接)。

使用会话管理器连接

终端会话将在新的浏览器标签页中打开。现在,您已连接至 EC2 实例。您可以选择右上角的 Terminate(终止)终止会话(浏览器标签页)。

任务完成: 您已成功验证了所有 VPC 和防火墙资源。

任务 2:出口 Web 筛选

在此任务中,您将使用 AWS Network Firewall 以通过本实验中之前预置的资源筛选出站 Web 流量。

任务 2.1 - 列出防火墙和规则组

在此任务中,验证规则组 NetworkFirewall-DomainAllow-RuleGroup。

  1. 在页面顶部的统一搜索栏中,搜索并选择 VPC。

  2. 在左侧导航窗格的 Network Firewall 下方,选择 Network Firewall rule groups(Network Firewall 规则组)。

  3. 选择 NetworkFirewall-DomainAllow-RuleGroup,查看更多详细信息。

您可以观察到有状态规则组 NetworkFirewall-DomainAllow-RuleGroup 允许与域 .amazon.com 和 .amazonaws.com 匹配的流量。您可以在此处添加更多域以进行测试,也可以将其保留为默认域。

任务 2.2 - 列出并验证 EC2 实例

在本实验的设置过程中,我们在 SpokeVPC 的私有子网中预先创建了名为 SpokeVPC-TestInstance1 和 SpokeVPC-TestInstance2 的 EC2 实例。在此任务中,您将验证 EC2 实例详细信息。

  1. 在页面顶部的统一搜索栏中,搜索并选择 EC2。

  2. 在左侧导航窗格的 Instances(实例)下方,选择 Instances(实例)。

  3. 选择实例 SpokeVPC-TestInstance1。

  4. 从导航栏中选择 Connect(连接)。

  5. 选择 Session Manager(会话管理器)选项卡后,选择 Connect(连接)。

终端会话将在新的浏览器标签页中打开。

现在您已准备好测试防火墙策略了。

任务 2.3 - 验证域筛选

在 SpokeVPC-TestInstance1 实例上,运行以下命令:

curl https://aws.amazon.com --max-time 5

示例输出: 您观察 curl 命令的输出。请注意,curl 命令已成功完成。

sh-4.2$ curl https://aws.amazon.com --max-time 5
<!doctype html>
<html class="no-js aws-lng-en_US aws-with-target" lang="en-US" data-static-assets="https://a0.awsstatic.com" data-js-version="1.0.545" data-css-version="1.0.485">
 <head>
  <meta property="og:type" content="company">
  <meta property="og:url" content="https://aws.amazon.com/">
  <meta property="og:image" content="https://a0.awsstatic.com/libra-css/images/logos/aws_logo_smile_1200x630.png">
  <meta property="og:site_name" content="Amazon Web Services, Inc.">
  <meta name="google-site-verification" content="XHghG81ulgiW-3EylGcF48sG28tBW5EH0bNUhgo_DrU">
  <meta name="msvalidate.01" content="6F92E52A288E266E30C2797ECB5FCCF3">
  <link rel="stylesheet" href="https://a0.awsstatic.com/libra-css/css/1.0.485/style-awsm.css">
  <script type="application/json" id="aws-page-settings">

现在,尝试使用默认不允许使用的另一个域再次测试该命令。

在 SpokeVPC-TestInstance1 实例上,运行以下命令:

curl -vvv https://google.com -o /dev/null --max-time 5

示例输出: 请注意,curl 命令最终超时,没有返回任何数据。

sh-4.2$ curl -vvv https://google.com -o /dev/null --max-time 5
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0*   Trying 142.251.33.110:443...
* Connected to google.com (142.251.33.110) port 443 (#0)
* ALPN: offers h2,http/1.1
* Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
} [5 bytes data]
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
} [512 bytes data]
*  CAfile: /etc/pki/tls/certs/ca-bundle.crt
*  CApath: none
  0     0    0     0    0     0      0      0 --:--:--  0:00:04 --:--:--     0* Connection timed out after 5000 milliseconds
  0     0    0     0    0     0      0      0 --:--:--  0:00:05 --:--:--     0
* Closing connection 0
curl: (28) Connection timed out after 5000 milliseconds

任务 2.4 - 更新域规则组

  1. 在页面顶部的统一搜索栏中,搜索并选择 VPC。

  2. 在左侧导航窗格的 Network Firewall 下方,选择 Network Firewall rule groups(Network Firewall 规则组)。

  3. 选择 NetworkFirewall-DomainAllow-RuleGroup 规则组。

  4. 向下滚动到 Domains (2)(域(2))部分,然后选择 Edit(编辑)。

  5. 在 Edit domains for NetworkFirewall-DomainAllow-RuleGroup(编辑 NetworkFirewall-DomainAllow-RuleGroup 的域)弹出窗口中,在 Domain names(域名)下方添加 .google.com。

  6. 选择 Save(保存)。

任务 2.5 - 验证域更新成功

现在您有 3 个域可以在此规则组中使用。

对 SpokeVPC-TestInstance1 实例再次运行以下命令:

curl -vvv https://google.com -o /dev/null --max-time 5

示例输出: 请注意,curl 现已成功完成,您已允许在规则组中使用该域。

************************
**** EXAMPLE OUTPUT ****
************************

sh-4.2$ curl -vvv https://google.com -o /dev/null --max-time 5
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0*   Trying 142.251.33.78:443...
* Connected to google.com (142.251.33.78) port 443 (#0)
* ALPN: offers h2,http/1.1
* Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
} [5 bytes data]
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
} [512 bytes data]
*  CAfile: /etc/pki/tls/certs/ca-bundle.crt
*  CApath: none
{ [5 bytes data]
* TLSv1.2 (IN), TLS handshake, Server hello (2):
{ [96 bytes data]
* TLSv1.2 (IN), TLS handshake, Certificate (11):
{ [6482 bytes data]
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
{ [149 bytes data]
* TLSv1.2 (IN), TLS handshake, Server finished (14):
{ [4 bytes data]
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
} [70 bytes data]
* TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):
} [1 bytes data]
* TLSv1.2 (OUT), TLS handshake, Finished (20):
} [16 bytes data]
* TLSv1.2 (IN), TLS change cipher, Change cipher spec (1):
{ [1 bytes data]
* TLSv1.2 (IN), TLS handshake, Finished (20):
{ [16 bytes data]
* SSL connection using TLSv1.2 / ECDHE-ECDSA-AES128-GCM-SHA256
* ALPN: server accepted h2
* Server certificate:
*  subject: CN=*.google.com
*  start date: May 22 08:17:22 2023 GMT
*  expire date: Aug 14 08:17:21 2023 GMT
*  subjectAltName: host "google.com" matched cert's "google.com"
*  issuer: C=US; O=Google Trust Services LLC; CN=GTS CA 1C3
*  SSL certificate verify ok.
} [5 bytes data]
* using HTTP/2
* h2h3 [:method: GET]
* h2h3 [:path: /]
* h2h3 [:scheme: https]
* h2h3 [:authority: google.com]
* h2h3 [user-agent: curl/8.0.1]
* h2h3 [accept: */*]
* Using Stream ID: 1 (easy handle 0x864180)
} [5 bytes data]
> GET / HTTP/2
> Host: google.com
> user-agent: curl/8.0.1
> accept: */*
>
{ [5 bytes data]
< HTTP/2 301
< location: https://www.google.com/
< content-type: text/html; charset=UTF-8
< content-security-policy-report-only: object-src 'none';base-uri 'self';script-src 'nonce-MNvpA-8Q_2WZmYfQzKH8cA' 'strict-dynamic' 'report-sample' 'unsafe-eval' 'unsafe-inline' https: http:;report-uri https://csp.withgoogle.com/csp/gws/other-hp
< date: Fri, 16 Jun 2023 19:05:38 GMT
< expires: Sun, 16 Jul 2023 19:05:38 GMT
< cache-control: public, max-age=2592000
< server: gws
< content-length: 220
< x-xss-protection: 0
< x-frame-options: SAMEORIGIN
< alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000
<
{ [5 bytes data]
100   220  100   220    0     0   3470      0 --:--:-- --:--:-- --:--:--  3492
* Connection #0 to host google.com left intact  

任务2.6 验证 CloudWatch 中捕获的提醒日志

事件发生后,日志可能需要 5 到 10 分钟才能显示。

  1. 在页面顶部的统一搜索栏中,搜索并选择 CloudWatch

  2. 在左侧导航窗格的 Logs(日志) 下方,选择 Log groups(日志组)

  3. 选择 /NetworkFirewall/Alert 日志组。

  4. 选择最新的日志流 /aws/network-firewall/alert/SpokeVPC-InspectionFirewall_

您可以观察到捕获的提醒以及日志组下的所有详细信息。

  1. Filter events(筛选事件) 对话框中输入 google.com,查找 google.com 被阻止的录入事件。

可选 - 验证 ICMP 提醒

您可能已经注意到,在 Network Firewall 规则组下,我们还为本实验预置了另一个规则组 NetworkFirewall-IcmpAlert-RuleGroup。此规则组允许所有 ICMP 流量通过,但是要在日志中记录流量。

若要测试此规则组,对您的 EC2 实例运行以下命令:

ping 1.1.1.1 -c 5

示例输出

ping 命令的屏幕截图示例如下所示:

sh-4.2$ ping 1.1.1.1 -c 5
PING 1.1.1.1 (1.1.1.1) 56(84) bytes of data.
64 bytes from 1.1.1.1: icmp_seq=1 ttl=31 time=10.3 ms
64 bytes from 1.1.1.1: icmp_seq=2 ttl=31 time=9.15 ms
64 bytes from 1.1.1.1: icmp_seq=3 ttl=31 time=8.98 ms
64 bytes from 1.1.1.1: icmp_seq=4 ttl=31 time=9.01 ms
64 bytes from 1.1.1.1: icmp_seq=5 ttl=31 time=18.8 ms

--- 1.1.1.1 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4005ms
rtt min/avg/max/mdev = 8.985/11.276/18.838/3.816 ms

使用 CloudWatch 查看日志。您可以使用本任务前面提供的如何导航到 Cloudwatch 并查看日志的步骤。

任务 3:出口 DNS 查询筛选

在上一个任务中,您使用 AWS Network Firewall 允许对某些域的访问。AWS Network Firewall 检查应用程序的网络流量,并对流量执行允许、拒绝操作或发送相关提醒。这些操作是通过检查 HTTP、TCP/UDP 或 IP 的协议标头来完成的。但是,AWS Network Firewall 不会检查由 Route 53 Resolver 处理的某些域的 DNS 查询。为了提供更全面的安全性,您还希望阻止对某些域的 DNS 解析。这可以使用 Route 53 DNS Firewall 来实现。

在此任务中,您将使用 Amazon Route 53 DNS Firewall 来阻止某些域,并将其应用于之前在实验设置期间预置的 VPC。

任务 3.1 - 创建 DNS 防火墙域列表

在此任务中,您将创建域列表。此域列表将指定您要阻止其 DNS 查询的域。

  1. 在页面顶部的统一搜索栏中,搜索并选择 VPC。

  2. 在左侧导航窗格的 DNS firewall(DNS 防火墙)下方,选择 Domain lists(域列表)。

  3. 在 Owned domain lists(拥有的域列表)部分下方,选择 Add domain list(添加域列表),然后进行以下配置:

    • Domain list name(域列表名称):NetworkFirewall-blocked-domains-list。

    • Enter one domain per line(每行输入一个域)*.google.comgoogle.com

  4. 选择 Add domain list(添加域列表)。

任务 3.2 - 创建规则组

  1. 在左侧导航窗格的 DNS firewall(DNS 防火墙)下方,选择 Rule groups(规则组)。

  2. 在启动屏幕上,选择 Create rule group(创建规则组)。

  3. 在 Add rule group(添加规则组)页面上,从 Rule group details(规则组详细信息)下方为 Name(名称)指定 NetworkFirewall-block-domains-rule-group。

  4. 选择 Next(下一步)。

  5. 在 Add rules - optional(添加规则 - 可选)页面上,选择 Add rule(添加规则)。

  6. 在 Add rules - optional(添加规则 - 可选)页面上:

    • 对于 Name(名称),输入 NetworkFirewall-block-domains-rule。

    • 对于 Domain list(域列表),选择 Add my own domain list(添加我自己的域列表)。

    • 对于 Choose or create a new domain list(选择或创建新的域列表),从下拉菜单中选择 NetworkFirewall-blocked-domains-list。

    • 对于 Choose an action to take when a DNS query fits the matches(选择当 DNS 查询符合匹配项时要采取的操作),从下拉菜单中选择 BLOCK(阻止)。

    • 对于 Select a response to send for the BLOCK action(为阻止操作选择要发送的响应),选择 NXDOMAIN。

  7. 选择 Add rule(添加规则)。

  8. 选择 Next(下一步)。

  9. 在 Set rule priority - optional(设置规则优先级 - 可选)页面上,您可以设置规则优先级,但是由于您仅有 1 条规则,将保留默认值。

  10. 选择 Next(下一步)。

  11. 在 Add tags - optional(添加标签 - 可选)页面上,选择 Next(下一步)。

  12. 选择 Create rule group(创建规则组)。

任务 3.3 - 将规则组与 VPC 相关联

  1. 选择 NetworkFirewall-block-domains-rule-group,向下滚动到 Associated VPCs(关联的 VPC)选项卡。

  2. 选择 Associate VPC(关联 VPC)。

  3. 从下拉列表中选择 vpc-******* (SpokeVPC)。

  4. 选择 Associate(关联)。

  5. 此过程需要几分钟时间,您可以在 Status(状态)栏中看到进度。一旦状态变为 Complete(完成),请继续下一个任务。

任务 3.4 - 配置 DNS 查询日志记录

  1. 在页面顶部的统一搜索栏中,搜索并选择 Route 53。

  2. 在左侧导航窗格的 Resolver 下方,选择 Query logging(查询日志记录)。

  3. 默认情况下,在 N. Virginia (us-east-1)(弗吉尼亚北部 (us-east-1))区域中,选择 Route 53 > Resolver > Query logging(Route 53 > Resolver > 查询日志记录)。确保从运行本实验的区域访问查询日志记录。如果您没有从下拉列表中选择合适的区域,根据访问权限,您可能会遇到错误。

  4. 选择 Configure query logging(配置查询日志记录)。

  5. 在 Configure query logging(配置查询日志记录)页面上:

    • 对于 Query logging configuration name(查询日志记录配置名称),输入 NetworkFirewall-dnsfw-queries。

    • 对于 Destination for query logs(查询日志的目的地),选择 CloudWatch Logs log group(CloudWatch Logs 日志组)。

    • 对于 CloudWatch Logs log groups(CloudWatch Logs 日志组),选择 Create log group(创建日志组)。

    • 对于 New log group name(新日志组名称),输入 /aws/route53/NetworkFirewall-dnsfw-queries-loggroup

    • 对于 VPCs to log queries for - optional(要记录查询的 VPC - 可选),选择 Add VPC(添加 VPC)。

    • 选择 SpokeVPC。

    • 选择 Add(添加)。

  6. 选择 Configure query logging(配置查询日志记录)。

任务 3.5 - 验证域名查询解析

  1. 在页面顶部的统一搜索栏中,搜索并选择 EC2。

  2. 在左侧导航窗格的 Instances(实例)下方,选择 Instances(实例)。

  3. 选择实例 SpokeVPC-TestInstance1。

  4. 从导航栏中选择 Connect(连接)。

  5. 选择 Session Manager(会话管理器)选项卡后,选择 Connect(连接)。终端会话将在新的浏览器标签页中打开。

  6. 在 SpokeVPC-TestInstance1 实例上,运行以下命令:

    nslookup www.google.com
    

    示例输出:

    sh-4.2$ nslookup www.google.com
    Server:         10.1.0.2
    Address:        10.1.0.2#53
    
    ** server can't find www.google.com: NXDOMAIN
    
    sh-4.2$
    
  7. 在 SpokeVPC-TestInstance1 实例上,运行下面的 curl 命令:

    curl -vvv https://google.com -o /dev/null --max-time 5
    

    示例输出:

    sh-4.2$ curl -vvv https://google.com -o /dev/null --max-time 5
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
      0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0* Could not resolve host: google.com
    * Closing connection 0
    curl: (6) Could not resolve host: google.com
    sh-4.2$
    
  8. 使用不属于被阻止的域的另一个域再次测试:

nslookup www.amazon.com

示例输出:

 ************************
 **** EXAMPLE OUTPUT ****
 ************************
 
 sh-4.2$ nslookup www.amazon.com
 Server:         10.1.0.2
 Address:        10.1.0.2#53

 Non-authoritative answer:
 www.amazon.com  canonical name = tp.47cf2c8c9-frontier.amazon.com.
 tp.47cf2c8c9-frontier.amazon.com        canonical name = d3ag4hukkh62yn.cloudfront.net.
 Name:   d3ag4hukkh62yn.cloudfront.net
 Address: 99.84.79.137
 Name:   d3ag4hukkh62yn.cloudfront.net
 Address: 2600:9000:2163:c000:7:49a5:5fd2:8621
 Name:   d3ag4hukkh62yn.cloudfront.net
 Address: 2600:9000:2163:ca00:7:49a5:5fd2:8621
 Name:   d3ag4hukkh62yn.cloudfront.net
 Address: 2600:9000:2163:d600:7:49a5:5fd2:8621
 Name:   d3ag4hukkh62yn.cloudfront.net
 Address: 2600:9000:2163:e00:7:49a5:5fd2:8621
 Name:   d3ag4hukkh62yn.cloudfront.net 
 Address: 2600:9000:2163:2400:7:49a5:5fd2:8621
 Name:   d3ag4hukkh62yn.cloudfront.net
 Address: 2600:9000:2163:3400:7:49a5:5fd2:8621
 Name:   d3ag4hukkh62yn.cloudfront.net
 Address: 2600:9000:2163:9600:7:49a5:5fd2:8621
 Name:   d3ag4hukkh62yn.cloudfront.net
 Address: 2600:9000:2163:b200:7:49a5:5fd2:8621

任务 3.6 - 在 CloudWatch 中验证 DNS 查询日志

事件发生后,日志可能需要 5 到 10 分钟才能显示。

  1. 在页面顶部的统一搜索栏中,搜索并选择 CloudWatch

  2. 在左侧导航窗格的 Logs(日志) 下方,选择 Log groups(日志组)

  3. 选择 /aws/route53/NetworkFirewall-dnsfw-queries-loggroup 日志组。

  4. 您可以观察到捕获的提醒以及日志组下的所有详细信息。

  5. 选择最新的日志流。

  6. Filter events(筛选事件) 对话框中输入 www.google.com,查找 www.google.com 被阻止的录入事件。

  7. 您看到一个筛选后的条目列表,这些条目与对该域的查询相关。

  8. 查询可能需要几分钟才能显示出来。等待一段时间,查看与您的查询相关的条目。

通过此任务,您可以看到 Route 53 DNS Firewall 如何对您的 AWS Network Firewall 部署进行补充。它确保您在 DNS 和应用程序级别保护流量。

任务完成

您已经成功使用 Amazon Route 53 DNS Firewall 阻止了某些 DNS 查询,进而阻止对这些域的访问。


任务 4:在 AWS Network Firewall 中使用开源规则

在此任务中,了解如何在 AWS Network Firewall 中利用开源/ Suricata 兼容规则。在此例中,从社区中选择 Suricata 特定规则,例如可在此处找到的 Proofpoint OPEN 规则集。有关 Proofpoint 开源和商业规则的更多详细信息,请查看其他资源。

根据要求,可在多种部署模型中设置 AWS Network Firewall。要获得有关部署模型和如何设置防火墙的更多详细信息,请查看其他资源。

任务 4.1 - 下载/克隆规则

对于本实验,您需要从 Proofpoint 的 OPEN 规则中选择“User-Agents”类别,该类别的规则可用于检测可疑的用户代理。该类别的规则可在此处获得。

要下载这些规则,请执行以下选项之一:

  • 您可以右键单击 > Save Link As…(> 链接另存为…),然后将规则文件保存在本地计算机上。

  • 使用以下命令,对本地计算机执行 wget

    wget https://rules.emergingthreats.net/open/suricata-5.0/rules/emerging-user_agents.rules -O emerging-user-agents.rules
    
  • 使用以下命令,对本地计算机执行 curl

    curl https://rules.emergingthreats.net/open/suricata-5.0/rules/emerging-user_agents.rules -o emerging-user-agents.rules
    
  • 在 Windows 计算机中,您可以使用 Invoke-WebRequest 命令:

    Invoke-WebRequest https://rules.emergingthreats.net/open/suricata-5.0/rules/emerging-user_agents.rules -OutFile $env:USERPROFILE\Downloads\emerging-user-agents.rules
    

下载后,记下保存规则的位置,以便在接下来的步骤中使用。

任务 4.2 - 使用 Suricata 兼容规则创建规则组

  1. 在页面顶部的统一搜索栏中,搜索并选择 VPC。

  2. 在左侧导航窗格的 Network Firewall 下方,选择 Create rule group(创建规则组)。

  3. 选择 Create rule group(创建规则组)。

  4. 在 Choose rule group type(选择规则组类型)页面的 Rule group type(规则组类型)部分中:

    • 对于 Rule group type(规则组类型),选择 Stateful rule group(有状态规则组)。

    • 对于 Rule group format(规则组格式),从下拉菜单中选择 Suricata compatible rule string(Suricata 兼容规则字符串)。

    • 对于 Rule evaluation order(规则评估顺序),选择 Action order(操作顺序)。

    • 选择 Next(下一步)。

  5. 在 Describe rule group(描述规则组)页面的 Rule group details(规则组详细信息)部分中:

    • 对于 Name(名称),输入 NetworkFirewall-Emerging-User-Agents-Rules-RuleGroup

    • 对于 Description - optional(描述 - 可选),输入 Emerging user agents rules rule group

    • 对于 Capacity(容量),输入 300

    • 选择 Next(下一步)。

  6. 在 Configure rules(配置规则)页面的 Rule variables - optional(规则变量 - 可选)部分中:

    • 在 IP set variables(IP 集变量)部分中:

      • 对于 Variable name(变量名称),输入 HOME_NET

      • 对于 Values(值),输入 10.0.0.0/8

      • HOME_NET 规则组变量用于在有状态域列表中定义符合处理条件的源 IP 范围,以及可选的 Suricata 兼容 IPS 规则组。默认情况下,该变量设置为用于部署防火墙终端节点的 VPC CIDR。

    • 在 Suricata compatible rule string(Suricata 兼容规则字符串)部分的文本输入字段中,复制并粘贴您在任务 4.1 中下载的规则,其中包含新兴威胁用户代理规则。

    • 选择 Next(下一步)。

  7. 在 Configure advanced settings - optional(配置高级设置 - 可选)页面上,将所有项保留为默认值,然后选择 Next(下一步)。

  8. 在 Add tags - optional(添加标签 - 可选)页面上,将所有项保留为默认值,然后选择 Next(下一步)。

  9. 在 Review and create(查看并创建)页面上,选择 Create rule group(创建规则组)。

任务 4.3 - 修改防火墙策略,以将流量添加和转发到有状态规则组

  1. 在左侧导航窗格的 Network Firewall 下方,选择 Firewall policies(防火墙策略)。

  2. 选择 SpokeVPC-InspectionFirewall-Policy,查看详细信息。

  3. 添加在上一任务中创建的新规则组之前,请先删除现有的规则组。

    • 在 Stateful rule groups(有状态规则组)部分,选择这两个规则:

      • NetworkFirewall-DomainAllow-RuleGroup

      • NetworkFirewall-IcmpAlert-RuleGroup

    • 从 Actions(操作)下拉菜单中,选择 Disassociate from policy(取消与策略的关联),然后选择 Disassociate from policy(取消与策略的关联)。

  4. 现在添加您在上一个任务中创建的新规则组。

    • 在 Stateful rule groups(有状态规则组)部分中,从 Actions(操作)下拉菜单中选择 Add unmanaged stateful rule groups(添加非托管的有状态规则组)。

    • 选择 NetworkFirewall-Emerging-User-Agents-Rules-RuleGroup

    • 选择 Add stateful rule group(添加有状态规则组)。

  5. 为了确保将流量转发到有状态检查引擎,需要添加一个自定义的无状态规则组来覆盖相应的流量,或者在防火墙策略中为转发到有状态规则组的所有无状态流量设置一个默认操作。对于本实验,您可以将 Stateless default actions(无状态默认操作)下的设置保留为 Forward to stateful rule groups(转发至有状态规则组)。

任务 4.4 - 测试和监控

  1. 如需生成相应的流量,您必须拥有计算资源,例如,受 AWS Network Firewall 保护的 EC2 实例。

  2. 对于此任务,本实验已预先创建了一个 EC2 实例,用于针对上一任务中导入的 Proofpoint OPEN 规则集(检测可疑的用户代理)的签名 # 2029569 生成请求。

  3. 在页面顶部的统一搜索栏中,搜索并选择 EC2。

  4. 在左侧导航窗格的 Instances(实例)下方,选择 Instances(实例)。

  5. 选择实例 SpokeVPC-TestInstance1

  6. 从导航栏中选择 Connect(连接)。

  7. 选择 Session Manager(会话管理器)选项卡后,选择 Connect(连接)。

  8. 终端会话将在新的浏览器标签页中打开。

  9. SpokeVPC-TestInstance1 实例上,运行以下命令:

    wget -U "easyhttp client" http://www.amazon.com -o /dev/null
    

    此命令将生成一个用户代理为 easyhttp client 的 HTTP GET 请求。要查看日志,请导航到 CloudWatch 控制台。

  10. 在页面顶部的统一搜索栏中,搜索并选择 CloudWatch。

  11. 在左侧导航窗格的 Logs(日志)下方,选择 Log groups(日志组)。

  12. 选择 /NetworkFirewall/Alert 日志组。

  13. 选择最新的日志流 /aws/network-firewall/alert/SpokeVPC-InspectionFirewall_

  14. 在 Filter events(筛选事件)对话框中输入 easyhttp client,查找具有 “signature”: “ET USER_AGENTS Observed Suspicious UA (easyhttp client)” 的录入事件。

下面对如何将 Suricata 规则引用导入 AWS Network Firewall 做个总结。

在继续执行下一任务之前,解除 NetworkFirewall-Emerging-User-Agents-Rules-RuleGroup 与防火墙策略的关联,然后将 NetworkFirewall-DomainAllow-RuleGroupNetworkFirewall-IcmpAlert-RuleGroup 重新关联/添加到防火墙策略,步骤如下:

  1. 要移除规则组,请选择 NetworkFirewall-Emerging-User-Agents-Rules-RuleGroup

  2. 从 Actions(操作)下拉菜单中,选择 Disassociate from policy(取消与策略的关联),然后选择 Disassociate from policy(取消与策略的关联)。

  3. 要添加新规则组,请从 Actions(操作)下拉菜单中选择 Add unmanaged stateful rule groups(添加非托管的有状态规则组)。

  4. 在 Stateful rule group(有状态规则组)下方选择以下规则组:

    • NetworkFirewall-DomainAllow-RuleGroup

    • NetworkFirewall-IcmpAlert-RuleGroup

  5. 选择 Add stateful rule group(添加有状态规则组)。

任务完成:您已经成功地在 AWS Network Firewall 中导入并利用开源/Suricata 兼容规则来检测可疑流量。

任务 5:利用 AWS Network Firewall 部署进行威胁搜寻

此任务向您展示如何快速使用 AWS Network Firewall 查找可能表明基础设施遭受攻击的可疑网络活动。在此任务中,查找正在通过网络端口 443 传输的非 TLS TCP 流量,这种类型的网络流量并不常见,应该进行调查。如需生成一些相应流量供您调查,本实验已经部署了受 AWS Network Firewall 保护的计算资源以及恶意主机。

任务 5.1 - 创建防火墙规则组,用于检测通过 TLS 端口的非 TLS 流量

  1. 在页面顶部的统一搜索栏中,搜索并选择 VPC

  2. 在左侧导航窗格的 Network Firewall 下方,选择 Network Firewall rule groups(Network Firewall 规则组)。

  3. 选择 Create rule group(创建规则组)。

  4. Choose rule group type(选择规则组类型)页面的 Rule group type(规则组类型)部分中:

    • 对于 Rule group type(规则组类型),选择 Stateful rule group(有状态规则组)。

    • 对于 Rule group format(规则组格式),从下拉菜单中选择 Suricata compatible rule string(Suricata 兼容规则字符串)。

    • 对于 Rule evaluation order(规则评估顺序),选择 Action order(操作顺序)。

    • 选择 Next(下一步)。

  5. Describe rule group(描述规则组)页面的 Rule group details(规则组详细信息)部分中:

    • 对于 Name(名称),输入 NetworkFirewall-Suricata-Detect-Non-TLS-Over-TLS-Ports-RuleGroup

    • 对于 Description - optional(描述 - 可选),输入 This rule will detect non-TLS traffic over ports 443

    • 对于 Capacity(容量),输入 10

    • 选择 Next(下一步)。

  6. Configure rules(配置规则)页面的 Rule variables - optional(规则变量 - 可选)部分中:

    • IP set variables(IP 集变量)部分中:

      • 对于 Variable name(变量名称),输入 HOME_NET

      • 对于 Values(值),输入 10.0.0.0/8

      • HOME_NET 规则组变量用于在有状态域列表中定义符合处理条件的源 IP 范围,以及可选的 Suricata 兼容 IPS 规则组。默认情况下,该变量设置为用于部署防火墙终端节点的 VPC CIDR。

    • Suricata compatible rule string(Suricata 兼容规则字符串)部分的文本输入字段中,复制并粘贴以下 Suricata 规则:

      alert tcp any any <> any 443 (msg:"SURICATA Port 443 but not TLS"; flow:to_server,established; app-layer-protocol:!tls; sid:2271003; rev:1;)
      

      对于通过端口 443 从任意方向 <> 的任何接口的 TCP 流量,此规则都将发出提醒,未使用 !tls 协议。

    • 选择 Next(下一步)。

  7. Configure advanced settings - optional(配置高级设置 - 可选)页面上,将所有项保留为默认值,然后选择 Next(下一步)。

  8. Add tags - optional(添加标签 - 可选)页面上,将所有项保留为默认值,然后选择 Next(下一步)。

  9. Review and create(查看并创建)页面上,选择 Create rule group(创建规则组)。

任务 5.2 - 将新建的防火墙规则组添加到现有防火墙策略

  1. 在左侧导航窗格的 Network Firewall 下方,选择 Firewall policies(防火墙策略)。

  2. 选择 SpokeVPC-InspectionFirewall-Policy,开始编辑。

  3. Stateful rule groups(有状态规则组)部分下方,从 Actions(操作)下拉菜单中选择 Add unmanaged stateful rule groups(添加非托管的有状态规则组)。

  4. 选择 NetworkFirewall-Suricata-Detect-Non-TLS-Over-TLS-Ports-RuleGroup

  5. 选择 Add stateful rule group(添加有状态规则组)。

    • 为了确保将流量转发到有状态检查引擎,需要添加一个自定义的无状态规则组来覆盖相应的流量,或者在防火墙策略中为转发到有状态规则组的所有无状态流量设置一个默认操作。对于本实验,您可以将 Stateless default actions(无状态默认操作)下的设置保留为 Forward to stateful rule groups(转发至有状态规则组)。

任务 5.3 - 调查时间

  1. 在左侧导航窗格的 Network Firewall 下方,选择 Firewalls(防火墙)。

  2. 选择 SpokeVPC-InspectionFirewall,查看详细信息。

  3. 选择 Monitoring(监控)选项卡,查看流量是否流经 Network Firewall。

    • 流量可能需要几分钟才能出现,点击右下角的图标刷新按钮,直到看到一些流量。

  4. 在页面顶部的统一搜索栏中,搜索并选择 CloudWatch

  5. 在左侧导航窗格的 Logs(日志)下方,选择 Log groups(日志组)。

  6. 选择 /NetworkFirewall/Alert 日志组。

  7. 选择最新的日志流 /aws/network-firewall/alert/SpokeVPC-InspectionFirewall_

  8. Filter events(筛选事件)对话框中输入 SURICATA,查找签名设置为 SURICATA Port 443 but not TLS、操作设置为 allowed 的录入事件。

    • 日志可能需要 10-15 分钟才会显示在 CloudWatch 中,但当它显示时,您可能会看到多个日志流。深入了解其中几个日志,并调查提醒涉及的内容。您是否看到任何可疑内容? 实际使用的是什么协议?

  9. 您发现一些实例正在通过端口 443 传输非 TLS 流量,现在您可以做哪些更改来阻止该活动? 看看您创建的用于检测非 TLS 流量的 Suricata 规则,更改什么参数会丢弃流量?

    • 在页面顶部的统一搜索栏中,搜索并选择 VPC

    • 在左侧导航窗格的 Network Firewall 下方,选择 Network Firewall rule groups(Network Firewall 规则组)。

    • 选择 NetworkFirewall-Suricata-Detect-Non-TLS-Over-TLS-Ports-RuleGroup 规则组。

    • Rules(规则)部分下方,选择 Edit(编辑)。

    • 将现有规则修改如下:

      drop tcp any any <> any 443 (msg:"SURICATA Port 443 but not TLS"; flow:to_server,established; app-layer-protocol:!tls; sid:2271003; rev:1;)
      
    • 选择 Save rule group(保存规则组)。

  10. 在页面顶部的统一搜索栏中,搜索并选择 CloudWatch

  11. 在左侧导航窗格的 Logs(日志)下方,选择 Log groups(日志组)。

  12. 选择 /NetworkFirewall/Alert 日志组。

  13. 选择最新的日志流 /aws/network-firewall/alert/SpokeVPC-InspectionFirewall_

  14. 在最新日志流中,搜索签名设置为 SURICATA Port 443 but not TLS、操作设置为 blocked 的录入事件。

任务完成

您已经成功使用 AWS Network Firewall 有效阻止了不必要的网络活动。此外,由于集成了 Suricata 规则,为您提供了对 AWS VPC 网络的极大灵活性与可控性。