Skip to main content

More Info:

Use Gke Sandbox To Restrict Untrusted Workloads As An Additional Layer Of Protection When Running In A Multi-Tenant Environment.

Risk Level

Medium

Address

Security

Compliance Standards

  • APRA CPS 234 (Australia)
  • BSI C5 (Germany)
  • Brazil LGPD
  • CCPA / CPRA (California)
  • CIS Critical Security Controls v8
  • CIS GKE
  • CMMC 2.0
  • CSA Cloud Controls Matrix v4
  • DPDPA
  • Digital Operational Resilience Act (EU)
  • Essential 8
  • ISO/IEC 27017
  • ISO/IEC 27018
  • ISO/IEC 27701
  • KSA PDPL
  • MAS Technology Risk Management (Singapore)
  • MITRE ATT&CK (Cloud)
  • NIS2 Directive
  • NIST SP 800-171
  • NYDFS 23 NYCRR 500
  • SWIFT Customer Security Controls Framework
  • Sarbanes-Oxley IT General Controls
  • UK NCSC Cyber Assessment Framework

Triage and Remediation

Remediation

Manual Steps

  1. Identify existing node pools and their sandbox configuration
    • Run on: any machine with gcloud access
    • Command:
      For each node pool name from the output:
    • Review: Note which node pools show {"type": "gvisor"} and which show null or no sandbox.
  2. Determine which workloads are untrusted or multi-tenant
    • Run on: any machine with kubectl access
    • Commands to list namespaces and deployments (for your own review; no change yet):
    • Review: Identify namespaces/workloads that:
      • Are operated by external tenants/teams, or
      • Run third-party or less-trusted code, or
      • Process unvalidated/untrusted input at scale.
        These are candidates to be scheduled onto sandboxed (gVisor) nodes.
  3. Decide the sandboxing strategy and scheduling model
    • Review and decide:
      • Will all workloads be sandboxed, or only specific namespaces/apps?
      • Resource overhead: gVisor imposes performance cost; ensure capacity is acceptable.
      • Scheduling mechanism:
        • Option A: Taint gVisor node pools and use tolerations on untrusted workloads.
        • Option B: Use nodeSelector or topology spread constraints to pin untrusted workloads to gVisor nodes.
      • Pod Security / Admission policies: ensure they won’t block running on COS with containerd and gVisor.
  4. Create a new gVisor-enabled node pool for untrusted workloads
    • Run on: any machine with gcloud access
    • Command (adapt names and sizes to your decision):
    • Optional (if you plan to use taints for isolation):
  5. Migrate untrusted workloads to the sandboxed node pool
    • Run on: any machine with kubectl access
    • For workloads you identified as untrusted:
      • If using taints/tolerations, patch a deployment example:
      • If using nodeSelector instead:
        1. Label gVisor nodes (once they are ready):
        2. Patch deployment to select those nodes:
    • Review: Ensure pods from untrusted workloads are now scheduled only onto the gVisor node pool.
  6. Verify sandbox configuration and workload placement
    • Run on: any machine with gcloud and kubectl access
    • Verify node pool sandbox:
      Confirm it outputs {"type":"gvisor"} (or equivalent).
    • Verify workloads run only on sandbox nodes:
      Confirm the NODE column for untrusted workloads matches nodes in the gvisor-untrusted-pool and not any non-sandbox node pools.
kubectl cannot be used to enable or configure GKE Sandbox because this setting is applied at the node pool / cluster level through Google Cloud (gcloud CLI, console, or IaC), not via Kubernetes API objects. Refer to the Manual Steps section for guidance on enabling GKE Sandbox using the appropriate cloud provider configuration tools.
How to run (from any machine with gcloud configured):
How to interpret output (problem indicators):Look at the ISSUE column:
  • NO_SANDBOX_CONFIGURED
    • Node pool does not use GKE Sandbox (gVisor).
    • In a multi-tenant or untrusted workload scenario, this is what you review and likely treat as non-compliant.
  • NON_GVISOR_SANDBOX(<type>)
    • Some other sandbox type is configured instead of gvisor; verify if it meets your policy (typically a finding for this CIS control).
  • GVISOR_WITH_UNSUPPORTED_IMAGE(<IMAGE_TYPE>)
    • gVisor is set but the image type is not cos_containerd, which is required per the benchmark remediation. Treat as misconfiguration.
  • OK
    • Node pool uses sandboxConfig.type=gvisor and imageType=cos_containerd and aligns with the remediation.
Use the report to decide which clusters/node pools running untrusted or multi-tenant workloads should be migrated onto new node pools created with:

Additional Reading: