<?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: Hugo | DevOps | Cybersecurity</title>
    <description>The latest articles on DEV Community by Hugo | DevOps | Cybersecurity (@hugovalters).</description>
    <link>https://dev.to/hugovalters</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1175774%2F8a57b46a-da15-4ac2-ab41-fbe56c6a99a5.jpg</url>
      <title>DEV Community: Hugo | DevOps | Cybersecurity</title>
      <link>https://dev.to/hugovalters</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hugovalters"/>
    <language>en</language>
    <item>
      <title>What Is Tailscale? The VPN That Doesn't Suck</title>
      <dc:creator>Hugo | DevOps | Cybersecurity</dc:creator>
      <pubDate>Wed, 22 Apr 2026 12:33:03 +0000</pubDate>
      <link>https://dev.to/hugovalters/what-is-tailscale-the-vpn-that-doesnt-suck-4pi1</link>
      <guid>https://dev.to/hugovalters/what-is-tailscale-the-vpn-that-doesnt-suck-4pi1</guid>
      <description>&lt;h2&gt;
  
  
  The VPN Struggle Is Real
&lt;/h2&gt;

&lt;p&gt;If you've ever tried to set up a traditional VPN — OpenVPN, WireGuard, IPsec — you probably know how it goes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It takes hours (or days) to configure&lt;/li&gt;
&lt;li&gt;Something always breaks with firewalls or DNS&lt;/li&gt;
&lt;li&gt;You spend more time managing the VPN than doing real work&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Enter Tailscale. It's a tool that feels like magic the first time you use it. &lt;br&gt;
But it's not magic. It's just smart engineering.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🖼️ &lt;strong&gt;&lt;a href="https://www.valtersit.com/what-is-tailscale-the-vpn-that-doesnt-suck/" rel="noopener noreferrer"&gt;Image: 'Tailscale VPN Dashboard' available in the full article here&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  So... What Is Tailscale?
&lt;/h2&gt;

&lt;p&gt;Tailscale is a zero-config VPN built on top of WireGuard.&lt;/p&gt;

&lt;p&gt;It creates a secure, private network between your devices — no matter where they are.&lt;/p&gt;

&lt;p&gt;In other words:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your phone can talk to your server at home.&lt;/li&gt;
&lt;li&gt;Your laptop can SSH into your Raspberry Pi on a mobile hotspot.&lt;/li&gt;
&lt;li&gt;Your Docker containers can reach your NAS over a Tailscale subnet.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All without touching a firewall or router. And yes — it just works.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why It's a Game-Changer
&lt;/h2&gt;

&lt;p&gt;Tailscale isn't "just another VPN". It's more like a trusted mesh network across all your devices.&lt;/p&gt;

&lt;p&gt;Here's what makes it different:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Traditional VPN:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Painful to set up&lt;/li&gt;
&lt;li&gt;Needs port forwarding&lt;/li&gt;
&lt;li&gt;Breaks in restrictive networks&lt;/li&gt;
&lt;li&gt;Shared secrets&lt;/li&gt;
&lt;li&gt;No visibility&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Tailscale:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1-minute install&lt;/li&gt;
&lt;li&gt;No port forwarding&lt;/li&gt;
&lt;li&gt;Works over NAT, firewalls, CGNAT&lt;/li&gt;
&lt;li&gt;Uses OAuth (Google, GitHub, Microsoft)&lt;/li&gt;
&lt;li&gt;Admin console for ACLs &amp;amp; devices&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You get end-to-end encrypted connections, no central server required, and identity-based access control.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use Case: Why I Can't Live Without It
&lt;/h2&gt;

&lt;p&gt;In my setup, I manage:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A few Hetzner VPS servers&lt;/li&gt;
&lt;li&gt;My homelab (ZimaBlade + Raspberry Pi)&lt;/li&gt;
&lt;li&gt;A laptop, desktop, phone, and tablet&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Before Tailscale, I was juggling SSH keys, port forwards, and DNS hacks. Now?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I can run &lt;code&gt;tailscale up&lt;/code&gt; on a new server, and boom — it's part of my private network.&lt;/li&gt;
&lt;li&gt;I can access &lt;code&gt;192.168.x.x&lt;/code&gt; home devices remotely via Tailscale subnet routing.&lt;/li&gt;
&lt;li&gt;I use &lt;code&gt;tailscale serve&lt;/code&gt; to spin up secure HTTPS dashboards in seconds.&lt;/li&gt;
&lt;li&gt;I don't worry about firewalls. I don't need a static IP.&lt;/li&gt;
&lt;li&gt;I don't even need to remember where my stuff is — it all just works.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Great for Developers, Freelancers, and Teams
&lt;/h2&gt;

&lt;p&gt;Tailscale isn't just for homelab nerds.&lt;/p&gt;

&lt;p&gt;If you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Work remotely with sensitive code or production servers&lt;/li&gt;
&lt;li&gt;Need to share secure access with clients or teammates&lt;/li&gt;
&lt;li&gt;Want to avoid exposing ports to the open internet&lt;/li&gt;
&lt;li&gt;Need a simple way to access internal dashboards&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then you'll love Tailscale. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Bonus:&lt;/em&gt; You can even share access with people outside your team via ACLs and ephemeral auth.&lt;/p&gt;

&lt;h2&gt;
  
  
  Integrations I Love
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Actions:&lt;/strong&gt; Auto-provision servers that join Tailscale immediately&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Caddy + Tailscale Serve:&lt;/strong&gt; Instant HTTPS reverse proxy&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rancher over Tailscale:&lt;/strong&gt; Secure K8s access without public exposure&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Syncthing + Tailscale:&lt;/strong&gt; Secure file sync across all devices&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prometheus:&lt;/strong&gt; Monitoring over encrypted tunnels&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tailscale becomes the glue for everything.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Coming Next?
&lt;/h2&gt;

&lt;p&gt;This is only the beginning. In the next article and upcoming YouTube videos, I'll show you:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;How to install and configure Tailscale on Linux (including headless)&lt;/li&gt;
&lt;li&gt;How to expose internal web UIs securely using &lt;code&gt;tailscale serve&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;How to combine Tailscale with Rancher, Docker, and Caddy for powerful, secure infrastructure&lt;/li&gt;
&lt;li&gt;How to automate Tailscale onboarding in your CI/CD pipeline&lt;/li&gt;
&lt;/ol&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ DECLASSIFIED / TRUNCATED VERSION&lt;/strong&gt;&lt;br&gt;
You are reading a truncated version of this technical guide. &lt;br&gt;
To read the full, unedited deep-dive (including all configuration files, architecture diagrams, and high-res images), &lt;strong&gt;&lt;a href="https://www.valtersit.com/what-is-tailscale-the-vpn-that-doesnt-suck/" rel="noopener noreferrer"&gt;visit the original post on Valters IT Docs&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>networking</category>
      <category>tailscale</category>
      <category>vpn</category>
      <category>wireguard</category>
    </item>
    <item>
      <title>WireGuard vs OpenVPN: Kernel Space vs User Space – A Reality Check</title>
      <dc:creator>Hugo | DevOps | Cybersecurity</dc:creator>
      <pubDate>Mon, 20 Apr 2026 12:33:04 +0000</pubDate>
      <link>https://dev.to/hugovalters/wireguard-vs-openvpn-kernel-space-vs-user-space-a-reality-check-25ho</link>
      <guid>https://dev.to/hugovalters/wireguard-vs-openvpn-kernel-space-vs-user-space-a-reality-check-25ho</guid>
      <description>&lt;h2&gt;
  
  
  WireGuard vs OpenVPN: Kernel Space vs User Space – A Reality Check
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Introduction: The Unavoidable Truth of VPNs
&lt;/h3&gt;

