Nutshell Series, Security

🧾 SAST vs DAST Comparison

Feature SAST (Static Application Security Testing) DAST (Dynamic Application Security Testing)
Testing Type White-box Black-box
Access to Code Required (analyzes source code or binaries) Not required (tests from outside the app)
When Used Early in SDLC (during coding/build phase) Later in SDLC (during or after deployment)
What It Tests Source code, bytecode, or binaries Running application, web interfaces, APIs
Finds Code-level issues (e.g., SQL injection, secrets) Runtime issues (e.g., logic flaws, auth problems)
False Positives Higher (due to theoretical analysis) Lower (based on real execution)
Speed Fast (no need to run the app) Slower (requires deployed app and interactions)
Tool Examples SonarQube, Checkmarx, Fortify OWASP ZAP, Burp Suite, Acunetix
Language Dependency Language-specific Language-agnostic
Use Case Secure code review, CI/CD integration Real-world attack simulation, post-deployment testing
Nutshell Series

Fixing Logic App VNet Integration: “Access to the path ‘C:\home\data\Functions\secrets\Sentinels’ is denied.”

If you’re integrating Azure Logic Apps Standard with a VNet and private endpoints, you may encounter this nasty error after deploying your app or modifying your networking configuration:

Access to the path ‘C:\home\data\Functions\secrets\Sentinels’ is denied.

Despite following Microsoft’s recommended steps, the issue may persist. In this post, I’ll break down the actual root causes, explain why the error happens, and offer a practical trick that can resolve it, especially after switching from public to private networking.

🔍 Root Cause

This error usually happens when:

  • Your Logic App is moved from public access to a VNet-integrated private network.
  • The storage account (used to host runtime content and secrets) has private endpoints enabled, but DNS or firewall rules aren’t set up properly.
  • Deployment tools like ARM or Terraform don’t handle the WEBSITE_CONTENTOVERVNET setting correctly during creation.

✅ Microsoft Recommendations to Try First

  1. Enable WEBSITE_CONTENTOVERVNET = 1 in Configuration settings of the Logic App.
  2. Ensure the storage account has:
    • VNet access with correct subnet delegations
    • Private DNS zone linked to your VNet (file, blob, queue, table)
  3. Enable “Allow storage account key access” in the storage account’s Configuration blade.
  4. If using ARM or Terraform:
    • Separate your appSettings into a nested resource of type [Microsoft.Web/sites/config]

But here’s the truth: Even after doing all this, the error may still appear.

🛠️ Trick That Actually Works

If you’re stuck and everything seems configured correctly, try this workaround that’s helped in many real-world deployments:

💡 Scale up your Logic App to WS2 tier temporarily and then scale it back down to WS1.

Why this works:

When switching from public to private storage/VNet, the Logic App runtime may get “stuck” in an inconsistent state, especially regarding storage path mounting or internal config sync.

Scaling up to WS2 forces:

  • A runtime refresh
  • A full reinitialization of the hosting environment
  • Resync of private DNS/storage endpoints

🚀 Step-by-Step: Fix It

  1. Go to your Logic App resource.
  2. Navigate to Scale Up blade.
  3. Change SKU to WS2 (higher tier) and hit Apply.
  4. Wait until the deployment is successful (1–2 mins).
  5. Now go back and revert the SKU back to WS1.

✅ After this step, your Logic App should restart and mount the secret paths correctly.

🧠 Final Thoughts

This issue is not well-documented, but it’s common when moving to private networking in enterprise deployments. Logic Apps tightly depend on the underlying storage account, and improper sync between the app’s network context and the storage endpoints can lead to the above error.

Scaling the app up and down is a safe way to force the platform to re-establish all bindings.

📌 Quick Checklist

  • ✅ VNet Integration configured
  • ✅ Private endpoints enabled for Storage Account
  • ✅ Private DNS zones linked
  • ✅ WEBSITE_CONTENTOVERVNET = 1
  • ✅ Allow storage account key access
  • ✅ Storage access via system-assigned managed identity
  • Scale-up and scale-down trick applied

💬 Have You Faced This?

Drop your experience or questions in the comments — Azure networking errors can be painful, but you’re not alone!

Nutshell Series

Power Query vs SQL Joins

The following table compares Power Query Join Kinds with their equivalent SQL Join types. Each join kind is explained with a visual icon and SQL analogy.

Join Kind Icon Description SQL Equivalent
Left Outer

Returns all rows from the left table and matching rows from the right. Non-matching right rows are set to null. LEFT JOIN
Right Outer

Returns all rows from the right table and matching rows from the left. Non-matching left rows are set to null. RIGHT JOIN
Full Outer

Returns all rows from both tables. Where there’s no match, nulls are inserted. FULL OUTER JOIN
Inner

Returns only rows with matching values in both tables. INNER JOIN
Left Anti

Returns rows from the left table that have no match in the right table. LEFT JOIN ... WHERE right.id IS NULL
Right Anti

Returns rows from the right table that have no match in the left table. RIGHT JOIN ... WHERE left.id IS NULL
Full Outer Anti

Returns all rows from both tables where there’s no matches

FULL OUTER JOIN ... WHERE left.id IS NULL AND right.id IS NULL

Nutshell Series

🔐 Struggling with Connect-ExchangeOnline Errors in PowerShell? Here’s How I Solved It!


If you’ve ever tried to connect to Exchange Online using PowerShell and hit a brick wall, you’re not alone. I recently ran into two frustrating errors while using Connect-ExchangeOnline, and after a lot of head-scratching (and Googling), I finally found a clean, working solution.

Let me walk you through what went wrong and how you can fix it — especially if you’re working in a non-interactive or automation-heavy environment.


⚠️ Error #1: “A window handle must be configured”

This was the first error I got when running a simple connection command:

A window handle must be configured. See https://aka.ms/msal-net-wam#parent-window-handles

This usually happens when PowerShell tries to use Windows Web Account Manager (WAM) to launch a browser-based login — but there’s no interactive UI available. If you’re running a script in a headless setup (like Azure Automation, GitHub Actions, or a remote server), this error is a dead end.

🔧 Tried Fix: Using -DisableWAM

Disabling WAM seemed like a logical next step. I ran:

Connect-ExchangeOnline -DisableWAM

But that only led me straight into this new error:

Failed to connect to Exchange Online: An HttpListenerException occurred while listening on http://localhost:49747/ for the system browser to complete the login.

It also suggested running this from an admin shell:

netsh http add iplisten 127.0.0.1

But honestly? That felt like duct-taping the problem instead of solving it.


✅ The Real Fix: Use an Access Token Instead

After some digging, I found a better way — one that doesn’t depend on browser pop-ups, localhost listeners, or WAM. The trick is to generate an access token using your Azure AD app and pass it directly to the Connect-ExchangeOnline command.

📌 Step 1: Register an Azure App

  1. Go to Azure Portal → App Registrations.
  2. Create a new app registration.
  3. Under “API Permissions”, add Exchange.ManageAsApp.
  4. Create a client secret or upload a certificate (for secure token access).

🛠 Step 2: Generate Access Token via PowerShell

$tenantId = "<your-tenant-id>"
$clientId = "<your-client-id>"
$clientSecret = "<your-client-secret>"
$scope = "https://outlook.office365.com/.default"

