More Info:
Use Gke Sandbox To Restrict Untrusted Workloads As An Additional Layer Of Protection When Running In A Multi-Tenant Environment.Risk Level
MediumAddress
SecurityCompliance 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
Remediation
Manual Steps
Manual Steps
-
Identify existing node pools and their sandbox configuration
- Run on: any machine with
gcloudaccess - Command:
For each node pool name from the output:
- Review: Note which node pools show
{"type": "gvisor"}and which shownullor no sandbox.
- Run on: any machine with
-
Determine which workloads are untrusted or multi-tenant
- Run on: any machine with
kubectlaccess - 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.
- Run on: any machine with
-
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.
- Review and decide:
-
Create a new gVisor-enabled node pool for untrusted workloads
- Run on: any machine with
gcloudaccess - Command (adapt names and sizes to your decision):
- Optional (if you plan to use taints for isolation):
- Run on: any machine with
-
Migrate untrusted workloads to the sandboxed node pool
- Run on: any machine with
kubectlaccess - For workloads you identified as untrusted:
- If using taints/tolerations, patch a deployment example:
- If using nodeSelector instead:
- Label gVisor nodes (once they are ready):
- Patch deployment to select those nodes:
- Label gVisor nodes (once they are ready):
- If using taints/tolerations, patch a deployment example:
- Review: Ensure pods from untrusted workloads are now scheduled only onto the gVisor node pool.
- Run on: any machine with
-
Verify sandbox configuration and workload placement
- Run on: any machine with
gcloudandkubectlaccess - Verify node pool sandbox:
Confirm it outputs
{"type":"gvisor"}(or equivalent). - Verify workloads run only on sandbox nodes:
Confirm the
NODEcolumn for untrusted workloads matches nodes in thegvisor-untrusted-pooland not any non-sandbox node pools.
- Run on: any machine with
Using kubectl
Using kubectl
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.
Automation
Automation
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).
- Some other sandbox type is configured instead of
-
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.
- gVisor is set but the image type is not
-
OK- Node pool uses
sandboxConfig.type=gvisorandimageType=cos_containerdand aligns with the remediation.
- Node pool uses