&lt;p&gt;Let's be blunt: nobody &lt;em&gt;wants&lt;/em&gt; a VPN. We use them because the underlying network infrastructure is either hostile, insecure, or poorly managed. It's a workaround for a broken world, a necessary evil. For years, OpenVPN has been the ubiquitous answer, a Swiss Army knife that did &lt;em&gt;everything&lt;/em&gt; – often with the elegance of a brick. It was the default, the venerable solution, and for a long time, the only truly robust, open-source contender for flexible VPN deployments.&lt;/p&gt;

&lt;p&gt;Now we have WireGuard, a newcomer that doesn't pretend to be more than it is: a fast, secure, simple layer 3 tunnel. It's a specialized tool, meticulously crafted for a single purpose, and it excels at it. This isn't just about "new shiny syndrome"; it's about a fundamental shift in design philosophy, rooted in the very execution context of the VPN daemon itself. We're talking kernel space versus user space, and the implications are significant, not just for theoretical performance metrics, but for your actual throughput, latency, CPU utilization, and ultimately, your sanity when trying to debug why "the VPN is slow." If you're still relying on solutions from the early 2000s, it's time to understand why you might be sacrificing performance, introducing unnecessary complexity, and perpetuating a configuration nightmare that modern alternatives have long since eradicated. The difference isn't just a detail; it's a foundational architectural decision with direct, measurable impact.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. OpenVPN: The Grand Old Dame (User Space - And All Its Baggage)
&lt;/h3&gt;

&lt;p&gt;OpenVPN arrived in a different era, one where kernel module development was less standardized, less portable across various operating systems, and often viewed with a healthy dose of suspicion by many administrators. The idea of running arbitrary, complex network code &lt;em&gt;inside&lt;/em&gt; the kernel was concerning. Its design reflects this: a robust, flexible, but ultimately user-space application that leverages existing OS mechanisms for networking. It's mature, it's auditable (having been picked apart by countless eyes for nearly two decades), and it's slow – relatively speaking. This slowness isn't due to poor coding; it's an inherent limitation of its architectural choice.&lt;/p&gt;

&lt;h4&gt;
  
  
  2.1. Architectural Overview: The User Space Slog
&lt;/h4&gt;

&lt;p&gt;OpenVPN operates primarily in user space. The &lt;code&gt;openvpn&lt;/code&gt; daemon handles everything: key exchange (via the TLS/SSL protocol, typically using OpenSSL), data encryption/decryption (also via OpenSSL), packet encapsulation/decapsulation, and interaction with the virtual network interface (&lt;code&gt;tun&lt;/code&gt; for IP packets, &lt;code&gt;tap&lt;/code&gt; for Ethernet frames).&lt;/p&gt;

&lt;p&gt;This user-space approach means that every single packet flowing through the VPN must traverse the user-kernel boundary multiple times. This is the crux of its performance limitation, the architectural "tax" you pay for its flexibility and historical context. Let's trace a packet:&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ DECLASSIFIED / TRUNCATED VERSION&lt;/strong&gt;&lt;br&gt;
You are reading a truncated version of this technical guide. &lt;br&gt;
To read the full, unedited deep-dive (including all configuration files, architecture diagrams, and high-res images), &lt;strong&gt;&lt;a href="https://www.valtersit.com/guides/networking/wireguard-vs-openvpn-kernel-space-vs-user-space--a-reality-check/" rel="noopener noreferrer"&gt;visit the original post on Valters IT Docs&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>vpn</category>
      <category>wireguard</category>
      <category>openvpn</category>
      <category>networking</category>
    </item>
    <item>
      <title>Exposing SSH to 0.0.0.0: The Fast Track to a Brute-Force Apocalypse</title>
      <dc:creator>Hugo | DevOps | Cybersecurity</dc:creator>
      <pubDate>Sun, 19 Apr 2026 12:33:03 +0000</pubDate>
      <link>https://dev.to/hugovalters/exposing-ssh-to-0000-the-fast-track-to-a-brute-force-apocalypse-4lo7</link>
      <guid>https://dev.to/hugovalters/exposing-ssh-to-0000-the-fast-track-to-a-brute-force-apocalypse-4lo7</guid>
      <description>&lt;p&gt;Every day, a junior developer spins up a $5 DigitalOcean droplet, leaves port 22 exposed to &lt;code&gt;0.0.0.0/0&lt;/code&gt;, enables password authentication, and sets the root password to &lt;code&gt;Company2026!&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;A week later, they are posting on Reddit, utterly baffled as to why their server's CPU has been pinned at 100% for five days and their &lt;code&gt;/var/log/auth.log&lt;/code&gt; is suddenly 50 gigabytes. &lt;/p&gt;

&lt;p&gt;Congratulations. You didn't deploy a web server; you successfully deployed a new worker node for a Russian crypto-mining botnet. Leaving SSH wide open with default configurations is the absolute fastest way to lose control of a Linux machine. &lt;/p&gt;

&lt;h3&gt;
  
  
  The Mechanics: The Background Radiation of the Internet
&lt;/h3&gt;

&lt;p&gt;There is a constant, ambient background radiation of malicious scanning on the internet. Within approximately 45 seconds of your server acquiring a public IPv4 address, automated scanners will find it. &lt;/p&gt;

&lt;p&gt;These botnets don't care who you are. They are blindly hammering port 22 with millions of dictionary attacks and credential stuffing payloads. If your &lt;code&gt;sshd_config&lt;/code&gt; allows &lt;code&gt;root&lt;/code&gt; logins with a password, you have already done half their job for them—they don't even have to guess the username. &lt;/p&gt;

&lt;p&gt;They will throw &lt;code&gt;admin&lt;/code&gt;, &lt;code&gt;root&lt;/code&gt;, &lt;code&gt;ubuntu&lt;/code&gt;, and &lt;code&gt;test&lt;/code&gt; at your daemon ten times a second until the server either crashes from the IO overhead of writing failed auth logs, or they guess the password. Once they have a root shell, they drop a persistence script in &lt;code&gt;/etc/cron.d&lt;/code&gt;, alter your authorized keys, and start hunting for AWS credentials in your environment variables.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Fix: Kill Passwords and Jail the Noise
&lt;/h3&gt;

&lt;p&gt;The Senior Sysadmin approach to SSH is uncompromising: &lt;strong&gt;Passwords are dead.&lt;/strong&gt; If you are using a password to authenticate to a production Linux server in the current year, you are doing it wrong. You must enforce public key authentication (specifically Ed25519 keys, stop using weak RSA), disable root login entirely, and disable password authentication. &lt;/p&gt;

&lt;p&gt;As a secondary layer, you implement Fail2Ban or CrowdSec. While dropping passwords makes brute-forcing mathematically impossible, the botnets will still try, filling your disk with garbage logs. Fail2Ban monitors those logs and automatically drops a firewall block on any IP that fails authentication 5 times. &lt;/p&gt;

&lt;p&gt;Finally, move SSH off port 22. It is not "security," it is security through obscurity—but changing the port to &lt;code&gt;50222&lt;/code&gt; will instantly filter out 98% of the automated script-kiddie noise hitting your daemon.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Code &amp;amp; Config
&lt;/h3&gt;

&lt;p&gt;Here is the default garbage you usually find in &lt;code&gt;/etc/ssh/sshd_config&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# THE BAD WAY (A Botnet Welcome Mat)
Port 22
PermitRootLogin yes
PasswordAuthentication yes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here is the hardened, DevSecOps-approved configuration. Open &lt;code&gt;/etc/ssh/sshd_config&lt;/code&gt;, make these changes, and run &lt;code&gt;systemctl restart sshd&lt;/code&gt;. (Make sure your SSH key is actually installed before you do this, or you will lock yourself out).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# THE REAL ENGINEER'S WAY (Zero Trust SSH)

