Skip to main content
INS // Insights

Agile Cloud Sub Delivery for Government IT

Updated May 2026 · 7 min read

Federal cloud workloads are increasingly microservices-based — decoupled services, independent deployment, horizontal scaling. But the distributed nature of microservices creates attack surface that traditional perimeter security doesn't address: service-to-service communication, lateral movement risk, and secrets sprawl across dozens of deployment units.

NIST SP 800-204 (Security Strategies for Microservices-based Application Systems) provides the policy framework. Here's how to implement it.

Core Microservices Security Challenges in Federal Context

Service-to-service trust: In a traditional application, internal function calls are trusted by default. In microservices, each service communicates over the network — without mutual authentication, any compromised pod can impersonate a legitimate service.

Secrets management: Each microservice needs credentials (database passwords, API keys, certificates). Distributing secrets via environment variables or config files creates sprawl and rotation complexity.

API surface expansion: Every microservice exposes an API. In a 20-service application, that's 20+ attack surfaces, each potentially exposing different endpoints with varying authorization implementations.

Audit trail gaps: Tracing a request through multiple microservices to reconstruct an incident requires distributed tracing infrastructure — often absent in early federal cloud deployments.

Service Mesh and mTLS

A service mesh (Istio, Linkerd) provides mutual TLS (mTLS) between all service-to-service communications automatically, without application code changes:

# Istio: Enforce strict mTLS across entire mesh
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: default
  namespace: mission-services
spec:
  mtls:
    mode: STRICT  # No plaintext service-to-service communication
---
# Istio: Allow only specific services to communicate
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: telemetry-ingest-policy
  namespace: mission-services
spec:
  selector:
    matchLabels:
      app: telemetry-ingest
  action: ALLOW
  rules:
  - from:
    - source:
        principals:
        - "cluster.local/ns/mission-services/sa/data-processor"
    to:
    - operation:
        methods: ["POST"]
        paths: ["/v1/ingest/*"]

This AuthorizationPolicy allows only the data-processor service account to POST to the telemetry ingest service — all other callers are rejected at the sidecar level before reaching the application.

Secrets Management with Vault or AWS Secrets Manager

Never store secrets in environment variables or Kubernetes Secrets (which are base64, not encrypted by default). Use a secrets management platform:

import boto3
import json
from functools import lru_cache

@lru_cache(maxsize=None)
def get_secret(secret_name: str, region: str = 'us-gov-east-1') -> dict:
    """
    Retrieve secret from AWS Secrets Manager with caching.
    Use @lru_cache carefully — clear cache on secret rotation events.
    """
    client = boto3.client('secretsmanager', region_name=region)
    
    try:
        response = client.get_secret_value(SecretId=secret_name)
    except client.exceptions.ResourceNotFoundException:
        raise ValueError(f"Secret {secret_name} not found")
    
    if 'SecretString' in response:
        return json.loads(response['SecretString'])
    
    raise ValueError("Binary secrets not supported in this context")

# Usage: secrets loaded at startup, never in environment
db_config = get_secret('mission-app/database')
db_connection = create_db_connection(
    host=db_config['host'],
    password=db_config['password']
)

For Kubernetes-native environments, use the Secrets Store CSI Driver to mount secrets directly as volumes from AWS Secrets Manager or HashiCorp Vault:

apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: mission-app-secrets
  namespace: mission-services
spec:
  provider: aws
  parameters:
    objects: |
      - objectName: "mission-app/database"
        objectType: "secretsmanager"
        jmesPath:
          - path: "password"
            objectAlias: "db-password"

API Gateway Authorization Pattern

Every external-facing microservice API should route through an API gateway that handles authentication and coarse-grained authorization:

from fastapi import FastAPI, Depends, HTTPException, Security
from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
import jwt

app = FastAPI()
security = HTTPBearer()

def verify_dod_token(credentials: HTTPAuthorizationCredentials = Security(security)):
    """
    Verify DoD PKI-based JWT or CAC-derived token.
    In production, validate against PKI infrastructure.
    """
    try:
        payload = jwt.decode(
            credentials.credentials,
            key=get_public_key(),
            algorithms=["RS256"],
            audience="mission-service-api"
        )
        
        # Enforce clearance level claim
        if payload.get('clearance_level') not in ['SECRET', 'TOP_SECRET']:
            raise HTTPException(status_code=403, detail="Insufficient clearance")
        
        return payload
    except jwt.InvalidTokenError as e:
        raise HTTPException(status_code=401, detail=f"Invalid token: {e}")

@app.post("/v1/mission-data")
async def ingest_mission_data(payload: dict, user: dict = Depends(verify_dod_token)):
    # Process request with authenticated user context
    pass

See Rutagon's zero trust network access guide and cybersecurity ATO process for complementary security architecture guidance.

Explore Rutagon's cloud engineering capabilities.

FAQ

Is Istio approved for use in DoD cloud environments?

Istio has been used in various DoD cloud environments and appears in reference architectures from platform providers like Platform One (DoD's DevSecOps platform). However, approval depends on your specific authorization boundary — consult your ATO documentation and work with your AO to document Istio's inclusion in your system boundary and applicable STIG compliance status.

What is NIST 800-204 and how does it apply to federal microservices?

NIST SP 800-204 (Security Strategies for Microservices-based Application Systems) provides security recommendations specific to microservices architectures — covering API security, service mesh usage, container security, secrets management, and audit logging. It's not a compliance checklist but rather guidance that supports control implementation claims in NIST 800-53 SSPs.

Should federal microservices use mTLS even for internal cluster traffic?

Yes. Zero trust principles applied to federal environments require authentication for all service-to-service communication, even within a cluster. A compromised container within the cluster should not be able to freely call other services. Service mesh mTLS with AuthorizationPolicies provides this guarantee without requiring application code changes.

How do you handle secrets rotation in a microservices environment?

Use secrets management platforms (AWS Secrets Manager, Vault) that support automatic rotation. Microservices should retrieve secrets at startup and periodically refresh them using short TTLs — avoid caching secrets indefinitely. For database credentials, use dynamic secrets from Vault that issue short-lived, unique credentials per service instance.

What distributed tracing approach works best for federal microservices?

OpenTelemetry is the standard for federated tracing. Instrument services with the OpenTelemetry SDK, collect traces in a government-approved backend (Jaeger on GovCloud, or commercial SIEM integrations). Traces should be retained per your data retention policy and available for incident response. AWS X-Ray provides a managed option in AWS GovCloud.

Ready to discuss your project?

We deliver production-grade software for government, defense, and commercial clients. Let's talk about what you need.

Initiate Contact