2.5 KiB
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 inspectshowsPrivileged: false - Penetration test before production go-live