# Move the port to drop the automated noise
Port 50222

# Only allow Protocol 2 (Usually default, but be explicit)
Protocol 2

# THE FIX: Kill root login and password auth entirely
PermitRootLogin no
PasswordAuthentication no
PermitEmptyPasswords no
PubkeyAuthentication yes

# Optional: Only allow specific users to even attempt login
AllowUsers deploy_user admin_user
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To stop the log spam, install Fail2Ban (&lt;code&gt;apt install fail2ban&lt;/code&gt;) and drop this configuration into &lt;code&gt;/etc/fail2ban/jail.local&lt;/code&gt;:&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ DECLASSIFIED / TRUNCATED VERSION&lt;/strong&gt;&lt;br&gt;
You are reading a truncated version of this technical guide. &lt;br&gt;
To read the full, unedited deep-dive (including all configuration files, architecture diagrams, and high-res images), &lt;strong&gt;&lt;a href="https://www.valtersit.com/guides/security/exposing-ssh-to-0_0_0_0-the-fast-track-to-a-brute-force-apocalypse/" rel="noopener noreferrer"&gt;visit the original post on Valters IT Docs&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>cybersecurity</category>
      <category>linux</category>
      <category>ssh</category>
      <category>serverhardening</category>
    </item>
    <item>
      <title>Hardcoded Passwords in Scripts: That's Not Automation, That's a Breach</title>
      <dc:creator>Hugo | DevOps | Cybersecurity</dc:creator>
      <pubDate>Sat, 18 Apr 2026 12:33:03 +0000</pubDate>
      <link>https://dev.to/hugovalters/hardcoded-passwords-in-scripts-thats-not-automation-thats-a-breach-26kg</link>
      <guid>https://dev.to/hugovalters/hardcoded-passwords-in-scripts-thats-not-automation-thats-a-breach-26kg</guid>
      <description>&lt;p&gt;There is a special place in infrastructure hell for sysadmins who write "automation" scripts with &lt;code&gt;$AdminPassword = "CompanyAdmin2026!"&lt;/code&gt; right at the top. &lt;/p&gt;

&lt;p&gt;You usually find these masterpieces sitting on a globally readable network share like &lt;code&gt;\\fs01\IT_Scripts\NewUserSetup.ps1&lt;/code&gt;, or worse, pushed to a public GitHub repository because someone didn't understand how &lt;code&gt;.gitignore&lt;/code&gt; works. &lt;/p&gt;

&lt;p&gt;Let’s get one thing straight: if your script contains a plain-text password, you didn't write an automation script. You wrote a self-service portal for threat actors. You are doing the attacker's job for them.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Mechanics: The String Search
&lt;/h3&gt;

&lt;p&gt;When a threat actor or an automated worm breaches a low-level workstation on your network, they don't immediately start dropping zero-days. They live off the land. One of the very first enumeration steps is mounting available network shares and running a recursive search for files ending in &lt;code&gt;.ps1&lt;/code&gt;, &lt;code&gt;.sh&lt;/code&gt;, &lt;code&gt;.bat&lt;/code&gt;, or &lt;code&gt;.py&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;Once they find those files, they just grep for strings like &lt;code&gt;password&lt;/code&gt;, &lt;code&gt;pwd&lt;/code&gt;, &lt;code&gt;credential&lt;/code&gt;, or &lt;code&gt;api_key&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;If anyone with read access to that file share can read the script, anyone can own the domain. It doesn't matter how complex the password is if you leave it written on a digital Post-it note attached to the execution file. &lt;/p&gt;

&lt;h3&gt;
  
  
  The Fix: DPAPI and Secret Vaults
&lt;/h3&gt;

&lt;p&gt;Stop hardcoding secrets. If you need a script to run unattended, you have to decouple the credential from the code.&lt;/p&gt;

&lt;p&gt;For enterprise environments, the correct answer is a dedicated secrets engine like HashiCorp Vault, Azure Key Vault, or AWS Secrets Manager. Your script authenticates via a managed identity or machine certificate, pulls the secret dynamically into memory, uses it, and dumps it.&lt;/p&gt;

&lt;p&gt;If you don't have a vault, you can still secure local automation using the Windows Data Protection API (DPAPI). PowerShell's &lt;code&gt;Export-Clixml&lt;/code&gt; cmdlet can serialize a credential object and encrypt it using a key tied specifically to the Windows user account and the machine executing the script. If an attacker copies the XML file to another machine, or tries to read it as a different user, it fails to decrypt.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Code
&lt;/h3&gt;

&lt;p&gt;Here is the script that guarantees your Domain Controller gets encrypted by Friday:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# THE BAD WAY (A breach waiting to happen)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# Anyone who can read this file owns the hypervisor&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="nv"&gt;$Username&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"admin@corp.local"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$Password&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SuperSecretAdmin123!"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$Cred&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;New-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;System.Management.Automation.PSCredential&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$Username&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="n"&gt;ConvertTo-SecureString&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Password&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AsPlainText&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="n"&gt;Connect-VMHost&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;vcenter.corp.local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Credential&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Cred&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here is the Senior Sysadmin approach using local DPAPI encryption. &lt;/p&gt;

&lt;p&gt;First, as a one-time setup step logged in as the service account running the automation, you prompt for the password and encrypt it to disk:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# ONE-TIME SETUP (Run as the Service Account on the execution machine)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-Credential&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Export-Clixml&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"C:\SecureScripts\Credentials\vcenter_cred.xml"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, your actual automation script just imports that encrypted object. No plain-text secrets in the code, no hardcoded strings for malware to scrape.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# THE REAL ENGINEER'S WAY (Decoupled and Encrypted)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# The credential can only be decrypted by the specific Service Account on this specific machine.&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="nv"&gt;$CredPath&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"C:\SecureScripts\Credentials\vcenter_cred.xml"&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="kr"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-Not&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Test-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$CredPath&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="n"&gt;Write-Error&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Credential file missing. Cannot authenticate."&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="kr"&gt;exit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&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;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ DECLASSIFIED / TRUNCATED VERSION&lt;/strong&gt;&lt;br&gt;
You are reading a truncated version of this technical guide. &lt;br&gt;
To read the full, unedited deep-dive (including all configuration files, architecture diagrams, and high-res images), &lt;strong&gt;&lt;a href="https://www.valtersit.com/guides/security/hardcoded-passwords-in-scripts-thats-not-automation-thats-a-breach/" rel="noopener noreferrer"&gt;visit the original post on Valters IT Docs&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>cybersecurity</category>
      <category>scripting</category>
      <category>powershell</category>
      <category>devsecops</category>
    </item>
    <item>
      <title>MFA Fatigue: Why Your 'Secure' Push Notifications Are Getting You Hacked</title>
      <dc:creator>Hugo | DevOps | Cybersecurity</dc:creator>
      <pubDate>Fri, 17 Apr 2026 12:33:04 +0000</pubDate>
      <link>https://dev.to/hugovalters/mfa-fatigue-why-your-secure-push-notifications-are-getting-you-hacked-16h9</link>
      <guid>https://dev.to/hugovalters/mfa-fatigue-why-your-secure-push-notifications-are-getting-you-hacked-16h9</guid>
      <description>&lt;p&gt;Companies will spend $50,000 a year on a premium Identity Provider (IdP) tier, roll out an authenticator app to the entire org, and proudly declare themselves "unhackable" at the next board meeting. &lt;/p&gt;

&lt;p&gt;Then Kevin in Sales gets his password scraped by an infostealer. At 2:14 AM on a Tuesday, his phone buzzes. He ignores it. At 2:15 AM, it buzzes 30 more times in rapid succession. Bleary-eyed, irritated, and just wanting the screen to go dark so he can go back to sleep, Kevin hits "Approve". &lt;/p&gt;

