<?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: Adepitan Adetunji</title>
    <description>The latest articles on DEV Community by Adepitan Adetunji (@masterpitan).</description>
    <link>https://dev.to/masterpitan</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%2F3458415%2Fb66f7f46-94b4-4278-880a-1ec8e9fba102.png</url>
      <title>DEV Community: Adepitan Adetunji</title>
      <link>https://dev.to/masterpitan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/masterpitan"/>
    <language>en</language>
    <item>
      <title>Setting up Amazon Macie for S3 Buckets</title>
      <dc:creator>Adepitan Adetunji</dc:creator>
      <pubDate>Mon, 24 Aug 2026 21:43:44 +0000</pubDate>
      <link>https://dev.to/masterpitan/setting-up-amazon-macie-for-s3-buckets-342g</link>
      <guid>https://dev.to/masterpitan/setting-up-amazon-macie-for-s3-buckets-342g</guid>
      <description>&lt;p&gt;Amazon S3 misconfigurations remain among the most frequent and damaging cloud vulnerabilities, regularly exposing organizations to severe data breaches, regulatory penalties, and reputational fallout.&lt;/p&gt;

&lt;p&gt;To mitigate these risks, Amazon Macie delivers fully managed data security and privacy capabilities powered by machine learning. Macie continuously audits your Amazon S3 footprint to evaluate access permissions, flagging world-readable and world-writable buckets, while automatically discovering, classifying, and protecting sensitive information like Personally Identifiable Information (PII) and hardcoded credentials.&lt;/p&gt;

&lt;p&gt;In this hands-on lab, you will configure Amazon Macie, create and scope automated discovery jobs, and analyze generated security findings to remediate exposed sensitive assets across your S3 buckets.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NB&lt;/strong&gt;. This hands-on was practiced from pwned labs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Working with Amazon Macie for S3
&lt;/h2&gt;

&lt;p&gt;Start by navigating to Amazon Macie in your console, click on “get started” and select “create a job” under “analyze public buckets”&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuobngowfvrhz0hs2k19p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuobngowfvrhz0hs2k19p.png" alt=" " width="512" height="357"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On the next page (choose s3 buckets), select "Specify bucket criteria" and click Next. This includes all S3 buckets in the AWS account, if you prefer to select specific buckets you can choose this option instead. However, this walkthrough uses the all s3 buckets option.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F68bw1vqbbax9l6agtajo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F68bw1vqbbax9l6agtajo.png" alt=" " width="512" height="285"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click Next on the Review S3 bucket criteria page. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fboqqgojuzpxpmee9zywb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fboqqgojuzpxpmee9zywb.png" alt=" " width="512" height="286"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here, to refine scope, you can specify whether this is a scheduled or just a one-time job. If you run a one-time job, you will be able to establish a baseline or to test a new configuration, while a scheduled job allows you to get the current security health of your S3 buckets at a frequency that is useful to you.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8q7im9h5l7qi426pzrdb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8q7im9h5l7qi426pzrdb.png" alt=" " width="512" height="286"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Select Recommended under managed data identifier options. Unless you have a need to use specific identifiers.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmbvy1nq9l81u5dx2jhts.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmbvy1nq9l81u5dx2jhts.png" alt=" " width="512" height="290"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Unless you chose custom in previous step, do not make any changes in this present step, click next&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8zb7ospjl0xcdn330lw5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8zb7ospjl0xcdn330lw5.png" alt=" " width="512" height="282"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There may be certain data patterns that you don't want to be alerted on, even if they match and you can define allow lists on this step .&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3ruau2o1zecnruh550bp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3ruau2o1zecnruh550bp.png" alt=" " width="512" height="282"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now select a name for your job:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ficq1g792s6xbtt021ksc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ficq1g792s6xbtt021ksc.png" alt=" " width="512" height="283"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You will be asked to configure a repository which will include a bucket and KMS Key ARN, go ahead and click on the configuration to do the following:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fng8sezbwyysx2lb6c4cv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fng8sezbwyysx2lb6c4cv.png" alt="Image credit to pwned_labs" width="512" height="208"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;First we need a key to encrypt our data. AWS Key Management Service (KMS) is a managed service that makes it easy for users to create and manage cryptographic keys. Create a key if needed by navigating to the Create key page below, selecting the appropriate settings and click Next. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fne51lbmz81iugd1zbmci.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fne51lbmz81iugd1zbmci.png" alt="Image credit to pwned_labs" width="512" height="242"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next we provide an alias and optionally a description for the key.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft0lp90glp8e7uf35pm8v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft0lp90glp8e7uf35pm8v.png" alt="Image credit to pwned_labs" width="512" height="199"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Returning to the repository settings page create a new bucket if needed, select your AWS KMS key and click Next. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8z0vctu1ubdee77sbj6m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8z0vctu1ubdee77sbj6m.png" alt="Image credit to pwned_labs" width="512" height="392"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you encounter any issues with configuring the repository, then you may need to add the statement below to the existing KMS key policy: &lt;/p&gt;

