<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Elijah Udom | Infrastructure &amp; Cloud Engineer (elijahu)</title><link>https://elijahu.me/portfolio/tags/security/</link><description>Infrastructure &amp; Cloud Engineering portfolio by Elijah Udom (elijahu) — AWS, Kubernetes, eBPF Security, AI/ML Infrastructure, and Platform Engineering projects.</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Wed, 17 Dec 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://elijahu.me/portfolio/tags/security/index.xml" rel="self" type="application/rss+xml"/><item><title>KodeKloud Days 9-12: Databases, Backups, Tomcat, and the Great Port War</title><link>https://elijahu.me/portfolio/projects/kodekloud-days-9-12/</link><pubDate>Wed, 17 Dec 2025 00:00:00 +0000</pubDate><guid>https://elijahu.me/portfolio/projects/kodekloud-days-9-12/</guid><description>&amp;ldquo;Every K8s node is a Linux host. Every database that won&amp;rsquo;t start has a reason in the logs. Every &amp;rsquo;no route to host&amp;rsquo; is a firewall issue until proven otherwise.&amp;rdquo;
Context: This series is a deliberate return to Linux fundamentals before going deeper into kernel-level work — CentOS, MariaDB, SELinux, Ansible. The stuff that runs silently under every K8s cluster and eBPF probe. Owning it isn&amp;rsquo;t optional.
Four problems this week: a MariaDB instance that wouldn&amp;rsquo;t start due to a corrupted data directory, a backup automation task requiring passwordless SSH, a Tomcat WAR deployment with a custom port, and a two-layer port conflict that required both evicting a rogue Sendmail process and adding an iptables rule before Apache was reachable.</description></item><item><title>KodeKloud Days 5-8: SELinux, Cron Jobs, and the Great Ansible Adventure</title><link>https://elijahu.me/portfolio/projects/kodekloud-days-5-8/</link><pubDate>Tue, 16 Dec 2025 00:00:00 +0000</pubDate><guid>https://elijahu.me/portfolio/projects/kodekloud-days-5-8/</guid><description>&amp;ldquo;Before going deeper into kernel-level work, I went back to Linux fundamentals. This is what runs under every K8s cluster and eBPF probe — owning it isn&amp;rsquo;t optional.&amp;rdquo;
This series is a deliberate return to Linux fundamentals before going deeper into kernel-level work — CentOS, SELinux, Ansible, SSH. The stuff that runs silently under every K8s cluster and eBPF probe. Owning it isn&amp;rsquo;t optional.
Four problems this week: SELinux configuration on a RHEL-based system, cron job automation, passwordless SSH across multiple servers, and Ansible version management for global availability.</description></item><item><title>KodeKloud 100 Days Challenge: Days 1-4 (Or: How I Learned to Stop Worrying and Love the Slow Labs)</title><link>https://elijahu.me/portfolio/projects/kodekloud-days-1-4/</link><pubDate>Mon, 15 Dec 2025 00:00:00 +0000</pubDate><guid>https://elijahu.me/portfolio/projects/kodekloud-days-1-4/</guid><description>&amp;ldquo;Before going deeper into kernel-level work, I went back to Linux fundamentals. This is what runs under every K8s cluster and eBPF probe — owning it isn&amp;rsquo;t optional.&amp;rdquo;
This series is a deliberate return to Linux fundamentals before going deeper into kernel-level work — CentOS, user management, SSH hardening, permissions. The stuff that runs silently under every K8s cluster and eBPF probe. Owning it isn&amp;rsquo;t optional.
Four problems this week: non-interactive user creation, temporary account expiry, disabling root SSH across multiple servers, and file permission management.</description></item><item><title>Getting to A+ on SSL Labs: Hardening a LEMP Stack for Production</title><link>https://elijahu.me/portfolio/projects/hardened-web-server/</link><pubDate>Sat, 03 May 2025 00:00:00 +0000</pubDate><guid>https://elijahu.me/portfolio/projects/hardened-web-server/</guid><description>&amp;ldquo;Default configs aren&amp;rsquo;t secure. They&amp;rsquo;re defaults — built for compatibility, not production. Running SSL Labs against a stock Nginx install and getting a B or F isn&amp;rsquo;t a surprise. It&amp;rsquo;s the expected result.&amp;rdquo;
This is a full hardening walkthrough for a LEMP stack on Ubuntu 22.04 — Nginx TLS configuration, PHP-FPM lockdown, MySQL least-privilege setup, firewall, Fail2Ban, and what the actual path to A+ on SSL Labs looks like. Not the happy path.</description></item><item><title>Building a Secure CI/CD Pipeline with Docker, AWS ECR, and GitHub Actions</title><link>https://elijahu.me/portfolio/projects/cicd-container-orch/</link><pubDate>Fri, 11 Apr 2025 00:00:00 +0000</pubDate><guid>https://elijahu.me/portfolio/projects/cicd-container-orch/</guid><description>&amp;ldquo;A deployment pipeline that requires a human in the loop for every push isn&amp;rsquo;t a pipeline — it&amp;rsquo;s a bottleneck with extra steps.&amp;rdquo;
This is a full walkthrough of taking a Flask application from local development to production on AWS using Docker, ECR, ECS, and GitHub Actions — with secrets handled properly from the start, not bolted on as an afterthought.
Pipeline flow: local development → GitHub Actions → ECR → ECS</description></item><item><title>Building an AWS Security Group Auditor That Actually Works in Production</title><link>https://elijahu.me/portfolio/projects/aws-security-auditor/</link><pubDate>Thu, 06 Mar 2025 00:00:00 +0000</pubDate><guid>https://elijahu.me/portfolio/projects/aws-security-auditor/</guid><description>&amp;ldquo;Manually checking security groups across multiple AWS accounts is how breaches happen. You miss things. You always miss things.&amp;rdquo;
Manual security group reviews feel fine at one account. At ten, you&amp;rsquo;re genuinely flying blind — too many rules, too much context to hold in your head, no audit trail. I built this CLI tool to close that gap. This is the breakdown: what I built, the failure modes I hit, and what the production version actually looks like.</description></item><item><title>GitOps CI/CD with Flask, Kubernetes, and Webhook Orchestration</title><link>https://elijahu.me/portfolio/projects/orchestration-guide/</link><pubDate>Sat, 01 Mar 2025 00:00:00 +0000</pubDate><guid>https://elijahu.me/portfolio/projects/orchestration-guide/</guid><description>&amp;ldquo;Manual deployments are technical debt with compound interest. Every time you run kubectl apply by hand you&amp;rsquo;re borrowing against future reliability.&amp;rdquo;
This is a full breakdown of a push-to-deploy GitOps pipeline on Kubernetes — Flask webhook orchestration server, isolated test namespace with resource quotas, RBAC scoped to minimum permissions, network policy isolation between test and production, and blue-green deployment with automated rollback. Built because the manual process was unsustainable, documented because the failure modes are worth knowing.</description></item><item><title>NGINX on AWS EC2: Configuration, Permissions, and Debugging 403s</title><link>https://elijahu.me/portfolio/projects/nginx/</link><pubDate>Tue, 28 Jan 2025 00:00:00 +0000</pubDate><guid>https://elijahu.me/portfolio/projects/nginx/</guid><description>&amp;ldquo;403 errors on a freshly configured Nginx server are almost never about the file. They&amp;rsquo;re about the path to the file.&amp;rdquo;
This is a configuration and troubleshooting reference for running Nginx on Ubuntu 22.04 on AWS EC2 — covering the full setup, the security group configuration that catches people out, and the complete 403 debugging chain. Written from a real configuration session where the permission issues took longer than they should have.</description></item></channel></rss>