<?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"><channel><title><![CDATA[Brandon's Cloud Blog]]></title><description><![CDATA[Documenting my experiences through cloud technologies. ]]></description><link>https://hashnode.brandonscloud.com</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1672851267715/YS88FCMY3.png</url><title>Brandon&apos;s Cloud Blog</title><link>https://hashnode.brandonscloud.com</link></image><generator>RSS for Node</generator><lastBuildDate>Thu, 15 Oct 2026 04:48:44 GMT</lastBuildDate><atom:link href="https://hashnode.brandonscloud.com/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Local Administrator Password Solution (LAPS)]]></title><description><![CDATA[Problem
When you set up a new computer or Windows server, Systems Administrators have been notoriously guilty of using the same password, with a local administrator account, and never changing it. 
Face it. We are all guilty of it. Password reuse is ...]]></description><link>https://hashnode.brandonscloud.com/local-administrator-password-solution-laps</link><guid isPermaLink="true">https://hashnode.brandonscloud.com/local-administrator-password-solution-laps</guid><category><![CDATA[Windows]]></category><category><![CDATA[Active Directory]]></category><category><![CDATA[Security]]></category><category><![CDATA[cybersecurity]]></category><dc:creator><![CDATA[Brandon Bowman]]></dc:creator><pubDate>Wed, 14 Sep 2022 17:19:38 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1663174858566/pTEuZx_d4.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1 id="heading-problem">Problem</h1>
<p>When you set up a new computer or Windows server, Systems Administrators have been notoriously guilty of using the same password, with a local administrator account, and never changing it. </p>
<p><strong>Face it. We are all guilty of it.</strong> Password reuse <a target="_blank" href="https://www.helpnetsecurity.com/2019/11/12/password-reuse-problem/">is human nature</a>. There have even been <a target="_blank" href="https://users.ece.cmu.edu/~lbauer/papers/2017/ccs2017-password-reuse.pdf">studies about it</a>. </p>
<p>Even seasoned Information Security professionals have the same password on multiple websites. I know I probably do.  However, I have improved my password usage once I invested in a password manager (<a target="_blank" href="https://www.lastpass.com/">LastPass</a>) and my passwords are mostly randomly generated. However, there may be a few lingering accounts out there with old and reused passwords. </p>
<p><em>So what could go wrong if I use the same local administrator password across all of my computers and servers?</em></p>
<p>If one of your domain servers or workstations becomes compromised, an attacker could easily use those local administrator credentials to migrate across each system in your environment.  An attacker does not even need to know the exact password but could use the <a target="_blank" href="https://www.beyondtrust.com/resources/glossary/pass-the-hash-pth-attack">password hash to authenticate to other systems</a> and computers in your environment.  </p>
<p>Former attorney, current IT &amp; Information Security Consultant, and a very informative Twitter account I follow, <a target="_blank" href="https://twitter.com/arekfurt">"Brian in Pittsburgh"</a> recently tweeted three reasons why attackers gaining local administrator access is bad. </p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://twitter.com/arekfurt/status/1548423167588192257?s=20&amp;t=VRFj7opKioQfRACO24CzSg align=">https://twitter.com/arekfurt/status/1548423167588192257?s=20&amp;t=VRFj7opKioQfRACO24CzSg align="center"</a></div>
<h1 id="heading-solution">Solution</h1>
<p><a target="_blank" href="https://support.microsoft.com/en-us/topic/microsoft-security-advisory-local-administrator-password-solution-laps-now-available-may-1-2015-404369c3-ea1e-80ff-1e14-5caafb832f53">Microsoft introduced the Local Admin Password Solution (LAPS) in 2015</a> as a free tool to Domain Administrators to combat the use of local administrator passwords being left on domain-joined servers and computers. </p>
<p>LAPS will set a different and random password for the local administrator account to every computer in your domain and can rotate those passwords based on your domain's password policy. These passwords are then saved in Active Directory and only authorized administrators can retrieve these passwords when required. </p>
<h3 id="heading-how-does-laps-work">How does LAPS work?</h3>
<p>In the <a target="_blank" href="https://www.microsoft.com/en-us/download/details.aspx?id=46899">LAPS download documentation</a>, you will find a section that discusses how it works in your environment. However, this documentation can be a little difficult to comprehend. Here is (hopefully) an easier breakdown of how LAPS works.</p>
<ol>
<li><p>A small application installed on your computers and servers (<a target="_blank" href="https://docs.microsoft.com/en-us/previous-versions/windows/desktop/policy/client-side-extensions-to-group-policy#:~:text=A%20client%2Dside%20extension%20is%20a%20dynamic%2Dlink%20library%20(DLL)%20that%20implements%20Group%20Policy%20on%20the%20client%20computer.">client-side extension (CSE)</a>), is deployed by a small script (Group Policy Object) from your Domain Controller. </p>
</li>
<li><p>This small application (CSE) checks whether the password of the local Administrator account has expired (based on your Domain's password policy). If the password is deemed to have expired or is close to expiring, the CSE generates a new password.</p>
</li>
<li><p>The new password is then validated against the Domain Password Policy to make sure it meets password length and complexity requirements or isn't on a list of passwords you can't use. </p>
</li>
<li><p>The CSE reports the password and the next expiration time to Active Directory,  and it is stored in a confidential attribute associated with the computer account in Active Directory.</p>
</li>
<li><p>The CSE changes the password of the local administrator account on the computer. </p>
</li>
<li><p>The password then can be read from Active Directory by users (administrators) who are allowed to do so. </p>
</li>
</ol>
<h3 id="heading-how-to-configure-laps">How to configure LAPS?</h3>
<p>LAPS can be <a target="_blank" href="https://www.microsoft.com/en-us/download/details.aspx?id=46899">downloaded directly from Microsoft</a>. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1658027900678/4wiX7f_P_.png" alt="Download Local Administrator Password Solution (LAPS) from Official Microsoft Download Center" class="image--center mx-auto" /></p>
<p>We should first check the System Requirements.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1658027952657/0rIta9t34.png" alt="Local Administrator Password Solution (LAPS) System Requirements" /></p>
<p>LAPS is only supported on the following operating systems:</p>
<ul>
<li>Windows Server 2022</li>
<li>Windows Server 2019 </li>
<li>Windows Server 2008 </li>
<li>Windows Server 2016</li>
<li>Windows 10 </li>
<li>Windows Server 2012 R2</li>
<li>Windows Server 2012 </li>
<li>Windows Server 2008 R2 (EOL January 2020)</li>
<li>Windows Server 2003 (EOL July 2015)</li>
<li>Windows 8.1</li>
<li>Windows 8 </li>
<li>Windows 7 (EOL January 2020)</li>
<li>Windows Vista (EOL April 2017)</li>
</ul>
<p>In my test environment, I will use a Windows Server 2019 virtual machine for my Domain Controller, and two client virtual machines running Windows 10 and Windows 11. I am thankful that I do have a development server, running <a target="_blank" href="https://www.vmware.com/content/vmware/vmware-published-sites/us/products/esxi-and-esx.html.html">VMware ESXi</a>,  to host the virtual machines. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1662773487246/qOnc9ZMLt.png" alt="VMware ESXi Setup" /></p>
<p>In the <strong><em>Details</em></strong> section of the Download page, you will see a lengthy description of why LAPS was created, how LAPS works, and its features. <em>I highly recommend reading through this section carefully.</em></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1658027992570/UjI8Z4vwu.png" alt="LAPS Details Section" class="image--center mx-auto" /></p>
<p>When you are ready to download the files, you are given several file options. 
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1658028072077/zqOKOk6GR.png" alt="Download Options" class="image--center mx-auto" /></p>
<p>For my test environment installation, I downloaded the following files:</p>
<ul>
<li>LAPS_OperationsGuide.docx</li>
<li>LAPS.x64.msi</li>
<li>LAPS_Datasheet.docx</li>
<li>LAPS_TechnicalSpecification.docx</li>
</ul>
<h3 id="heading-installing-laps-on-the-management-computer">Installing LAPS on the Management Computer</h3>
<p>The first step was to install LAPS.x64.msi on my Domain Controller.  Following the instructions from the guides, I will deselect the AdmPwdGPO Extension and ensure all of the Management Tools are selected. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1663952042317/jv5C-A-6s.png" alt="LAPS UI Features" /></p>
<p>Here is a brief description of what each component of LAPS.x64.msi does:</p>
<ul>
<li>AdmPwd GPO Extension — this is a LAPS agent that need to be installed on all computers</li>
<li>Fat Client UI — GUI tool for viewing the local administrator password</li>
<li>PowerShell Module — allows you to manage LAPS using PowerShell</li>
<li>GPO Editor templates — admx/adml GPO templates for configuring LAPS</li>
</ul>
<p>After the LAPS UI finishes installing, you will see the LAPS UI icon on your desktop. Opening up the LAPS UI will look as such:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1662831477966/vYnd0iuf5.png" alt="LAPS-UI" /></p>
<h3 id="heading-extend-the-active-directory-schema-for-laps">Extend the Active Directory Schema for LAPS</h3>
<p>We next need to run some PowerShell commands in order to extend the Active Directory Schema so that LAPS can store the data in attributes in Active Directory.  LAPS will be storing data in the following attributes:</p>
<ul>
<li><strong>ms-Mcs-AdmPwd </strong> - stores the password</li>
<li><strong>ms-Mcs-AdmPwdExpirationTime</strong> - stores the password expiration time</li>
</ul>
<p>While logged in to my Administrator account on the Domain Controller, I will need to run the following PowerShell commands to extend the Active Directory Schema:</p>
<p>1) Import the PowerShell LAPS module:</p>
<pre><code>Import-<span class="hljs-built_in">module</span> AdmPwd.PS
</code></pre><p>2) Extend the Active Directory schema:</p>
<pre><code>Update-AdmPwdADSchema
</code></pre><p>You should see the following results:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1662833114495/WE4dl1Mw6.png" alt="PowerShell LAPS Commands" /></p>
<h2 id="heading-change-computer-object-permissions">Change Computer Object Permissions</h2>
<p>Now, I need to apply LAPS policies to my "Domain Computers" OU within Active Directory. As you can see, I have two workstations, WINDOWS10 and WINDOWS11, in my "Domain Computers" OU.  I want to apply the LAPS policies to that group of computers. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1662834564624/GC_eNXU1j.png" alt="Domain Computers Left" /></p>
<p>I now need to allow the workstations to have the proper permissions to write values to the <strong>ms-Mcs-AdmPwd</strong> and <strong>ms-Mcs-AdmPwdExpirationTime</strong> attributes in the Active Directory Schema (via the CSE that will be installed on each computer in "Domain Computers"). </p>
<p>To this, I will run the following PowerShell command:</p>
<pre><code><span class="hljs-built_in">Set</span>-AdmPwdComputerSelfPermission -OrgUnit <span class="hljs-string">'Domain Computers'</span>
</code></pre><p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1662835347473/MnThwL2AS.png" alt="Set-AdmPwdComputerSelfPermission" /></p>
<h2 id="heading-assign-permissions-to-administrators">Assign Permissions to Administrators</h2>
<p>I will then assign the proper permissions to allow administrators to view the passwords stored in Active Directory. First, I need to view the permissions that are currently set. </p>
<p>To this, I will run the following PowerShell command:</p>
<pre><code>Find-AdmPwdExtendedRights -Identity <span class="hljs-string">"Domain Computers"</span>
</code></pre><p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1662836753706/xydYDpwD1.png" alt="Find-AdmPwdExtendedRights" /></p>
<p>In my demo environment, I'm satisfied with only allowing administrators in the "Domain Admins" security group with access to the LAPS passwords. If you want to delegate permissions to an additional local administrators group (for example an "ITAdmins" group), you would need to run the following PowerShell command:</p>
<pre><code><span class="hljs-built_in">Set</span>-AdmPwdReadPasswordPermission -Identity <span class="hljs-string">"Domain Computers"</span> -AllowedPrincipals <span class="hljs-string">"ITAdmins"</span>
</code></pre><h2 id="heading-install-the-cse-on-workstations">Install the CSE on Workstations</h2>
<p>There are several ways to install the CSE (LAPS.x64.msi) across your workstations.  Manually installing it across every workstation may take some time, too.  The easiest, and most convenient, way to deploy the CSE is using a <a target="_blank" href="https://docs.microsoft.com/en-us/previous-versions/windows/desktop/policy/group-policy-objects">Group Policy Object (GPO)</a>.  </p>
<p>Microsoft already provides us with a .msi file.  The "msi" file extension stands for <em>Microsoft Software Installer</em>.  It is a Windows Installer format that uses Microsoft's Windows Installer service to configure installer packages, such as Windows applications or update packages. (ref. <a target="_blank" href="https://www.advancedinstaller.com/what-is-msi-file.html#:~:text=MSI%20file%20extension%20stands%20for,software%20on%20Windows%20operating%20systems.">MSI File - What is, how to open and edit it?</a>)</p>
<p>So knowing that I have a msi file that I can use to install software, I will create a GPO to deploy the application. </p>
<p>1) In your Domain Controller, launch GPMC (Group Policy Management Console) in Server Manager or search for gpmc.msc in the Windows start menu. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1662845022555/tt45NMYHi.png" alt="GPMC using Server Manager" class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1662845038770/F3TTj86Gt.png" alt="GPMC using Start Menu" class="image--center mx-auto" /></p>
<p>2) Create a new Group Policy under the Domain Computers OU.  </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1662845249087/MZLk0iKoR.png" alt="Create a new GPO" class="image--center mx-auto" /></p>
<p>3) Then right-click on the group policy and click on <strong>Edit</strong></p>
<p>4) Then navigate to <strong>Computer Configuration | Policies | Software Settings | Software Installations</strong></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1662846042733/v7xWQd1Dm.png" alt="Navigate to Software Installations" class="image--center mx-auto" /></p>
<p>5) Right-click on it and select <strong>New | Package</strong></p>
<p>6) A File Explorer window will open. Then browse to a network share that has <strong>LAPS.x64.msi </strong>file. In this demo, I am using path <strong> \\dc\LAPS\LAPS.x64.msi </strong> and this share has read permissions for everyone.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1662846343783/OSRwmyv92.png" alt="LAPS package" class="image--center mx-auto" /></p>
<p>7) Then in the next window select the deployment method as <strong>“Assigned”</strong></p>
<p>This will deploy the LAPS agent to all the computers in the "Domain Computers" OU. The installation will require a reboot on the client's computer to complete the installation.</p>
<h2 id="heading-gpo-for-laps-password-settings">GPO for LAPS Password Settings</h2>
<p>I now need to create a password policy for the computers using LAPS. You can use the same policy for the LAPS deployment, or you can create a new GPO.  </p>
<p>1) With the GPMC (Group Policy Management Console) open,  create a new Group Policy under the Domain Computers OU.  </p>
<p>2) Then right-click on the group policy and click on <strong>Edit</strong></p>
<p>3) Then navigate to <strong>Computer Configuration | Policies | Administrative Templates | LAPS</strong></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1662846991925/LeFjMMCSa.png" alt="laps-password.png" /></p>
<p>4) I will then go through all the listed polices and set them to <strong>Enable</strong>. The policies are described more in detail below:</p>
<ul>
<li><strong>Enable local admin password management</strong>: Enabled; This enables management of the local administrator account. </li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1663169045236/j9xCH7Gjj.png" alt="Enable local admin password management" class="image--center mx-auto" /></p>
<ul>
<li><strong>Do not allow password expiration time longer than required by policy</strong>: Enabled; If an administrator password is expired, it will be changed immediately. </li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1663169108458/eG_7Y7jL6.png" alt="Do not allow password expiration time" class="image--center mx-auto" /></p>
<ul>
<li><strong>Name of administrator account to manage</strong>: Use this policy if you use an administrator account other than the built-in Administrator;  Sometimes you may use a different named account (ie. "admin" or "xadministrator")</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1663169299232/FLd29NFj5.png" alt="Name of administrator account to manage" class="image--center mx-auto" /></p>
<ul>
<li><strong>Password Settings</strong>: Enabled, configure the complexity, length, and frequency of changing the password here. I have mine set below. </li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1663169382450/7oi4_BVEZ.png" alt="Password Settings" /></p>
<h2 id="heading-testing-and-verifying-laps-is-working">Testing and Verifying LAPS is Working</h2>
<p>Now that the LAPS policies have been set, we need to make sure the client computers are generating new passwords.  Since we set the CSE to deploy using a Group Policy Object, we will need to wait for the workstations to update their Group Policy. According to the <a target="_blank" href="https://docs.microsoft.com/en-us/windows-server/networking/core-network-guide/cncg/server-certs/refresh-group-policy">Microsoft documentation</a>, Group Policy is automatically refreshed when you restart the domain member computer, or when a user logs on to a domain member computer. In addition, Group Policy is periodically refreshed. By default, this periodic refresh is performed every 90 minutes with a randomized offset of up to 30 minutes.  </p>
<p>I then restarted the WINDOWS10 and WINDOWS11 computers and logged in with a domain account.  Once the workstations were restarted, I can now check the LAPS UI on the Domain Controller.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1663173653068/4JQyAvB3w.png" alt="Windows10 LAPS" class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1663173656238/FyJd5Nex3.png" alt="Windows11 LAPS" class="image--center mx-auto" /></p>
<p>It looks like it's working as expected.  I can also set a new password expiration time in the last box in the LAPS UI.  By default, it will enter the current date and time.  If I select "Set" that will set that date and time to the expiration time.  </p>
<p>And we are done!</p>
<h1 id="heading-conclusion">Conclusion</h1>
<p>Hopefully, this guide will be able to help you set up LAPS in your Domain environment. 
The instructions in the LAPS documentation may be a bit intimidating, but thankfully there are additional step-by-step guides out there that were able to help me. Please see the following two guides for additional information:</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://techcommunity.microsoft.com/t5/itops-talk-blog/step-by-step-guide-how-to-configure-microsoft-local/ba-p/2806185">https://techcommunity.microsoft.com/t5/itops-talk-blog/step-by-step-guide-how-to-configure-microsoft-local/ba-p/2806185</a></div>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://theitbros.com/deploying-local-administrator-password-solution-laps-in-active-directory/">https://theitbros.com/deploying-local-administrator-password-solution-laps-in-active-directory/</a></div>
<p>Blog cover photo by <a href="https://unsplash.com/@halacious?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Hal Gatewood</a> on <a href="https://unsplash.com/s/photos/computer-windows?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></p>
]]></content:encoded></item><item><title><![CDATA[Cyber Incident Reporting for Critical Infrastructure Act of 2022]]></title><description><![CDATA[On March 15, 2022, the Cyber Incident Reporting for Critical Infrastructure Act of 2022 was signed into law by President Biden as part of the Consolidated Appropriations Act of 2022. The act will require US-based privately-owned businesses, operating...]]></description><link>https://hashnode.brandonscloud.com/cyber-incident-reporting-for-critical-infrastructure-act-of-2022</link><guid isPermaLink="true">https://hashnode.brandonscloud.com/cyber-incident-reporting-for-critical-infrastructure-act-of-2022</guid><category><![CDATA[Security]]></category><category><![CDATA[CyberSec]]></category><category><![CDATA[#cybersecurity]]></category><dc:creator><![CDATA[Brandon Bowman]]></dc:creator><pubDate>Mon, 25 Apr 2022 14:02:21 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1650853460850/X0h44bGHG.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>On March 15, 2022, the Cyber Incident Reporting for Critical Infrastructure Act of 2022 was signed into law by President Biden as part of the <a target="_blank" href="https://www.congress.gov/bill/117th-congress/house-bill/2471/text">Consolidated Appropriations Act of 2022</a>. The act will require US-based privately-owned businesses, operating in critical infrastructure sectors, to report cyber security incidents and ransomware payments to the United States federal government. However, there are still guidelines yet to be established by the federal government as far as the implementation of the law. As Information Technology Professionals, you should be familiar with these new requirements and how to prepare your organization when the law is finally implemented. </p>
<p>In this blog, I will attempt to break down this federal act as best as possible to give you an insight into what may or may not be required by federal law for your organization The views and opinions expressed in this blog post are of my own professional opinion and not of my employer or organizations with which I am affiliated. I will be referencing analyses from other individuals and organizations which may provide further information on the passed legislation. Readers of this blog should contact their organization’s attorney to obtain appropriate legal advice. </p>
<p><strong>I am not a lawyer, and this is not legal advice.</strong></p>
<h3 id="heading-what-is-circia">What is CIRCIA?</h3>
<p>In general, the Cyber Incident Reporting for Critical Infrastructure Act of 2022 (CIRCIA) amends Title XXII of the Homeland Security Act of 2002 and requires covered private-sector entities to submit reports to the Cybersecurity and Infrastructure Security Agency (CISA) when they suffer a “covered cybersecurity incident or make a ransomware payment” within 72 hours after the incident has occurred. (H.R. 2471 § 2242(a)(1), H.R. 2471 § 2242(a)(2))</p>
<p>A covered private-sector entity would also be required to submit a supplemental report to CISA if “substantial new or different information becomes available or if the covered entity notifies the Agency (CISA) that the covered cyber incident at issue has concluded and has been fully mitigated and resolved.  (H.R. 2471 § 2242(a)(3))</p>
<p>A covered private-sector entity, subject to the requirements, would also be required to preserve data relevant to the covered cyber incident or ransom payment in accordance with the procedures established in the final guidelines issued by CISA. (H.R. 2471 § 2242(a)(4)) </p>
<p>There are some exceptions to the requirements (H.R. 2471 § 2242(a)(5)), 
Section 2242 outlines the required reporting of covered cyber incidents, ransomware payments, supplemental information, the preservation of information, and any exceptions.  </p>
<h3 id="heading-what-is-a-covered-private-sector-entity">What is a Covered Private-Sector Entity?</h3>
<p>Section 2240 (Definitions) of Title XXII of the Homeland Security Act of 2002 defines a covered entity as, “an entity in a critical infrastructure sector, as defined in Presidential Policy Directive 21, that satisfies the definition established by the Director (of the Cybersecurity and Infrastructure Security Agency) in the final rule issued pursuant to section 2242(b).”  </p>
<p><a target="_blank" href="https://obamawhitehouse.archives.gov/the-press-office/2013/02/12/presidential-policy-directive-critical-infrastructure-security-and-resil">Presidential Policy Directive 21 (PPD-21)</a> identified the following 16 critical infrastructure sectors:</p>
<ul>
<li>Chemical</li>
<li>Commercial Facilities</li>
<li>Communications</li>
<li>Critical Manufacturing</li>
<li>Dams</li>
<li>Defense Industrial Base</li>
<li>Emergency Services</li>
<li>Energy</li>
<li>Financial Services</li>
<li>Food and Agriculture </li>
<li>Government Facilities </li>
<li>Healthcare and Public Health </li>
<li>Information Technology</li>
<li>Nuclear Reactors, Materials, and Waste</li>
<li>Transportation Systems </li>
<li>Water and Wastewater Systems</li>
</ul>
<p>The reference to <em>“...the definition established by the Director in the final rule issued pursuant to section 2242(b).”</em> would come from the final ruling and from CISA on which private-sector entities would also be required to report. </p>
<p>If your organization falls within any of the critical infrastructure sectors, as defined in PPD-21, or designated by CISA after final rules have been published, you will potentially be required to report these incidents. It may be some time before CISA publishes these final guidelines, and CISA will be required to conduct an outreach and education campaign to let covered entities know about the reporting requirements (H.R. 2471 § 2242(e) - Outreach to Covered Entities).   </p>
<h3 id="heading-what-is-a-covered-cybersecurity-incident">What is a Covered Cybersecurity Incident?</h3>
<p>Section 2240 defines a covered cyber incident as a “substantial cyber incident experienced by a covered entity that satisfies the definition and criteria established by the Director in the final rule issued pursuant to section 2242(b).”  This essentially means whatever criteria CISA defines as a substantial cyber incident when final guidelines are published. </p>
<p>Section 2242(c)(2)(A) does state, at a minimum, what would constitute a covered cyber incident. This includes the following:</p>
<ul>
<li>A cyber incident that leads to substantial loss of confidentiality, integrity, or availability of such information system or network, or a serious impact on the safety and resiliency of operational systems and processes;</li>
<li>A disruption of business or industrial operations, including due to a denial of service attack, ransomware attack, or exploitation of a zero-day vulnerability, against an information system or network, or an operational technology system or process;</li>
<li>Unauthorized access or disruption of business or industrial operations due to loss of service facilitated through, or caused by, a compromise of a cloud service provider, managed service provider, or other third-party data hosting provider or by a supply chain compromise</li>
</ul>
<p>Again, CISA will produce final guidelines on what is considered to be a covered cyber incident and what will need to be reported. </p>
<h3 id="heading-how-does-circia-define-ransom-payment-and-ransomware-attack">How does CIRCIA define Ransom Payment and Ransomware Attack?</h3>
<p>Section 2240 defines ransom payment as “the transmission of any money or other property or asset, including virtual currency, or any portion thereof, which has at any time been delivered as ransom in connection with a ransomware attack.” </p>
<p>Section 2240 also defines ransomware attack as “an incident that includes the use or threat of use of unauthorized or malicious code on an information system, or the use or threat of use of another digital mechanism such as a denial of service attack, to interrupt or disrupt the operations of an information system or compromise the confidentiality, availability, or integrity of electronic data stored on, processed by, or transiting an information system to extort a demand for a ransom payment.”  </p>
<p>This does not include any event where the demand for payment is “not genuine” or is “made in good faith by an entity in response to a specific request by the owner or operator of the information system”. </p>
<p>Overall, if a malicious actor has infected your organization’s systems through the use of a ransomware attack and has demanded a ransom payment, you will be required to report the incident to CISA.  </p>
<h3 id="heading-what-information-would-you-need-to-report">What Information Would you Need to Report?</h3>
<p>As we wait for clarification and guidelines from CISA, Section 2242(c)(4) does provide us with an outline of what information will need to be given when reporting a covered cyber incident.  This information will include a description of the covered cyber incident that includes:</p>
<ul>
<li>Identification and a description of the function of the affected information systems, networks, or devices that were, or are reasonably believed to have been, affected by such cyber incident;</li>
<li>A description of the unauthorized access with substantial loss of confidentiality, integrity, or availability of the affected information system or network or disruption of business or industrial operations;</li>
<li>The estimated date range of such incident; and</li>
<li>The impact on the operations of the covered entity (your organization).</li>
</ul>
<p>Other details of reporting would include the following (where applicable):</p>
<ul>
<li>A description of the vulnerabilities exploited and the security defenses that were in place, as well as the tactics, techniques, and procedures used to perpetrate the covered cyber incident.</li>
<li>Any identifying or contact information related to each actor reasonably believed to be responsible for such cyber incident.
-Identification of the category or categories of information that was, or are reasonably believed to have been, accessed or acquired by an unauthorized person.</li>
</ul>
<p>Section 2242(c)(5) outlines what information will need to be given when reporting a ransomware payment.  This will include the following if applicable and available:</p>
<ul>
<li>A description of the ransomware attack, including the estimated date range of the attack.</li>
<li>A description of the vulnerabilities, tactics, techniques, and procedures used to perpetrate the ransomware attack.</li>
<li>Any identifying or contact information related to the actor or actors reasonably believed to be responsible for the ransomware attack.</li>
<li>The name and other information that clearly identifies the covered entity that made the ransom payment or on whose behalf the payment was made.</li>
<li>Contact information, such as telephone number or electronic mail address, that the CISA may use to contact the covered entity that made the ransom payment or an authorized agent of such covered entity, or, where applicable, the service provider of such covered entity acting with the express permission of, and at the direction of, that covered entity to assist with compliance with the requirements.</li>
<li>The date of the ransom payment.</li>
<li>The ransom payment demand, including the type of virtual currency or other commodity requested.
-The ransom payment instructions, including information regarding where to send the payment, such as the virtual currency address or physical address the funds were requested to be sent to.</li>
<li>The amount of the ransom payment.</li>
</ul>
<p>Again, CISA will be providing final guidelines and educational material to help your organization meet the requirements of reporting. You will likely see these questions already provided to you in an online form during reporting. </p>
<h3 id="heading-what-could-happen-if-your-organization-does-not-report">What could happen if your organization does not report?</h3>
<p>Section 2244 outlines noncompliance with required reporting.  If your organization fails to comply, the CISA may issue a subpoena in a district court of the United States “to gather information sufficient to determine whether a covered cyber incident or ransom payment has occurred.” Section 2242(c)(2)(C) states, “A court may punish a failure to comply with a subpoena issued under this subsection as contempt of court.”</p>
<h3 id="heading-what-should-your-organization-do">What should your organization do?</h3>
<p>Even though this law is not in full effect, it is strongly recommended that you should already be reporting critical cybersecurity incidents or ransomware attacks to law enforcement or to a government organization that can properly assist you in dealing with these matters.</p>
<p>In the United States, these organizations include the <a target="_blank" href="https://us-cert.cisa.gov/forms/report">Cybersecurity and Infrastructure Security Agency (CISA)</a> and the <a target="_blank" href="https://www.ic3.gov">Federal Bureau of Investigation’s (FBI) Internet Crime Complaint Center (IC3)</a>. You can also contact your local <a target="_blank" href="https://www.secretservice.gov/investigation/cyber">U.S. Secret Service Cyber Fraud Task Force Network Intrusion Team</a>.  These organizations will be able to initiate criminal investigations and offer their assistance to the best of their abilities. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1650848943410/RcFNMSxUL.png" alt="CISA Incident Reporting System" /></p>
<p>As an organization, you should also look to implement technologies and procedures to help prepare for the upcoming requirements. </p>
<p>One good technology system to implement would be a SIEM (pronounced "sim"). A <a target="_blank" href="https://www.techtarget.com/searchsecurity/definition/security-information-and-event-management-SIEM">Security Information Event Management (SIEM)</a> is a system designed to college system log (Syslog) messages from all your security appliances, networking devices, servers, and workstations into a single unified environment.  A SIEM can offer real-time monitoring and analysis of events as well as tracking and logging of security data for compliance or auditing purposes. (ref. <a target="_blank" href="https://www.ibm.com/topics/siem">What is SIEM? - IBM</a>)</p>
<p>There are various providers of SIEM applications that are out there on the market such as:</p>
<ul>
<li><a target="_blank" href="https://www.splunk.com/en_us/software/splunk-enterprise.html">Splunk Enterprise SIEM</a></li>
<li><a target="_blank" href="https://www.ibm.com/qradar">IBM QRadar</a></li>
<li><a target="_blank" href="https://www.solarwinds.com/security-event-manager">SolarWinds SIEM Security and Monitoring</a> </li>
<li><a target="_blank" href="https://www.datadoghq.com/product/security-platform/cloud-siem/">Datadog</a></li>
<li><a target="_blank" href="https://cybersecurity.att.com/products/usm-anywhere">AlienVault USM</a></li>
<li><a target="_blank" href="https://www.rapid7.com/products/insightidr/">Rapid7 Insight IDR</a></li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1650849503576/ouGnFC9Ci.jpg" alt="Rapid7 Insight IDR" /></p>
<p>There are also Free and Open-Source SIEM tools which are usually limited in their capabilities compared to their paid/enterprise versions.. This list includes:</p>
<ul>
<li><a target="_blank" href="https://cybersecurity.att.com/products/ossim">AlienVault OSSIM</a></li>
<li><a target="_blank" href="https://siemonster.com/download-community-edition/">SIEM Monster Community Edition</a></li>
<li><a target="_blank" href="https://wazuh.com/">Wazuh</a></li>
<li><a target="_blank" href="https://www.snort.org/">Snort</a></li>
<li><a target="_blank" href="https://www.ossec.net/">OSSEC</a></li>
<li><a target="_blank" href="https://quadrantsec.com/sagan_log_analysis_engine/">Sagan</a></li>
<li><a target="_blank" href="https://logit.io/">Logit.io</a></li>
<li><a target="_blank" href="https://www.prelude-siem.com/en/">Prelude</a></li>
<li><a target="_blank" href="https://docs.splunk.com/Documentation/Splunk/8.2.6/Admin/MoreaboutSplunkFree">Splunk Free</a></li>
<li><a target="_blank" href="https://securityonionsolutions.com/">Security Onion</a></li>
<li><a target="_blank" href="https://suricata.io/">Suricata</a></li>
<li><a target="_blank" href="https://www.graylog.org/products/open-source">Greylog</a></li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1650849584968/pXKOd1k_x.png" alt="Wazuh-Security" /></p>
<p>Analysis of the free and open-source products listed above can be found in this blog post of the <a target="_blank" href="https://logit.io/blog/post/the-top-14-free-and-open-source-siem-tools-for-2021">THE TOP 14 FREE AND OPEN SOURCE SIEM TOOLS FOR 2022</a>.</p>
<p>A good procedure to implement would be an <a target="_blank" href="https://www.exabeam.com/incident-response/incident-response-plan/">Incident Response Plan</a>. An Incident Response Plan is a set of tools and procedures that your security team can use to identify, eliminate, and recover from cybersecurity threats. It is designed to help your team respond quickly and uniformly against any type of external threat. </p>
<p>Being prepared to respond to an incident and having documented steps on how to respond and recover from an incident can save your organization critical time and money.  Part of the Incident Response plan includes properly documenting and reporting the incident. </p>
<p>For more information on building your own Incident Response Plan, please visit the following resources:</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://www.exabeam.com/incident-response/incident-response-plan">https://www.exabeam.com/incident-response/incident-response-plan</a></div>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://www.cynet.com/incident-response/nist-incident-response">https://www.cynet.com/incident-response/nist-incident-response</a></div>
<h3 id="heading-conclusion">Conclusion</h3>
<p>The above information was just a high-level overview of the Cyber Incident Reporting for Critical Infrastructure Act of 2022 (CIRCIA) and its impending requirements for covered privately-owned companies operating in critical infrastructure sectors. It is likely that CISA will produce final guidelines within the next 18-24 months. However, you should immediately begin preparing your organization to meet these requirements when they are finally implemented.  </p>
<p>For further information on this newly signed law, I will include some legal analyses which I found to be helpful. </p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://www.gibsondunn.com/president-biden-signs-into-law-the-cyber-incident-reporting-for-critical-infrastructure-act-expanding-cyber-reporting-obligations-for-a-wide-range-of-public-and-private-entities/">https://www.gibsondunn.com/president-biden-signs-into-law-the-cyber-incident-reporting-for-critical-infrastructure-act-expanding-cyber-reporting-obligations-for-a-wide-range-of-public-and-private-entities/</a></div>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://www.lawfareblog.com/2022-cyber-incident-reporting-law-key-issues-watch">https://www.lawfareblog.com/2022-cyber-incident-reporting-law-key-issues-watch</a></div>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://www.jdsupra.com/legalnews/cyber-incident-reporting-for-critical-3180707">https://www.jdsupra.com/legalnews/cyber-incident-reporting-for-critical-3180707</a></div>
<p>I thank you for your time in reading this blog post and I hope that you found it informative and helpful.  Please feel free to comment below or share with your network.
Thank you!</p>
<p>(Blog image photographed by <a href="https://unsplash.com/@haroldrmendoza?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Harold Mendoza</a> on <a href="https://unsplash.com/collections/2278408/america?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a>) </p>
]]></content:encoded></item><item><title><![CDATA[Reverse Proxies for Web Applications]]></title><description><![CDATA[At my current employer, we host a fleet of virtualized servers that runs a logistics web application.  This web application allows our member distributors to effectively manage the transportation of shipments. 
However, each server in the fleet has b...]]></description><link>https://hashnode.brandonscloud.com/reverse-proxies-for-web-applications</link><guid isPermaLink="true">https://hashnode.brandonscloud.com/reverse-proxies-for-web-applications</guid><category><![CDATA[nginx]]></category><category><![CDATA[Web Development]]></category><category><![CDATA[webdev]]></category><category><![CDATA[networking]]></category><category><![CDATA[proxy]]></category><dc:creator><![CDATA[Brandon Bowman]]></dc:creator><pubDate>Sun, 03 Apr 2022 23:55:42 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1649025757829/aNQNMHL3t.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>At my current employer, we host a fleet of virtualized servers that runs a logistics web application.  This web application allows our member distributors to effectively manage the transportation of shipments. </p>
<p>However, each server in the fleet has been assigned its own public IP address.   If I have 10 web servers, it means that I must provision 10 public IP addresses.  That could be a significant chunk of my public IP addresses that I theoretically rent from my Internet Service Provider (ISP).  If my ISP gives me a /27 or /28 address block, then that could be a problem for other services I need to provide a public IP address to (30 useable IP addresses for a /27 and 14 useable IP addresses for a /28). </p>
<p>Provisioning all those public IP addresses also increases my company’s digital footprint.  For 10 webservers, that could give hackers 10 different attack vectors. </p>
<p><em>Ouch!</em> I do love my job, but I’m not trying to lose sleep overnight over it.  So how can I fix this?  </p>
<p>This is where a Reverse Proxy Server would be useful.</p>
<h3 id="heading-what-is-a-reverse-proxy-server">What is a Reverse Proxy Server?</h3>
<p>According to <a target="_blank" href="https://www.nginx.com/">NGINX</a> (pronounced “Engine X”, one of the most commonly used open-sourced web servers used for web serving, reverse proxying, caching, load balancing, media streaming, and more), a <a target="_blank" href="https://www.nginx.com/resources/glossary/reverse-proxy-server/">reverse proxy server</a> is a type of proxy server which directs client requests to the appropriate backend server. It provides an additional level of abstraction and control to ensure the smooth flow of network traffic between clients and servers.</p>
<p>In layman’s terms, it’s a server that sits in front of your other web servers and acts as a “traffic cop,” directing requests to the appropriate server.  </p>
<p>Other benefits of having a Reverse Proxy Server include the following:</p>
<ul>
<li><p><strong>Improved Security:</strong>  A reverse proxy server intercepts requests headed for your backend servers.  This protects the identities of your backend servers against common web attacks.  By placing your pool of web servers behind a reverse proxy, you only expose one server to the public internet, further protecting all your backend servers. </p>
</li>
<li><p><strong>Load Balancing:</strong> If your web application is hosted across multiple servers, the Reverse Proxy Server can distribute web requests across your pool of servers preventing any single server from being overloaded. </p>
</li>
<li><p><strong>Improved Performance:</strong> A reverse proxy server can compress both inbound and outbound data, cache content, and conduct SSL encryption, resulting in faster performance. </p>
</li>
</ul>
<h3 id="heading-how-does-a-reverse-proxy-work">How does a Reverse Proxy Work?</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1648929514927/mDqQVvATV.png" alt="Reverse Proxy Demo Setup" /></p>
<p>If you look at the above diagram may make you a bit confused about how a reverse proxy would work.  Let me try to simplify this process in a step-by-step manner:</p>
<ol>
<li>A public user will first request to access your web server via the public internet.</li>
<li>The corporate firewall receives the request on the publicly facing interface, inspects the request, and forwards it to the Reverse Proxy in the private corporate network. </li>
<li>The Reverse Proxy receives the incoming request and inspects the destination address.</li>
<li>The Reverse Proxy then checks the reverse proxy configuration file to determine the appropriate private IP address to send the request to.</li>
<li>The incoming request is then sent to the appropriate backend web server.</li>
<li>The backend web server then sends the response data back to the public user. </li>
</ol>
<h3 id="heading-demonstration-setup">Demonstration Setup</h3>
<p>To demonstrate this concept of a reverse proxy, I set up a lab environment on VMware Workstation Pro using an NGINX virtual machine and four different pre-made web-application virtual machines from <a target="_blank" href="https://bitnami.com/">Bitnami</a>. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1648930052082/zlwVAPo-U.png" alt="Reverse Proxy Setup" /></p>
<h3 id="heading-deploying-virtual-machines">Deploying Virtual Machines</h3>
<p>Bitnami by VMware provides pre-packaged images for the automated setup of popular server software on Windows, Mac OS X, and Linux platforms. Bitnami also provides pre-packaged virtual machines. Using the Bitnami Virtual Machine (VM) image requires hypervisor software such as <a target="_blank" href="https://www.vmware.com/products/workstation-player.html">VMware Player</a> or <a target="_blank" href="https://www.virtualbox.org/">VirtualBox</a>. Both of these hypervisors are available free of charge. </p>
<p>In this lab, I chose the following Bitnami Virtual Machines:</p>
<ul>
<li><a target="_blank" href="https://bitnami.com/stack/lamp/virtual-machine">LAMP</a></li>
<li><a target="_blank" href="https://bitnami.com/stack/nodejs/virtual-machine">Node.JS</a></li>
<li><a target="_blank" href="https://bitnami.com/stack/mediawiki/virtual-machine">MediaWiki</a></li>
<li><a target="_blank" href="https://bitnami.com/stack/wordpress/virtual-machine">Wordpress</a></li>
</ul>
<p>This gave me a decent sample of various web applications. I also installed NGINX on a virtual machine running <a target="_blank" href="https://ubuntu.com/server">Ubuntu Server 20.04 LTS</a>. </p>
<p>Once I had the VMs running, logged in to each VM and assigned a static IP address. I kept it simple and assigned static private addresses in sequential order. I didn’t start with a .1 address because that would be the gateway address to the virtual subnet (VLAN). </p>
<ul>
<li>NGINX – 192.168.80.2</li>
<li>LAMP – 192.168.80.3</li>
<li>Node.JS – 192.168.80.4</li>
<li>MediaWiki – 192.168.80.5</li>
<li>WordPress – 192.168.80.6</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1648931881179/nWnYlCdDE.png" alt="NGINX Server Setup" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1648932072927/BnfUIXcRR.png" alt="Bitnami VMs" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1649011864028/SPRrQVKtQ.png" alt="Working Web Servers" /></p>
<p>The images above show my 5 virtual machines running in VMware Workstation Pro all with the appropriately assigned addresses, and running as expected in their default states.</p>
<h3 id="heading-nginx-configuration-files">NGINX Configuration Files</h3>
<p>Once I had the static IP addresses configured, I had to edit the reverse proxy configuration file on the NGINX virtual machine. First I need to look at the default NGINX configuration file.</p>
<p>NGINX uses text-based configuration files written in a particular format. The default configuration file is named <code>nginx.conf</code>and is commonly located in the <code>/etc/nginx</code> directory. The location of the <code>nginx.conf</code> depends on the package system used to install NGINX and the operating system. It is may be found in <code>/usr/local/nginx/conf</code>, <code>/etc/nginx</code>, or <code>/usr/local/etc/nginx</code>. An example of the NGINX configuration file can be found <a target="_blank" href="https://www.nginx.com/resources/wiki/start/topics/examples/full/">here</a>.</p>
<p>Here is what my default <code>nginx.conf</code> looks like:</p>
<pre><code><span class="hljs-attribute">user</span> www-data;
<span class="hljs-attribute">worker_processes</span> auto;
<span class="hljs-attribute">pid</span> /run/nginx.pid;
<span class="hljs-attribute">include</span> /etc/nginx/modules-enabled/<span class="hljs-regexp">*.conf</span>;