&lt;p&gt;&lt;code&gt;{&lt;br&gt;
    "Sid": "Allow Macie to use the key",&lt;br&gt;
    "Effect": "Allow",&lt;br&gt;
    "Principal": {&lt;br&gt;
        "Service": "macie.amazonaws.com"&lt;br&gt;
    },&lt;br&gt;
    "Action": [&lt;br&gt;
        "kms:GenerateDataKey",&lt;br&gt;
        "kms:Encrypt"&lt;br&gt;
    ],&lt;br&gt;
    "Resource": "*"&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;On the Macie summary page we see a high-level summary of our S3 security posture. There are a number of public buckets, including one that contains sensitive information! We also have a classification error that requires our attention.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg32jxb7xmtjimra5va1e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg32jxb7xmtjimra5va1e.png" alt=" " width="512" height="289"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Clicking on the 1 under Sensitive, we see the page below. Click the triangle to see further details.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fto3q05eowvoimhgm6dc3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fto3q05eowvoimhgm6dc3.png" alt=" " width="512" height="289"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It reports that the hlogistics-beta bucket contains AWS credentials. Click AWS_CREDENTIALS.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6rwgfpaqi7llrkef2j20.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6rwgfpaqi7llrkef2j20.png" alt=" " width="512" height="244"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On the findings page, select the resource that's affected to bring up a details container window.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwar3cfbx1n4fz2ufftym.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwar3cfbx1n4fz2ufftym.png" alt=" " width="512" height="243"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then click on the Resource URL in the Overview section, and on the S3 page click the Object URL to view the file. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F450i6rzrobocbvuemzqu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F450i6rzrobocbvuemzqu.png" alt=" " width="512" height="233"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fibwqstowj3ov9sj9kmu3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fibwqstowj3ov9sj9kmu3.png" alt=" " width="512" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Returning to the Macie summary page we also see a high-level overview of our data security. Macie has identified that five our our public buckets are world-readable, and one is world-writable! With this access, any malicious actor would potentially be able to tamper with or delete our data, steal our data and hold it to ransom, use it to host malicious content and upload a large amount of data, potentially resulting in large storage costs. If the S3 bucket hosts a website it is also possible to backdoor existing JavaScript files, and steal the cookies of site visitors, including administrators.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftiuatf4zmgvtcg9evc8b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftiuatf4zmgvtcg9evc8b.png" alt=" " width="512" height="289"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Building a Production-Ready VPC Implementation on Linux. HNG Internship Task 4: Complete VPC Control System with Networking</title>
      <dc:creator>Adepitan Adetunji</dc:creator>
      <pubDate>Wed, 12 Nov 2025 20:11:55 +0000</pubDate>
      <link>https://dev.to/masterpitan/building-a-production-ready-vpc-implementation-on-linux-hng-internship-task-4-complete-vpc-control-3h9j</link>
      <guid>https://dev.to/masterpitan/building-a-production-ready-vpc-implementation-on-linux-hng-internship-task-4-complete-vpc-control-3h9j</guid>
      <description>&lt;p&gt;Project Overview&lt;/p&gt;

&lt;p&gt;This project implements a complete Virtual Private Cloud (VPC) management system using Linux networking primitives. Built as part of the HNG Internship program, it demonstrates advanced networking concepts including network namespaces, bridges, NAT, routing, and security policies.&lt;/p&gt;

&lt;p&gt;Features Implemented&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;VPC Management: Create and manage multiple isolated VPCs with custom CIDR ranges&lt;/li&gt;
&lt;li&gt;Subnet Types: Public subnets with NAT gateway and private subnets with no internet access&lt;/li&gt;
&lt;li&gt;VPC Isolation: Complete network isolation between VPCs by default&lt;/li&gt;
&lt;li&gt;VPC Peering: Controlled communication between VPCs with proper routing&lt;/li&gt;
&lt;li&gt;Security Policies: JSON-based security group rules using iptables&lt;/li&gt;
&lt;li&gt;Application Deployment: Deploy and test applications within subnets&lt;/li&gt;
&lt;li&gt;Comprehensive Logging: All operations logged with timestamps and details&lt;/li&gt;
&lt;li&gt;Cleanup Automation: Complete resource cleanup and management&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Architecture&lt;br&gt;
┌─────────────────────────────────────────────────────────────┐&lt;br&gt;
│                     Host System                             │&lt;br&gt;
│  ┌─────────────────┐              ┌─────────────────┐      │&lt;br&gt;
│  │     VPC1        │   Peering    │     VPC2        │      │&lt;br&gt;
│  │ ┌─────────────┐ │ ◄──────────► │ ┌─────────────┐ │      │&lt;br&gt;
│  │ │br-vpc1      │ │              │ │br-vpc2      │ │      │&lt;br&gt;
│  │ │(10.0.0.0/16)│ │              │ │(172.16.0.0/ │ │      │&lt;br&gt;
│  │ └─────────────┘ │              │ │16)          │ │      │&lt;br&gt;
│  │       │         │              │ └─────────────┘ │      │&lt;br&gt;
│  │   ┌───▼───┐ ┌───▼───┐          │       │         │      │&lt;br&gt;
│  │   │Public │ │Private│          │   ┌───▼───┐     │      │&lt;br&gt;
│  │   │Subnet │ │Subnet │          │   │Public │     │      │&lt;br&gt;
│  │   │(NS)   │ │(NS)   │          │   │Subnet │     │      │&lt;br&gt;
│  │   └───────┘ └───────┘          │   │(NS)   │     │      │&lt;br&gt;
│  └─────────────────┐               │   └───────┘     │      │&lt;br&gt;
│                    │               └─────────────────┐      │&lt;br&gt;
│              ┌─────▼─────┐                          │      │&lt;br&gt;
│              │    NAT    │                          │      │&lt;br&gt;
│              │(iptables) │                          │      │&lt;br&gt;
│              └─────┬─────┘                          │      │&lt;br&gt;
│                    │                                 │      │&lt;br&gt;
│              ┌─────▼─────┐                          │      │&lt;br&gt;
│              │ Internet  │                          │      │&lt;br&gt;
│              └───────────┘                          │      │&lt;br&gt;
└─────────────────────────────────────────────────────────────┘&lt;/p&gt;

&lt;p&gt;Project Structure&lt;br&gt;
hng-task4/&lt;br&gt;
├── vpcctl.py              # Main VPC control tool&lt;br&gt;
├── demo-complete.sh       # Complete demonstration script&lt;br&gt;
├── cleanup.sh            # Resource cleanup script&lt;br&gt;
├── example-security-policy.json  # Security policy template&lt;br&gt;
├── logs/                 # Operation logs directory&lt;br&gt;
│   ├── vpc-operations.log&lt;br&gt;
│   └── demo-run-YYYYMMDD-HHMMSS.log&lt;br&gt;
└── README.md            # Project README&lt;/p&gt;

&lt;p&gt;Core Implementation&lt;br&gt;
VPC Creation with Bridges&lt;br&gt;
Each VPC is implemented as a Linux bridge with proper CIDR management:&lt;/p&gt;

&lt;p&gt;def create_vpc(self, vpc_name, cidr_block):&lt;br&gt;
    """Create a new VPC with specified CIDR"""&lt;br&gt;
    network = ipaddress.IPv4Network(cidr_block, strict=False)&lt;br&gt;
    bridge_name = f"br-{self._short_name(vpc_name, 12)}"&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Create and configure bridge
self.run_cmd(f"ip link add {bridge_name} type bridge")
self.run_cmd(f"ip link set {bridge_name} up")

# Assign gateway IP (first usable IP)
gateway_ip = str(list(network.hosts())[0])
self.run_cmd(f"ip addr add {gateway_ip}/{network.prefixlen} dev {bridge_name}")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Network Namespace Subnets&lt;br&gt;
Subnets are implemented as network namespaces for complete isolation:&lt;/p&gt;

&lt;p&gt;def add_subnet(self, vpc_name, subnet_name, subnet_cidr, subnet_type="private"):&lt;br&gt;
    """Add subnet to existing VPC"""&lt;br&gt;
    # Create namespace for subnet isolation&lt;br&gt;
    ns_name = f"{self._short_name(vpc_name, 6)}-{self._short_name(subnet_name, 6)}"&lt;br&gt;
    veth_host = f"vh-{self._short_name(subnet_name, 10)}"&lt;br&gt;
    veth_ns = f"vn-{self._short_name(subnet_name, 10)}"&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Create veth pair and connect to bridge
self.run_cmd(f"ip netns add {ns_name}")
self.run_cmd(f"ip link add {veth_host} type veth peer name {veth_ns}")
self.run_cmd(f"ip link set {veth_ns} netns {ns_name}")
self.run_cmd(f"ip link set {veth_host} master {config['bridge']}")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;NAT Gateway for Public Subnets&lt;br&gt;
Public subnets get internet access through iptables NAT:&lt;/p&gt;

&lt;p&gt;def setup_nat(self, vpc_name, subnet_cidr):&lt;br&gt;
    """Setup NAT for public subnet internet access"""&lt;br&gt;
    result = self.run_cmd("ip route | grep default | awk '{print $5}' | head -1")&lt;br&gt;
    internet_iface = result.stdout.strip()&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Enable IP forwarding and configure NAT
self.run_cmd("echo 1 &amp;gt; /proc/sys/net/ipv4/ip_forward")
self.run_cmd(f"iptables -t nat -A POSTROUTING -s {subnet_cidr} -o {internet_iface} -j MASQUERADE")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;VPC Peering with Proper Isolation&lt;br&gt;
VPC peering creates controlled communication channels:&lt;/p&gt;

&lt;p&gt;def peer_vpcs(self, vpc1_name, vpc2_name):&lt;br&gt;
    """Create peering connection between two VPCs"""&lt;br&gt;
    # Clean up existing peering interfaces&lt;br&gt;
    self.run_cmd(f"ip link delete {peer_veth1}", check=False)&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Create new veth pair for peering
self.run_cmd(f"ip link add {peer_veth1} type veth peer name {peer_veth2}")

# Add routes to namespaces (not host) for proper isolation
for subnet_name, subnet_info in vpc1_config["subnets"].items():
    ns_name = subnet_info["namespace"]
    self.run_cmd(f"ip netns exec {ns_name} ip route add {vpc2_config['cidr']} via {vpc1_config['gateway']}")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Usage Examples&lt;br&gt;
Complete VPC Setup&lt;/p&gt;

&lt;h1&gt;
  
  
  Create VPC with subnets
&lt;/h1&gt;

&lt;p&gt;sudo python3 vpcctl.py create-vpc vpc1 10.0.0.0/16&lt;br&gt;
sudo python3 vpcctl.py add-subnet vpc1 public-subnet 10.0.1.0/24 --type public&lt;br&gt;
sudo python3 vpcctl.py add-subnet vpc1 private-subnet 10.0.2.0/24 --type private&lt;/p&gt;

&lt;h1&gt;
  
  
  Deploy applications
&lt;/h1&gt;

&lt;p&gt;sudo python3 vpcctl.py deploy-app vpc1 public-subnet --type python --port 8080&lt;br&gt;
sudo python3 vpcctl.py deploy-app vpc1 private-subnet --type python --port 8081&lt;/p&gt;

&lt;h1&gt;
  
  
  Test connectivity
&lt;/h1&gt;

&lt;p&gt;sudo python3 vpcctl.py test vpc1 public-subnet 8.8.8.8  # Should work&lt;br&gt;
sudo python3 vpcctl.py test vpc1 private-subnet 8.8.8.8  # Should fail&lt;/p&gt;

&lt;p&gt;VPC Peering Demonstration&lt;/p&gt;

&lt;h1&gt;
  
  
  Create second VPC
&lt;/h1&gt;

&lt;p&gt;sudo python3 vpcctl.py create-vpc vpc2 172.16.0.0/16&lt;br&gt;
sudo python3 vpcctl.py add-subnet vpc2 public-subnet2 172.16.1.0/24 --type public&lt;/p&gt;

&lt;h1&gt;
  
  
  Test isolation (should fail)
&lt;/h1&gt;

&lt;p&gt;sudo python3 vpcctl.py test vpc1 public-subnet 172.16.1.1&lt;/p&gt;

&lt;h1&gt;
  
  
  Create peering
&lt;/h1&gt;

&lt;p&gt;sudo python3 vpcctl.py peer-vpcs vpc1 vpc2&lt;/p&gt;

&lt;h1&gt;
  
  
  Test connectivity after peering (should work)
&lt;/h1&gt;

&lt;p&gt;sudo python3 vpcctl.py test vpc1 public-subnet 172.16.1.1&lt;/p&gt;

&lt;h1&gt;
  
  
  Remove peering
&lt;/h1&gt;

&lt;p&gt;sudo python3 vpcctl.py unpeer-vpcs vpc1 vpc2&lt;/p&gt;

&lt;p&gt;Security Policy Application&lt;/p&gt;

&lt;h1&gt;
  
  
  Apply security rules from JSON file
&lt;/h1&gt;

&lt;p&gt;sudo python3 vpcctl.py apply-policy vpc1 example-security-policy.json&lt;/p&gt;

&lt;p&gt;Automated Testing&lt;br&gt;
Run the complete demonstration:&lt;/p&gt;

&lt;h1&gt;
  
  
  Full automated test suite
&lt;/h1&gt;

&lt;p&gt;sudo bash demo-complete.sh&lt;/p&gt;

&lt;p&gt;This script validates:&lt;/p&gt;

&lt;p&gt;VPC creation and isolation&lt;/p&gt;

&lt;p&gt;Public/private subnet behavior&lt;/p&gt;

&lt;p&gt;NAT gateway functionality&lt;/p&gt;

&lt;p&gt;VPC peering connections&lt;/p&gt;

&lt;p&gt;Security policy enforcement&lt;/p&gt;

&lt;p&gt;Application deployment&lt;/p&gt;

&lt;p&gt;Key Technical Achievements&lt;br&gt;
Proper VPC Isolation: Fixed routing issues to ensure VPCs are truly isolated by default&lt;/p&gt;

&lt;p&gt;Namespace-based Subnets: Each subnet runs in its own network namespace for security&lt;/p&gt;

&lt;p&gt;Dynamic Interface Naming: Handles Linux interface name length limits with hashing&lt;/p&gt;

&lt;p&gt;Comprehensive Error Handling: Robust error handling and cleanup on failures&lt;/p&gt;

&lt;p&gt;Production-Ready Logging: All operations logged with timestamps and details&lt;/p&gt;

&lt;p&gt;Automated Cleanup: Complete resource cleanup to prevent conflicts&lt;/p&gt;

&lt;p&gt;Logging and Monitoring&lt;br&gt;
All operations are logged to /tmp/vpcctl/logs/ with:&lt;/p&gt;

&lt;p&gt;Command execution logs&lt;/p&gt;

&lt;p&gt;Timestamp information&lt;/p&gt;

&lt;p&gt;Error details and troubleshooting info&lt;/p&gt;

&lt;p&gt;Demo run summaries&lt;/p&gt;

&lt;p&gt;Cleanup and Management&lt;/p&gt;

&lt;h1&gt;
  
  
  Clean up all resources
&lt;/h1&gt;

&lt;p&gt;sudo bash cleanup.sh&lt;/p&gt;

&lt;h1&gt;
  
  
  Delete specific VPC
&lt;/h1&gt;

&lt;p&gt;sudo python3 vpcctl.py delete-vpc vpc1&lt;/p&gt;

&lt;h1&gt;
  
  
  List all VPCs
&lt;/h1&gt;

&lt;p&gt;sudo python3 vpcctl.py list&lt;/p&gt;

&lt;p&gt;Copy&lt;br&gt;
bash&lt;br&gt;
Security Policy Example&lt;br&gt;
{&lt;br&gt;
  "subnet": "10.0.1.0/24",&lt;br&gt;
  "ingress": [&lt;br&gt;
    {"port": 80, "protocol": "tcp", "action": "allow"},&lt;br&gt;
    {"port": 443, "protocol": "tcp", "action": "allow"},&lt;br&gt;
    {"port": 22, "protocol": "tcp", "action": "deny"}&lt;br&gt;
  ]&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;Conclusion&lt;br&gt;
This VPC implementation demonstrates a deep understanding of Linux networking primitives and provides a solid foundation for understanding how cloud networking works under the hood. The project successfully implements all major VPC features with proper isolation, security, and management capabilities.&lt;/p&gt;

</description>
      <category>networking</category>
      <category>devops</category>
      <category>linux</category>
      <category>cloudcomputing</category>
    </item>
  </channel>
</rss>