$tokenResponse = Invoke-RestMethod -Method Post -Uri "https://login.microsoftonline.com/$tenantId/oauth2/v2.0/token" `
    -Body @{
        client_id     = $clientId
        scope         = $scope
        client_secret = $clientSecret
        grant_type    = "client_credentials"
    }

$accessToken = $tokenResponse.access_token

🔗 Step 3: Connect Using the Token

Connect-ExchangeOnline -AccessToken $accessToken -Organization "<your-tenant-domain>"

And that’s it — no browser, no WAM, no port listeners. Just a clean, programmatic login.


💡 Pro Tips

  • This method is great for automation scripts in environments like Azure Automation, GitHub Actions, or even headless servers.
  • Make sure your app has the right permissions and you’ve granted admin consent in Azure AD.
  • This method is meant for admin tasks, not user mailbox actions (like reading emails).

🧩 Wrapping Up

If you’re facing authentication issues with Connect-ExchangeOnline, don’t waste hours trying to debug listener ports or browser issues. Switching to access token-based authentication saved me so much time — and now my scripts run flawlessly, even in automated pipelines.

Got questions? Drop them in the comments below — happy to help!

Nutshell Series

Complete List of DNS Record Types and Their Purpose

DNS (Domain Name System) records are instructions stored in authoritative DNS servers that provide information about a domain, such as its IP address, mail servers, and other services. Understanding different DNS record types is essential for managing domains and configuring networks efficiently.

📌 DNS Record Types Explained

Record Type Full Form Purpose
A Address Record Maps a domain to an IPv4 address.
AAAA IPv6 Address Record Maps a domain to an IPv6 address.
CNAME Canonical Name Alias of one domain to another (no IP).
MX Mail Exchange Specifies mail server for receiving emails.
TXT Text Holds human-readable notes, SPF, DKIM, DMARC records.
NS Name Server Specifies authoritative name servers for domain.
SOA Start of Authority Provides domain metadata: serial number, refresh, retry, etc.
PTR Pointer Used for reverse DNS lookups (IP → domain).
SRV Service Locator Specifies host and port for specific services.
CAA Certification Authority Authorization Specifies which CAs are allowed to issue certificates.
NAPTR Name Authority Pointer Used in conjunction with SRV records for VoIP, SIP, ENUM.
DNSKEY DNS Public Key Contains public keys used in DNSSEC.
DS Delegation Signer Used to secure delegation in DNSSEC.
RRSIG Resource Record Signature Cryptographic signature for DNSSEC data.
NSEC Next Secure Record Used in DNSSEC to prove a record does not exist.
NSEC3 Next Secure Record v3 Improved DNSSEC denial of existence.
TLSA Transport Layer Security Authentication Used with DANE to associate TLS certificates with domain names.
SPF Sender Policy Framework Defines authorized email servers. Deprecated in favor of TXT.
LOC Location Specifies geographical location of a host.
HINFO Host Information Specifies CPU and OS type of a host (rarely used).
RP Responsible Person Provides email address of the person responsible for the domain.
AFSDB AFS Database Specifies servers for AFS (Andrew File System).
X25 X.25 Address Maps domain to an X.25 address (obsolete).
ISDN ISDN Address Maps domain to an ISDN number (obsolete).
KEY Key Record Used for cryptographic keys in DNSSEC (deprecated).
SIG Signature Record Used to store digital signatures in DNSSEC (deprecated in favor of RRSIG).

Note: Not all record types are commonly used. DNSSEC-related records (like DNSKEY, DS, RRSIG) are crucial for securing DNS. Legacy types like X25 and ISDN are mostly obsolete today.

Nutshell Series

📡 Ultimate Guide to Standard Port Numbers and IP Address Ranges

In today’s digital landscape, ports and IP addresses form the backbone of all network communication. Whether you’re configuring a server, firewall, or cloud resource, understanding standard ports and IP ranges is essential.


🔢 Port Number Ranges

Range Description Port Numbers
Well-known ports Assigned to core services (HTTP, DNS, etc.) 0 – 1023
Registered ports Assigned to specific apps/services 1024 – 49151
Dynamic/Ephemeral ports Used for temporary communications 49152 – 65535

🌐 Common TCP/UDP Ports

Port Protocol Service
20 TCP FTP Data Transfer
21 TCP FTP Control
22 TCP SSH
23 TCP Telnet
25 TCP SMTP
53 TCP/UDP DNS
67 UDP DHCP Server
68 UDP DHCP Client
69 UDP TFTP
80 TCP HTTP
110 TCP POP3
119 TCP NNTP
123 UDP NTP
135 TCP/UDP Microsoft RPC
137–139 TCP/UDP NetBIOS
143 TCP IMAP
161 UDP SNMP
162 UDP SNMP Trap
179 TCP BGP
389 TCP/UDP LDAP
443 TCP HTTPS
445 TCP SMB
465 TCP SMTPS
500 UDP IPsec IKE
514 UDP Syslog
515 TCP LPD
587 TCP SMTP (Auth)
631 TCP/UDP IPP
636 TCP LDAPS
873 TCP rsync
993 TCP IMAPS
995 TCP POP3S
1080 TCP SOCKS Proxy
1433 TCP Microsoft SQL Server
1434 UDP SQL Server Browser
1521 TCP Oracle DB
1701 UDP L2TP VPN
1812 UDP RADIUS Auth
1813 UDP RADIUS Accounting
1883 TCP MQTT
2049 TCP/UDP NFS
2375 TCP Docker (non-TLS)
2376 TCP Docker (TLS)
3306 TCP MySQL
3389 TCP RDP
3690 TCP Subversion
4369 TCP Erlang Port Mapper
5000 TCP Flask / Docker Registry
5060 TCP/UDP SIP
5061 TCP SIP over TLS
5432 TCP PostgreSQL
5671 TCP AMQP over TLS
5672 TCP AMQP (RabbitMQ)
5900 TCP VNC
5985 TCP WinRM (HTTP)
5986 TCP WinRM (HTTPS)
6379 TCP Redis
8080 TCP HTTP Alternate
8443 TCP HTTPS Alternate
9000 TCP SonarQube / PHP-FPM
9090 TCP Prometheus
9200 TCP Elasticsearch (API)
9300 TCP Elasticsearch (Cluster)
11211 TCP/UDP Memcached
27017 TCP MongoDB

🌍 IP Address Ranges Explained

🔐 Private IP Ranges (RFC 1918)

Class Range CIDR IPs
A 10.0.0.0 – 10.255.255.255 10.0.0.0/8 16.7 million
B 172.16.0.0 – 172.31.255.255 172.16.0.0/12 1 million
C 192.168.0.0 – 192.168.255.255 192.168.0.0/16 65,536

🌐 Public IP Addresses

Any IP address not in the above private ranges is considered public and routable on the internet.

Example Public IPs:

  • 8.8.8.8 (Google DNS)
  • 1.1.1.1 (Cloudflare DNS)

📘 Quick Reference Table

Category Range or Example
Well-known Ports 0 – 1023
Registered Ports 1024 – 49151
Dynamic/Ephemeral 49152 – 65535
Private IP (Class A) 10.0.0.0 – 10.255.255.255
Private IP (Class B) 172.16.0.0 – 172.31.255.255
Private IP (Class C) 192.168.0.0 – 192.168.255.255
Public IPs Anything outside private ranges
Nutshell Series

🧩 Azure Load Balancing Services – Feature Comparison

Feature / Service Azure Load Balancer Application Gateway Azure Front Door Traffic Manager
OSI Layer Layer 4 (Transport) Layer 7 (Application) Layer 7 (Application) DNS-based (Layer 7 via DNS)
Scope Regional or Global Regional Global Global
Traffic Type TCP/UDP (non-HTTP/S) HTTP/HTTPS HTTP/HTTPS Any (via DNS redirection)
Protocol Awareness No content inspection URL path, host header, SSL termination URL path, host header, SSL termination, caching DNS-based routing only
Health Probes TCP/HTTP/HTTPS HTTP/HTTPS HTTP/HTTPS DNS endpoint monitoring
Session Affinity Source IP affinity Cookie-based Supported Not supported
Web Application Firewall
SSL Termination
Caching / CDN
Public/Private Support ✅ Both ✅ Both ✅ Public only ✅ Public only
Use Case Internal or external TCP/UDP balancing Secure web apps with custom routing Global web apps with low latency Geo-routing and DNS-based failover
Best For VM-level traffic, AKS, backend services Web apps needing WAF, SSL offload APIs, static content, multi-region apps Multi-region apps needing DNS balancing
Pricing Basic (free), Standard (paid) Standard_v2 / WAF_v2 Standard / Premium Based on DNS queries and monitoring
Nutshell Series

🧩 OSI Model Layers – Complete Overview

Layer Function Key Protocols & Examples
Application (7) Closest to the user; provides network services and interfaces for applications HTTP, FTP, DNS, SMTP, SNMP
Presentation (6) Translates, encrypts, compresses data; ensures machine-independent data formatting SSL/TLS, JPEG, MPEG, ASCII, EBCDIC
Session (5) Manages sessions or connections between applications; handles authentication and synchronization NetBIOS, RPC, PPTP, SAP, SDP
Transport (4) Provides reliable or unreliable data transport with error recovery and flow control TCP, UDP, SCTP, SPX
Network (3) Handles logical addressing and routing between different networks IP (IPv4/IPv6), ICMP, IGMP, IPsec
Data Link (2) Ensures reliable transfer across physical link; handles MAC addressing and framing Ethernet, PPP, ARP, MAC, HDLC, Frame Relay
Physical (1) Transmits raw bitstreams over physical media; defines hardware specs and signal modulation Coaxial cable, RJ45, Fiber optics, Wi-Fi, Bluetooth, Hubs
Nutshell Series

☁️ Cloud Migration Strategies in a Nutshell


Thinking about moving to the cloud? There’s more than one way to get there. Each migration approach has its own pros, cons, and ideal use cases. In this post, we’ll break down six major cloud migration strategies that organizations use to transition smoothly and smartly.


🧱 1. Lift and Shift (Rehost)

Move it as-is. This strategy involves migrating your existing apps to the cloud without any code changes.

  • ✅ Fastest method
  • ✅ No code changes
  • ❌ Doesn’t leverage cloud-native benefits
  • Best for: Legacy apps or fast migrations

🛠️ 2. Replatform

Tweak a little. Make minor changes to use managed cloud services (like migrating from on-prem SQL Server to Azure SQL Database).

  • ✅ Better performance
  • ✅ Less maintenance
  • ❌ Still not fully cloud-native
  • Best for: Apps needing light optimization

🔁 3. Refactor (Re-architect)

Redesign for the cloud. This involves reworking app architecture to use microservices, containers, or serverless technologies.

  • ✅ Maximum scalability and cloud benefits
  • ✅ Future-proof architecture
  • ❌ Higher cost and complexity
  • Best for: Strategic modernization of core systems

🛍️ 4. Repurchase

Buy new (SaaS). Replace your existing app with a SaaS solution, like moving to Salesforce or Microsoft 365.

  • ✅ Low maintenance
  • ✅ Fastest implementation
  • ❌ Limited customizability
  • Best for: Standard tools like CRM, HR, or Email

🗑️ 5. Retire

Let it go. Identify and decommission apps that are no longer used or necessary.

  • ✅ Saves cost
  • ✅ Reduces system clutter
  • ❌ Risk of dependencies
  • Best for: Obsolete or duplicate applications

⏳ 6. Retain

Keep it on-prem for now. Retain certain applications that are not ready for the cloud due to business or technical constraints.

  • ✅ Safe for sensitive workloads
  • ❌ Misses out on cloud benefits
  • Best for: Apps with regulatory or latency concerns

📊 Quick Comparison Table

Strategy Code Change Speed Cloud Benefits Best For
Lift & Shift ❌ None 🟢 Fast 🔴 Low Legacy/Quick Wins
Replatform ⚠️ Minor 🟡 Medium 🟡 Partial Light Optimization
Refactor ✅ High 🔴 Slow 🟢 Full Strategic Modernization
Repurchase ❌ None 🟢 Fast 🟢 Full (SaaS) Commodity Tools
Retire ❌ N/A 🟢 Fast 🔴 N/A Unused Systems
Retain ❌ N/A N/A 🔴 None Critical On-Prem Apps
Nutshell Series

Containers vs. Virtual Machines: What’s the Difference?

In the world of virtualization and cloud computing, both containers and virtual machines (VMs) are widely used to run applications efficiently. While they share similarities, they have different architectures, benefits, and use cases. Let’s explore their differences to understand when to use each.

Understanding Containers and VMs

Containers: Lightweight & Agile

Containers provide application-level isolation, using the host operating system’s kernel. They are fast, scalable, and resource-efficient, ideal for microservices and cloud deployments.

Virtual Machines: Full OS Environments

VMs, on the other hand, provide full isolation by running a complete operating system inside a virtualized environment. They are great for strong security boundaries and running multiple OS types on the same hardware.

Comparison Table: Containers vs. Virtual Machines

Feature Virtual Machine (VM) Container
Isolation Provides strong isolation with its own OS kernel. Lightweight isolation, shares host OS kernel.
Operating System Runs a full OS, including the kernel. Runs only user-mode OS components.
Resource Usage Needs more CPU, memory, storage. Uses fewer system resources.
Guest Compatibility Can run any OS (Linux, Windows, etc.). Runs same OS version as the host.
Deployment Managed via Hyper-V, VMware, VirtualBox. Uses Docker, Kubernetes for deployment.
Updates & Upgrades Requires full OS upgrades & manual updates. Easily updated via image rebuild process.
Storage & Networking Uses virtual hard disks (VHDs), private networks. Uses shared storage, network isolation.
Fault Tolerance VM failover restarts the OS on a new server. Containers are recreated instantly by an orchestrator.
Load Balancing Moves VMs to balance workloads. Orchestrators scale containers dynamically.

Which One Should You Use?

Both containers and VMs complement each other. Containers are best for modern, cloud-native applications, while VMs provide stronger security and OS flexibility. In fact, many container deployments run on VMs for enhanced scalability!

Which solution fits your workload best? Containers, VMs, or both? Let’s discuss in the comments! 🚀