&lt;p&gt;Congratulations. Your multi-million dollar security perimeter was just breached because Kevin was tired. &lt;/p&gt;

&lt;p&gt;Basic push notifications are not a security boundary; they are an annoyance threshold. If your security architecture relies on a binary "Yes/No" from an exhausted human, it is structurally flawed.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Mechanics: Prompt Bombing
&lt;/h3&gt;

&lt;p&gt;This attack vector is known as "MFA Fatigue" or "Prompt Bombing," and it is the primary way threat actors like Lapsus$ and Scattered Spider have been breaching Fortune 500s. &lt;/p&gt;

&lt;p&gt;The attacker already has the valid username and password—usually bought for $5 on a darknet market or phished via a fake Office 365 login page. The only thing standing between them and your corporate VPN is the MFA prompt. So, they script the login portal to fire authentication requests repeatedly. &lt;/p&gt;

&lt;p&gt;Sometimes they don't even rely on pure fatigue. They will hit the user with three prompts, then immediately call the user's phone, spoofing the caller ID to look like the internal Helpdesk. "Hi, this is IT. We're doing an overnight server migration and need you to acknowledge the prompt on your phone to keep your account active."&lt;/p&gt;

&lt;p&gt;The user taps "Approve", the attacker gets the session token, and they are in. It relies entirely on human psychology, requiring zero technical sophistication once the password is known.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Fix: Kill the "Approve" Button
&lt;/h3&gt;

&lt;p&gt;The modern Zero-Trust approach dictates that you must immediately disable simple "Approve/Deny" push notifications. &lt;/p&gt;

&lt;p&gt;You must enforce &lt;strong&gt;Number Matching&lt;/strong&gt;. With Number Matching, the login screen displays a randomly generated 2-digit number. The user cannot simply tap "Approve"; they &lt;em&gt;must&lt;/em&gt; open their authenticator app and manually type that specific number. You cannot type the number if you aren't the one looking at the login screen. It completely neutralizes MFA fatigue.&lt;/p&gt;

&lt;p&gt;For highly privileged accounts (Domain Admins, Global Admins), you should deprecate phone-based MFA entirely. Mandate FIDO2 hardware keys (like YubiKeys). FIDO2 is cryptographically bound to the TLS session and the specific domain being accessed, making it mathematically phishing-resistant.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Code &amp;amp; Config
&lt;/h3&gt;

&lt;p&gt;If you are using Microsoft Entra ID (formerly Azure AD), Number Matching is now the default, but if you have legacy policies overriding it, you are vulnerable. Here is the Microsoft Graph API payload to strictly enforce Number Matching, along with application context and geographic location display.&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="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;THE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;REAL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;ENGINEER'S&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;WAY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(Enforce&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Number&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Matching&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;via&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;MS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Graph&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;API)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;PATCH&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;https://graph.microsoft.com/v&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="err"&gt;/policies/authenticationMethodsPolicy/authenticationMethodConfigurations/microsoftAuthenticator&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="err"&gt;(https://graph.microsoft.com/v&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="err"&gt;/policies/authenticationMethodsPolicy/authenticationMethodConfigurations/microsoftAuthenticator)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ DECLASSIFIED / TRUNCATED VERSION&lt;/strong&gt;&lt;br&gt;
You are reading a truncated version of this technical guide. &lt;br&gt;
To read the full, unedited deep-dive (including all configuration files, architecture diagrams, and high-res images), &lt;strong&gt;&lt;a href="https://www.valtersit.com/guides/security/mfa-fatigue-why-your-secure-push-notifications-are-getting-you-hacked/" rel="noopener noreferrer"&gt;visit the original post on Valters IT Docs&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>cybersecurity</category>
      <category>identity</category>
      <category>mfa</category>
      <category>phishing</category>
    </item>
    <item>
      <title>Port 3389 to the World: How to Lose Your Company Data Over the Weekend</title>
      <dc:creator>Hugo | DevOps | Cybersecurity</dc:creator>
      <pubDate>Thu, 16 Apr 2026 12:33:03 +0000</pubDate>
      <link>https://dev.to/hugovalters/port-3389-to-the-world-how-to-lose-your-company-data-over-the-weekend-fbc</link>
      <guid>https://dev.to/hugovalters/port-3389-to-the-world-how-to-lose-your-company-data-over-the-weekend-fbc</guid>
      <description>&lt;p&gt;It’s 4:30 PM on a Friday. The head accountant insists they need to finish payroll from home over the weekend. The junior IT guy, wanting to be helpful and avoid setting up a VPN profile, logs into the edge firewall, creates a quick NAT rule forwarding TCP 3389 straight to the internal terminal server, and goes to the pub. &lt;/p&gt;

&lt;p&gt;By Monday morning, every file server, domain controller, and backup repository on the network ends in &lt;code&gt;.lockbit&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;If you are exposing Remote Desktop Protocol (RDP) directly to the public internet in the current year, you are not administering a network. You are operating a honeypot. It is the single most amateur mistake in Windows system administration, and it is the primary vector for ransomware groups globally.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Mechanics: The 48-Hour Guarantee
&lt;/h3&gt;

&lt;p&gt;You might think your obscure static IP address is flying under the radar. It isn't. &lt;/p&gt;

&lt;p&gt;Mass-scanning botnets map the entire IPv4 address space in a matter of hours. When you open port 3389, it takes roughly 45 minutes for automated scanners to find it and flag your IP in a Telegram channel. &lt;/p&gt;

&lt;p&gt;Once the port is discovered, the attack branches into two paths:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Credential Stuffing:&lt;/strong&gt; Automated scripts hammer your login prompt with leaked credentials, default passwords, and variations of &lt;code&gt;Administrator&lt;/code&gt; and &lt;code&gt;Company2026!&lt;/code&gt;. If you don't have aggressive Active Directory account lockout policies enabled, they will eventually brute-force their way in.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Protocol Exploits:&lt;/strong&gt; If the server is missing a few critical Windows Updates, attackers just fire off a known RDP vulnerability payload—like the infamous BlueKeep (CVE-2019-0708). This gives them pre-authentication remote code execution at the SYSTEM level. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Once they have an RDP session, the game is over. They deploy Cobalt Strike, disable Windows Defender, dump LSASS memory to harvest Domain Admin credentials, and move laterally across your hypervisors. &lt;/p&gt;

&lt;h3&gt;
  
  
  The Fix: Kill the NAT Rule
&lt;/h3&gt;

&lt;p&gt;The Senior Sysadmin approach to RDP is absolute: &lt;strong&gt;Never, under any circumstances, expose 3389 to the internet.&lt;/strong&gt; If users need remote access, you implement layers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The Network Layer:&lt;/strong&gt; Users must connect to a proper VPN (WireGuard or IPsec) &lt;em&gt;before&lt;/em&gt; they can even route to the internal subnet where the RDP server lives.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Gateway Layer:&lt;/strong&gt; If you absolutely cannot use a VPN client, deploy a Remote Desktop Gateway (RD Gateway) behind a reverse proxy. This encapsulates the RDP traffic over HTTPS (TCP 443).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Identity Layer:&lt;/strong&gt; Enforce Multi-Factor Authentication (MFA) via Entra ID, Duo, or Okta at the VPN or Gateway level. Passwords alone are mathematically obsolete.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  The Code &amp;amp; Config
&lt;/h3&gt;

&lt;p&gt;Here is what the firewall rule looks like on an amateurly managed network. Delete this immediately.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# THE BAD WAY (Ransomware Welcome Mat)
# Edge Firewall NAT / Port Forwarding
Rule: 10
Action: ALLOW
Protocol: TCP
Source: ANY (0.0.0.0/0)
Destination Port: 3389
Forward IP: 192.168.10.50 (Internal Terminal Server)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your edge firewall should simply drop all inbound 3389 traffic. &lt;/p&gt;