<span class="hljs-section">events</span> {
        <span class="hljs-attribute">worker_connections</span> <span class="hljs-number">768</span>;
        <span class="hljs-comment"># multi_accept on;</span>
}

<span class="hljs-section">http</span> {

        <span class="hljs-comment">##</span>
        <span class="hljs-comment"># Basic Settings</span>
        <span class="hljs-comment">##</span>

        <span class="hljs-attribute">sendfile</span> <span class="hljs-literal">on</span>;
        <span class="hljs-attribute">tcp_nopush</span> <span class="hljs-literal">on</span>;
        <span class="hljs-attribute">tcp_nodelay</span> <span class="hljs-literal">on</span>;
        <span class="hljs-attribute">keepalive_timeout</span> <span class="hljs-number">65</span>;
        <span class="hljs-attribute">types_hash_max_size</span> <span class="hljs-number">2048</span>;
        <span class="hljs-comment"># server_tokens off;</span>

        <span class="hljs-comment"># server_names_hash_bucket_size 64;</span>
        <span class="hljs-comment"># server_name_in_redirect off;</span>

        <span class="hljs-attribute">include</span> /etc/nginx/mime.types;
        <span class="hljs-attribute">default_type</span> application/octet-stream;

        <span class="hljs-comment">##</span>
        <span class="hljs-comment"># SSL Settings</span>
        <span class="hljs-comment">##</span>

        <span class="hljs-attribute">ssl_protocols</span> TLSv1 TLSv1.<span class="hljs-number">1</span> TLSv1.<span class="hljs-number">2</span> TLSv1.<span class="hljs-number">3</span>; <span class="hljs-comment"># Dropping SSLv3, ref: POODLE</span>
        <span class="hljs-attribute">ssl_prefer_server_ciphers</span> <span class="hljs-literal">on</span>;

        <span class="hljs-comment">##</span>
        <span class="hljs-comment"># Logging Settings</span>
        <span class="hljs-comment">##</span>

        <span class="hljs-attribute">access_log</span> /var/log/nginx/access.log;
        <span class="hljs-attribute">error_log</span> /var/log/nginx/error.log;

        <span class="hljs-comment">##</span>
        <span class="hljs-comment"># Gzip Settings</span>
        <span class="hljs-comment">##</span>

        <span class="hljs-attribute">gzip</span> <span class="hljs-literal">on</span>;

        <span class="hljs-comment"># gzip_vary on;</span>
        <span class="hljs-comment"># gzip_proxied any;</span>
        <span class="hljs-comment"># gzip_comp_level 6;</span>
        <span class="hljs-comment"># gzip_buffers 16 8k;</span>
        <span class="hljs-comment"># gzip_http_version 1.1;</span>
        <span class="hljs-comment"># gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;</span>

        <span class="hljs-comment">##</span>
        <span class="hljs-comment"># Virtual Host Configs</span>
        <span class="hljs-comment">##</span>

        <span class="hljs-attribute">include</span> /etc/nginx/conf.d/<span class="hljs-regexp">*.conf</span>;
        <span class="hljs-attribute">include</span> /etc/nginx/sites-enabled/*;
}


<span class="hljs-comment">#mail {</span>
<span class="hljs-comment">#       # See sample authentication script at:</span>
<span class="hljs-comment">#       # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript</span>
<span class="hljs-comment">#</span>
<span class="hljs-comment">#       # auth_http localhost/auth.php;</span>
<span class="hljs-comment">#       # pop3_capabilities "TOP" "USER";</span>
<span class="hljs-comment">#       # imap_capabilities "IMAP4rev1" "UIDPLUS";</span>
<span class="hljs-comment">#</span>
<span class="hljs-comment">#       server {</span>
<span class="hljs-comment">#               listen     localhost:110;</span>
<span class="hljs-comment">#               protocol   pop3;</span>
<span class="hljs-comment">#               proxy      on;</span>
<span class="hljs-comment">#       }</span>
<span class="hljs-comment">#</span>
<span class="hljs-comment">#       server {</span>
<span class="hljs-comment">#               listen     localhost:143;</span>
<span class="hljs-comment">#               protocol   imap;</span>
<span class="hljs-comment">#               proxy      on;</span>
<span class="hljs-comment">#       }</span>
<span class="hljs-comment">#}</span>
</code></pre><p>Now, this may seem like a lot of information, but most of the configuration is commented out. The <a target="_blank" href="http://nginx.org/en/docs/beginners_guide.html#conf_structure">NGINX Beginner's Guide</a> explains this structure in an easier manner:</p>
<p>I can see that in the <code>http{</code> top-level directive, referred to as a <em>context</em>, there is a section for <code>Virtual Host Configs</code> that includes the following:</p>
<pre><code>        <span class="hljs-comment">##</span>
        <span class="hljs-comment"># Virtual Host Configs</span>
        <span class="hljs-comment">##</span>

        <span class="hljs-attribute">include</span> /etc/nginx/conf.d/<span class="hljs-regexp">*.conf</span>;
        <span class="hljs-attribute">include</span> /etc/nginx/sites-enabled/*;
</code></pre><p>This means that any configuration files I place in <code>/etc/nginx/conf.d/</code> and <code>/etc/nginx/sites-enabled/</code> will be included into the default NGINX configuration. I don't exactly want to place my reverse proxy configuration straight into the default <strong>nginx.conf</strong> because that could make things a little unorganized. </p>
<p>If I look into the <code>/etc/nginx</code> directory, I can see that there is also a <code>/sites-available</code> directory available. 
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1649012881705/r8N5xiDgZ.png" alt="Listing of /etc/nginx/ directory" /></p>
<p><em>What's the difference between</em> <code>sites-available</code> <em>and</em> <code>sites-enabled</code><em>?</em></p>
<p>The <code>sites-available</code> folder will hold all of your virtual host configuration files, whether you use them or not. </p>
<p>The <code>sites-enabled</code> folder will contain symbolic links to files in the <code>sites-available</code> folder. This will allow you to disable your virtual host just by removing the symbolic link. </p>
<p>I will now create my <code>reverse-proxy.conf</code> and place it in the <code>/etc/nginx/sites-available/</code> directory.</p>
<p><code>cd etc/nginx/sites-available/</code></p>
<p><code>sudo vi reverse-proxy.conf</code></p>
<p>I will then paste the following strings into the file:</p>
<pre><code><span class="hljs-section">server</span> {
    <span class="hljs-attribute">listen</span> <span class="hljs-number">80</span>;
    <span class="hljs-attribute">server_name</span> lamp.bitnami.local;
    <span class="hljs-attribute">location</span> / {
        <span class="hljs-attribute">proxy_pass</span> http://192.168.80.3;
        }
}

<span class="hljs-section">server</span> {
    <span class="hljs-attribute">listen</span> <span class="hljs-number">80</span>;
    <span class="hljs-attribute">server_name</span> nodejs.bitnami.local;
    <span class="hljs-attribute">location</span> / {
        <span class="hljs-attribute">proxy_pass</span> http://192.168.80.4;
    }
}

<span class="hljs-section">server</span> {
    <span class="hljs-attribute">listen</span> <span class="hljs-number">80</span>;
    <span class="hljs-attribute">server_name</span> media.bitnami.local;
    <span class="hljs-attribute">location</span> / {
        <span class="hljs-attribute">proxy_pass</span> http://192.168.80.5;
    }
}

<span class="hljs-section">server</span> {
    <span class="hljs-attribute">listen</span> <span class="hljs-number">80</span>;
    <span class="hljs-attribute">server_name</span> wp.bitnami.local;
    <span class="hljs-attribute">location</span> / {
        <span class="hljs-attribute">proxy_pass</span> http://192.168.80.6;
    }
}
</code></pre><p>In the <code>reverse-proxy.conf</code> I have included several <code>server</code> blocks that are all listening on port 80 (http).  Each <code>sever``` block will have a</code>server_name``` directive.  When a request comes in, NGINX will test only the request’s header field “Host” to determine which server the request should be routed to. If its value does not match any server name, or the request does not contain this header field at all, then NGINX will route the request to the default server for this port. In the configuration above, the default server is the first one — which is NGINX’s standard default behavior.</p>
<p>You can also explicitly set which server should be <strong>default</strong>, with the <code>default_server</code> parameter in the listen directive. If I wanted to set my LAMP application to be the <strong>default</strong>, I would have placed the following into the configuration:</p>
<pre><code><span class="hljs-section">server</span> {
    <span class="hljs-attribute">listen</span> <span class="hljs-number">80</span> default_server;
    <span class="hljs-attribute">server_name</span> lamp.bitnami.local;
    <span class="hljs-attribute">location</span> / {
        <span class="hljs-attribute">proxy_pass</span> http://192.168.80.3;
        }
}
</code></pre><p>However, if requests without the "Host" header field (requests without a pre-defined URL) should not be allowed, I could insert the following <code>server</code> block that just drops the request:</p>
<pre><code><span class="hljs-section">server</span> {
    <span class="hljs-attribute">listen</span>      <span class="hljs-number">80</span>;
    <span class="hljs-attribute">server_name</span> <span class="hljs-string">""</span>;
    <span class="hljs-attribute">return</span>      <span class="hljs-number">444</span>;
}
</code></pre><p>Here, the <code>server_name</code> is set to an empty string that will match requests without the “Host” header field, and a special NGINX’s non-standard code 444 is returned that closes the connection.  I will add this block to my <code>reverse-proxy.conf</code>.</p>
<h3 id="heading-configuring-my-local-dns">Configuring My Local DNS</h3>
<p>Since these web applications are not available to the public internet, I now have to edit my <code>hosts</code> file on my local machine to assume the role of a Domain Name Service (DNS).  </p>
<p>On a Windows 10 computer, you will have to search for <strong>Notepad </strong> in the Windows Search menu and choose to <strong>Run as administrator</strong>.  Once you’ve done so, open up the following file using the File -&gt; Open feature. The <code>hosts</code> file is located in the <code>C:\Windows\System32\drivers\etc</code> folder.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1649020692271/Tq3F-juBX.png" alt="Windows Hosts File Location" /></p>
<p>Feel free to check out the tutorial in the link below if you're having trouble with this.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://www.howtogeek.com/howto/27350/beginner-geek-how-to-edit-your-hosts-file/">https://www.howtogeek.com/howto/27350/beginner-geek-how-to-edit-your-hosts-file/</a></div>
<p>I will then edit the <code>hosts</code> inserting entries into the file by placing the IP address of the NGINX proxy next to the <code>server_name</code> entries of the web applications.  All the <code>server_name</code> entries will have the same IP address so that the web requests can go through the NGINX reverse proxy. Save the file when this is complete. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1649021170890/lEnGj5c9n.png" alt="Windows Hosts File " /></p>
<h3 id="heading-testing-the-reverse-proxy">Testing the Reverse Proxy</h3>
<p>Now we will test the reverse proxy. By default, most browsers will assume that you are trying to connect to a website that has a SSL/TLS certificate installed and will insert <code>https://</code> into your request. Therefore, I will have to type out the entire address.</p>
<pre><code><span class="hljs-attribute">http</span>:<span class="hljs-comment">//lamp.bitnami.local</span>
</code></pre><p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1649022062514/Lc51KAQe5.png" alt="LAMP Stack" /></p>
<pre><code><span class="hljs-attribute">http</span>:<span class="hljs-comment">//nodejs.bitnami.local</span>
</code></pre><p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1649021573047/yvSHI9t8Q.png" alt="NodeJS" /></p>
<pre><code><span class="hljs-attribute">http</span>:<span class="hljs-comment">//media.bitnami.local</span>
</code></pre><p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1649021679069/x2CIedZ6Z.png" alt="MediaWiki" /></p>
<pre><code><span class="hljs-attribute">http</span>:<span class="hljs-comment">//wp.bitnami.local</span>
</code></pre><p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1649021786152/citbItj6u.png" alt="Wordpress" /></p>
<p>Everything looks good! I can now look at the NGINX access.log to see the requests.  This file is located at <code>/var/log/nginx/access.log</code></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1649022635276/vryMrYWnh.png" alt="NGINX Access Log" /></p>
<p>This was just a simple demonstration of how a reverse proxy works and how it can be easily configured.  There are many options you can include in the <code>reverse-proxy.conf</code> such as passing request headers and choosing an outgoing IP address.  Check out the <a target="_blank" href="https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/">NGINX documentation</a> for more information.</p>
<p>For a complete tutorial on NGINX, please feel free to look at The NGINX Handbook from FreeCodeCamp below.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://www.freecodecamp.org/news/the-nginx-handbook/">https://www.freecodecamp.org/news/the-nginx-handbook/</a></div>
<p>Thank you for your time and please leave some comments below.</p>
<p><em>UPDATE:5/5/2022
Found this awesome webinar from NGINX if you're interested in getting a hands-on demonstration:</em></p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://www.nginx.com/resources/webinars/caching-101-nginx/">https://www.nginx.com/resources/webinars/caching-101-nginx/</a></div>
<p>Hashnode Blog Photo by <a href="https://unsplash.com/@sonofara?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Jaffer Nizami</a> on <a href="https://unsplash.com/s/photos/cloud-computing?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></p>
]]></content:encoded></item><item><title><![CDATA[Deploying an OpenStack Cloud Environment]]></title><description><![CDATA[When you think of on-premise Software-Defined Data Center (SDDC) solutions, the first option that really comes to mind is VMware vSphere. vSphere is an encompassing term that includes several other VMware technologies to provide an infrastructure for...]]></description><link>https://hashnode.brandonscloud.com/deploying-an-openstack-cloud-environment</link><guid isPermaLink="true">https://hashnode.brandonscloud.com/deploying-an-openstack-cloud-environment</guid><category><![CDATA[Cloud]]></category><category><![CDATA[Cloud Computing]]></category><category><![CDATA[infrastructure]]></category><category><![CDATA[Open Source]]></category><dc:creator><![CDATA[Brandon Bowman]]></dc:creator><pubDate>Sun, 20 Feb 2022 23:43:02 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1645400545587/hwzWlf4mc.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>When you think of on-premise Software-Defined Data Center (SDDC) solutions, the first option that really comes to mind is VMware vSphere. vSphere is an encompassing term that includes several other VMware technologies to provide an infrastructure for virtualization. I personally enjoy working with a VMware vSphere environment. However, there are other competing platforms out in today's marketplace.  Today we're going to look at OpenStack.</p>
<h3 id="heading-what-is-openstack">What is OpenStack?</h3>
<p><a target="_blank" href="https://www.openstack.org/">OpenStack</a> is an open-source cloud computing platform that can be used to manage distributed computing, network, and storage resources. You can use OpenStack to build private and public clouds. Resources can be managed through a dashboard, giving administrators control while empowering users to provision resources through a web interface. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1645330216885/8oGbBnZmN.png" alt="OpenStack Overview" /></p>
<p>OpenStack is also fully open-source meaning there are no licensing costs.  It is available under the Apache License which means that it can be used free of charge. Even if deployed within one of the available distributions, vendors must not add any additional licensing costs (ref <a target="_blank" href="https://ubuntu.com/blog/openstack-vs-vmware">OpenStack vs VMware: Bringing costs down</a>).  However, OpenStack is also not just a simple technology that you install and use. It has a certain degree of complexity and takes time to fully understand and maximize utilization. Organizations, like <a target="_blank" href="https://ubuntu.com/openstack">Canonical</a> and <a target="_blank" href="https://www.redhat.com/en/resources/openstack-platform-subscription-overview">Red Hat</a>,  provide professional services and support to help manage your OpenStack environment.</p>
<h3 id="heading-how-to-use-openstack">How to use OpenStack?</h3>
<p>Today I will be demonstrating how to deploy and configure an OpenStack cloud.  However, I will be utilizing <a target="_blank" href="https://microstack.run/">MicroStack</a>. MicroStack is a micro cloud platform based on OpenStack, designed for the edge and small-scale data center deployments, that can be installed and maintained with minimal effort.  Canonical provides <a target="_blank" href="https://ubuntu.com/openstack/tutorials">easy-to-understand tutorials</a> to learn more about OpenStack. (For this demonstration, I used <a target="_blank" href="https://ubuntu.com/openstack/install">these installation instructions</a> versus the one in the tutorials.  But they are the same instructions. </p>
<h3 id="heading-create-the-vm">Create the VM</h3>
<p>The first requirements are to have a physical machine to work on. The tutorial's requirements are as follows:</p>
<ul>
<li><p>The latest Ubuntu LTS installed.</p>
</li>
<li><p>Multi-core CPU</p>
</li>
<li><p>8 GB of RAM</p>
</li>
<li><p>100 GB of storage</p>
</li>
</ul>
<p>In fact, I'm just going to create a virtual machine in VMware Workstation Pro.  Something like this should be perfect for this demonstration:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1645387072723/JjW13eD2v.png" alt="OpenStack VM on Ubuntu" /></p>
<h3 id="heading-microstack-deployment">MicroStack Deployment</h3>
<p>If you <a target="_blank" href="https://ubuntu.com/tutorials/install-openstack-on-your-workstation-and-launch-your-first-instance#2-install-openstack">follow along in the tutorial</a>, the commands are pretty simple. </p>
<p>First, execute the following command to install the MicroStack snap:</p>
<p><code>sudo snap install microstack --devmode --beta</code> </p>
<p>When the installation process has finished, I will view information on the installed snap by entering the command: :</p>
<p><code>snap list microstack</code> </p>
<p><em>Looking good so far!</em>
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1645387323424/9wP5WL6wO.png" alt="Install MicroStack snap" /></p>
<h3 id="heading-initialization">Initialization</h3>
<p>I will then initialize MicroStack.  According to the <a target="_blank" href="https://ubuntu.com/openstack/install">documentation</a>, this will "automatically deploy, configures, and starts OpenStack services. In particular, it will create the database, networks, an image, several flavors, and ICMP/SSH security groups."  The command I will use is:</p>
<p><code>sudo microstack init --auto --control</code> </p>
<p>Apparently, this can take quite a bit of time depending on your system. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1645389289892/N2m089h_4.png" alt="MicroStack Initialization" /></p>
<h3 id="heading-verification">Verification</h3>
<p>Once the initialization is finished, you can run a few commands to check functionality.  The standard OpenStack client comes pre-installed and is invoked like so:</p>
<p><code>microstack.openstack &lt;command&gt;</code> </p>
<p>To list the default image, run:</p>
<p><code>microstack.openstack image list</code> </p>
<p>To get the default list of flavors:</p>
<p><code>microstack.openstack flavor list</code> </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1645390979461/4n4vxrquv.png" alt="MicroStack Image and Flavor List" /></p>
<p><em>Now we are getting somewhere!</em></p>
<h3 id="heading-create-an-instance">Create an Instance</h3>
<p>I will now create an instance (virtual machine) named 'test' based on the 'cirros' image. CirrOS is a minimal Linux distribution that was designed for use as a test image on clouds such as OpenStack Compute. You can download a CirrOS image in various formats from the  <a target="_blank" href="http://download.cirros-cloud.net/">CirrOS download page</a>  I will use the command: </p>
<p><code>microstack launch cirros -name test</code></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1645398071334/Zqws0NQL_g.png" alt="MicroStack launch cirrOS" /></p>
<p>Now I will connect to the instance via ssh using the generated ssh keys that were shown in the output.  <em>(I just copied the command from the resulting output from creating the instance.)</em></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1645398748759/DmvtagK3N.png" alt="Connecting to Test instance via ssh" /></p>
<p>I then typed in <code>ip a</code> to get a quick status of the networking.  </p>
<h3 id="heading-access-the-cloud-dashboard">Access the Cloud Dashboard</h3>
<p><em>Now for the fun stuff!</em></p>
<p>To access the OpenStack (MicroStack) Cloud Dashboard, I need to open a browser with the IP address of the virtual machine running MicroStack.   So let me browse over to the IP address.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1645399221239/7-VBCueT3.png" alt="OpenStack Coud Dashboard" /></p>
<p>Now I need a username and password.  The tutorial states that the username is <em>admin</em>, but I also need to generate a password from the terminal console. The password is obtained by entering the command:</p>
<p><code>sudo snap get microstack config.credentials.keystone-password</code> </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1645399170021/Zzdaf0vkv.png" alt="Generate OpenStack Admin Password" /></p>
<p>Now I need to enter the username <em>admin</em> and generated password into the console.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1645399354877/5Nxk0yqVM.png" alt="OpenStack Login" /></p>
<p>And I can now look at my entire OpenStack environment on a Cloud Dashboard.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1645399440824/kXXtot_so.png" alt="OpenStack Cloud Dashboard" /></p>
<p>If I select <em>Instances</em>  I should be able to see the <em>test</em> instance that we created in the terminal. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1645399536959/OTkKe8rzS.png" alt="Test Instance Cloud Dashboard" /></p>
<h3 id="heading-where-to-go-from-here">Where to go from here?</h3>
<p>Now that you have your MicroStack environment deployed, you can get started with the basics of OpenStack by going through the <a target="_blank" href="https://ubuntu.com/openstack/tutorials">OpenStack Tutorials</a> by Canonical.  </p>
<p>Create your own micro cloud environment and have some fun!</p>
<p>There is even an <a target="_blank" href="https://assets.ubuntu.com/v1/8d3130a1-OpenStack.cheat.sheet.1.pdf">OpenStack Cheat Sheet</a> should you need it.  I'm pretty sure you will if you're new to OpenStack. </p>
<p>Thank you for your time during this tutorial/demonstration.  Please feel free to leave any comments below!</p>
]]></content:encoded></item><item><title><![CDATA[So it has Been a While...]]></title><description><![CDATA[It feels like it has been a minute since my last post.  In fact, it has been 117 days since my last Hashnode post. So what happened? 
Well, my day job as an Information Systems & Security Manager got a bit hectic in late October and November.  But th...]]></description><link>https://hashnode.brandonscloud.com/so-it-has-been-a-while</link><guid isPermaLink="true">https://hashnode.brandonscloud.com/so-it-has-been-a-while</guid><category><![CDATA[AWS]]></category><category><![CDATA[Cloud]]></category><category><![CDATA[Certification]]></category><category><![CDATA[infrastructure]]></category><dc:creator><![CDATA[Brandon Bowman]]></dc:creator><pubDate>Sat, 19 Feb 2022 02:51:14 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1645292371776/mkTdVtupT.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>It feels like it has been a minute since my last post.  In fact, it has been 117 days since my last Hashnode post. So what happened? </p>
<p>Well, my day job as an Information Systems &amp; Security Manager got a bit hectic in late October and November.  But then there were also the holidays and spending time with my (now) fiancée.  <strong><em>Yea! I'm also surprised that she said yes!</em></strong></p>
<p>In late October, I completed both the VMware Install, Configure, Manage (ICM) vSphere and Optimize and Scale (O&amp;S) vSphere courses through the <a target="_blank" href="https://www.clevelandcc.edu/program/vmware/">IT Academy at Cleveland Community College</a>.  These virtual courses are $180 tuition plus $16 for a digital textbook for each course; definitely more affordable than a corporate training program.  These courses count as the required courses to take the <a target="_blank" href="https://www.vmware.com/asean/education-services/certification/vcp-dcv.html">VMware Certified Professional - Data Center Virtualization</a> certification exam.  </p>
<p><strong><em>If you take both ICM and O&amp;$ courses, you will get 70% off both the VCTA and VCP-DCV Exams!</em></strong></p>
<p>In early November, I went and passed the <a target="_blank" href="https://www.credly.com/badges/b4de1072-cdc7-446d-8e8a-2810a48406a8/public_url">VMware Certified Technical Associate - Data Center Virtualization certification exam</a>.  This certification is the entry-level VMware vShpere certification that validates a basic understanding of virtualization and vSphere concepts.  I probably should have prepared more, but I barely passed. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1645292240494/mwDqjruUG.png" alt="vmware-certified-technical-associate-data-center-virtualization-2021" /></p>
<p>In late November, I started to study for the AWS Certig also studied and passed the <a target="_blank" href="https://www.credly.com/badges/aec5cd56-d089-4555-bb1d-acdf4d58f52a/public_url">AWS Certified Solutions Architect - Professional</a> certification in mid-January. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1645235239153/Rq_p2nRHn.png" alt="aws-certified-solutions-architect-professional.png" /></p>
<p>It was a pretty challenging exam, but I credit my success to the following sources:</p>
<ul>
<li><a target="_blank" href="https://gocloudcareers.com/cloud-architect-career-development-program/">The Cloud Architect Career Development program at Go Cloud Architects</a></li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1645235740960/IBOqx8dIA.png" alt="Go Cloud Architets" />
This program helped me understand the technologies and architectures behind public and private infrastructures more so than just learning the AWS services.  I credit Mike Gibbs for giving me the confidence and knowledge to help me succeed. Mike and his team also put out a free comprehensive <a target="_blank" href="https://www.gocloudarchitects.com/free-csa-p-ebook-pdf/">AWS Certified Solutions Architect - Professional study guide.</a></p>
<ul>
<li><a target="_blank" href="https://digitalcloud.training/aws-solutions-architect-professional/">AWS Certified Solutions Architect Professional course from Digital Cloud</a></li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1645237388694/TnI4objg3.png" alt="Neil Davis" /></p>
<p>Neil Davis' AWS Certified Solutions Architect Professional course really helped me understand all the AWS services and how they work together.  This was easy to understand and came with some fun hands-on labs.  I enjoyed his course. </p>
<ul>
<li><a target="_blank" href="https://portal.tutorialsdojo.com/courses/aws-certified-solutions-architect-professional-practice-exams/">AWS Certified Solutions Architect Professional Practice Exams 2022 from Tutorials Dojo</a></li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1645237522840/qJMP5Nfbg.png" alt="image.png" /></p>
<p>I believe that these practice exams were probably more difficult than the actual exam. But the explanations that came with these questions were amazing and thorough.  Overall, I thank Jon Bonso and his team for preparing me for this tough exam. </p>
<p>In late January, our company was in Las Vegas, NV hosting our winter conference at Caesars Palace. Part of my role includes setup and teardown of the conference, so I was out there for about 6 long days. I'm finally recovering from that trip.</p>
<p>During that conference, I also was able to present to a group of foodservice distributor executives on Ransomware. Although the topic can get super in-depth, I tried to keep it to a high-level and easy-to-understand conversation on what these executives should be asking from their IT support. Some of these companies outsource their IT Support to MSPs.  I hope that my presentation made complete sense to them.  If not, I'll go into our studio at work and record a better presentation. </p>
<p>Now, I am currently studying for the Certified Information Systems Security Professional exam which I intend on taking around the end of March.  I do plan on building more cloud projects and documenting/blogging more about my adventures, though! </p>
<p>I love infrastructure and I love security, so I need to get all together and start producing quality projects.</p>
<p>Thanks again for your patience! </p>
<p>-Brandon</p>
]]></content:encoded></item><item><title><![CDATA[Configure PHP on an Ubuntu Server]]></title><description><![CDATA[In the previous article in this series, we discussed how to install and configure the database layer, in your LAMP stack, using MySQL.  
Today, we are going to finish off the LAMP stack by adding the scripting layer. This layer is where the code of y...]]></description><link>https://hashnode.brandonscloud.com/configure-php-on-an-ubuntu-server</link><guid isPermaLink="true">https://hashnode.brandonscloud.com/configure-php-on-an-ubuntu-server</guid><category><![CDATA[Web Development]]></category><category><![CDATA[PHP]]></category><dc:creator><![CDATA[Brandon Bowman]]></dc:creator><pubDate>Sun, 24 Oct 2021 23:03:03 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1635116431245/62eVQ6pL2.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In the <a target="_blank" href="https://hashnode.brandonscloud.com/basic-installation-and-configuration-of-mysql">previous article in this series</a>, we discussed how to install and configure the database layer, in your LAMP stack, using MySQL.  </p>
<p>Today, we are going to finish off the LAMP stack by adding the scripting layer. This layer is where the code of your web application will run. In this demonstration, PHP will be used in this layer. However, a developer may want to use other scripting languages,  such as Python or Perl. </p>
<p>I currently have my Ubuntu Server (operating system layer) configured with Apache2 (web server layer) and MySQL (database layer).  Let me check for updates and make sure that I have the latest packages.  I will enter the following command:</p>
<pre><code>sudu apt <span class="hljs-keyword">update</span> &amp; sudo apt <span class="hljs-keyword">upgrade</span> -y
</code></pre><p>Followed by entering my password (if needed).</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1635110206824/RrdoH0bKC.png" alt="Upgrade and Update" /></p>
<p>This will get me an updated list of Ubuntu Server packages and install any available upgrades of all packages currently installed on the system. </p>
<p>Now if it has been a while since I last updated, it may take a minute or two.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1635110284590/mNS3Zvpcg.png" alt="Update and Upgrade Progress" /></p>
<p>My next step will be to bring up the <a target="_blank" href="https://ubuntu.com/server/docs/programming-php">Ubuntu Server documentation on PHP</a>.  This will give me a step-by-step guide to installing the PHP service. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1635110466619/GzjA9qWcX.png" alt="Ubuntu Server Documentation - PHP" /></p>
<p>Since I already have the Apache2 Web Server and MySQL Database installed, I can refer to just the Apache2 and MySQL sections in the documentation.  </p>
<p>To install PHP and the Apache PHP module I will enter the following command: </p>
<pre><code>sudo apt <span class="hljs-keyword">install</span> php libapache2-<span class="hljs-keyword">mod</span>-php
</code></pre><p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1635110726234/lX0M-ETr7.png" alt="Install PHP and Apache2 PHP Module" /></p>
<p>I will then enter <strong>Y</strong> to continue with the installation.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1635110806782/LznnDitHb.png" alt="Enter Y to Continue - Apache PHP" /></p>
<p>Once the installation is complete, I will then refer to the documentation to locate the command to use MySQL with PHP.  To use MySQL with PHP you should install the php-mysql package with the following command:</p>
<pre><code><span class="hljs-attribute">sudo</span> apt install php-mysql
</code></pre><p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1635111047270/R4mBBLX4-.png" alt="Install MySQL PHP package" /></p>
<p>Again, you will enter <strong>Y</strong> to continue with the installation.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1635111116835/VKIHE6mDQ.png" alt="Enter Y to Continue - MySQL PHP" /></p>
<p>When the MySQL PHP package is installed, you should restart the Apache2 Web Server to run PHP scripts.  You will run the following command: </p>
<pre><code>sudo systemctl <span class="hljs-keyword">restart</span> apache2.service
</code></pre><p>You will then need to check to see if the PHP service is configured correctly.  What I prefer to do is to create a <code>phpinfo.php</code> file in the <code>DocumentRoot</code> directory of the Apache2 web server.  In Apache2, this directory is located at <code>/var/www/html</code>.   </p>
<p>In the <code>phpinfo.php</code> file, I will place the following code into the file using VIM:</p>
<pre><code><span class="hljs-meta">&lt;?php</span>
  phpinfo();
<span class="hljs-meta">?&gt;</span>
</code></pre><p>The following image shows me changing to the <code>/var/www/html</code> directory.  Listing the contents of the directory with <code>ls</code>.  And then creating a file using the command <code>sudo vim phpinfo.php</code>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1635111858691/TGRYiS4Ag.png" alt="Creating phpinfo.php" /></p>
<p>Once in VIM, I will insert and save the snippet of code.  Press the letter <strong>I</strong> to switch into insert mode so that you can start editing the file.  </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1635112052555/xKatYjG3P.png" alt="Insert Code into VIM" /></p>
<p>Once you're done, press the escape key <strong>Esc </strong>to get out of insert mode and back to command mode. Type <strong>:wq</strong> to save and exit your file.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1635111937077/lKZ9ZoBjB.png" alt="Save and exit VIM file" /></p>
<p>I will then enter the command <code>ls</code> to make sure the <code>phpinfo.php</code> file is in my <code>/var/www/html</code> directory. 
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1635112157016/H61GbGa58.png" alt="LS to check for phpinfo.php" /></p>
<p>I will then restart the Apache2 service with the following command:</p>
<pre><code>sudo systemctl <span class="hljs-keyword">restart</span> apache2
</code></pre><p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1635112266149/VdF5NK4pm.png" alt="Restart Apache2 service" /></p>
<p>I will then call up my phpinfo.php file from my web browser.  This will verify that both the Apache2 web server and the PHP service are running correctly.  Point your browser to <code>http://hostname/phpinfo.php</code>. This will display the values of various PHP configuration parameters.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1635113681652/aAVSQ2UfQ.png" alt="Phpinfo Page" /></p>
<p><strong><em>Prior to pubically deploying your application, you should remove the phpinfo.php file completely. </em></strong> Leaving this page on your webserver directory will give potential hackers more information on the services you are running, which may cause them to exploit known vulnerabilities.  Therefore, you (as the administrator) or your developer needs to remove the file as soon as possible.</p>
<p>This concludes my tutorial on installing and configuring PHP on your LAMP stack.  Please feel free to leave comments below!</p>
<p>Thanks again!</p>
]]></content:encoded></item><item><title><![CDATA[Basic Installation and Configuration of MySQL]]></title><description><![CDATA[In the last article, we quickly discussed how to set up and configure an Apache2 web server. The next part of configuring a LAMP stack is the MySQL database. 
According to the documentation, MySQL is the most popular Open Source SQL database manageme...]]></description><link>https://hashnode.brandonscloud.com/basic-installation-and-configuration-of-mysql</link><guid isPermaLink="true">https://hashnode.brandonscloud.com/basic-installation-and-configuration-of-mysql</guid><category><![CDATA[MySQL]]></category><category><![CDATA[infrastructure]]></category><category><![CDATA[Web Development]]></category><dc:creator><![CDATA[Brandon Bowman]]></dc:creator><pubDate>Sun, 03 Oct 2021 22:59:27 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1633301836565/c9_L754Ml.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In the <a target="_blank" href="https://hashnode.brandonscloud.com/configure-an-apache-webserver-on-an-ubuntu-server">last article</a>, we quickly discussed how to set up and configure an Apache2 web server. The next part of configuring a LAMP stack is the MySQL database. </p>
<p>According <a target="_blank" href="https://dev.mysql.com/doc/refman/8.0/en/what-is-mysql.html">to the documentation</a>, MySQL is the most popular Open Source SQL database management system and is developed, distributed, and supported by Oracle Corporation. The MySQL Database Server is very fast, reliable, scalable, and easy to use and can work in client/server or embedded systems. </p>
<p>Apparently, the official way to pronounce “MySQL” is “My Ess Que Ell” (not “my see-quel”).   But they do not mind if you pronounce it as “my see-quel” or in some other localized way. MySQL is also named after co-founder Monty Widenius's daughter, My.</p>
<p><img src="https://media.giphy.com/media/83QtfwKWdmSEo/giphy.gif" alt="The more you know." /></p>
<p>However, you can use other database alternatives in your LAMP stack such as PostgreSQL, MariaDB, or MongoDB (for a NoSQL database).</p>
<p>Developers, such as the one that I work with, love using MySQL and find many uses for it. In a LAMP stack, the MySQL database is used for storing application data.</p>
<p>So how do we install and configure MySQL for use?  In this short tutorial, I will configure a MySQL database for use on an Ubuntu Server VM.   </p>
<p>Canonical (the software company that provides commercial support and related services for the Ubuntu distribution) provides an easy-to-understand <a target="_blank" href="https://ubuntu.com/server/docs">Ubuntu server documentation guide</a>. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1633281070607/va-poEowU.png" alt="Ubuntu Server Documentation" /></p>
<p>Another source of documentation that I will reference is the <a target="_blank" href="https://dev.mysql.com/doc/refman/8.0/en/">MySQL 8.0 Reference Manual</a>.  This documentation is more MySQL-specific but is very useful.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1633297088262/KGBu85QVD.png" alt="MySQL 8.0 Reference Manual" /></p>
<p>Even if I have configured the service hundreds of times, I like to have the documentation ready on a screen with me. Most times I will be doing this type of project at work and will end up with 20 different distractions before I get this completed and ready for my developer to use.  </p>
<p>Let's first pull up the <a target="_blank" href="https://ubuntu.com/server/docs/databases-mysql">Ubuntu Server documentation on MySQL</a>. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1633281163932/tISBc-Xd0.png" alt="Ubuntu Server - MySQL Guide" /></p>
<p>The first command looks easy enough.... </p>
<p><code>sudo apt install mysql-server</code> </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1633281977000/u66iCG6T5.png" alt="Install MySQL-Server Command" /></p>
<p>Do I want to continue?  Press <strong>Y</strong> for Yes. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1633282123498/WE7gEYyna.png" alt="Do I want to continue?" /></p>
<p>Now the MySQL packages are installing. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1633282079630/qFYWVjlY2.png" alt="Packages installing" /></p>
<p>Depending on your connection, the installation takes a minute or two.  You will see the progress bar down at the bottom.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1633282223421/JJatAHp1C.png" alt="Progress Bar for Installing MySQL" /></p>
<p>Once you receive your terminal prompt again, type in the following command to check the status of the service via systemd: </p>
<p><code>sudo service mysql status</code> </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1633282357572/eVKQiXRUP.png" alt="Check MySQL Status" /></p>
<p>Then you can check the network status of the MySQL service by sunning the <code>ss</code> command:</p>
<p><code>sudo ss -tap | grep mysql</code></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1633282479594/VQAR4ItsU.png" alt="Check MySQL Network Status" /></p>
<p>Once I confirmed that the MySQL service is running correctly, I will run the <strong>mysql_secure_installation</strong> command.  This <a target="_blank" href="https://dev.mysql.com/doc/refman/8.0/en/mysql-secure-installation.html">MySQL Installation-related program</a> is a guided setup to improve the security of your MySQL installation.  As stated in the <a target="_blank" href="https://dev.mysql.com/doc/refman/8.0/en/mysql-secure-installation.html">MySQL documentation</a>, this program enables you to improve the security of your MySQL installation in the following ways:</p>
<ul>
<li><p>You can set a password for root accounts.</p>
</li>
<li><p>You can remove root accounts that are accessible from outside the local host.</p>
</li>
<li><p>You can remove anonymous-user accounts.</p>
</li>
<li><p>You can remove the test database (which by default can be accessed by all users, even anonymous users), and privileges that permit anyone to access databases with names that start with <em>test_</em>.</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1633297416782/Gy4xw_fr1.png" alt="4.4.2 mysql_secure_installation — Improve MySQL Installation Security" /></p>
<p>When executed, <strong>mysql_secure_installation</strong> prompts you to determine which actions to perform. </p>
<p>Let us see it in action.... </p>
<p>The command is <code>sudo mysql_secure_installation</code> </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1633297664529/AUVeB7YKl.png" alt="mysql_secure_installation command" /></p>
<p>First question I get is...</p>
<blockquote>
<p>Would you like to setup VALIDATE PASSWORD component?</p>
</blockquote>
<p>In the paragraph above the question, it states that the VALIDATE PASSWORD component checks for the strength of a password. As a Systems Administrator with security in mind, this seems like a good feature.  Let me press <strong>Y</strong> for yes.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1633297952979/lc9CVPWfU.png" alt="VALIDATE PASSWORD component" /></p>
<p>The next question I receive is to select which level of password validation policy I would like to implement.  My choices are as follows:</p>
<blockquote>
<p>LOW: At least 8 characters in length.</p>
<p>MEDIUM: At least 8 characters in length, numeric, mixed case, and special characters</p>
<p>STRONG: At least 8 characters in length, numeric, mixed case, and special characters, and no dictionary words.</p>
</blockquote>
<p>That's going to be <strong>STRONG</strong> for me.  I want at least 8 characters, mixed case, numbers, special characters, and no dictionary words.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1633298127118/xiXI1ePfl.png" alt=" level of password validation policy" /></p>
<p>Now time to set up a password for the <strong>root</strong> account. As you can see in the image below, my password had an estimated score of 100.  Since I am happy with my password, I will then select <strong>Y</strong> to continue.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1633298356307/vQncVCUKf.png" alt="Root User Password" /></p>
<p>Now I am asked if I want to remove <strong>Anonymous Users</strong>.  If this was a test database with no data of any value, I wouldn't care about this.  But since this is database will be used in production, let's go ahead and remove <strong>Anonymous Users</strong>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1633298613047/NOvIo2QHJ.png" alt="Remove Anonymous Users" /></p>
<p>I am now asked if I should only allow the root user to connect from the 'localhost'.  This means that the root user can only log in to the MySQL service from the local virtual machine. If a user connects to the virtual machine via SSH and then to the root account on MySQL service, that will still be allowed. I am going to select <strong>Y</strong> for this. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1633298749513/USJjNwDMUU.png" alt="Roos User Local Machine" /></p>
<p>Then I am asked if I want to remove the test database. I will leave it for now and select <strong>N</strong>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1633298831965/jyTaXpi_G.png" alt="Remove Test Database" /></p>
<p>The next question asks me to <strong>Reload the privilege tables</strong>.  This will ensure that all changes made so far will go into effect.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1633298930058/GmqN1bZLI.png" alt="Reload the privilege tables" /></p>
<p>Looks like I am all done with the <strong>mysql_secure_installation</strong> program! </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1633298992491/Z4KJsnMQ5.png" alt="mysql_secure_installation completed" /></p>
<p>Now time to log in to the MySQL service and see what users are listed.  The command I will use is <code>sudo mysql -u root -p</code>. I will then be prompted to enter my password. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1633299445325/OBxAppLWz.png" alt="Login to MySQL" /></p>
<p>Let me try that again!  Then follow it up with this SQL command to get the list of users:
<code>SELECT DISTINCT User from mysql.user;</code> </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1633299554700/LEtyikr-Z.png" alt="Root MySQL login and get list of users" /></p>
<p>I will not create my user account and request a randomly generated password.  This will be the user account that I give to my developer, assuming his name is also Brandon (Which would be strange!):</p>
<p><code>CREATE USER brandon@localhost IDENTIFIED BY RANDOM PASSWORD;</code></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1633299697830/klKVc_cfk.png" alt="Create MySQL user" /></p>
<p>Then I will grant my user account all privileges, which will make it an Administrator account.  I will then need to flush the privileges so they go into effect:</p>
<p><code>GRANT ALL PRIVILEGES ON *.* TO brandon@localhost;</code></p>
<p>Followed by:</p>
<p><code>FLUSH PRIVILEGES;</code></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1633299951939/K-_bXEu-R.png" alt="Apply privileges to the user." /></p>
<p>Now I will try to log in to that user account I just created.</p>
<p><code>sudo myspl -u brandon -p</code></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1633300038010/9REACNjI-.png" alt="MySQP login to user account." /></p>
<p>From there I can list the tables:</p>
<p>```SHOW DATABASES;"</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1633300149194/EbzNZ1792.png" alt="Show tables" /></p>
<p>Looks like our MySQL service is ready for use.  I will then share the user credentials with my web developer for his use. </p>
<p>Thank you for taking to time to go through this tutorial with me!  Please feel free to leave any comments below.</p>
]]></content:encoded></item><item><title><![CDATA[Something is wrong with my company's website]]></title><description><![CDATA[During some free time on my wonderful vacation to Denver last week, I noticed an error with the SSL certificate on my company's website. Being the company's Information Systems & Security Manager, I should have noticed this earlier.  
Low and behold ...]]></description><link>https://hashnode.brandonscloud.com/something-is-wrong-with-my-companys-website</link><guid isPermaLink="true">https://hashnode.brandonscloud.com/something-is-wrong-with-my-companys-website</guid><category><![CDATA[Security]]></category><category><![CDATA[Web Development]]></category><category><![CDATA[SSL]]></category><dc:creator><![CDATA[Brandon Bowman]]></dc:creator><pubDate>Fri, 24 Sep 2021 14:31:34 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1632493387749/fs3Vf0g5g.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>During some free time on my wonderful vacation to Denver last week, I noticed an error with the SSL certificate on my company's website. Being the company's Information Systems &amp; Security Manager, I should have noticed this earlier.  </p>
<p>Low and behold there was an error right on my phone screen.... </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1632406359004/XnzNUDxim.jpeg" alt="Frosty Acres SSL/TLS certificate error" /></p>
<p>Now that I think about it, I may have heard about it from one of our member's Managed Service Provider in an email not too long ago after I told the member that their SPF record was incorrect and their emails were not being delivered successfully. <em>That is another story...</em> </p>
<h3 id="so-what-really-was-the-issue">So what really was the issue?</h3>
<p>As you can see in the picture above, the warning I received was that the certificate did not match the URL.  </p>
<p>So let's take a look at the certificate in more detail... </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1632406526467/0TU3xYQIk.jpeg" alt="Frosty Acres SSL Certificate" /></p>
<p>The certificate was issued to "<a target="_blank" href="www.frostyacres.com">www.frostyacres.com</a>".  </p>
<p><em>But that looks correct, right?</em></p>
<p>In a sense, it does.  However, the first image was making a request to "<a target="_blank" href="frostyacres.com">frostyacres.com</a>" and not "<a target="_blank" href="www.frostyacres.com">www.frostyacres.com</a>".  The browser is looking for the certificate for "<a target="_blank" href="https://frostyacres.com">frostyacres.com</a>".</p>
<h3 id="so-how-do-you-fix-it">So how do you fix it?</h3>
<p>To fix this issue, you must go back and have a cert reissued for "<a target="_blank" href="https://frostyacres.com">frostyacres.com</a>" with "<a target="_blank" href="https://www.frostyacres.com">www.frostyacres.com</a>" as a <strong>Certificate Subject Alternative Name</strong>.  </p>
<p>I should have known this because this is how my SSL certificate is configured on my personal website <a target="_blank" href="https://brandonscloud.com">brandonscloud.com</a>. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1632406967265/DfMQ-OxiIe.jpeg" alt="Brandons's Cloud SSL Certificate" /></p>
<p>The certificate for my personal website is issued to brandonscloud.com and has www.brandonscloud.com as an <strong>Alternative Name</strong></p>
<p>Since we used a free SSL certificate from <a target="_blank" href="https://letsencrypt.org/">LetsEncrpty </a> and our web server is running on a common Linux distribution, I had to run several terminal commands to get <a target="_blank" href="https://certbot.eff.org/">Certbot</a>  to reissue the certificate. Certbot is a free, open-source software tool for automatically using Let’s Encrypt certificates on manually-administrated websites to enable HTTPS.</p>
<p>Several commands later, I had a valid certificate. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1632408102358/J-BLwh6Wg.png" alt="New Certbot Certificate" /></p>
<p>However, I did manage to break a few things but had my web developer next to me and we quickly got the website back online within a few minutes.   </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1632408241710/BNdb87MPR.jpeg" alt="New Frosty Acres SSL certificate" /></p>
<p>The new certificate looks good and we shouldn't see any issues.</p>
<p>I hope you enjoyed the read.  Please feel free to leave any comments. </p>
]]></content:encoded></item><item><title><![CDATA[Why do I write?]]></title><description><![CDATA[Day #1 of the Hashnode Bootcamp certainly gave me an interesting perspective on my journey into technical writing. Sam Sycamore and Quincy Larson gave us an excellent Keynote opener, and Edidiong Asikpo followed up with a great discussion on how to g...]]></description><link>https://hashnode.brandonscloud.com/why-do-i-write</link><guid isPermaLink="true">https://hashnode.brandonscloud.com/why-do-i-write</guid><category><![CDATA[hashnodebootcamp]]></category><dc:creator><![CDATA[Brandon Bowman]]></dc:creator><pubDate>Wed, 15 Sep 2021 14:52:42 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1631717474356/BcpEW2F4m.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Day #1 of the <a target="_blank" href="https://hashnode.com/bootcamp">Hashnode Bootcamp</a> certainly gave me an interesting perspective on my journey into technical writing. Sam Sycamore and Quincy Larson gave us an excellent Keynote opener, and Edidiong Asikpo followed up with a great discussion on how to get started with technical writing. </p>
<p>The biggest thing I took away from Day #1 was <strong>to take the time to just write.  Practice makes perfect.</strong></p>
<h3 id="why-do-i-write">Why do I write?</h3>
<p>That is an interesting question.... I started off by wanting to build a portfolio of cloud infrastructure projects that I was working on, and I wanted to have a place where I can document all my projects for not just myself, but for other technology professionals getting into various infrastructure projects.  It turns out potential employers like to see these write-ups as well, too.  It's basically a win-win for everyone!</p>
<p>My girlfriend is also a published author and she really thought it would be a good idea for me to write short technical pieces.  She is also currently working on her Master of Arts in Professional Writing (Applied Writing) and recently accepted a position that would allow her to create more technical content. <em>Super proud of her!!!!</em>  </p>
<h3 id="how-did-i-get-to-hashnode">How did I get to Hashnode?</h3>
<p>I tried looking into other platforms, but a fellow student of mine from Western Governers University introduced me to Hashnode a couple of months ago.  I started to give it a shot and turns out that it works really well for what I am trying to accomplish. </p>
<p>So between what my goals were and my amazing girlfriend, it really motivated me to write technical content pieces.  If you have read some of my previous blogs, then you know that I am not a developer but more of a systems and infrastructure professional.  I feel that I need to continue to write more so that I can communicate better with everyone, not just professionally but also in my personal relationships.</p>
<h3 id="where-will-i-go-from-here">Where will I go from here?</h3>
<p>Who really knows?  My biggest struggle is just taking the time to write.  I need to do better, and I will do better.</p>
<p><strong>Thank you, Hashnode, for providing an amazing platform. I hope that you will continue to become a better community for content creators for years to come. </strong></p>
]]></content:encoded></item><item><title><![CDATA[Configure an Apache Webserver on an Ubuntu Server]]></title><description><![CDATA[If you didn't know... LAMP stands for Linux, Apache, MySQL, and PHP.  These applications working together provide a complete framework for web applications. To get a better understanding of how a LAMP stack works, check out this easy-to-understand ar...]]></description><link>https://hashnode.brandonscloud.com/configure-an-apache-webserver-on-an-ubuntu-server</link><guid isPermaLink="true">https://hashnode.brandonscloud.com/configure-an-apache-webserver-on-an-ubuntu-server</guid><category><![CDATA[Ubuntu]]></category><category><![CDATA[apache]]></category><category><![CDATA[infrastructure]]></category><category><![CDATA[webdev]]></category><dc:creator><![CDATA[Brandon Bowman]]></dc:creator><pubDate>Sun, 22 Aug 2021 21:25:45 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1629667429054/zWG7c9-JG.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>If you didn't know... LAMP stands for Linux, Apache, MySQL, and PHP.  These applications working together provide a complete framework for web applications. To get a better understanding of how a LAMP stack works, check out <a target="_blank" href="https://www.section.io/engineering-education/lamp-stack/">this easy-to-understand article</a> written by Kanishkvardhan A N.   Kanishkvardhan A N is a sophomore at SDM College of Engineering and Technology pursuing his B.E in Information Science and Engineering. </p>
<p>Today we're going to quickly cover the letter "A" in LAMP; Apache. </p>
<p>As a Systems Manager or Infrastructure Architect, you don't need to know how to create a complete web application from top to bottom.  But you should be familiar with how these services work together and how to quickly deploy the backend infrastructure when needed.  </p>
<p><a target="_blank" href="https://hashnode.brandonscloud.com/ubuntu-server-2004-lts-virtual-machine-deployment">In a previous post</a>, I went over how to deploy the "L" portion of the stack by quickly deploying an Ubuntu Server 20.04 LTS VM on an ESXi host. </p>
<p>I've just logged in to my Virtual Machine using the <a target="_blank" href="https://www.putty.org/">Putty SSH Client application</a>.  I find this easier than working on a console from the ESXi host because I can easily copy and paste commands into the terminal through Putty. As you can see, the Server is pretty up to date.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1629665303747/2lCV3IeB2.png" alt="Putty Terminal logged in to Ubuntu Server" /></p>
<p>Next, I will bring up the <a target="_blank" href="https://ubuntu.com/server/docs/web-servers-apache">Ubuntu Server documentation on installing Apache</a>.  </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1629665660971/SZKUzOCt7.png" alt="Web Servers - Apache | Ubuntu Documentation" /></p>
<p>You can use the above documentation or even use the <a target="_blank" href="https://ubuntu.com/tutorials/install-and-configure-apache#1-overview">tutorial lesson provided by Ubuntu</a>. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1629665738281/heQnmL-_6.png" alt="Install and Configure Apache | Ubuntu Tutorial" /></p>
<p>I will then type in the following command to install the Apache webserver:</p>
<p><code>sudo apt install apache2</code> </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1634230284639/w7RYRdVXM.png" alt="Install Apache2 Command" /></p>
<p>The console will then ask me if I want to continue.  <em>Of course, I do!</em></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1629665960217/SRshMfuDk.png" alt="Do you want to continue?" /></p>
<p>There shouldn't be any errors and you will then be brought back to your command prompt.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1629666032408/XVOeyddeA.png" alt="Command Prompt After Installation" /></p>
<p>We can now test out your Apache2 installation by typing the IP address for the webserver into a browser page.  <em>Be sure to have port 80 and port 443 allowed through your UFW.</em></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1629666169515/i8mbNXi5lM.png" alt="Apache2 Index.html page" /></p>
<p><em>It works!</em></p>
<p>That's all you need to do. You can now pass this on to your web developer for use. </p>
<p>Nice and easy. Part 3 is the "M" portion; MySQL.  Coming soon!</p>
<p>Thanks again for reading!</p>
]]></content:encoded></item><item><title><![CDATA[Ubuntu Server 20.04 LTS Virtual Machine Deployment]]></title><description><![CDATA[About once every couple of months, our resident Web Developer will ask me to “spin him up a Linux server.” As vague as that request can be, I usually have to ask him if he has any specifications for said Linux server.  
Now I could just have a blank ...]]></description><link>https://hashnode.brandonscloud.com/ubuntu-server-2004-lts-virtual-machine-deployment</link><guid isPermaLink="true">https://hashnode.brandonscloud.com/ubuntu-server-2004-lts-virtual-machine-deployment</guid><category><![CDATA[Ubuntu]]></category><category><![CDATA[server]]></category><category><![CDATA[deployment]]></category><category><![CDATA[infrastructure]]></category><dc:creator><![CDATA[Brandon Bowman]]></dc:creator><pubDate>Sat, 21 Aug 2021 03:57:52 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1629518470816/sM1krWfKW.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>About once every couple of months, our resident Web Developer will ask me to “spin him up a Linux server.” As vague as that request can be, I usually have to ask him if he has any specifications for said Linux server.  </p>
<p>Now I could just have a blank template server and then adjust my virtual machine settings as needed, but that wouldn’t be as much fun as doing it from scratch. However, Ubuntu does provide a  <a target="_blank" href="https://ubuntu.com/server/docs/install/autoinstall">method of automating server installs</a>  via a configuration file. This process is different from the cloud automation YAML files or playbooks (ie. Chef, Ansible, Puppet, Terraform, etc.) that you hear about today. This automates the installation of the Operating System by answering all the configuration questions ahead of time. </p>
<p>Since I am somewhat of a Linux <em>newb </em>and I am currently studying for the CompTIA Linux+ certification, getting some practice with Linux commands is always good. 
As a good method of habit to have the  <a target="_blank" href="https://ubuntu.com/server/docs">Ubuntu Server Guide </a> open while I work. The documentation is pretty thorough, and I can quickly search for terms and find the correct documentation to help me.</p>
<h3 id="heading-register-the-virtual-machine">Register the Virtual Machine</h3>
<p>In my work vSphere environment, we utilize the vCenter Server advanced server management software. This virtual appliance provides us with a centralized platform to control our entire vSphere environment on one single console. I am a big fan of using the vCenter Server as it gives me insight across all my ESXi hosts.  </p>
<p>In this demonstration, I will be installing the Ubuntu Server VM on an ESXi server provided by Mike Gibbs and his team at Go Cloud Architect. This server access is made available to students of the <a target="_blank" href="https://www.gocloudarchitects.com/coaching/">Cloud Architect Career Development course</a>. Students share access to their ESXi servers to build their virtual machines and cloud infrastructure. </p>
<p>First, we need to allocate the computing resources for the Virtual Machine.  I first will click on <strong>Create /Register VM</strong>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1629515475110/hB7DHKGad.png" alt="Creating/Register VM ESXi Server" /></p>
<p>Then I will need to specify a unique name and OS for the virtual machine. If you mess up the name, you can always change it later. I will also select <strong>Linux</strong> as the Guest OS Family and <strong>Ubuntu Linux (64-Bit)</strong> as the Guest OS Version.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1629515405271/s9yjiCwUE.png" alt="Naming your Virtual Machine" /></p>
<p>Next, I will need to select where I will store the virtual machine’s files and its’ virtual disks.  Since this server has only one storage location, I will select <strong>datastore1</strong>. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1629515433932/xxULNpkwF.png" alt="ESXi Datastorage" /></p>
<p>Side note.... Storage locations for ESXi servers do not have to be physically on the server. You can <a target="_blank" href="https://docs.vmware.com/en/VMware-vSphere/7.0/com.vmware.vsphere.storage.doc/GUID-CC4A9BA1-AB17-4D83-9145-20B7C3024E24.html">configure a connection to a SAN (Storage Area Network)</a> to store your virtual machines. Quoting the documentation, using ESXi with a SAN improves flexibility, efficiency, and reliability. Using ESXi with a SAN also supports centralized management, failover, and load balancing technologies.</p>
<p>I will then customize the Virtual Hardware and edit the VM options. According to the  <a target="_blank" href="https://ubuntu.com/server/docs/installation">Ubuntu Server documentation</a>, the recommended system requirements are:
•    CPU: 1 gigahertz or better
•    RAM: 1 gigabyte or more
•    Disk: a minimum of 2.5 gigabytes</p>
<p>Depending on the usage of the server, I will not overload my VM with unnecessary computing resources. If the application calls for 1 vCPUs, 4GB of RAM, and 10GB of storage, I’ll usually allocate 2vCPUS, 8GB of RAM, and at least 20GB of storage. I don’t want the application to use all of the VM’s allocated resources, so I will double what is required in case of resource spikes caused by the operating system. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1629515526868/bJm94kyZv.png" alt="VM Hardware Settings" /></p>
<p>Since I am only using this server as a demonstration and this is a server provided by Go Cloud Architect, I will keep the resources down to a minimum. I can add things such as additional virtual Hard Disks, Network Adapters, and even CD/DVD drives. For the CD/DVD Media, you will need to change the selection to <strong>Datastore ISO File</strong>, then select the .ISO file which corresponds to the Operating System which you are trying to install.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1629515612076/niasAn_Wb.png" alt="ISO loaded to CD/DVD Drive" /></p>
<p>In the <strong>VM Options</strong> menu, you can configure different types of Boot Options and advanced settings. Typically, I do not use these options, but they are there if you need them.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1629515650909/x17tKAm_Z.png" alt="VM Options Menu" /></p>
<p>You will then review your selection and then select <strong>Finish</strong> to deploy the Virtual Machine on the ESXi host.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1629515682040/ewk-7dALS.png" alt="Review Screen" /></p>
<p>Once your VM is registered in the list on your ESXi host, you will select your Virtual Machine then select <strong>Power On</strong>. You will see your machine power on in the provided window. To get a better view, select <strong>Console</strong> to open a console window.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1629516584434/3HiC6guIO.png" alt="ESXi VM Console" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1629516613945/c3PfiLAvS.png" alt="Console Window Selection" /></p>
<p>You can even click on the provided preview window and a small console window will open.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1629516653979/kekiZFwi3.png" alt="Small Console Window" /></p>
<h3 id="heading-installing-and-configuring-the-operating-system">Installing and Configuring the Operating System</h3>
<p>Now it’s time to go through the options to configure the OS. <em>Almost there, my friends! </em>
After selecting the appropriate language option, you will then be taken into the Network Options. </p>
<p>In the <strong>Network Connections</strong> menu, you can configure your virtual network interface. As a good rule of thumb, servers will almost always have a static private IP address. If you keep your server on DHCP and it is assigned a different IP address, some other services trying to connect to it will likely be unable to find the server on your network. You can assign your static private IP address here or wait to do it after the installation of the Operating System. In this scenario, I will leave it as is.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1629516802507/veI9CHB6y.png" alt="Ubuntu Server Network Options" /></p>
<p>In the section labeled <strong>Guided Storage Configuration</strong> you will see several options. If you do not know what to select, the <a target="_blank" href="https://ubuntu.com/server/docs/install/storage">Ubuntu Server documentation</a> for this section will help. The documentation states the following: </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1629516856127/HAmmDbc-q.png" alt="Disk Options" /></p>
<p>A couple of things to note… <strong>LVM </strong>stands for <a target="_blank" href="https://wiki.ubuntu.com/Lvm"><em>Logical Volume Management</em></a>. It is a system of managing logical volumes or filesystems, that is much more advanced and flexible than the traditional method of partitioning a disk into one or more segments and formatting that partition with a filesystem.</p>
<p><strong>LUKS </strong>stands for <em>Linux Unified Key Setup-on-disk-format</em> and is used for full-disk encryption. This is similar to the Windows Bitlocker Drive encryption service and will require the user to enter in a passphrase each time the system boots. This could be problematic if your server reboots automatically for updates. </p>
<p>I usually keep the default settings and move on to <strong>Storage Configuration</strong> where I will review the options and select <strong>Done</strong> when I am satisfied with the partitions.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1629516887526/L1tmfVVHO.png" alt="Guided Disk Configuration Options" /></p>
<p>You will then select <strong>Continue</strong> on the <strong>Confirm Destructive Action</strong> screen.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1629516913083/o7JGSRgnL.png" alt="Confirm Destructive Action Option" /></p>
<p>The next window allows you to set up a profile for the administrator account and select a hostname, then chose a complex password. For this exercise, I will keep things simple. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1629516935571/bI2zQQmTv.png" alt="Hostname and User Account Setup" /></p>
<p>Then I will enable the <strong>Install OpenSSH Server</strong> setup option for remote access to the server. Since this virtual machine is in my private network, and not exposed to the public internet, there is minimal risk of attacks. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1629516984111/2QKFmuwSp.png" alt="OpenSSH Server Option" /></p>
<p>After the OpenSSH menu, you can select from a list of <strong>Featured Server Snaps</strong>. This feature could help should you have the need for some of these services (ie Docker, AWS CLI, etc). But for now, I will leave it blank and select <strong>Done</strong> to begin the installation of the operating system. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1629517265220/DVPZxwWmu.png" alt="Additional options" /></p>
<p>Once the installation is complete, you will select <strong>Reboot </strong>Now to reboot the Virtual Machine. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1629517045704/eajUFJUvF.png" alt="Reboot Now Option" /></p>
<p>If you do not see a login prompt after reboot, press <strong>Enter</strong> on your keyboard, and the login prompt will appear.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1629517073870/svZyidhLT.png" alt="Login Prompt after OS Installation" /></p>
<p>You will then log in to your Ubuntu Server with the credentials that you provided during the setup process.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1629517110269/4BiaL-9VV.png" alt="Successful Login" /></p>
<p>Since I installed the OpenSSH server during the OS configuration, I can now use an SSH client, such as  <a target="_blank" href="https://www.putty.org/">Putty</a>, to connect to the Ubuntu Server. This will make it easier for me to copy and paste Linux commands into the terminal session. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1629517126357/xmDkpbNkg.png" alt="Console and Putty Side by Side" /></p>
<p>Once I am logged in to my Ubuntu Server, the first thing I typically like to do is to <a target="_blank" href="https://ubuntu.com/server/docs/package-management">update and upgrade</a> the Operating System packages using the following commands:</p>
<blockquote>
<blockquote>
<p><code>sudo apt update &amp;&amp; sudo apt upgrade -y</code></p>
</blockquote>
</blockquote>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1629517154476/BODtm8Aek.png" alt="Update and upgrade Ubuntu Server" /></p>
<p>From there, I will enable the default host-based firewall tool for Ubuntu named the  <a target="_blank" href="https://ubuntu.com/server/docs/security-firewall"><strong>Uncomplicated Firewall (UFW)</strong></a>. Typically I will know what services should be allowed to the server. For instance, if I know that this server will be used as a web server, I will allow access to ports 22 (SSH), 80 (HTTP), and 443 (HTTPS) using the following commands:</p>
<blockquote>
<blockquote>
<p><code>sudu ufw enable</code></p>
<p><code>sudo ufw allow ssh</code></p>
<p><code>sudo ufw allow http</code></p>
<p><code>sudo ufw allow https</code></p>
<p><code>sudu ufw status</code></p>
</blockquote>
</blockquote>
<p><em>Always check the documentation to see if there are commands you could use to allow other services to your server.</em> </p>
<p>My next step would be to create  <a target="_blank" href="https://ubuntu.com/server/docs/security-users">authorized user accounts</a>. For example, my Web Developer needs access to the server, I would create an appropriate level account for him. In this scenario, I would give him root/administrator level permissions. I would use the following commands:</p>
<blockquote>
<blockquote>
<p><code>sudo adduser webdev</code></p>
<p><code>sudo adduser webdev sudo</code></p>
</blockquote>
</blockquote>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1629517331245/fEVD1qrsB.png" alt="Added WebDev account" /></p>
<p>From there, it is up to the Web Developer what applications or services he wants to install on the server.  I have met the requirement to produce a functioning Ubuntu Server Virtual Machine.</p>
<p>Thank you for your time in reading this! I hope you enjoyed this post.</p>
]]></content:encoded></item><item><title><![CDATA[Connecting to Your VPN While In-Flight]]></title><description><![CDATA[So about two and a half months ago, I configured 2FA for our Meraki VPN service. (Check out the write-up if you want to) Works well and I slept a little better at night knowing that my remote users had secure access to the corporate network.
A common...]]></description><link>https://hashnode.brandonscloud.com/connecting-to-your-vpn-while-in-flight</link><guid isPermaLink="true">https://hashnode.brandonscloud.com/connecting-to-your-vpn-while-in-flight</guid><category><![CDATA[Security]]></category><category><![CDATA[infrastructure]]></category><dc:creator><![CDATA[Brandon Bowman]]></dc:creator><pubDate>Sat, 14 Aug 2021 01:42:33 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1628905283438/NmjEQzQq_.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>So about two and a half months ago, I configured 2FA for our Meraki VPN service. (<a target="_blank" href="https://hashnode.brandonscloud.com/duo-authentication-proxy-securing-our-meraki-vpn-with-2fa">Check out the write-up if you want to</a>) Works well and I slept a little better at night knowing that my remote users had secure access to the corporate network.</p>
<p>A common question I get is “How do I connect to the VPN while I am traveling, and only have registered my laptop to the airplane Wi-Fi? Paying for a second device (mobile phone) to access the in-flight Wi-Fi would be costly.”  </p>
<p><em>That is a good question!</em> Unlike me, some people do like to get work done during a long flight. And we all know how <em>not</em> secure in-flight Wi-Fi is. In-Flight Wi-Fi connections are essentially the same public Wi-Fi hotspots that are used on the ground. Even paying for access does not mean your device is safe. </p>
<p> As a rule of thumb, <strong>using a VPN connection is always recommended while conducting work activities on your laptop, especially from public Wi-Fi networks and hotspots.</strong> Just because you’re in the air, doesn’t mean that your data can’t be stolen.</p>
<p>Also, the reliability of these connections is also not guaranteed. In-flight Wi-Fi from 30,000 feet still must travel through multiple routers and connections before it gets to its destination. To see how In-Flight Wi-Fi works, <a target="_blank" href="https://www.rd.com/article/wifi-on-planes/">check out this article from Reader’s Digest</a>.  </p>
<h3 id="so-what-can-we-do">So what can we do?</h3>
<p>Even with your phone in Airplane mode, you can still authenticate with the Duo Mobile app using a <a target="_blank" href="https://duo.com/product/multi-factor-authentication-mfa/authentication-methods/tokens-and-passcodes">Mobile Passcode</a>. This works anywhere, even in places where you don't have an internet connection or can't get cell service.</p>
<p>I then remember that <a target="_blank" href="https://duo.com/docs/meraki-radius">Two-Factor Authentication for Meraki Client VPN</a> supports push, phone call, or passcode authentication for desktop and mobile client connections.  <em>Perfect! I may have a solution!</em></p>
<h3 id="how-do-we-fix-it">How do we fix it?</h3>
<p>On the Duo Mobile App, the user will need to tap the down indicator on the Duo-Protected Account to get a one-time passcode for login.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1628904161903/nTqSpSO4v.png" alt="Duo Down Indicator and PIN location " /></p>
<p>Then when the user logs in to their VPN connection, the user will append (add to the end of) their password a comma followed by the six-digit passcode generated in their Duo Mobile app. For example:</p>
<p><code>username: bob</code></p>
<p><code>password: hunter2,123456</code> </p>
<p>These passcodes are for one-time use only. If a user cannot connect using the current mobile passcode on the Duo Mobile App, they will have to press the blue circular arrows and regenerate a mobile passcode. Then the user will enter that new passcode after the comma that is appended to their password.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1628904557801/l-Pgx3Unk.png" alt="Regenerating a new Duo Passcode" /></p>
<p>Although I have not tested this out on a flight, I did simulate by putting my phone on "airplane" mode and connecting to my corporate VPN using the passcode that was generated in the Duo Mobile app. </p>
<p>I was able to get the instructions out to my users today.  So fingers crossed that it works for them!</p>
<p>Thanks for reading!</p>
<p><strong>SIDE NOTE....</strong>  Duo Security just rolled out their new <a target="_blank" href="https://levelup.duo.com/">online learning platform</a>.  It's free to Duo customers and has a few certification paths. I have gone through most of the material and I have been learning a lot about the various options there are.  As a Duo Administrator, I thought it was awesome. Needless to say, I am a big fan of Duo Security.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1628906053941/X0Zu64Z0G.png" alt="Duo Certifications" /></p>
]]></content:encoded></item><item><title><![CDATA[Improving Security: Duo Access Gateway]]></title><description><![CDATA[UPDATE February 15, 2022:  Received an email that DUO is planning to deprecate the Duo Access Gateway with an End-of-Life by October 2023. Your best option is to use their cloud-hosted solution, Duo Single Sign-On.
Duo (owned by Cisco) is a user-cent...]]></description><link>https://hashnode.brandonscloud.com/improving-security-duo-access-gateway</link><guid isPermaLink="true">https://hashnode.brandonscloud.com/improving-security-duo-access-gateway</guid><category><![CDATA[Security]]></category><category><![CDATA[infrastructure]]></category><category><![CDATA[Cloud]]></category><category><![CDATA[#cybersecurity]]></category><dc:creator><![CDATA[Brandon Bowman]]></dc:creator><pubDate>Sat, 07 Aug 2021 03:49:31 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1628308084641/P_9HBzE3k.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>UPDATE February 15, 2022:  Received an email that DUO is planning to deprecate the Duo Access Gateway with an End-of-Life by October 2023. Your best option is to use their cloud-hosted solution, <a target="_blank" href="https://duo.com/docs/sso">Duo Single Sign-On</a>.</em></p>
<p>Duo (owned by Cisco) is a user-centric access security platform that provides two-factor authentication, endpoint security, remote access solutions and more to protect sensitive data at scale for all users, all devices and all applications.  They offer multiple products to help secure your organization from Multi-Factor Authentication, Device Trust, Remote Access, and Single-Sign-On.</p>
<p>Our company has been using Duo Security for Multi-Factor Authentication for several years now to protect some of our more critical assets, such as Remote Server access and Office 365 accounts. Outside of work purposes, I personally use the Duo Mobile app for a number of commercial services that allow for 2FA  (ie. Amazon accounts, LinkedIn, banking, etc.)</p>
<p>When we ran a legacy Windows ADFS server, to federate our domain and allow a Single Sign-On for  Office 365, we implemented <a target="_blank" href="https://duo.com/docs/adfs">Duo Authentication for Microsoft AD FS</a> as our Multi-Factor Authentication (MFA) provider. It worked well with the AD FS 2.0 integration.</p>
<p>It worked fairly well and was pretty reliable.  In January 2020, Microsoft officially <a target="_blank" href="https://community.duo.com/t/end-of-support-for-duo-products-on-windows-server-2008-windows-server-2008-r2-and-windows-7/6095">ended support for Windows Server 2008</a> and it came time to update those ADFS servers.  </p>
<p><a target="_blank" href="https://docs.microsoft.com/en-us/office365/troubleshoot/active-directory/set-up-adfs-for-single-sign-on">Configuring a Windows ADFS server </a> (and a web application proxy) isn't too challenging, and I was able to find enough articles online to get it working and installed within a few days.  In a small business environment, it's hard to get any scheduled maintenance times during the week.  Therefore I had to wait to get it done over the weekend; which isn't much of a problem. </p>
<p>Then it came to configuring the  <a target="_blank" href="https://duo.com/docs/adfs">Duo Authentication for Microsoft AD FS</a>. According to the Duo Security documentation,  "the Duo AD FS module supports relying parties that use Microsoft's WS-Federation protocol, like Office 365, as well as SAML 2.0 federated logons for cloud apps like Google G Suite and salesforce.com."   Duo Security provides step-by-step instructions which are pretty easy to understand.  If you get stuck, then their Support personnel are quick to respond and easy to work with. <em>I have had to call them a few times...</em></p>
<p><strong>PROBLEM:</strong> After configuring the Duo AD FS module and testing, we were pretty confident that we had a good solution.  Several days later, we had users reporting that they could not get email on their native mail apps on their mobile devices (iOS mail, Samsung Mail, etc.). One of those users was our CEO, who wanted to just use his iOS mail app. We tried to convince our users to move to the Outlook mobile app, but that was not successful.  <a target="_blank" href="https://help.duo.com/s/article/3476?language=en_US">After some deep research</a>, it turns out that these native mobile mail clients (at the time) ran on legacy Basic Authentication protocols.  <em>In a nutshell, Modern Authentication is more secure than Basic Authentication.</em> </p>
<p>According to the  <a target="_blank" href="https://help.duo.com/s/article/3476?language=en_US">Duo Security documentation</a>, "this is a Microsoft -- not Duo -- limitation." <strong>But there is a solution! </strong>  In the meantime, I had to disable the Duo AD FS module which did not provide secure our Office 365 accounts with MFA.  <em>Scary.... I know! </em></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1628216193224/40_duaH0t.png" alt="Can I use my Android, iOS mail client, or any legacy client to access Office 365 via AD FS, Azure, or DAG?" /></p>
<p><strong>SOLUTION:</strong> After some research, I proposed implementing a <a target="_blank" href="https://duo.com/docs/dag">Duo Access Gateway</a> to completely replace our Microsoft AD FS. </p>
<p>"Duo Access Gateway is an on-premises solution that secures access to cloud applications with your users’ existing directory credentials (like Microsoft Active Directory or Google G Suite accounts) using the Security Assertion Markup Language (SAML) 2.0 authentication standard. SAML delegates authentication from a service provider to an identity provider, and is used for single sign-on (SSO) solutions."   </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1628216317107/sG9tw5VHh.png" alt="Duo Access Gateway with AD Diagram" /></p>
<p>In terms of solving my problem, "<a target="_blank" href="https://duo.com/docs/dag-o365">Duo protection for Microsoft 365 via DAG</a> includes a <a target="_blank" href="https://duo.com/docs/dag-o365#create-the-microsoft-365-application-in-duo">Basic Auth</a> option that allows users accessing Office 365 from clients that do not support Modern Auth to still log in using only their AD username and password." <em>Bingo! This could work!</em></p>
<p><em>(Duo has recently updated their DUO AD FS plugin that may now support Basic Auth clients, but I wanted the chance to deploy a fancy app on a single Linux server.)</em></p>
<h3 id="heading-deploy-a-dmz-server">Deploy a DMZ Server</h3>
<p>So my first objective was to get a Linux server up and running. The <a target="_blank" href="https://duo.com/docs/dag-linux#prerequisites">minimum server requirements</a> are as follows: </p>
<ol>
<li>Form Factor: Physical or virtual machine</li>
<li>Processor: Two processors of 2 GHz or faster</li>
<li>Memory: 4 GB RAM or greater</li>
<li>Disk Storage: 20 GB or greater</li>
<li>Operating System: See the Install Docker section of this document for supported Linux flavors and versions</li>
</ol>
<p>I decided on running the Duo Access Gateway on <a target="_blank" href="https://ubuntu.com/server/docs">Ubuntu Server LTS (Focal Fossa)</a>. Why Ubuntu Server?  For one, it's free to use. Secondly, it is lightweight and doesn't require much maintaining unlike routinely checking on a Windows server. </p>
<p>Following the <a target="_blank" href="https://ubuntu.com/server/docs/installation">Ubuntu Server documentation</a>, we can easily install Ubuntu Server.  One major difference between Ubuntu Server and Ubuntu Desktop is that the graphical environment used for the Desktop Edition is not installed for the Server.  After the Operating System is installed, I went ahead and completed some basic hardening of the server and allowed the following ports to be open on the server's host-based firewall called the UFW (which literally means Uncomplicated Firewall):</p>
<ol>
<li><p>Open ports 80 and 443 in the perimeter firewall for HTTP and HTTPS external traffic to and from the server (HTTP automatically redirects to HTTPS).</p>
</li>
<li><p>Port 8443 will be used for administrative purposes. Restrict traffic to this port to only authorized networks.</p>
</li>
<li><p>Open a port for LDAP (default 389) or LDAPS (default 636) traffic from the server to your internal Active Directory Domain Controller(s) or OpenLDAP directory server if you are using an on-premises directory.</p>
</li>
</ol>
<p><em>I will open up port 22 for SSH for server administration purposes, but would restrict that to the local network.</em></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1628298707049/MQI7aZd2f.png" alt="Adding UFW rules to the Ubuntu Server" /></p>
<p><em>DISCLAIMER: I'm not going to go through the entire Ubuntu Server installation and hardening here, but I'll have that in another blog soon.  I also am going to demonstrate this deployment on a local VM that is set up on VMware Workstation Pro, instead of pulling the VM on our corporate infrastructure. </em> </p>
<p>After deploying the server, we can now follow the  <a target="_blank" href="https://duo.com/docs/dag-linux#overview"><em>Duo Access Gateway for Linux</em> </a> documentation.  The guide is not too technical and provides you step-by-step instructions on how to deploy the DAG.  </p>
<h3 id="heading-install-docker">Install Docker</h3>
<p>In a nutshell, the DAG is deployed on a Docker container. So the first requirement is to <a target="_blank" href="https://duo.com/docs/dag-linux#install-docker">install docker</a>. The documentation even tells you that "Docker is a tool that allows Duo Access Gateway to run inside its own self-contained environment, called a “container”, on top of your host operating system."  I then would select the "Ubuntu" tab to get the directions. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1628298972425/P_qzEyFl2.png" alt="Duo documentation on installing Docker" /></p>
<p>You will know that you installed Docker correctly when you get the following output after running the command "docker ps"</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1628299309150/AO9QQQilX.png" alt="Docker Output" /></p>
<h3 id="heading-install-docker-compose">Install Docker Compose</h3>
<p>From there you will <a target="_blank" href="https://duo.com/docs/dag-linux#install-docker-compose">install Docker Compose</a>. According to the <a target="_blank" href="https://docs.docker.com/compose/">Docker documentation</a>, Compose is a tool for defining and running multi-container Docker applications. With Compose, you use a YAML file to configure your application’s services.  Since DAG is deployed using a YAML file, you will need Docker Compose.  You can verify that Docker Compose is working by typing <em>docker-compose --version</em>.  You will see text similar to what is on the bottom of the following screenshot:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1628299573424/UZYJLCRre.png" alt="Docker Compose installation" /></p>
<h3 id="heading-install-duo-access-gateway">Install Duo Access Gateway</h3>
<p>You then will download and install the Duo Access Gateway YAML file. You will be able to verify that the Duo Access Gateway container is running by typing <em>docker ps</em> and will see the output showing the container with a status of "up" similar to the following screenshot:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1628299824558/Un7u4UojT.png" alt="Installation of Duo Access Gateway YAML to a Docker Container" /></p>
<p>I can also verify that the installation was successful by navigating to <strong>https://URL-OF-ACCESS-GATEWAY:8443</strong> from an internal network to log into the Duo Access Gateway admin console.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1628300050236/zgOP5B9k6.png" alt="Duo Access Gateway Admin Console" /></p>
<p><em>Yea! It's working!!!</em></p>
<h3 id="heading-configure-duo-access-gateway">Configure Duo Access Gateway</h3>
<p>After choosing an Admin Console password, you will then <a target="_blank" href="https://duo.com/docs/dag-linux#initial-duo-access-gateway-configuration">configure your DAG</a> with an appropriate hostname and uploading your SSL certificate and Private Key files.  <em>It's okay if you don't have one right now, you can continue through to the next screen.</em></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1628300264242/7-Kq4FRhB.png" alt="Duo Access Gateway Welcome screen" /></p>
<p>The next step would be to <a target="_blank" href="https://duo.com/docs/dag-linux#configure-your-authentication-source">configure your authentication source</a>.  Duo Access Gateway supports the following authentication sources:</p>
<ul>
<li>Active Directory</li>
<li>OpenLDAP</li>
<li>SAML IdP</li>
<li>Google (OpenID Connect)</li>
<li>Microsoft Azure (OpenID Connect)</li>
</ul>
<p>For our situation, we opted to use our Active Directory as our source that end-users will use for primary authentication.  Configuring this portion took a little time for me, as I had to also consult the <a target="_blank" href="https://duo.com/docs/dag-o365#deploy-or-update-duo-access-gateway"><em>Duo Protection for Microsoft 365 with Duo Access Gateway</em></a>  documentation.  The documentation stated that I must use Active Directory as my authentication source as well as include specific AD attributes in the "Attributes" field. </p>
<p>Here is what it will look like when you're configuring Active Directory as your authentication source: </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1628302965332/0ngnakcxl.png" alt="DAG AD Config" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1628302981967/6vQiV5FM2.png" alt="DAG AD Success" /></p>
<p>In the last portion of configuring your Duo Access Gateway, you can look at the Settings page and configure your "Fail Mode" (what happens when your DAG isn't available), Session Management (enhanced security for Admin console sessions), and other general settings (hostname, verbose logging, certificate change, and Admin password).</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1628303439825/eockHnKWj.png" alt="Additional Settings on DAG" /></p>
<p>Before creating an application on the Duo Admin Panel, you need to download the certificate to obtain the token signing certificate (the downloaded file is named "dag.crt"). This is located on the <em>Applications</em> page in the <em>Metadata</em> section.  A few of these variables will be used when you enable AD Federation to Microsoft 365 using your DAG. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1628303582344/sSn61qyjU.png" alt="DAG Metadata Certificate" /></p>
<p>That's it for deploying and configuring your Duo Access Gateway.  But then you need to create and deploy the Microsoft 365 Application in Duo. </p>
<h3 id="heading-create-the-microsoft-365-application-in-duo">Create the Microsoft 365 Application in Duo</h3>
<p>Following the documentation to <a target="_blank" href="https://duo.com/docs/dag-o365#create-the-microsoft-365-application-in-duo">create the Microsoft 365 application in Duo</a> you will end up creating the application and then check the box next to <em>Enable Basic Auth</em> to allow legacy mail clients that do not support Modern Auth to still log in using only their AD username and password. When this option is configured users logging in with legacy mail clients will bypass Duo 2FA. <em>That doesn't sound safe, right?</em></p>
<p>However, we deploy email profiles to mobile devices using Office 365 Device Security Polices.  When the user enrolls their device using the Microsoft Company Portal application, they will still get the Duo 2FA when they sign in. Once the device is registered and checked for compliance, then the email profile is deployed and the user is only required to enter in their password.  You still get the 2FA, but when enrolling the device.  </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1628305068678/ksjDRsaD5.png" alt="Office 365 Device Security Policy" /></p>
<p>Now back to creating the Microsoft 365 application in Duo.... Once your settings are set, you click on Save Configuration to generate a downloadable JSON configuration file which you will upload into your Duo Access Gateway. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1628305253151/gMuFDLMNM.png" alt="Microsoft 365 Settings for DAG" /></p>
<h3 id="heading-add-the-microsoft-365-application-to-duo-access-gateway">Add the Microsoft 365 Application to Duo Access Gateway</h3>
<p>Return to the Applications page of the DAG admin console session.</p>
<p>Click the Choose File button in the "Add Application" section of the page and locate the Microsoft 365 SAML application JSON file you downloaded from the Duo Admin Panel earlier. Click the Upload button after selecting the JSON configuration file.</p>
<p>The Microsoft 365 SAML application is added.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1628305938950/8IyiX_RSp.png" alt="SAML - Office 365 Application Added to DAG" /></p>
<p>Since our organization had previously configured directory synchronization between your on-premises AD domain and Microsoft 365, we could skp the steps to <a target="_blank" href="https://duo.com/docs/dag-o365#enable-microsoft-365-sso">enable directory sychronization in Microsoft 365</a>. </p>
<h3 id="heading-enable-ad-federation-to-microsoft-365-using-dag">Enable AD Federation to Microsoft 365 using DAG</h3>
<p>Our next task was to enable AD federation to Microsoft/Office 365 using DAG.  This step required me to basically take down our AD FS.  Any users that were not already authenticated, would not be able to access Office 365 resources temporarily. I ended up doing this on a Sunday afternoon, outside of normal business hours.  </p>
<p>The first step in this process was to connect to launch the Windows Azure Active Directory Module for Windows PowerShell and enter the <em>Connect-MsolService</em> command. I then had to enter your Microsoft 365 administrator credentials for the domain.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1628306771692/VX1oh2zjW.png" alt="Connect-MsolService and Sign In windows" /></p>
<p>I then had to transition our Microsoft 365 tenant from <em>managed </em>to <em>federated</em>. Following the steps in the documentation made it basically a copy and paste into my PowerShell console.  The documentation states that "the transition of your Microsoft 365 tenant from <em>managed </em>to <em>federated </em>can take two hours or more." However, ours maybe took 10 minutes. To convert it from <em>Federated</em> to <em>Managed</em> you enter the following command. </p>
<p><code>Set-MsolDomainAuthentication –DomainName your365domain.com -Authentication Managed</code> </p>
<p>Once you verify that your Microsoft 365 domain shows as <em>Managed</em> and not <em>Federated</em>, you need to gather the federation parameter information.  The URLs needed for some of the variables are found in your DAG certification (dag.crt) file. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1628306941680/gWYjIK6KU.png" alt="DAG CRT file" /></p>
<p>Then you need to set the federation parameters as PowerShell variables (shown in the documentation).  This step took me a bit to figure out, as I had to locate all the correct pieces of information for the variables.  You have to ensure that these variables are set correctly. I had to put in a support ticket on this, and the technical support engineer was able to help me see that I was missing an "h" in one of the Uri's.  It was a bit of a pain since I was past the "point of no return" and couldn't go back to my AD FS Federation. </p>
<h3 id="heading-verify-sso">Verify SSO</h3>
<p>Once my federation settings were verified, I could then verify my SSO.  </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1628307643175/UXtLuGn5h.png" alt="DAG Login for Office 365" /></p>
<p>Thankfully I was successful and it has been working well since deployment.  I also verified that mobile devices were able to use their native mail applications.  I do intend to use our DAG to secure other applications in the future. But for now, it is just adding additional security on our Office 365 accounts. </p>
<p>Thank you so much for your time in reading this post.  I know it was a lengthy one, but I hope someone will use this for their deployments.  Please feel free to leave some comments!</p>
]]></content:encoded></item><item><title><![CDATA[Go Cloud Architects: Career Development Program]]></title><description><![CDATA[So about a month or so ago I was introduced to Mike Gibbs, CEO and founder of Go Cloud Architects.  I started to watch some of his amazing  YouTube videos and then I attended one of his webinars. He started a program to help aspiring individuals get ...]]></description><link>https://hashnode.brandonscloud.com/go-cloud-architects-career-development-program</link><guid isPermaLink="true">https://hashnode.brandonscloud.com/go-cloud-architects-career-development-program</guid><category><![CDATA[Career]]></category><category><![CDATA[Cloud]]></category><category><![CDATA[architecture]]></category><category><![CDATA[training]]></category><dc:creator><![CDATA[Brandon Bowman]]></dc:creator><pubDate>Wed, 04 Aug 2021 00:52:50 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1628037775757/FKd8j_VRR.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>So about a month or so ago I was introduced to Mike Gibbs, CEO and founder of <a target="_blank" href="https://gocloudcareers.com/">Go Cloud Architects</a>.  I started to watch some of his amazing  YouTube videos and then I attended one of his webinars. He started a program to help aspiring individuals get their first Cloud Architect career by focusing on deep cloud knowledge and improving their soft skills.  </p>
<p>As someone who certainly believes in "investing in yourself," I was intrigued and decided to give it a shot.  I am currently on Week 5 and am enjoying the learning experience as well as the weekly coaching calls. The content is amazing, the labs are fun, and improving my soft skills is always important.</p>
<p>I'll show off some of the projects that Mike has us working on here in the next posts.</p>
]]></content:encoded></item><item><title><![CDATA[Microsoft Certified: Azure Administrator Associate]]></title><description><![CDATA[Okay... so I haven't been posting as much as I should be lately.  But over the weekend I passed the Microsoft Certified: Azure Administrator Associate (AZ-104) certification. It wasn't easy, but certainly worth it in the end.   

Now on to bigger and...]]></description><link>https://hashnode.brandonscloud.com/microsoft-certified-azure-administrator-associate</link><guid isPermaLink="true">https://hashnode.brandonscloud.com/microsoft-certified-azure-administrator-associate</guid><category><![CDATA[Azure]]></category><category><![CDATA[Certification]]></category><dc:creator><![CDATA[Brandon Bowman]]></dc:creator><pubDate>Tue, 03 Aug 2021 12:53:41 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1627996206859/lKL8MPz-I.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Okay... so I haven't been posting as much as I should be lately.  But over the weekend I passed the Microsoft Certified: Azure Administrator Associate (AZ-104) certification. It wasn't easy, but certainly worth it in the end.   </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1627995021697/_JalEdRKwv.png" alt="microsoft-certified-azure-administrator-associate.png" /></p>
<p>Now on to bigger and better cloud things!</p>
]]></content:encoded></item><item><title><![CDATA[Replacing a Synology Diskstation]]></title><description><![CDATA[Over the weekend one of our older DS419+ 4-bay Synology Diskstations, which runs our Security Camera System via Surveillance Station, decided that it didn't want to work anymore.  We do know it was working last week, but there was a significant brown...]]></description><link>https://hashnode.brandonscloud.com/replacing-a-synology-diskstation</link><guid isPermaLink="true">https://hashnode.brandonscloud.com/replacing-a-synology-diskstation</guid><category><![CDATA[hardware]]></category><category><![CDATA[Security]]></category><dc:creator><![CDATA[Brandon Bowman]]></dc:creator><pubDate>Tue, 03 Aug 2021 04:00:00 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1628038857676/4cvFeqS0R.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Over the weekend one of our older DS419+ 4-bay Synology Diskstations, which runs our Security Camera System via <a target="_blank" href="https://www.synology.com/en-us/surveillance">Surveillance Station</a>, decided that it didn't want to work anymore.  We do know it was working last week, but there was a significant brown-out at the office on Friday. My boss and I thought all of our systems were still online because our data center is protected with a hefty UPS backup system and APC surge protectors.  </p>
<p>I guess that wasn't enough for the DS419+.  Rumor has it that those Diskstations run on an older processor and have been known to just stop working.  So Saturday morning comes around, and our CFO accidentally sets off the alarm at the office.  We go to check the cameras and find that it's not working.  No worries though!  I was going in later on to take my AZ-104 exam, so I went in a little earlier than planned and saw that the DS419+ wasn't working.  I attempted to power-cycle the device, which didn't fix anything.  </p>
<p>I notified my boss (Director of IT) and recommended that we just replace the Diskstation with a newer one.  The fastest option was to purchase a DS920+ ($550) on Amazon and it would arrive on Monday.  I even purchased an additional 4GB of DDR4 memory ($90) for the device.  (<em>Note to other IT Pros: Most companies have a policy that anything under $1000 is just an "Operating Expense".  Over $1000 is a "Capital Expenditure".  So if you can fix something under $1000, then you're doing pretty good.</em>) </p>
<p>The DS920+ came in Monday right at lunchtime, so I had plenty of time to swap them out.  The first thing I did was find some reference material to help me out.  I'm not a big fan of reading and I found a Synology video on YouTube  <a target="_blank" href="https://www.youtube.com/watch?v=oGvbNlJaQIg">"How to Migrate to Another Synology NAS by Swapping Drives"</a> <em>Perfect!</em></p>
<p>Watched the quick 5-minute video and felt pretty confident. Let's get started!</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1628040733411/dQuWd3I3M.jpeg" alt="DS419+ and boxed DS920+ side-by-side" /></p>
<p>Unboxing wasn't so bad.  First thing though was to add the additional memory.  I didn't bust out the manual and started looking around.  Found these two slots on the bottom though for M.2. drives.  Looks like you can have an SSD cache.  Interesting, but not really needed for our scenario.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1628040995558/3itFDzX4g.jpeg" alt="DS920+ M.2 Slots" /></p>
<p>Still hunting for the DIMM slot, I decided to pull the drive cases out. I was going to need to do that anyways.  As soon as I pulled them out, I found what I was looking for. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1628041061227/3Fb8rq7cG.jpeg" alt="DS920+ DIMM slot" /></p>
<p>I then seated the 4GB DDR4 DIMM into the expansion slot. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1628041190740/0Uz5OW2_f.jpeg" alt="D920+ with added 4GB DDR4 DIMM" /></p>
<p>Now time to swap the drives from the DS419+ to the DS920+.  They come out of the holders pretty easily.  No tools are required.  There isn't a specific order in which you're supposed to insert the drives, but I just kept it the same order from the DS419+ to the DS920+. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1628041278486/C_nu5Pf0Y.jpeg" alt="Swapping drives between DS419+ and DS920+" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1628041333148/Bk30tgiQ7.jpeg" alt="DS920+ with drives installed" /></p>
<p>After that, it was time to put the DS920+ back into the data center and connect the power supply and the network cable.  We keep ours on a small shelf in the racks.  Nothing too fancy here. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1628041397176/TxycLUycy.jpeg" alt="DS920+ in data center" /></p>
<p>Thankfully Synology has a "find tool" that works perfectly when trying to locate your new Diskstation on your network. The web assistant can be accessed by going to "find.synology.com" in your browser. Once it is found, you can just follow the instructions. The Diskstation will see that you're migrating from one device to another. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1628041612806/95owpIsTl.jpeg" alt="Diskstation Migration" /></p>
<p>Then you wait about 10 minutes for the migration to finish. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1628041655256/dYGERLeVx.jpeg" alt="Diskstation wait time" /></p>
<p>The only issue I had was finding the IP address of the device once it restarted.  So I had to go to my Meraki dashboard to find it.  After I logged back into the device, I made sure everything was set correctly and my boss confirmed that he could access the cameras via the mobile app. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1628041865200/87oOLOvBA.jpeg" alt="Healthy DS920+" /></p>
<p>Overall, this probably took me about an hour to get everything back online.  I actually enjoy doing small projects like this. Hopefully, this helps someone out.  I don't always do just SysAdmin work. Sometimes I've got to get my hands dirty.  </p>
<p>I thank you for your time and I hope you enjoyed this!</p>
<p>-Brandon</p>
]]></content:encoded></item><item><title><![CDATA[DUO Authentication Proxy: Securing our Meraki VPN with 2FA]]></title><description><![CDATA[I did this project a while back and am now just writing this up.  
PROBLEM: The current Meraki Client VPN OS configuration allows users to save their login credentials to their devices. This can be very problematic, from a security standpoint, becaus...]]></description><link>https://hashnode.brandonscloud.com/duo-authentication-proxy-securing-our-meraki-vpn-with-2fa</link><guid isPermaLink="true">https://hashnode.brandonscloud.com/duo-authentication-proxy-securing-our-meraki-vpn-with-2fa</guid><category><![CDATA[Security]]></category><category><![CDATA[infrastructure]]></category><category><![CDATA[#cybersecurity]]></category><dc:creator><![CDATA[Brandon Bowman]]></dc:creator><pubDate>Sun, 23 May 2021 20:37:22 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1628887486283/1cm6449rw.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>I did this project a while back and am now just writing this up.  </em></p>
<p><strong>PROBLEM:</strong> The current <a target="_blank" href="https://documentation.meraki.com/MX/Client_VPN/Client_VPN_OS_Configuration">Meraki Client VPN OS configuration</a> allows users to save their login credentials to their devices. This can be very problematic, from a security standpoint, because a compromised device could have direct access to your corporate environment using those saved credentials. </p>
<p><strong>SOLUTION:</strong> <a target="_blank" href="https://duo.com/docs/meraki-radius">Duo integrates with your Meraki Client VPN</a> to add two-factor authentication to any VPN login. In a nutshell, it forces users to use a secondary form of authentication (Duo), via the Duo Authentication Proxy, when connecting to your Meraki Client VPN. This provides you that added layer of security.</p>
<h3 id="how-does-it-work">How does it work?</h3>
<p>Here is how it works:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1628886391788/w7r0cqE-X.png" alt="Meraki MX with Duo Authentication Proxy" /></p>
<ol>
<li>Primary authentication initiated to Meraki Client VPN</li>
<li>Meraki MX sends the authentication request to the Duo Authentication Proxy</li>
<li>Primary authentication using Active Directory or RADIUS</li>
<li>Duo Authentication Proxy connection established to Duo Security over TCP port 443</li>
<li>Secondary authentication via Duo Security’s service</li>
<li>Duo authentication proxy receives the authentication response</li>
<li>Meraki Client VPN access granted</li>
</ol>
<h3 id="install-the-duo-authentication-proxy">Install the Duo Authentication Proxy</h3>
<p>For this to work, the organization must configure the Duo Authentication Proxy on one of the following systems:</p>
<ul>
<li>Windows Server 2012 or later (Server 2016 or 2019 recommended)</li>
<li>CentOS 7 or later</li>
<li>Red Hat Enterprise Linux 7 or later</li>
<li>Ubuntu 16.04 or later</li>
<li>Debian 7 or later</li>
</ul>
<p>Regardless of the OS that you chose, Duo recommends a system with at least 1 CPU, 200 MB disk space, and 4 GB RAM (although 1 GB RAM is usually sufficient).</p>
<p>In my corporate situation, I have our Duo Authentication Proxy installed on a “miscellaneous” Windows server that runs a few different services. The proxy doesn’t utilize a significant amount of computing resources. Therefore, I didn’t think that we should deploy the Duo Authentication Proxy on its own server. It was also the first Duo application I deployed, so I was slightly hesitant to do it on a Linux server. </p>
<p>But before installing and configuring the Duo Authentication Proxy, I needed to contact Meraki Support to have the Client VPN RADIUS Timeout value increased to 60 seconds. This is important because it gives the user plenty of time to receive and respond to the Duo Push notification.</p>
<h3 id="configuring-the-proxy">Configuring the Proxy</h3>
<p>Now this took me a little bit of time to configure. The configuration file is formatted as a simple INI file. Following the <a target="_blank" href="https://duo.com/docs/meraki-radius#configure-the-proxy-for-your-primary-authenticator">Duo documentation</a> made things a little easier though. I ended up using Active Directory/LDAP as our primary authenticator, utilizing a Read-Only Service Account to read the Active Directory service on my Domain Controller. The rest of the configuration was step-by-step.</p>
<h3 id="start-the-proxy">Start the Proxy</h3>
<p>Once you configure the INI file, the commands to start the proxy service actually check your configuration file for any errors as well as checks for connectivity to Duo. If you ever modify your configuration file, you must stop and restart the DuoAuthProxy service as well as restart the Authentication Proxy. </p>
<h3 id="configure-your-meraki-vpn">Configure Your Meraki VPN</h3>
<p>You will then add the server, containing your configured Duo Authentication Proxy, to your list of RADIUS servers on the Client VPN section of your Meraki Cloud console. Following the <a target="_blank" href="https://duo.com/docs/meraki-radius#configure-your-meraki-client-vpn">Duo documentation</a> makes this process relatively simple. </p>
<h3 id="testing-your-setup">Testing Your Setup</h3>
<p>I ended up testing my setup from home because I wouldn’t be able to connect to our Meraki VPN from inside the network. Technically I could have done it at the office using mobile hotspots but doing it from the comfort of my house made more sense. </p>
<p>Thankfully it worked out well and now I have enabled 2FA on our corporate VPN. </p>
]]></content:encoded></item><item><title><![CDATA[First Post]]></title><description><![CDATA[Just a quick short post here.  A fellow student of mine at Western Governors University brought me here. I currently work as an Information Systems & Security Manager for a foodservice buying group in the Atlanta area.  My goal here is to document my...]]></description><link>https://hashnode.brandonscloud.com/first-post</link><guid isPermaLink="true">https://hashnode.brandonscloud.com/first-post</guid><category><![CDATA[AWS]]></category><category><![CDATA[Cloud]]></category><category><![CDATA[Cloud Computing]]></category><dc:creator><![CDATA[Brandon Bowman]]></dc:creator><pubDate>Sat, 15 May 2021 20:25:56 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1621110154542/ktJJUE6Z4.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Just a quick short post here.  A fellow student of mine at Western Governors University brought me here. I currently work as an Information Systems &amp; Security Manager for a foodservice buying group in the Atlanta area.  My goal here is to document my journey into cloud technologies.  </p>
<p>I am currently working on the AWS version of the  <a target="_blank" href="https://cloudresumechallenge.dev/">Cloud Resume Challenge</a>.  I am currently six steps in and working on Step #7 (Javascript).  </p>
<p>Thanks for following and I hope this is a fun and successful journey! </p>
]]></content:encoded></item></channel></rss>