Files
HexaHost-GameCloud/docs/security/container-isolation.md

2.5 KiB

Container isolation

How HexaHost GameCloud isolates Minecraft server workloads on game nodes.

Model

Each customer server runs as a non-privileged Docker container on a dedicated game node. The node-agent creates and manages containers; customers never receive Docker socket access.

Control plane (trusted)  ──mTLS──►  Node agent (trusted)  ──►  Game container (untrusted)

Container hardening (target profile)

Control Setting
User Non-root UID inside container
Privileges --privileged=false
Capabilities Drop ALL, add only required (none for vanilla Java)
seccomp Docker default or custom profile (Phase 2)
AppArmor Docker default profile
Network Bridge network per server; no host network mode
Read-only root Where compatible with selected software family
Memory / CPU cgroup limits from plan slug
PIDs limit Prevents fork bombs

Network isolation

  • Game containers reach the internet for Minecraft auth and mod downloads only through controlled egress
  • No route to control plane PostgreSQL, Redis, or internal APIs
  • Node-agent management port (9100) bound to localhost or management VLAN only

See threat T05 and T12 in threat model.

Storage isolation

  • Per-server data directory on node disk: /var/lib/hgc-node/servers/{serverId}/
  • Path traversal prevented server-side; symlinks rejected on archive extract
  • Backups uploaded to object storage — not readable by other tenants

Image policy

  • Only catalog-approved runtime images (digest-pinned)
  • Customers cannot push custom images
  • Periodic image vulnerability scan in CI (Phase 9)

Multi-tenant on one node

The scheduler enforces RAM and server count limits per node. There is no shared filesystem between server containers except the read-only image layers.

Operator responsibilities

Task Frequency
Docker security updates on nodes Monthly
Review AppArmor/seccomp profiles after Minecraft/Java major bumps Per release
Audit docker ps for unexpected privileged containers Weekly

Bootstrap hardening via deploy/ansible/game-node.yml.

Verification

  • Attempt cross-container network scan from test server (should fail to reach agent port)
  • Confirm docker inspect shows Privileged: false
  • Penetration test before production go-live