&lt;p&gt;Inside the network, you must harden the RDP host itself. At a bare minimum, enforce Network Level Authentication (NLA). NLA requires the user to authenticate &lt;em&gt;before&lt;/em&gt; the server establishes a full RDP session and allocates memory, completely neutralizing entire classes of pre-auth exploits like BlueKeep.&lt;/p&gt;

&lt;p&gt;Run this snippet in an elevated PowerShell prompt to force NLA on your Windows Servers, or push it via Group Policy (GPO):&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ DECLASSIFIED / TRUNCATED VERSION&lt;/strong&gt;&lt;br&gt;
You are reading a truncated version of this technical guide. &lt;br&gt;
To read the full, unedited deep-dive (including all configuration files, architecture diagrams, and high-res images), &lt;strong&gt;&lt;a href="https://www.valtersit.com/guides/security/port-3389-to-the-world-how-to-lose-your-company-data-over-the-weekend/" rel="noopener noreferrer"&gt;visit the original post on Valters IT Docs&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>cybersecurity</category>
      <category>windows</category>
      <category>rdp</category>
      <category>ransomware</category>
    </item>
    <item>
      <title>Wazuh SIEM: A Threat Hunting Toolkit for People Who Hate SIEMs</title>
      <dc:creator>Hugo | DevOps | Cybersecurity</dc:creator>
      <pubDate>Wed, 15 Apr 2026 12:33:03 +0000</pubDate>
      <link>https://dev.to/hugovalters/wazuh-siem-a-threat-hunting-toolkit-for-people-who-hate-siems-1e2k</link>
      <guid>https://dev.to/hugovalters/wazuh-siem-a-threat-hunting-toolkit-for-people-who-hate-siems-1e2k</guid>
      <description>&lt;h3&gt;
  
  
  1. Introduction: So You Need a SIEM. My Condolences.
&lt;/h3&gt;

&lt;p&gt;Let's get one thing straight. You're here because someone—a manager, an auditor, or that little voice of dread in your head—told you that you need a Security Information and Event Management (SIEM) system. My condolences. Most SIEMs are expensive, proprietary black boxes designed to do one thing exceptionally well: generate invoices. They are compliance checkboxes, not functional security tools. They drown you in so many false positives that a real attack would look like just another Tuesday.&lt;/p&gt;

&lt;p&gt;We're not here to install a "next-gen" magic quadrant leader. We're here to build a data analysis engine.&lt;/p&gt;

&lt;h4&gt;
  
  
  Why Commercial SIEMs Are (Mostly) Expensive Alert Cannons
&lt;/h4&gt;

&lt;p&gt;The commercial SIEM market is built on a foundation of terrible ideas. The "per-GB-per-day" licensing model is the most fundamentally broken of them all. It actively punishes you for collecting more data, which is the entire point of security monitoring. The more visibility you want, the more it costs, until you inevitably start making compromises, like not logging DNS queries because it'll blow the budget.&lt;/p&gt;

&lt;p&gt;Then there's the vendor lock-in. Their detection logic is an opaque, proprietary secret sauce. You can't see it, you can't easily modify it, and you're entirely at the mercy of their release cycle to detect the latest threat. The default configuration is a firehose of useless "Severity: Medium - User logged in" noise, designed to make the dashboard look busy and justify its existence. Alert fatigue isn't a side effect; it's a feature.&lt;/p&gt;

&lt;h4&gt;
  
  
  Enter Wazuh: The Box of Sharp Parts
&lt;/h4&gt;

&lt;p&gt;Wazuh isn't a polished, shrink-wrapped product. It's a framework, a collection of sharp, powerful parts that you have to assemble yourself. It grew out of the OSSEC HIDS (Host-based Intrusion Detection System) and has been bolted onto the Elastic Stack—or OpenSearch, or whatever they're calling the fork this week. The point is, it's a battle-tested agent-based HIDS connected to a modern, scalable data backend.&lt;/p&gt;

&lt;p&gt;The power of Wazuh isn't in the pre-canned dashboard widgets. It's in the absolute, granular control you have over data collection, rule logic, and automated response. It's free, as in beer. Your only cost is the hardware (or cloud bill) and your own time. If you're not willing to invest the time to learn its quirks and tune it properly, stop reading now. Go call your Splunk sales rep and prepare your purchase order. For everyone else, let's build something useful.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Architecture: Don't Screw This Up from the Start
&lt;/h3&gt;

&lt;p&gt;Your initial architectural decisions will determine whether this project is a success or a slow, painful failure. Get this part right, and the rest is just tuning.&lt;/p&gt;

&lt;h4&gt;
  
  
  The Three Horsemen
&lt;/h4&gt;

&lt;p&gt;Wazuh is composed of three primary services. Understand what each one does and its limitations.&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ DECLASSIFIED / TRUNCATED VERSION&lt;/strong&gt;&lt;br&gt;
You are reading a truncated version of this technical guide. &lt;br&gt;
To read the full, unedited deep-dive (including all configuration files, architecture diagrams, and high-res images), &lt;strong&gt;&lt;a href="https://www.valtersit.com/guides/security/wazuh-siem-a-threat-hunting-toolkit-for-people-who-hate-siems/" rel="noopener noreferrer"&gt;visit the original post on Valters IT Docs&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>wazuh</category>
      <category>siem</category>
      <category>security</category>
      <category>devops</category>
    </item>
    <item>
      <title>Schrödinger's Backup: If You Haven't Tested a Restore, You Don't Have a Backup</title>
      <dc:creator>Hugo | DevOps | Cybersecurity</dc:creator>
      <pubDate>Tue, 14 Apr 2026 12:33:03 +0000</pubDate>
      <link>https://dev.to/hugovalters/schrodingers-backup-if-you-havent-tested-a-restore-you-dont-have-a-backup-1d53</link>
      <guid>https://dev.to/hugovalters/schrodingers-backup-if-you-havent-tested-a-restore-you-dont-have-a-backup-1d53</guid>
      <description>&lt;p&gt;Let me introduce you to Schrödinger's Backup: the condition of your corporate data is simultaneously pristine and completely destroyed until you actually attempt a bare-metal restore. &lt;/p&gt;

&lt;p&gt;I have sat in entirely too many incident response war rooms where a company gets hit by LockBit or BlackCat. The CEO is panicking, but the IT Director smugly crosses his arms and says, "Don't worry, we use Veeam. We'll just restore from last night."&lt;/p&gt;

&lt;p&gt;Ten minutes later, the blood completely drains from the IT Director's face. He realizes that the backup server was joined to the exact same Active Directory domain that just got compromised. The attacker used their stolen Domain Admin credentials to log into the backup repository and encrypted the backups, too. &lt;/p&gt;

&lt;p&gt;You didn't have a disaster recovery plan. You just had a really expensive secondary target.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Mechanics: Destroying the Safety Net
&lt;/h3&gt;

&lt;p&gt;Modern ransomware is not a dumb script that just blindly encrypts &lt;code&gt;C:\Users&lt;/code&gt;. It is a human-operated, highly targeted "living off the land" operation. &lt;/p&gt;

&lt;p&gt;The absolute &lt;em&gt;first&lt;/em&gt; thing a competent threat actor does after escalating privileges is hunt down your safety net. They query Active Directory for servers with "backup", "veeam", "rubrik", or "datto" in the hostname. They log into your hypervisors. They run &lt;code&gt;vssadmin delete shadows /all /quiet&lt;/code&gt; to nuke your local Volume Shadow Copies. They log into your network-attached storage (NAS) and format the volume. &lt;/p&gt;

