Turn the network off
If a workload doesn’t need the network, remove it. Nothing to filter is the strongest filter.Deny egress by default
When a workload needs only a handful of destinations, switch from allow-public to deny-by-default and allow exactly what’s required. In any allow-by-default policy, remember todeny@meta so the cloud metadata service stays blocked.
Drop in-guest privileges
Two independent steps, both worth taking for untrusted code:- Run the workload as a non-root user.
- Apply the restricted security profile, which sets
no_new_privs, drops the mount-admin capability, and forcesnosuid,nodevon user mounts.
sudo or Docker-in-Docker. See Isolation boundary for the SDK forms.
Mount least privilege
- Mount only the directories a workload actually needs.
- Use read-only mounts wherever write isn’t required. Read-only is enforced host-side, so the guest can’t remount around it.
- Avoid sharing a writable volume across sandboxes, since a shared volume is a deliberate isolation hole.
- Prefer a recent Linux kernel for writable bind mounts, where
openat2containment is strongest.
Pin and trust your images
- Pin images by digest, not a moving tag, for reproducibility.
- Pull from registries you control or trust, because content is digest-verified but not signature-verified.
Handle credentials with secrets
- Inject credentials with secrets and narrow allow lists, so a value only materializes at the destinations that need it.
- Keep
trust_host_casoff unless you’re behind a corporate MITM proxy. - For credentialed egress you want to inspect, enable TLS interception and pin DNS.
Bound resources and lifetime
- Set vCPU and memory caps appropriate to the workload.
- Set an idle timeout or a maximum duration so abandoned sandboxes get reclaimed.
Choosing a posture
| Use case | Network | In-guest privilege | Storage |
|---|---|---|---|
| Trusted internal tool | Default public egress | Root is fine | Mounts as needed |
| Untrusted code / AI agent with internet | Default, or deny-by-default allowlist | Non-root + restricted | Read-only mounts |
| Multi-tenant / per-user | Deny-by-default allowlist | Non-root + restricted | No shared writable volumes, one sandbox per tenant |
| Credential-handling egress | Deny-by-default + TLS interception | Non-root + restricted | Minimal and read-only, with narrow secret allow lists |
| Fully offline / compute-only | --no-net | Non-root + restricted | Read-only or none |