Secure Computes, Sandboxing, and Multi-Tenant Isolation for Polyglot Systems: Best Practices¶
Objective: Establish comprehensive sandboxing and multi-tenant isolation patterns across Python, Rust, Go microservices, ML inference, embedded engines, and containerized workloads. When you need secure isolation, when you want multi-tenant safety, when you need zero-trust internal boundaries—this guide provides the complete framework.
Introduction¶
Secure sandboxing and multi-tenant isolation are fundamental to safe, compliant systems. This guide establishes patterns for isolating workloads, preventing privilege escalation, and ensuring tenant separation across all system layers.
What This Guide Covers: - Isolation strategies for Python notebooks, Rust/Go microservices, ML model inference, DuckDB and embedded engines, Postgres FDW sandbox boundaries - Hardened container patterns, user namespaces, cgroups - GPU isolation (MPS, MIG, Kubernetes GPU scheduling) - Anti-patterns: privilege escalation between services - Multi-tenant designs for research and HPC clusters - Secure plugin architecture for NiceGUI/FastAPI apps - Zero-trust principles in internal service meshes - Fitness functions for tenant isolation
Prerequisites: - Understanding of security principles and isolation mechanisms - Familiarity with containers, Kubernetes, and multi-tenancy - Experience with sandboxing and privilege management
Related Documents: This document integrates with: - Secure-by-Design Lifecycle Architecture Across Polyglot Systems - Security lifecycle patterns - Identity & Access Management, RBAC/ABAC, and Least-Privilege Governance - Access control patterns - Operational Resilience and Incident Response - Incident response for isolation failures - Cost-Aware Architecture & Resource-Efficiency Governance - Cost-aware isolation
The Philosophy of Secure Sandboxing¶
Isolation Principles¶
Principle 1: Defense in Depth - Multiple isolation layers - Fail-safe defaults - Least privilege
Principle 2: Zero Trust - Verify all access - Assume breach - Continuous validation
Principle 3: Tenant Separation - Strong boundaries - No cross-tenant access - Audit all interactions
Isolation Strategies¶
Python Notebook Isolation¶
Jupyter Isolation:
# Jupyter isolation configuration
jupyter:
isolation:
enabled: true
strategy: "container-per-notebook"
security:
run_as_user: "jupyter-user"
run_as_group: "jupyter-group"
fs_group: "jupyter-group"
read_only_root: true
network:
policy: "namespace-isolation"
allowed_egress: ["pypi.org", "conda-forge.org"]
resource_limits:
cpu: "2"
memory: "4Gi"
storage: "10Gi"
VS Code Isolation:
# VS Code isolation
vscode:
isolation:
enabled: true
strategy: "devcontainer"
security:
user_namespace: true
cgroup_v2: true
seccomp_profile: "restricted"
network:
policy: "pod-network-policy"
Rust/Go Microservice Isolation¶
Rust Service Isolation:
# Rust service isolation
rust_service:
isolation:
enabled: true
security_context:
run_as_non_root: true
run_as_user: 1000
capabilities:
drop: ["ALL"]
add: []
seccomp_profile: "runtime/default"
network:
policy: "service-mesh-isolation"
mTLS: true
Go Service Isolation:
# Go service isolation
go_service:
isolation:
enabled: true
security_context:
run_as_non_root: true
run_as_user: 1000
read_only_root_filesystem: true
allow_privilege_escalation: false
network:
policy: "network-policy"
mTLS: true
ML Model Inference Isolation¶
Inference Isolation:
# ML inference isolation
ml_inference:
isolation:
enabled: true
strategy: "model-per-pod"
security:
run_as_user: "ml-user"
run_as_group: "ml-group"
read_only_model_storage: true
gpu:
isolation: "MIG"
allocation: "dedicated"
network:
policy: "inference-isolation"
rate_limiting: true
DuckDB and Embedded Engine Isolation¶
DuckDB Isolation:
# DuckDB isolation
class IsolatedDuckDB:
def __init__(self, isolation_config: dict):
self.isolation = isolation_config
self.connection = self.create_isolated_connection()
def create_isolated_connection(self):
"""Create isolated DuckDB connection"""
# Set up sandbox
sandbox = Sandbox(
memory_limit=self.isolation['memory_limit'],
cpu_limit=self.isolation['cpu_limit'],
network_policy=self.isolation['network_policy']
)
# Create connection in sandbox
return sandbox.create_connection()
Postgres FDW Sandbox Boundaries¶
FDW Isolation:
-- FDW sandbox boundaries
CREATE SERVER isolated_fdw
FOREIGN DATA WRAPPER postgres_fdw
OPTIONS (
host 'remote-host',
port '5432',
isolation_level 'strict',
sandbox_enabled 'true'
);
-- Isolation policy
CREATE POLICY fdw_isolation_policy
ON FOREIGN TABLE remote_table
USING (
current_user = 'isolated_user'
AND current_database = 'isolated_db'
);
Hardened Container Patterns¶
Container Hardening¶
Pattern: Harden containers for security.
Example:
# Hardened container
FROM python:3.11-slim
# Create non-root user
RUN groupadd -r appuser && useradd -r -g appuser appuser
# Set up security
RUN apt-get update && \
apt-get install -y --no-install-recommends \
ca-certificates && \
rm -rf /var/lib/apt/lists/*
# Copy application
COPY --chown=appuser:appuser app/ /app/
# Switch to non-root user
USER appuser
# Set security context
RUN chmod 755 /app && \
chmod 644 /app/*.py
# Run application
CMD ["python", "/app/main.py"]
User Namespaces¶
Configuration:
# User namespace configuration
user_namespace:
enabled: true
mapping:
- container_id: 0
host_id: 1000
size: 1
security:
rootless: true
no_new_privileges: true
Cgroups Configuration¶
Cgroup Setup:
# Cgroup configuration
cgroups:
version: "v2"
controllers:
- "cpu"
- "memory"
- "pids"
limits:
cpu:
max: "2"
period: "100ms"
memory:
max: "4Gi"
pids:
max: 100
GPU Isolation¶
MPS (Multi-Process Service)¶
MPS Configuration:
# MPS configuration
gpu_isolation:
strategy: "MPS"
mps:
enabled: true
memory_fraction: 0.5
compute_streams: 4
allocation:
per_tenant: true
dedicated: false
MIG (Multi-Instance GPU)¶
MIG Configuration:
# MIG configuration
gpu_isolation:
strategy: "MIG"
mig:
enabled: true
instances:
- type: "1g.5gb"
count: 2
- type: "3g.20gb"
count: 1
allocation:
per_tenant: true
dedicated: true
Kubernetes GPU Scheduling¶
GPU Scheduling:
# Kubernetes GPU scheduling
apiVersion: v1
kind: Pod
spec:
containers:
- name: ml-inference
resources:
limits:
nvidia.com/gpu: 1
requests:
nvidia.com/gpu: 1
nodeSelector:
accelerator: nvidia-tesla-v100
tolerations:
- key: nvidia.com/gpu
operator: Exists
effect: NoSchedule
Multi-Tenant Designs¶
Research Cluster Multi-Tenancy¶
Pattern: Multi-tenant research cluster.
Example:
# Research cluster multi-tenancy
multi_tenant:
strategy: "namespace-per-tenant"
isolation:
network: "network-policy"
storage: "storage-class-per-tenant"
compute: "resource-quota-per-tenant"
tenants:
- name: "research-team-a"
namespace: "research-a"
quota:
cpu: "20"
memory: "40Gi"
storage: "100Gi"
- name: "research-team-b"
namespace: "research-b"
quota:
cpu: "20"
memory: "40Gi"
storage: "100Gi"
HPC Cluster Multi-Tenancy¶
Pattern: Multi-tenant HPC cluster.
Example:
# HPC cluster multi-tenancy
hpc_multi_tenant:
strategy: "partition-per-tenant"
isolation:
compute: "slurm-partition"
storage: "lustre-quota"
network: "infiniband-vlan"
tenants:
- name: "hpc-tenant-a"
partition: "tenant-a"
nodes: ["node-1", "node-2"]
quota:
cpu_hours: 10000
memory_gb_hours: 50000
Secure Plugin Architecture¶
NiceGUI Plugin Isolation¶
Pattern: Isolate NiceGUI plugins.
Example:
# NiceGUI plugin isolation
class IsolatedPlugin:
def __init__(self, plugin_code: str):
self.sandbox = Sandbox(
allowed_imports=['nicegui'],
blocked_imports=['os', 'subprocess', 'sys'],
memory_limit='256Mi'
)
self.plugin = self.sandbox.execute(plugin_code)
def run(self, context: dict):
"""Run plugin in sandbox"""
return self.sandbox.run(self.plugin, context)
FastAPI Plugin Isolation¶
Pattern: Isolate FastAPI plugins.
Example:
# FastAPI plugin isolation
from fastapi import FastAPI
from sandbox import Sandbox
app = FastAPI()
class IsolatedFastAPIPlugin:
def __init__(self, plugin_code: str):
self.sandbox = Sandbox(
allowed_imports=['fastapi', 'pydantic'],
blocked_imports=['os', 'subprocess'],
network_policy='restricted'
)
self.plugin = self.sandbox.load_plugin(plugin_code)
@app.middleware("http")
async def isolate_plugin(request, call_next):
"""Isolate plugin execution"""
with self.sandbox:
return await call_next(request)
Zero-Trust Internal Service Meshes¶
Service Mesh Isolation¶
Pattern: Zero-trust service mesh.
Example:
# Service mesh isolation
service_mesh:
type: "istio"
zero_trust:
enabled: true
mTLS:
mode: "STRICT"
authorization:
policy: "deny-by-default"
network:
policy: "default-deny"
isolation:
per_namespace: true
cross_namespace: false
Architecture Fitness Functions¶
Tenant Isolation Fitness Function¶
Definition:
# Tenant isolation fitness function
class TenantIsolationFitnessFunction:
def evaluate(self, system: System) -> float:
"""Evaluate tenant isolation"""
# Check network isolation
network_isolation = self.check_network_isolation(system)
# Check storage isolation
storage_isolation = self.check_storage_isolation(system)
# Check compute isolation
compute_isolation = self.check_compute_isolation(system)
# Calculate fitness
fitness = (network_isolation * 0.4) + \
(storage_isolation * 0.3) + \
(compute_isolation * 0.3)
return fitness
Cross-Document Architecture¶
graph TB
subgraph Sandboxing["Secure Sandboxing<br/>(This Document)"]
Isolation["Isolation Strategies"]
MultiTenant["Multi-Tenancy"]
ZeroTrust["Zero Trust"]
end
subgraph Secure["Secure-by-Design"]
Lifecycle["Security Lifecycle"]
end
subgraph IAM["IAM & RBAC"]
Access["Access Control"]
end
subgraph Resilience["Operational Resilience"]
Incident["Incident Response"]
end
Isolation --> Lifecycle
MultiTenant --> Access
ZeroTrust --> Incident
style Sandboxing fill:#ffebee
style Secure fill:#e1f5ff
style IAM fill:#fff4e1
style Resilience fill:#e8f5e9 Checklists¶
Sandboxing Compliance Checklist¶
- Isolation strategies implemented
- Container hardening configured
- User namespaces enabled
- Cgroups configured
- GPU isolation active
- Multi-tenant design verified
- Plugin isolation enabled
- Zero-trust mesh configured
- Fitness functions defined
- Regular security audits scheduled
Anti-Patterns¶
Sandboxing Anti-Patterns¶
Privilege Escalation:
# Bad: Privilege escalation allowed
security_context:
allow_privilege_escalation: true
run_as_user: 0
# Good: No privilege escalation
security_context:
allow_privilege_escalation: false
run_as_user: 1000
run_as_non_root: true
Weak Network Isolation:
# Bad: No network isolation
network:
policy: "allow-all"
# Good: Strict network isolation
network:
policy: "deny-by-default"
allowed_connections: ["same-namespace"]
See Also¶
- Secure-by-Design Lifecycle Architecture Across Polyglot Systems - Security lifecycle patterns
- Identity & Access Management, RBAC/ABAC, and Least-Privilege Governance - Access control patterns
- Operational Resilience and Incident Response - Incident response for isolation failures
- Cost-Aware Architecture & Resource-Efficiency Governance - Cost-aware isolation
This guide establishes comprehensive sandboxing and multi-tenant isolation patterns. Start with isolation strategies, extend to multi-tenancy, and continuously enforce zero-trust principles.