&lt;p&gt;Only &lt;em&gt;after&lt;/em&gt; they have systematically dismantled your ability to recover do they push the button to encrypt your production environment. If your backup system relies on the same authentication perimeter (Active Directory, shared local admin passwords) as your production system, it will fall the second your domain falls.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Fix: Immutability and the 3-2-1-1 Rule
&lt;/h3&gt;

&lt;p&gt;The old 3-2-1 backup rule (3 copies, 2 media, 1 offsite) is dead. You need 3-2-1-1: the final "1" stands for &lt;strong&gt;Immutable&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Immutable storage is Write-Once-Read-Many (WORM). Once the data is written, it is physically and cryptographically impossible to delete, modify, or encrypt it for a specified retention period. It doesn't matter if the attacker gets Domain Admin. It doesn't matter if the attacker gets the literal AWS root credentials. The storage API will simply reject any delete or modify requests until the timer expires. &lt;/p&gt;

&lt;p&gt;The modern Senior Engineer approach is to push your secondary backups to a cloud bucket with strict Object Lock enabled in Compliance Mode. &lt;/p&gt;

&lt;h3&gt;
  
  
  The Code &amp;amp; Config
&lt;/h3&gt;

&lt;p&gt;Here is how you actually build an immutable vault. This Terraform snippet creates an AWS S3 bucket and locks it down with a 30-day compliance retention policy.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="c1"&gt;# THE REAL ENGINEER'S WAY (Immutable S3 Storage)&lt;/span&gt;
&lt;span class="c1"&gt;# If an attacker compromises your entire datacenter and AWS keys, &lt;/span&gt;
&lt;span class="c1"&gt;# they STILL cannot delete these backups for 30 days.&lt;/span&gt;

&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_s3_bucket"&lt;/span&gt; &lt;span class="s2"&gt;"immutable_backups"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;bucket&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"corp-airgapped-backups-2026"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# 1. Enable Object Lock (Must be done at bucket creation)&lt;/span&gt;
&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_s3_bucket_versioning"&lt;/span&gt; &lt;span class="s2"&gt;"backup_versioning"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;bucket&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_s3_bucket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;immutable_backups&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
  &lt;span class="nx"&gt;versioning_configuration&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Enabled"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_s3_bucket_object_lock_configuration"&lt;/span&gt; &lt;span class="s2"&gt;"backup_lock"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;bucket&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_s3_bucket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;immutable_backups&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ DECLASSIFIED / TRUNCATED VERSION&lt;/strong&gt;&lt;br&gt;
You are reading a truncated version of this technical guide. &lt;br&gt;
To read the full, unedited deep-dive (including all configuration files, architecture diagrams, and high-res images), &lt;strong&gt;&lt;a href="https://www.valtersit.com/guides/security/schrodingers-backup-if-you-havent-tested-a-restore-you-dont-have-a-backup/" rel="noopener noreferrer"&gt;visit the original post on Valters IT Docs&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>cybersecurity</category>
      <category>disasterrecovery</category>
      <category>backups</category>
      <category>ransomware</category>
    </item>
    <item>
      <title>Still Running SMBv1? You're Basically Inviting WannaCry to Dinner</title>
      <dc:creator>Hugo | DevOps | Cybersecurity</dc:creator>
      <pubDate>Sun, 12 Apr 2026 12:33:03 +0000</pubDate>
      <link>https://dev.to/hugovalters/still-running-smbv1-youre-basically-inviting-wannacry-to-dinner-1b0a</link>
      <guid>https://dev.to/hugovalters/still-running-smbv1-youre-basically-inviting-wannacry-to-dinner-1b0a</guid>
      <description>&lt;p&gt;It is 2026. The fact that I still walk into enterprise environments and see Server Message Block version 1 (SMBv1) enabled on Domain Controllers because the HR department refuses to replace a multifunction Xerox scanner from 2005 is a complete dereliction of duty. &lt;/p&gt;

&lt;p&gt;Let me be absolutely clear: SMBv1 is a 30-year-old protocol that was deprecated before most junior sysadmins even graduated high school. Keeping it active on your network isn't a "business requirement," it is gross negligence. If you have SMBv1 running, you are effectively leaving the front door to your datacenter wide open with a neon sign pointing to the servers.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Mechanics: The EternalBlue Nightmare
&lt;/h3&gt;

&lt;p&gt;To understand why SMBv1 is so lethal, you have to look at EternalBlue (CVE-2017-0144), the exploit that powered the WannaCry and NotPetya global meltdowns. &lt;/p&gt;

&lt;p&gt;This isn't a phishing attack that requires a user to click a bad link. It requires absolutely zero user interaction. If SMBv1 is enabled, an attacker (or a self-propagating worm) simply sends a specially crafted, unauthenticated packet to the target's &lt;code&gt;IPC$&lt;/code&gt; share. &lt;/p&gt;

&lt;p&gt;Because of a massive vulnerability in how the Windows kernel driver (&lt;code&gt;srv.sys&lt;/code&gt;) handles these packets, that single malformed request triggers a buffer overflow. The attacker instantly gains arbitrary code execution at the Ring 0 (SYSTEM) level. They don't just own the machine; they own the kernel. From there, the worm scans the local subnet, finds every other machine listening on TCP 445 with SMBv1 enabled, and infects the entire VLAN in a matter of seconds.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Fix: Nuke It From Orbit
&lt;/h3&gt;

&lt;p&gt;You do not mitigate SMBv1. You exterminate it. &lt;/p&gt;

&lt;p&gt;The Senior Sysadmin approach is to aggressively disable the protocol across every single endpoint and server in the domain. If that legacy 2005 scanner suddenly breaks, good. Tell them to buy a $300 printer from Best Buy. If management absolutely insists that a legacy piece of manufacturing hardware &lt;em&gt;must&lt;/em&gt; use SMBv1, you physically isolate that machine on a completely locked-down, air-gapped VLAN with zero routing access to the rest of the corporate network. &lt;/p&gt;

&lt;h3&gt;
  
  
  The Code &amp;amp; Config
&lt;/h3&gt;

&lt;p&gt;Stop clicking through GUI menus. Here is the exact PowerShell and Group Policy configuration to rip SMBv1 out of your infrastructure permanently.&lt;/p&gt;

&lt;p&gt;First, run this on your Windows Servers to kill the service immediately without a reboot:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# THE REAL ENGINEER'S WAY (Kill SMBv1 on Windows Server)&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Check if the protocol is even enabled&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-SmbServerConfiguration&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;EnableSMB1Protocol&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Terminate it with extreme prejudice&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Set-SmbServerConfiguration&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-EnableSMB1Protocol&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$false&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="n"&gt;Write-Host&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SMBv1 Server service terminated."&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ForegroundColor&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Green&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To rip the client feature out of Windows 10/11 workstations, use the Optional Features cmdlet:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Kill SMBv1 Client on Windows Workstations&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Disable-WindowsOptionalFeature&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Online&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FeatureName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SMB1Protocol&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-NoRestart&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally, to ensure no rogue machine or helpdesk tech ever turns it back on, you enforce this registry key via Group Policy Object (GPO) applied to the entire domain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# THE GPO NUKE (Enforce via Group Policy Preferences -&amp;gt; Registry)

