DEV Community

Cover image for A Practical Guide to Securing Azure Storage Accounts in Dev/Test (With Real-World Context)
Mahmud Seidu Babatunde
Mahmud Seidu Babatunde

Posted on

A Practical Guide to Securing Azure Storage Accounts in Dev/Test (With Real-World Context)

Introduction: Behind Every Streamed Movie and Processed Payment Is Secure Cloud Storage.

When you stream a movie on Netflix, process a payment with Flutterwave, or order a product on Jumia, you rarely think about storage.

You just expect it to work.

Your payment confirmation appears instantly.
Your playlist loads without delay.
Your order history is always available.

But behind that simplicity is something quiet and critical:

Cloud storage: deliberately configured.

Companies like Netflix, Shopify, Spotify, Flutterwave, Paystack, Jumia, and digital banking platforms across Africa rely heavily on distributed cloud storage systems to:

  • Store application data
  • Maintain financial transaction records
  • Preserve logs and audit trails
  • Scale across regions
  • Enforce encryption and compliance standards

And here’s what matters:

Their storage systems are not secure by accident.

They are configured intentionally.

A single misconfigured storage account can expose sensitive data.
A legacy TLS setting can weaken encrypted communication.
An overly permissive network rule can expand an attack surface.

Security in cloud environments lives in the configuration details.

As part of my Azure storage implementation practice, I provisioned and hardened a storage account designed for a non-production workload.

The objective was simple:

Maintain cost efficiency while enforcing real-world security discipline.

This walkthrough documents not just the steps I took, but the reasoning behind each configuration decision and how those decisions translate into real systems.

Objective

In this implementation, I aimed to:

  • Provision a secure Azure Storage account
  • Apply cost-efficient redundancy
  • Enforce modern encryption standards
  • Reduce authentication risk
  • Configure network exposure intentionally

The workload in this case was non-business critical. High availability across regions was not required. Cost optimization was important but not at the expense of security fundamentals.

1️⃣ Creating the Resource Group

I began by creating a dedicated resource group to logically isolate the storage resources.

In the Azure portal, search for and select Resource groups

Azure portal showing Resource Groups search result

Select + Create.

Azure Resource Groups page with + Create button highlighted

Give your resource group a name. For example, storagerg.

Azure Create Resource Group page with name field filled

Select a region. Use this region throughout the project.

Azure region selection dropdown during resource group creation

Select Review and create to validate the resource group.

Azure Review and create page before deployment

Select Create to deploy the resource group.

Azure deployment in progress for resource group creation

2️⃣ Deploying the Storage Account

Next, I created the storage account.

In the Azure portal, search for and select Storage accounts.

Azure portal search results showing Storage accounts option

Select + Create.

Storage accounts page with + Create button selected

On the Basics tab, select your Resource group.

Basics tab showing Resource Group selection for storage account

Provide a Storage account name. The storage account name must be unique in Azure.

Storage account name field filled during creation

Set the Performance to Standard.

Performance option set to Standard in storage account configuration

Why Standard?

For non-production workloads, Standard performance provides cost efficiency while maintaining reliability.

Large-scale platforms like Netflix or Shopify may require Premium storage for specific high-throughput workloads. But dev/test environments rarely demand that level of performance.

Choosing the right tier is about aligning cost with workload sensitivity.

Select Review,

Review tab before creating storage account

and then Create.

Create button selected to deploy storage account

Wait for the storage account to deploy and then Go to resource.

Storage account deployment completed with Go to resource button

3️⃣ Configure simple settings in the storage account.

The data in this storage account doesn’t require high availability or durability. A lowest cost storage solution is desired.

In your storage account, in the Data management section, select the Redundancy blade.

Storage account Data management section with Redundancy selected

Select Locally-redundant storage (LRS) in the Redundancy drop-down.

Redundancy dropdown with Locally-redundant storage LRS selected

Locally-redundant storage (LRS)

Redundancy configuration showing LRS selected

Why LRS?

  • Replicates data three times within a single datacenter
  • Lowest-cost redundancy model
  • Suitable for development and testing environments

In fintech platforms or e-commerce systems operating across regions, geo-redundancy is critical for disaster recovery.

However, resilience must match workload importance.

I saved the changes to apply the configuration.

Save button after changing redundancy settings

Refresh the page and notice the content only exists in the primary location.

Storage account overview showing primary region after LRS configuration

The storage account should only accept requests from secure connections.

In the Settings section, select the Configuration blade.

Settings section with Configuration blade selected

4️⃣ Ensure Secure transfer required is Enabled (HTTPS Only).

Secure transfer required set to Enabled HTTPS only

Financial platforms like Flutterwave and Paystack process sensitive transaction data daily. HTTPS-only communication prevents insecure requests and protects data from interception.

Security discipline should not depend on environment type.

5️⃣ Enforcing Minimum TLS Version 1.2

In the Settings section, select the Configuration blade.

Settings Configuration blade open for TLS configuration

Ensure the Minimal TLS version is set to Version 1.2.

Minimum TLS version set to 1.2 in configuration settings

Allowing outdated TLS versions increases exposure to protocol-based vulnerabilities.

Modern systems enforce current encryption standards by default.

6️⃣ Until the storage is needed again, disable requests to the storage account.

In the Settings section, select the Configuration blade.

Settings Configuration blade selected before disabling shared key access

Ensure Allow storage account key access is Disabled.

Allow storage account key access set to Disabled

Why Disable Shared Keys?

Shared keys:

  • Are long-lived
  • Harder to audit
  • Increase risk if exposed

Modern cloud environments prefer identity-based access control using RBAC and managed identities.

In fintech and enterprise systems, auditability and least-privilege access are critical.

Be sure to save your changes.

Save button selected after disabling shared key access

7️⃣ Ensure the storage account allows public access from all networks.

In the Security + networking section, select the Networking blade.

Security plus networking section with Networking blade selected

Ensure Public network access is set to Enabled from all networks.

Public network access set to Enabled from all networks

In production systems — such as banking platforms or telecom environments — public exposure would typically be restricted using private endpoints and firewall rules.

Network access decisions must always reflect workload sensitivity.

Be sure to Save your changes.

Save button selected after configuring networking settings

Real-World Perspective

Cloud infrastructure powers platforms used daily across Nigeria, Africa, and globally.

Behind every processed payment, streamed video, or online transaction is storage configured with intention.

This implementation focused on a non-production workload, but the principles applied here mirror the same foundational decisions made in production environments.

Security is not dramatic.

It is deliberate.

Final Thoughts

Creating a storage account is easy.

Configuring it responsibly is what defines engineering maturity.

Even in dev/test environments:

  • Encryption should be enforced
  • Legacy authentication should be minimized
  • Redundancy should be intentional
  • Network exposure should be deliberate

Behind every reliable digital experience is infrastructure configured carefully.

Mastering these fundamentals is how a strong cloud engineering discipline is built.

Top comments (0)