Hybrid Disconnected Pattern¶
Introduction¶
The hybrid disconnected pattern represents the most constrained deployment model on the Azure Hybrid Continuum — environments with no connectivity to Azure, either by regulatory mandate (air-gapped security requirements) or operational necessity (remote locations, military operations, maritime deployments, classified networks). This pattern demands complete operational autonomy, requiring local alternatives for every cloud service, local identity infrastructure, and self-contained monitoring and management.
Organizations operating in defense, intelligence, critical infrastructure, and highly regulated industries often face requirements that prohibit any external network connectivity. The disconnected pattern enables these organizations to adopt modern cloud-native application architectures while meeting zero-trust and air-gap requirements.
Pattern Summary
Deployment Model: Fully on-premises with no cloud connectivity
Connectivity: Air-gapped or intentionally disconnected
Management Plane: Local management tools only
Identity: On-premises Active Directory Domain Services (AD DS), ADFS
Target Use Cases: Classified networks, critical infrastructure, remote/maritime operations
Pattern Definition¶
Hybrid disconnected architecture eliminates all dependencies on Azure or external services:
- No network connectivity: Zero packets leave the environment (air-gapped by network design or policy)
- Local management: All operations, monitoring, and updates performed locally
- Self-hosted services: Every Azure PaaS service replaced with self-hosted alternatives
- Local identity: Active Directory Domain Services (AD DS) without cloud synchronization
- Offline updates: Software updates and patches delivered via physical media or secure one-way transfers
This pattern sacrifices the convenience of cloud management for absolute control and data sovereignty. Every capability present in cloud-native or hybrid connected patterns must be replicated locally using open-source or commercial software.
🔗 Working Example: Contoso Insurance Sample Application
See the complete working implementation of this architecture at ContosoInsurances-NativeToLocal — a .NET 8 enterprise application demonstrating fully disconnected, air-gapped deployment. Explore the local-disconnected branch to see how every Azure dependency is replaced with local alternatives: Prometheus/Grafana for monitoring, a local container registry, and on-premises identity.
When to Use Hybrid Disconnected¶
The hybrid disconnected pattern is mandatory when:
✅ Air-gapped security required: Classified networks (Top Secret, Secret), weapons systems, nuclear facilities
✅ Regulatory prohibition: Laws explicitly prohibit cloud connectivity (some national security contexts)
✅ Zero-trust environments: Threat model assumes adversarial cloud providers
✅ Remote operations: Ships, submarines, aircraft, Antarctic research stations, offshore oil platforms
✅ Critical infrastructure: Power grids, water treatment, emergency services where internet outages cannot be tolerated
Hybrid disconnected is not suitable when:
❌ Cloud-based management is desired (use hybrid connected instead)
❌ Global distribution or multi-region deployment is required
❌ Operational teams lack expertise to manage full infrastructure stack
❌ Budget constraints prevent investment in on-premises hardware and redundancy
Reference Architecture¶
graph TB
subgraph AirGap["Air-Gapped / Disconnected Environment"]
subgraph Users["User Access"]
AdminUsers[Admin Workstations]
AppUsers[Application Users]
end
subgraph Identity["Identity & Access Management"]
ADDS[Active Directory DS<br/>Domain Controllers]
ADFS[AD FS<br/>Federation Services]
FreeIPA[FreeIPA<br/>Linux Identity]
Keycloak[Keycloak<br/>OAuth2/OIDC]
end
subgraph Compute["Compute Platform"]
K3s[K3s / RKE2<br/>Kubernetes Cluster]
subgraph Apps["Application Services"]
AuthSvc[Auth Service]
APIGw[API Gateway]
AppSvc1[Business App 1]
AppSvc2[Business App 2]
end
end
subgraph Data["Data Services"]
Postgres[(PostgreSQL<br/>Primary DB)]
PostgresReplica[(PostgreSQL<br/>Replica)]
Redis[(Redis<br/>Cache)]
MinIO[MinIO<br/>S3-Compatible Storage]
end
subgraph Messaging["Messaging & Events"]
RabbitMQ[RabbitMQ<br/>Message Broker]
Kafka[Apache Kafka<br/>Event Streaming]
end
subgraph Security["Security Services"]
Vault[HashiCorp Vault<br/>Secrets Management]
PKI[Local PKI/CA<br/>Certificate Authority]
SIEM[Local SIEM<br/>Security Monitoring]
end
subgraph Monitoring["Observability Stack"]
Prometheus[Prometheus<br/>Metrics]
Grafana[Grafana<br/>Dashboards]
Loki[Loki<br/>Log Aggregation]
Jaeger[Jaeger<br/>Distributed Tracing]
end
subgraph Network["Network Infrastructure"]
FW[Firewall<br/>Segmentation]
LB[Load Balancer<br/>HAProxy/NGINX]
DNS[Local DNS<br/>BIND/CoreDNS]
end
subgraph Backup["Backup & DR"]
LocalBackup[Veeam/Velero<br/>Local Backup]
OffSite[Tape/Disk Rotation<br/>Off-Site Storage]
end
subgraph Registry["Container & Artifacts"]
Harbor[Harbor Registry<br/>Container Images]
Nexus[Nexus Repository<br/>Artifacts/Packages]
end
end
subgraph External["Isolated Transfer Zone"]
SecureMedia[Secure Media Transfer<br/>Air-Gap Data Diode]
Updates[Updates & Patches<br/>Manual Transfer]
end
%% User Access
AdminUsers --> ADDS
AppUsers --> LB
LB --> APIGw
%% Kubernetes Apps
K3s --> Apps
APIGw --> AppSvc1 & AppSvc2
AuthSvc --> Keycloak
Apps --> Harbor
%% Identity Flow
ADDS --> Keycloak
FreeIPA --> K3s
ADDS --> ADFS
ADFS --> AuthSvc
%% Data Access
Apps --> Postgres
Apps --> Redis
Apps --> MinIO
Postgres -.->|Replication| PostgresReplica
%% Messaging
AppSvc1 & AppSvc2 --> RabbitMQ
AppSvc1 --> Kafka
%% Security
Apps --> Vault
Vault --> PKI
FW --> K3s
K3s & Apps --> SIEM
%% Monitoring
K3s & Apps & Postgres & Redis --> Prometheus
Prometheus --> Grafana
Apps --> Loki
Apps --> Jaeger
%% Network
DNS --> K3s & Apps
LB --> K3s
%% Backup
K3s & Postgres & MinIO --> LocalBackup
LocalBackup -.->|Physical Transfer| OffSite
%% External Updates
SecureMedia -.->|One-Way Transfer| Harbor & Nexus
Updates -.->|Manual Process| Harbor & Nexus
style AirGap fill:#505050,stroke:#ffb900,stroke-width:4px,color:#fff
style Identity fill:#b4a0ff,stroke:#5e5e5e,stroke-width:2px
style Compute fill:#00bcf2,stroke:#0078d4,stroke-width:2px
style Data fill:#ffb900,stroke:#d83b01,stroke-width:2px
style Messaging fill:#7fba00,stroke:#107c10,stroke-width:2px
style Security fill:#e74856,stroke:#a80000,stroke-width:2px
style Monitoring fill:#00b7c3,stroke:#005b70,stroke-width:2px
style External fill:#d83b01,stroke:#a80000,stroke-width:3px,stroke-dasharray: 5 5 Reference Architecture Components¶
Compute Services¶
| Component | Description | Use Case |
|---|---|---|
| Azure Stack Hub | Microsoft's disconnected-capable Azure-consistent platform | Environments requiring Azure API compatibility |
| Azure Local (disconnected mode) | Hyperconverged infrastructure for VMs and containers | VM workloads, private cloud IaaS |
| K3s | Lightweight Kubernetes (certified, CNCF) | Edge and air-gapped Kubernetes clusters |
| RKE2 | Rancher Kubernetes Engine v2 (security-hardened) | FIPS 140-2 compliance, government use cases |
| OpenShift | Enterprise Kubernetes with full lifecycle management | Large enterprises requiring commercial support |
Kubernetes for Disconnected Environments
For air-gapped Kubernetes:
- K3s: Minimal dependencies, single binary (~70MB), fast startup, excellent for edge
- RKE2: Security-focused, FIPS-compliant, CIS Kubernetes Benchmark hardened
- OpenShift: Enterprise platform with built-in registry, logging, monitoring
Data Services¶
| Component | Description | Use Case |
|---|---|---|
| SQL Server | Microsoft's relational database (Standard/Enterprise) | Transactional workloads, ERP, LOB applications |
| PostgreSQL | Open-source relational database | ACID compliance, JSON support, extensibility |
| MySQL / MariaDB | Open-source relational databases | Web applications, content management systems |
| MongoDB | Document database with replication | User profiles, catalogs, session stores |
| Redis | In-memory cache and data structure store | Caching, session state, real-time leaderboards |
| MinIO | S3-compatible object storage | Unstructured data, backups, media files |
| Ceph | Distributed storage platform (block, file, object) | Large-scale storage with replication |
Messaging and Integration¶
| Component | Description | Use Case |
|---|---|---|
| RabbitMQ | AMQP message broker with high availability | Microservices messaging, work queues |
| Apache Kafka | Distributed event streaming platform | Event sourcing, log aggregation, real-time analytics |
| NATS | Lightweight, high-performance messaging | IoT telemetry, edge-to-core messaging |
| Redis Streams | Append-only log structure in Redis | Simple event streams without Kafka complexity |
| Apache Pulsar | Multi-tenant messaging with geo-replication | Large-scale messaging with guaranteed ordering |
Identity and Security¶
| Component | Description | Use Case |
|---|---|---|
| Active Directory Domain Services (AD DS) | On-premises directory service | Windows domain authentication, group policy |
| Active Directory Federation Services (ADFS) | Claims-based authentication and SSO | Web application authentication, SAML/OAuth |
| FreeIPA | Open-source identity management for Linux | Linux authentication, Kerberos, DNS, CA |
| OpenLDAP | Open-source LDAP directory | Lightweight directory for user/group management |
| Keycloak | Open-source identity and access management | OAuth2/OIDC provider, social login, SAML |
| HashiCorp Vault | Secrets management and encryption | API keys, database credentials, certificate issuance |
Monitoring and Observability¶
| Component | Description | Use Case |
|---|---|---|
| Prometheus | Time-series metrics database and monitoring | Infrastructure and application metrics |
| Grafana | Visualization and dashboarding | Metrics dashboards, alerting, exploration |
| Loki | Log aggregation system (Prometheus-inspired) | Application and infrastructure logs |
| Elasticsearch + Kibana (ELK) | Log search and analytics platform | Full-text log search, security log analysis |
| Jaeger | Distributed tracing system | Microservices request tracing, performance debugging |
| Thanos | Highly available Prometheus with long-term storage | Multi-cluster Prometheus federation |
Container Registry¶
| Component | Description | Use Case |
|---|---|---|
| Harbor | CNCF container registry with security scanning | Private registry with vulnerability scanning, signing |
| Docker Registry | Official Docker container registry | Simple private registry without advanced features |
| Artifactory | Universal artifact repository (commercial) | Containers, packages, binaries with enterprise features |
Continuous Integration / Continuous Deployment¶
| Component | Description | Use Case |
|---|---|---|
| GitLab CE | Self-hosted Git with integrated CI/CD | Source control, CI/CD pipelines, artifact storage |
| Gitea | Lightweight self-hosted Git service | Minimal-resource Git hosting |
| Jenkins | Automation server for CI/CD pipelines | Flexible CI/CD with extensive plugin ecosystem |
| Argo CD | GitOps continuous delivery for Kubernetes | Declarative Kubernetes app deployment |
| Flux | GitOps toolkit for Kubernetes | Automated Kubernetes deployment from Git |
Mapping Azure PaaS to Self-Hosted Alternatives¶
This table provides a comprehensive mapping from Azure PaaS services to disconnected alternatives:
| Azure Service | Disconnected Alternative | Notes |
|---|---|---|
| Azure Kubernetes Service (AKS) | K3s, RKE2, OpenShift | Use K3s for small/edge, RKE2 for security, OpenShift for enterprise |
| Azure Container Registry | Harbor, Docker Registry | Harbor adds security scanning and replication |
| Azure SQL Database | SQL Server (self-managed) | Requires licensing, patching, high availability setup |
| Azure Cosmos DB | MongoDB, Cassandra | Document model: MongoDB. Wide-column: Cassandra |
| Azure Cache for Redis | Redis (self-managed) | Deploy with Redis Sentinel for HA |
| Azure Blob Storage | MinIO, Ceph | MinIO for S3 API compatibility, Ceph for scale |
| Azure Service Bus | RabbitMQ, Apache Kafka | RabbitMQ for queues/topics, Kafka for event streaming |
| Azure Event Hubs | Apache Kafka, Apache Pulsar | Kafka is the de facto standard |
| Azure Functions | OpenFaaS, Knative, Kubeless | Serverless on Kubernetes |
| Azure Key Vault | HashiCorp Vault | Secrets, encryption keys, dynamic credentials |
| Azure Monitor | Prometheus + Grafana | Metrics monitoring and visualization |
| Azure Log Analytics | Elasticsearch + Kibana, Loki | ELK for advanced search, Loki for lightweight logs |
| Application Insights | Jaeger, Zipkin | Distributed tracing for microservices |
| Azure AD (Entra ID) | AD DS + ADFS, Keycloak | Keycloak for modern OAuth2/OIDC |
| Azure API Management | Kong, Tyk, KrakenD | API gateway with rate limiting, auth, analytics |
| Azure DevOps | GitLab CE, Jenkins + Gitea | GitLab offers integrated experience |
| Azure Backup | Veeam, Rubrik, Velero (K8s) | Velero for Kubernetes backup, Veeam for VMs |
Operational Complexity
Replacing managed PaaS services with self-hosted alternatives dramatically increases operational burden:
- Patching and updates must be performed manually
- High availability requires manual clustering configuration
- Security hardening is the operator's responsibility
- Capacity planning and scaling are manual processes
For detailed mapping, see Appendix: PaaS-to-Self-Hosted Service Mapping.
Operations in Disconnected Mode¶
Patch Management and Updates¶
Challenge: No internet connectivity for automatic updates.
Solution:
- Staging environment: Maintain a connected staging environment that mirrors production
- Download updates: Download OS patches, application updates, container images in staging
- Transfer media: Copy updates to encrypted USB drives or other secure media
- Import to disconnected environment: Transfer media through security screening
- Test and deploy: Apply updates in disconnected staging, then production
Air-Gapped Update Workflow
1. Connected Staging: Download RHEL security patches (Thursday)
2. Burn to encrypted DVD, log checksums (Friday)
3. Physical transfer via courier with chain of custody (Monday)
4. Import to disconnected staging, verify checksums (Tuesday)
5. Test patches in disconnected staging (Wednesday-Thursday)
6. Apply to disconnected production during maintenance window (Friday night)
Container Image Distribution¶
For Kubernetes workloads, container images must be pre-loaded into a local registry:
- Build images in connected environment
- Export images using
docker saveorskopeo copy - Transfer via secure media (encrypted USB, DVD, secure file transfer)
- Import to Harbor registry in disconnected environment
- Deploy to Kubernetes using local registry URL
Tool: Use skopeo for efficient image transfer:
# In connected environment
skopeo copy docker://nginx:1.25 oci-archive:nginx-1.25.tar
# Transfer nginx-1.25.tar to disconnected environment
# In disconnected environment
skopeo copy oci-archive:nginx-1.25.tar docker://harbor.local/library/nginx:1.25
Certificate Management¶
Without cloud-based certificate authorities, disconnected environments require local PKI:
- Microsoft Certificate Services: For Windows-based environments
- OpenSSL + custom CA: For Linux-based environments
- HashiCorp Vault PKI: For automated certificate issuance and rotation
- CFSSL: CloudFlare's PKI toolkit for certificate management
Best Practice: Establish a two-tier CA hierarchy:
- Root CA: Offline, air-gapped, used only to sign intermediate CAs
- Issuing CA: Online within the environment, issues certificates to services
Monitoring and Alerting¶
Deploy a full local monitoring stack:
Metrics: Prometheus scrapes metrics from all services and infrastructure, stores locally with retention policy (90 days typical). Grafana provides dashboards and alerting.
Logs: Loki or ELK stack aggregates logs from all nodes. Use Fluentd or Filebeat as log shippers.
Traces: Jaeger collects distributed traces from microservices, provides root cause analysis.
Alerting: Prometheus Alertmanager or Grafana sends alerts via local email server or SMS gateway.
Prometheus Federation
For multi-cluster environments, use Prometheus federation or Thanos to aggregate metrics from multiple disconnected sites into a central monitoring cluster.
Backup and Disaster Recovery¶
Without Azure Backup or Azure Site Recovery:
- VM Backup: Use Veeam, Rubrik, or native hypervisor snapshots
- Kubernetes Backup: Use Velero to backup Kubernetes resources and persistent volumes
- Database Backup: Scheduled dumps to local storage, replicated to secondary site
- Off-site backup: Physical tape or disk rotation to geographically separate location
Best Practice: Follow 3-2-1 rule: 3 copies, 2 different media types, 1 off-site.
Security Operations¶
Without cloud-based threat intelligence:
- SIEM: Deploy local SIEM (Splunk, ELK with Sigma rules) for security log analysis
- Endpoint protection: Use locally managed antivirus (Microsoft Defender ATP on-premises mode, CrowdStrike)
- Intrusion detection: Deploy Snort, Suricata, or Zeek for network traffic analysis
- Threat intelligence: Manually import threat feeds via secure media transfer
Kubernetes in Air-Gapped Environments¶
Choosing a Distribution¶
| Distribution | Best For | Key Features |
|---|---|---|
| K3s | Edge, small clusters | Single binary, minimal dependencies, fast startup |
| RKE2 | Security-focused, government | FIPS 140-2, CIS Benchmark, SELinux support |
| OpenShift | Enterprise, large scale | Integrated registry, logging, monitoring, commercial support |
| Rancher | Multi-cluster management | Centralized management for multiple K3s/RKE2 clusters |
Air-Gap Installation Process¶
K3s Air-Gapped Installation:
- Download K3s binary and air-gap images tarball in connected environment
- Transfer to disconnected environment via secure media
- Install K3s with
--airgap-installflag, pointing to local image archive - K3s runs entirely from local images, no internet access required
# In connected environment
curl -sfL https://get.k3s.io | INSTALL_K3S_SKIP_START=true sh -
k3s-airgap-images-amd64.tar.gz # Download from GitHub releases
# Transfer files to disconnected environment
# In disconnected environment
sudo mkdir -p /var/lib/rancher/k3s/agent/images/
sudo cp k3s-airgap-images-amd64.tar.gz /var/lib/rancher/k3s/agent/images/
sudo ./install-k3s.sh
OpenShift Disconnected Installation:
OpenShift supports disconnected installation via a local mirror registry. The process involves:
- Create a local container registry (Harbor or OpenShift Registry)
- Use
oc-mirrortool to sync OpenShift release images to local registry - Install OpenShift pointing to the local mirror
Deploying Applications to Air-Gapped Kubernetes¶
Helm Charts:
- Download Helm chart in connected environment:
helm pull <chart> - Transfer chart
.tgzfile to disconnected environment - Update
values.yamlto reference local container registry - Install:
helm install -f values.yaml <chart>.tgz
GitOps (Argo CD / Flux):
- Host Git repository locally (Gitea or GitLab CE)
- Configure Argo CD or Flux to watch local Git repository
- Push manifests to local Git, Argo CD/Flux deploys automatically
Identity Management in Disconnected Environments¶
Active Directory Domain Services (AD DS)¶
AD DS remains the identity backbone for disconnected Windows environments:
- Domain controllers: Deploy at least 2 DCs for redundancy
- Sites and Services: Configure AD sites to optimize replication
- Group Policy: Centralized configuration management for Windows clients and servers
- DNS integration: AD DNS for service discovery
Linux Identity: FreeIPA¶
FreeIPA provides integrated identity and authentication for Linux:
- Kerberos: Single sign-on for Linux services
- LDAP: Centralized user and group directory
- DNS: Integrated DNS for service discovery
- Certificate Authority: Built-in CA for issuing certificates
Modern Authentication: Keycloak¶
For cloud-native applications requiring OAuth2 / OIDC:
- Deploy Keycloak in HA mode (clustered, backed by PostgreSQL)
- Integrate with AD DS via LDAP user federation
- Configure realms and clients for each application
- OIDC / SAML support for modern and legacy applications
Disconnected Identity Architecture
- Windows Servers/Clients: Authenticate to AD DS domain controllers
- Linux Servers: Authenticate to FreeIPA via SSSD
- Kubernetes: Use OIDC authentication via Keycloak
- Web Applications: OAuth2 via Keycloak, federated to AD DS
Network Architecture for Disconnected Environments¶
Segmentation¶
Apply defense-in-depth with network segmentation:
- DMZ: External-facing services (if any external access allowed)
- Application tier: Web servers, application servers
- Database tier: Databases, message brokers
- Management network: Jump boxes, monitoring, logging
Internal DNS¶
Deploy authoritative DNS servers for internal name resolution:
- AD DNS for Windows-centric environments
- FreeIPA DNS for Linux-centric environments
- CoreDNS for Kubernetes cluster DNS
Time Synchronization¶
Without internet NTP servers, deploy local NTP infrastructure:
- Stratum 1 server: GPS-based time source (hardware GPS receiver)
- Stratum 2 servers: Sync from Stratum 1, serve clients
Accurate time synchronization is critical for:
- Kerberos authentication (clock skew tolerance: 5 minutes)
- Log correlation across services
- Certificate validity checks
Preparing for Reconnection (Intermittent Connectivity)¶
Some environments operate in intermittent disconnected mode — normally air-gapped, but occasionally connected for data synchronization or updates:
Sync Patterns¶
One-Way Sync (Inbound): - Download updates, patches, container images from cloud during connection window - Import to local environment when disconnected
One-Way Sync (Outbound): - Collect logs, metrics, backup data while disconnected - Upload to cloud during connection window for analysis
Bidirectional Sync: - Git repository synchronization (pull changes, push commits) - Database replication (careful conflict resolution required)
Tools: - Rsync for file synchronization - Git for source code synchronization - Database replication (PostgreSQL logical replication, SQL Server Always On)
Automated Reconnection Procedures¶
When connectivity is restored:
- Verify connection: Check certificate validity, test Azure endpoints
- Sync time: Ensure NTP synchronization
- Pull updates: Download OS patches, container images, threat intelligence
- Push telemetry: Upload aggregated logs and metrics for analysis
- Backup to cloud: Replicate critical data to Azure for disaster recovery
- Disconnect: Return to air-gapped state
Security During Reconnection
Connection windows introduce risk. Apply strict controls:
- Use dedicated "sync" network segment, isolated from production
- Require multi-factor authentication for connection approval
- Scan all incoming data for malware before importing to air-gapped network
- Audit all data transfers with signed logs
Security Considerations¶
Threat Model Differences¶
Disconnected environments face different threats than cloud-connected:
- Insider threats: Without cloud monitoring, detection relies on local SIEM
- Physical security: Physical access to servers becomes critical attack vector
- Supply chain: All hardware, software, and media must be verified for tampering
- Stale patches: Slower update cadence increases vulnerability window
Compensating Controls¶
Without cloud-based threat intelligence and automated response:
- Enhanced logging: Comprehensive logs of all authentication and authorization events
- File integrity monitoring: Detect unauthorized changes to system files
- Network segmentation: Limit blast radius of compromised systems
- Least privilege: Strictly enforce principle of least privilege for all accounts
- Security awareness: Train personnel on insider threat indicators
Incident Response¶
Disconnected incident response requires:
- Local forensics capability: Tools and trained personnel on-site
- Incident playbooks: Pre-defined procedures for common scenarios
- Evidence preservation: Chain of custody procedures for forensic data
- Communication plans: Out-of-band communication (phone, in-person) during incidents
Challenges and Trade-Offs¶
Operational Complexity¶
Self-managing the entire infrastructure stack requires:
- Deep expertise: Database administration, Kubernetes operations, networking, security
- Large operations team: 24/7 coverage for critical systems
- Slower innovation: Vetting and importing new technologies is time-consuming
Cost Structure¶
- High CapEx: Significant upfront investment in hardware, software licenses
- Redundancy requirements: Must provision for peak capacity (no elastic scaling)
- Slow depreciation: Hardware lifecycle is 3-5 years, cannot scale down during low usage
Disaster Recovery¶
- Geographic distribution: Requires physically separate datacenters
- Data replication: Must build custom replication solutions
- Recovery time: Longer RTO/RPO than cloud-based solutions
References¶
- Azure Stack Hub Disconnected Deployment
- K3s — Lightweight Kubernetes
- RKE2 Documentation
- Harbor Container Registry
- Prometheus Monitoring
- HashiCorp Vault
- OpenShift Disconnected Installation
- FreeIPA Identity Management
Next: Cloud Exit Pattern →
Next: Cloud Exit Pattern →