Action: Update
Hive: HKEY_LOCAL_MACHINE
Key Path: SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters
Value Name: SMB1
Value Type: REG_DWORD
Value Data: 0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ DECLASSIFIED / TRUNCATED VERSION&lt;/strong&gt;&lt;br&gt;
You are reading a truncated version of this technical guide. &lt;br&gt;
To read the full, unedited deep-dive (including all configuration files, architecture diagrams, and high-res images), &lt;strong&gt;&lt;a href="https://www.valtersit.com/guides/security/still-running-smbv1-you_re-basically-inviting-wannacry-to-dinner/" rel="noopener noreferrer"&gt;visit the original post on Valters IT Docs&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>cybersecurity</category>
      <category>networking</category>
      <category>windows</category>
      <category>smb</category>
    </item>
    <item>
      <title>The 'Domain Admin' Ego Trip: Why Handing Out DA Privileges Guarantees a Ransomware Outbreak</title>
      <dc:creator>Hugo | DevOps | Cybersecurity</dc:creator>
      <pubDate>Sat, 11 Apr 2026 12:33:04 +0000</pubDate>
      <link>https://dev.to/hugovalters/the-domain-admin-ego-trip-why-handing-out-da-privileges-guarantees-a-ransomware-outbreak-1b5d</link>
      <guid>https://dev.to/hugovalters/the-domain-admin-ego-trip-why-handing-out-da-privileges-guarantees-a-ransomware-outbreak-1b5d</guid>
      <description>&lt;p&gt;I frequently audit corporate networks where 15 different people are sitting in the &lt;code&gt;Domain Admins&lt;/code&gt; group. When I ask the IT Director why the junior helpdesk tech and the database administrator hold the literal keys to the entire Active Directory forest, the answer is always some variation of, "It makes fixing printer permissions easier."&lt;/p&gt;

&lt;p&gt;No, it doesn't. It makes you lazy. Handing out Domain Admin (DA) privileges like candy isn't an IT strategy; it's an ego trip for the IT staff and a guaranteed ransomware deployment for the business.&lt;/p&gt;

&lt;p&gt;If your helpdesk uses a DA account to log into user workstations, you are actively facilitating your own network's destruction. &lt;/p&gt;

&lt;h3&gt;
  
  
  The Mechanics: How Mimikatz Eats Your Domain
&lt;/h3&gt;

&lt;p&gt;You don't need to be hacked by a nation-state to lose your domain. An attacker only needs to phish one low-level employee. Let's say Kevin in HR clicks a bad PDF, and an attacker gets a silent, unprivileged reverse shell on his laptop.&lt;/p&gt;

&lt;p&gt;Kevin notices his computer is acting sluggish and calls the helpdesk. The lazy helpdesk tech, using their daily driver account which happens to be in the &lt;code&gt;Domain Admins&lt;/code&gt; group, RDPs into Kevin's infected workstation to take a look. &lt;/p&gt;

&lt;p&gt;The moment that DA account authenticates to the workstation, Windows caches their credentials in the Local Security Authority Subsystem Service (LSASS) process memory. &lt;/p&gt;

&lt;p&gt;The attacker, sitting quietly on Kevin's machine, runs a tool like Mimikatz. They scrape the LSASS memory and extract the helpdesk tech's NTLM hash or plain-text password. Because the tech is a DA, the attacker takes that hash, uses Pass-the-Hash to authenticate directly to the Domain Controller, and dumps the &lt;code&gt;NTDS.dit&lt;/code&gt; database. &lt;/p&gt;

&lt;p&gt;The attacker now owns every password of every user and service account in your company. The domain is dead. &lt;/p&gt;

&lt;h3&gt;
  
  
  The Fix: Tiered Administration and LAPS
&lt;/h3&gt;

&lt;p&gt;The Senior Sysadmin fix is non-negotiable: &lt;strong&gt;The Tiered Administration Model&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Domain Admins (Tier 0) must &lt;em&gt;never&lt;/em&gt; log into workstations (Tier 2) or standard application servers (Tier 1). Ever. If a DA account logs into a workstation, that workstation is now effectively a Domain Controller from a risk perspective. &lt;/p&gt;

&lt;p&gt;To give your helpdesk the ability to fix Kevin's computer without using a DA account, you implement the Principle of Least Privilege and deploy Microsoft LAPS (Local Administrator Password Solution). &lt;/p&gt;

&lt;p&gt;LAPS randomizes the built-in local administrator password on every single workstation in the domain, makes it completely unique, changes it automatically every 30 days, and stores it securely in a hidden Active Directory attribute. When the helpdesk needs to fix a PC, they look up that specific PC's LAPS password, use it, and move on. If the PC is compromised, the attacker only gets a local admin password that is useless on every other machine in the network.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Code &amp;amp; Config
&lt;/h3&gt;

&lt;p&gt;Deploying LAPS is not hard. It takes 15 minutes of PowerShell on a Domain Controller to stop 90% of lateral movement attacks.&lt;/p&gt;

&lt;p&gt;Here is the PowerShell snippet to prepare your Active Directory schema and delegate the correct permissions so your helpdesk can actually read the LAPS passwords without needing Domain Admin rights.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# THE REAL ENGINEER'S WAY (Deploying LAPS via PowerShell)&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# 1. Import the LAPS module on your Domain Controller&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Import-Module&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;AdmPwd.PS&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# 2. Update the AD Schema to include the ms-Mcs-AdmPwd attributes&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Update-AdmPwdADSchema&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ DECLASSIFIED / TRUNCATED VERSION&lt;/strong&gt;&lt;br&gt;
You are reading a truncated version of this technical guide. &lt;br&gt;
To read the full, unedited deep-dive (including all configuration files, architecture diagrams, and high-res images), &lt;strong&gt;&lt;a href="https://www.valtersit.com/guides/security/the-domain-admin-ego-trip-why-handing-out-da-privileges-guarantees-a-ransomware-outbreak/" rel="noopener noreferrer"&gt;visit the original post on Valters IT Docs&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>cybersecurity</category>
      <category>activedirectory</category>
      <category>sysadmin</category>
      <category>privilegeescalation</category>
    </item>
    <item>
      <title>The Open S3 Bucket Epidemic: Why Reading the Manual is Apparently Too Hard</title>
      <dc:creator>Hugo | DevOps | Cybersecurity</dc:creator>
      <pubDate>Fri, 10 Apr 2026 12:33:03 +0000</pubDate>
      <link>https://dev.to/hugovalters/the-open-s3-bucket-epidemic-why-reading-the-manual-is-apparently-too-hard-1goj</link>
      <guid>https://dev.to/hugovalters/the-open-s3-bucket-epidemic-why-reading-the-manual-is-apparently-too-hard-1goj</guid>
      <description>&lt;p&gt;Every time a tech company issues a somber press release about a "highly sophisticated, coordinated cyber incident," I immediately assume an intern left an AWS S3 bucket open to the public. Nine times out of ten, I'm right.&lt;/p&gt;

&lt;p&gt;There is an epidemic of startups leaking millions of customer passport scans, API keys, and PII because someone couldn't figure out IAM roles and just clicked "Public" so the frontend application could load an image. When your company's crown jewels are exposed to the internet without authentication, you haven't been hacked. You have just successfully hosted a public file share for criminals.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Mechanics: The Three-Minute Window
&lt;/h3&gt;

&lt;p&gt;Many developers believe that if their bucket name is obscure—something like &lt;code&gt;prod-backup-kyc-docs-xyz123&lt;/code&gt;—nobody will ever find it. This is fundamental ignorance of how modern adversaries operate. &lt;/p&gt;

&lt;p&gt;Attackers do not guess your bucket names. They use automated bucket stream scanners. They algorithmically monitor AWS IP spaces, passive DNS logs, and Certificate Transparency logs (like Certstream). &lt;/p&gt;

&lt;p&gt;The second you provision a new S3 bucket with a public ACL, a Python script running on a bulletproof VPS somewhere evaluates it. The script sends an unauthenticated HTTP GET request. If AWS replies with &lt;code&gt;200 OK&lt;/code&gt; instead of &lt;code&gt;403 Forbidden&lt;/code&gt;, the automated script instantly triggers a recursive download of the entire bucket. Your data is cloned and sitting on a darknet marketplace in under three minutes. &lt;/p&gt;

&lt;h3&gt;
  
  
  The Fix: Engineering Guardrails
