celld-operator

Security

An honest isolation story, stated plainly: this is a platform for your applications, or your customers' applications under your operation, not for anonymous hostile code. celld's own security page says it is not safe for hostile multi-tenant use; the operator's design takes that seriously instead of papering over it.

The isolation model

celld adds no sandbox beyond V8, so the design assumes the worst case: a V8 isolate escape hands an attacker the entire node process. The operator's answer is fleet-per-app blast-radius containment:

Two limits belong next to that claim. Within a fleet there is no per-cell resource quota: upstream notes that a defective cell can access only its own database but can still consume its fleet nodes' resources, so a runaway cell starves its neighbours in the same app. And WorkerApp exposes no scheduling fields — no nodeSelector, affinity, or tolerations — so pinning fleets to dedicated node pools for kernel-level separation needs a cluster-level mechanism (a namespace default node selector, or a mutating admission policy), not a field on the resource.

The internal listener

celld's internal listener — which the operator pins to :8081; celld itself defaults to an ephemeral loopback port — carries the peer protocol and an operator API that is unauthenticated by upstream design. Anyone who can reach it can inspect state, evict cells, stop the process, activate a cell, and send it a direct Durable Object request: that is application code execution and state mutation, not just inspection. The operator fences it in depth:

Peer requests on that listener keep celld's own protocol authentication (HMAC with the fleet secret, body-bound signatures, clock limits, replay protection). celld terminates no TLS, so confidentiality on the peer network is the cluster's job: the operator neither installs nor requires a mesh, and without one it reports MeshPolicyReady: False and leaves NetworkPolicy as the only guard. Where you do add a mesh, prefer Istio ambient mode for mTLS. Ambient specifically, not sidecars: celld makes outbound peer and bucket calls during termination, and a sidecar exiting first would break the handoff; an L7 proxy also has no business touching the HMAC-signed, body-bound peer protocol.

Bucket credentials

The bucket credential is fleet-admin authority. The bucket holds deployments, cell state, ownership leases, and the peer-auth secret; whoever holds the credential controls the fleet. Credential scoping is the tenancy enforcement.

TLS and application auth

Trust boundaries at a glance

BoundaryMechanism
Internet → WorkerGateway TLS + per-host routing; app-level auth in the Worker
Tenant ↔ tenantNamespaces, NetworkPolicy, fleet-scoped IAM (node-pool separation via cluster-level policy)
Anything → operator API (:8081)NetworkPolicy + AuthorizationPolicy; never routed
Node ↔ nodecelld HMAC/replay auth; transport encryption from your mesh or CNI, if any
Fleet → bucketPer-fleet, prefix-scoped IAM role
Operator → fleetsNetworkPolicy admits the whole operator namespace; the Istio policy, where installed, narrows it to the operator's ServiceAccount

Support and disclosure

Upstream ships security fixes for the latest celld release only; the operator's support policy mirrors it: current celld, current operator. Report operator vulnerabilities per the repository's SECURITY.md; report celld issues upstream at denoland/celld.