&lt;/h3&gt;

&lt;p&gt;You cannot fix this with compliance training or strongly worded memos. You fix this with hard engineering guardrails at the infrastructure level. &lt;/p&gt;

&lt;p&gt;The Senior Cloud Engineer's approach dictates that storage must be private by default, and public access must be explicitly blocked at the AWS Account level. If a frontend application absolutely needs to serve a private file to an authenticated user, you do not make the bucket public. You generate an &lt;strong&gt;S3 Pre-Signed URL&lt;/strong&gt; in your backend code, which grants the user temporary read access to that specific object for exactly 60 seconds.&lt;/p&gt;

&lt;p&gt;For anomaly detection, you turn on Amazon Macie to constantly scan your buckets for PII, and GuardDuty to flag anomalous access patterns.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Code &amp;amp; Config
&lt;/h3&gt;

&lt;p&gt;Here is the Terraform configuration that will eventually result in a class-action lawsuit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="c1"&gt;# THE BAD WAY (A Resume Generating Event)&lt;/span&gt;
&lt;span class="c1"&gt;# Making the entire bucket publicly readable because "IAM is confusing"&lt;/span&gt;

&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_s3_bucket"&lt;/span&gt; &lt;span class="s2"&gt;"customer_data"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;bucket&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"startup-kyc-documents"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_s3_bucket_acl"&lt;/span&gt; &lt;span class="s2"&gt;"customer_data_acl"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;bucket&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_s3_bucket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;customer_data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
  &lt;span class="nx"&gt;acl&lt;/span&gt;    &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"public-read"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here is the DevSecOps-approved Terraform. We deploy the bucket, and we immediately attach an absolute, non-negotiable block on all public access policies and ACLs.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="c1"&gt;# THE REAL ENGINEER'S WAY (Zero Trust Storage)&lt;/span&gt;

&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_s3_bucket"&lt;/span&gt; &lt;span class="s2"&gt;"customer_data"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;bucket&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"startup-kyc-documents"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# 1. THE FIX: Slam the door shut on public access&lt;/span&gt;
&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_s3_bucket_public_access_block"&lt;/span&gt; &lt;span class="s2"&gt;"secure_bucket"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;bucket&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_s3_bucket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;customer_data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ DECLASSIFIED / TRUNCATED VERSION&lt;/strong&gt;&lt;br&gt;
You are reading a truncated version of this technical guide. &lt;br&gt;
To read the full, unedited deep-dive (including all configuration files, architecture diagrams, and high-res images), &lt;strong&gt;&lt;a href="https://www.valtersit.com/guides/security/the-open-s3-bucket-epidemic-why-reading-the-manual-is-apparently-too-hard/" rel="noopener noreferrer"&gt;visit the original post on Valters IT Docs&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>cybersecurity</category>
      <category>aws</category>
      <category>cloud</category>
      <category>databreach</category>
    </item>
    <item>
      <title>Your VPN is Your Biggest Vulnerability: The Irony of Perimeter Security</title>
      <dc:creator>Hugo | DevOps | Cybersecurity</dc:creator>
      <pubDate>Thu, 09 Apr 2026 12:33:04 +0000</pubDate>
      <link>https://dev.to/hugovalters/your-vpn-is-your-biggest-vulnerability-the-irony-of-perimeter-security-2lfb</link>
      <guid>https://dev.to/hugovalters/your-vpn-is-your-biggest-vulnerability-the-irony-of-perimeter-security-2lfb</guid>
      <description>&lt;p&gt;There is a dark, painful irony in modern infrastructure: the very appliance you spent $50,000 on to keep the bad guys out is almost certainly the exact door they will use to walk in. &lt;/p&gt;

&lt;p&gt;I have lost count of the incident response calls where a company’s entire Active Directory forest was encrypted because the network admin was too terrified of "causing thirty minutes of downtime" to patch their enterprise VPN appliance. The perimeter security model is dead, and relying on it in 2026 is professional negligence. &lt;/p&gt;

&lt;h3&gt;
  
  
  The Mechanics: The Pre-Auth Webshell
&lt;/h3&gt;

&lt;p&gt;Enterprise VPN appliances—be it Pulse Secure, Fortinet, Palo Alto GlobalProtect, or Cisco AnyConnect—have become the absolute favorite targets for state-sponsored actors and ransomware syndicates alike. &lt;/p&gt;

&lt;p&gt;These devices sit directly on the public internet by design. Attackers do not need a phished password or an MFA bypass to compromise them. Instead, they target the unauthenticated pre-login endpoints—the very web interfaces that serve the initial login form to the user. &lt;/p&gt;

&lt;p&gt;Using path traversal vulnerabilities or basic buffer overflows on these public-facing interfaces, attackers drop a webshell (often written in Perl or Python) directly onto the appliance's underlying Linux operating system. &lt;/p&gt;

&lt;p&gt;Because a VPN appliance inherently requires deep, unrestricted routing access to your core network to function, the attacker now has a persistent, unlogged backdoor. They bypass every firewall rule, IPS, and identity provider you have set up, stepping right over your perimeter defenses.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Fix: Kill the Perimeter
&lt;/h3&gt;

&lt;p&gt;The Senior Security Engineer's fix is twofold. &lt;/p&gt;

&lt;p&gt;First, treat your VPN as a highly hostile zone. You patch it aggressively, immediately, the day a critical CVE drops. "Maintenance windows" are a luxury you do not have when your edge device is bleeding zero-days.&lt;/p&gt;

&lt;p&gt;Second, you stop relying on perimeter security entirely and migrate to a Zero Trust Network Access (ZTNA) model. In ZTNA, there is no "trusted internal network." Users do not connect to a VPN gateway and receive a &lt;code&gt;/16&lt;/code&gt; subnet route allowing them to ping whatever they want. &lt;/p&gt;

&lt;p&gt;Instead, users authenticate to an identity broker at the edge. The broker verifies their identity and their device's security posture, and then dynamically builds a micro-tunnel to &lt;em&gt;one specific application&lt;/em&gt;. If the user's laptop gets compromised, the malware cannot scan your internal subnets because those subnets are mathematically invisible to the client.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Code &amp;amp; Config
&lt;/h3&gt;

&lt;p&gt;Here is the legacy VPN configuration that assumes anyone with a valid password deserves a map to the kingdom.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# THE BAD WAY (Legacy VPN Configuration)
# "Welcome to the LAN. Please don't scan the Domain Controllers."

# Pushing the entire corporate routing table to the client
push "route 10.0.0.0 255.0.0.0"
push "route 192.168.0.0 255.255.0.0"
push "dhcp-option DNS 10.0.1.10"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here is what modern Zero Trust Network Access looks like. Before the user is allowed to even &lt;em&gt;see&lt;/em&gt; the internal application, the policy engine verifies the device is domain-joined, running EDR, and fully patched.&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="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;THE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;REAL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;ENGINEER'S&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;WAY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(ZTNA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Device&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Posture&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Policy)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;The&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;network&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;is&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;assumed&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;hostile.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Access&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;is&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;granted&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;per-app,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;not&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;per-subnet.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ DECLASSIFIED / TRUNCATED VERSION&lt;/strong&gt;&lt;br&gt;
You are reading a truncated version of this technical guide. &lt;br&gt;
To read the full, unedited deep-dive (including all configuration files, architecture diagrams, and high-res images), &lt;strong&gt;&lt;a href="https://www.valtersit.com/guides/security/your-vpn-is-your-biggest-vulnerability-the-irony-of-perimeter-security/" rel="noopener noreferrer"&gt;visit the original post on Valters IT Docs&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>cybersecurity</category>
      <category>vpn</category>
      <category>zerotrust</category>
      <category>patching</category>
    </item>
  </channel>
</rss>
