@namzu/sandbox 14.0.0 → 16.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +924 -0
- package/README.md +369 -14
- package/dist/backends/aci-standby-pool/index.d.ts.map +1 -1
- package/dist/backends/aci-standby-pool/index.js +13 -1
- package/dist/backends/aci-standby-pool/index.js.map +1 -1
- package/dist/backends/docker/index.d.ts +169 -6
- package/dist/backends/docker/index.d.ts.map +1 -1
- package/dist/backends/docker/index.js +499 -85
- package/dist/backends/docker/index.js.map +1 -1
- package/dist/backends/firecracker/index.d.ts.map +1 -1
- package/dist/backends/firecracker/index.js +12 -2
- package/dist/backends/firecracker/index.js.map +1 -1
- package/dist/backends/firecracker/protocol.d.ts +459 -8
- package/dist/backends/firecracker/protocol.d.ts.map +1 -1
- package/dist/backends/firecracker/protocol.js +136 -0
- package/dist/backends/firecracker/protocol.js.map +1 -1
- package/dist/backends/firecracker/transport.d.ts +539 -6
- package/dist/backends/firecracker/transport.d.ts.map +1 -1
- package/dist/backends/firecracker/transport.js +1171 -24
- package/dist/backends/firecracker/transport.js.map +1 -1
- package/dist/backends/kubernetes/egress-policy.d.ts +1181 -13
- package/dist/backends/kubernetes/egress-policy.d.ts.map +1 -1
- package/dist/backends/kubernetes/egress-policy.js +2350 -31
- package/dist/backends/kubernetes/egress-policy.js.map +1 -1
- package/dist/backends/kubernetes/identity.d.ts +193 -0
- package/dist/backends/kubernetes/identity.d.ts.map +1 -0
- package/dist/backends/kubernetes/identity.js +147 -0
- package/dist/backends/kubernetes/identity.js.map +1 -0
- package/dist/backends/kubernetes/index.d.ts +678 -33
- package/dist/backends/kubernetes/index.d.ts.map +1 -1
- package/dist/backends/kubernetes/index.js +1180 -95
- package/dist/backends/kubernetes/index.js.map +1 -1
- package/dist/backends/kubernetes/ingress-policy.d.ts +375 -0
- package/dist/backends/kubernetes/ingress-policy.d.ts.map +1 -0
- package/dist/backends/kubernetes/ingress-policy.js +1050 -0
- package/dist/backends/kubernetes/ingress-policy.js.map +1 -0
- package/dist/backends/kubernetes/k8s-client.d.ts +213 -4
- package/dist/backends/kubernetes/k8s-client.d.ts.map +1 -1
- package/dist/backends/kubernetes/k8s-client.js +359 -52
- package/dist/backends/kubernetes/k8s-client.js.map +1 -1
- package/dist/backends/kubernetes/lease.d.ts +40 -14
- package/dist/backends/kubernetes/lease.d.ts.map +1 -1
- package/dist/backends/kubernetes/lease.js +68 -18
- package/dist/backends/kubernetes/lease.js.map +1 -1
- package/dist/backends/kubernetes/objects.d.ts +423 -3
- package/dist/backends/kubernetes/objects.d.ts.map +1 -1
- package/dist/backends/kubernetes/objects.js +364 -2
- package/dist/backends/kubernetes/objects.js.map +1 -1
- package/dist/backends/kubernetes/per-sandbox-policy.d.ts +219 -0
- package/dist/backends/kubernetes/per-sandbox-policy.d.ts.map +1 -0
- package/dist/backends/kubernetes/per-sandbox-policy.js +375 -0
- package/dist/backends/kubernetes/per-sandbox-policy.js.map +1 -0
- package/dist/backends/kubernetes/rbac.d.ts +153 -0
- package/dist/backends/kubernetes/rbac.d.ts.map +1 -0
- package/dist/backends/kubernetes/rbac.js +177 -0
- package/dist/backends/kubernetes/rbac.js.map +1 -0
- package/dist/backends/kubernetes/sandbox.d.ts +81 -14
- package/dist/backends/kubernetes/sandbox.d.ts.map +1 -1
- package/dist/backends/kubernetes/sandbox.js +149 -15
- package/dist/backends/kubernetes/sandbox.js.map +1 -1
- package/dist/backends/kubernetes/transport.d.ts +935 -9
- package/dist/backends/kubernetes/transport.d.ts.map +1 -1
- package/dist/backends/kubernetes/transport.js +1958 -62
- package/dist/backends/kubernetes/transport.js.map +1 -1
- package/dist/backends/kubernetes/workspace.d.ts +1149 -18
- package/dist/backends/kubernetes/workspace.d.ts.map +1 -1
- package/dist/backends/kubernetes/workspace.js +2825 -186
- package/dist/backends/kubernetes/workspace.js.map +1 -1
- package/dist/backends/remote-execution-controller.d.ts +14 -0
- package/dist/backends/remote-execution-controller.d.ts.map +1 -1
- package/dist/backends/remote-execution-controller.js.map +1 -1
- package/dist/index.d.ts +294 -18
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +280 -10
- package/dist/index.js.map +1 -1
- package/dist/testing/sandbox-conformance.d.ts +39 -5
- package/dist/testing/sandbox-conformance.d.ts.map +1 -1
- package/dist/testing/sandbox-conformance.js +436 -5
- package/dist/testing/sandbox-conformance.js.map +1 -1
- package/package.json +3 -3
- package/src/backends/aci-standby-pool/index.ts +16 -1
- package/src/backends/docker/index.ts +617 -100
- package/src/backends/firecracker/index.ts +14 -2
- package/src/backends/firecracker/protocol.ts +514 -6
- package/src/backends/firecracker/transport.ts +1492 -40
- package/src/backends/kubernetes/egress-policy.ts +3334 -55
- package/src/backends/kubernetes/identity.ts +261 -0
- package/src/backends/kubernetes/index.ts +1785 -127
- package/src/backends/kubernetes/ingress-policy.ts +1344 -0
- package/src/backends/kubernetes/k8s-client.ts +444 -54
- package/src/backends/kubernetes/lease.ts +75 -19
- package/src/backends/kubernetes/objects.ts +626 -6
- package/src/backends/kubernetes/per-sandbox-policy.ts +497 -0
- package/src/backends/kubernetes/rbac.ts +192 -0
- package/src/backends/kubernetes/sandbox.ts +218 -20
- package/src/backends/kubernetes/transport.ts +2733 -124
- package/src/backends/kubernetes/workspace.ts +4476 -222
- package/src/backends/remote-execution-controller.ts +14 -0
- package/src/index.ts +668 -19
- package/src/testing/sandbox-conformance.ts +540 -5
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
*/
|
|
23
23
|
import { type ContainerSandboxLayout, type ResolvedContainerSandboxLayout } from '@namzu/sdk';
|
|
24
24
|
import type { BrokeredCredential, EgressProxyOptions } from '../../egress/index.js';
|
|
25
|
-
import { type EgressPolicy, type SandboxBackend } from '../../index.js';
|
|
25
|
+
import { type EgressPolicy, type SandboxBackend, type SandboxBackendOptions } from '../../index.js';
|
|
26
26
|
/**
|
|
27
27
|
* Backend-specific tuning. Most hosts use the defaults; advanced
|
|
28
28
|
* deployments override `image` to point at their own pre-built
|
|
@@ -47,13 +47,66 @@ export interface DockerBackendInternalConfig {
|
|
|
47
47
|
/**
|
|
48
48
|
* `--user` value for the container, e.g. `'1000:1000'` or `'nobody'`.
|
|
49
49
|
*
|
|
50
|
-
* Left unset by default because
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
* non-root
|
|
54
|
-
*
|
|
50
|
+
* Left unset by default because `--user` does not ADD a non-root user, it
|
|
51
|
+
* OVERRIDES the image's own choice of one. The reference image ends with
|
|
52
|
+
* `USER namzu` (uid 1001, its `/workspace` chowned to match), so this
|
|
53
|
+
* backend's default is already non-root for the image it ships — a
|
|
54
|
+
* hard-coded uid here would replace that with a guess, and the guess is
|
|
55
|
+
* wrong for any image whose files are owned by someone else, which
|
|
56
|
+
* surfaces as `EACCES` on a path the workload was told it could write.
|
|
57
|
+
* Set it when the image does not declare a user of its own, or when the
|
|
58
|
+
* host wants a different one than it declares.
|
|
55
59
|
*/
|
|
56
60
|
readonly runAsUser?: string;
|
|
61
|
+
/**
|
|
62
|
+
* CPU cores the container may use, rendered as `--cpus`. Unset by default.
|
|
63
|
+
*
|
|
64
|
+
* `--memory` and `--pids-limit` bound what a workload can take from the
|
|
65
|
+
* host, and CPU had no equivalent at all — no default, no knob — which
|
|
66
|
+
* reads as an oversight rather than a decision. It stays unset for the
|
|
67
|
+
* same reason neither of those two has a numeric default: the right value
|
|
68
|
+
* is a property of the host's machine and of what the workload is for, and
|
|
69
|
+
* any number this backend picked would silently throttle a run that
|
|
70
|
+
* finishes inside its timeout today. A host that wants the bound says what
|
|
71
|
+
* it is; the value is a decimal (`--cpus 1.5` is one and a half cores'
|
|
72
|
+
* worth of time, not a rounding).
|
|
73
|
+
*
|
|
74
|
+
* It lives on this config rather than beside `memoryLimitMb` on the
|
|
75
|
+
* per-call options because the documented deployment constructs one
|
|
76
|
+
* provider per task, so construction time IS per-task — and a control
|
|
77
|
+
* added to the tier-agnostic per-call shape would have to be refused by
|
|
78
|
+
* the ACI and kubernetes backends, which cannot apply a per-sandbox CPU
|
|
79
|
+
* limit any more than they can apply the memory and process ones.
|
|
80
|
+
*/
|
|
81
|
+
readonly cpuLimit?: number;
|
|
82
|
+
/**
|
|
83
|
+
* Mount the container's root filesystem read-only. Default `true`.
|
|
84
|
+
*
|
|
85
|
+
* See {@link HARDENING_ARGS} for why the default is on and
|
|
86
|
+
* {@link renderWritableRootfsArgs} for the paths that stay writable while
|
|
87
|
+
* it is. Set it to `false` to make every path inside the container
|
|
88
|
+
* writable again, which is what a host whose image writes somewhere the
|
|
89
|
+
* writable set cannot describe needs, and which is why the switch exists
|
|
90
|
+
* instead of an unwritten rule that the baseline is absolute. It turns off
|
|
91
|
+
* that one control and nothing else: `--cap-drop=ALL`,
|
|
92
|
+
* `--security-opt=no-new-privileges` and `--ipc private` are applied
|
|
93
|
+
* whatever this says. It is a config field rather than an argument so that
|
|
94
|
+
* turning it off is a line somebody wrote on purpose, and not the default
|
|
95
|
+
* anyone gets by not looking.
|
|
96
|
+
*/
|
|
97
|
+
readonly readOnlyRootfs?: boolean;
|
|
98
|
+
/**
|
|
99
|
+
* Extra paths to keep writable under `--read-only`, each mounted `--tmpfs`.
|
|
100
|
+
*
|
|
101
|
+
* The default set ({@link DEFAULT_WRITABLE_ROOTFS_PATHS}) is the reference
|
|
102
|
+
* image's needs, read off its Dockerfile; this is how a host that points
|
|
103
|
+
* `image` somewhere else says what ITS image needs, because the backend
|
|
104
|
+
* cannot read that out of an image and guessing is what these paths would
|
|
105
|
+
* otherwise be. A path the layout already mounts is refused rather than
|
|
106
|
+
* mounted twice (`Duplicate mount point`), and setting this at all beside
|
|
107
|
+
* `readOnlyRootfs: false` is refused as a contradiction.
|
|
108
|
+
*/
|
|
109
|
+
readonly writableRootfsPaths?: readonly string[];
|
|
57
110
|
/**
|
|
58
111
|
* Credentials the egress proxy stamps on, per host.
|
|
59
112
|
*
|
|
@@ -207,6 +260,116 @@ export declare function assertNetworkCarriesThePolicy(network: string, reachabil
|
|
|
207
260
|
* receives is the failure this shape exists to make testable.
|
|
208
261
|
*/
|
|
209
262
|
export declare function egressProxyOptions(config: Pick<DockerBackendInternalConfig, 'brokeredCredentials' | 'allowInwardFor'>, policy: EgressPolicy): EgressProxyOptions;
|
|
263
|
+
/** The backend config the hardening flags are rendered from. */
|
|
264
|
+
export type DockerHardeningConfig = Pick<DockerBackendInternalConfig, 'cpuLimit' | 'layout' | 'readOnlyRootfs' | 'writableRootfsPaths'>;
|
|
265
|
+
/**
|
|
266
|
+
* Refuse rootfs options that cannot both be honoured.
|
|
267
|
+
*
|
|
268
|
+
* `writableRootfsPaths` beside `readOnlyRootfs: false` is a contradiction: with
|
|
269
|
+
* a writable root filesystem every path is already writable, so the tmpfs
|
|
270
|
+
* mounts would either be dropped (a control accepted and not applied) or take a
|
|
271
|
+
* directory off the image for no reason. Refusing is the honest answer, and it
|
|
272
|
+
* is the same one the sibling backends give a per-sandbox control they cannot
|
|
273
|
+
* express.
|
|
274
|
+
*
|
|
275
|
+
* Called at construction and again where the argv is built, so a config that
|
|
276
|
+
* reaches `create()` by some path other than `buildDockerBackend` is refused
|
|
277
|
+
* too.
|
|
278
|
+
*/
|
|
279
|
+
export declare function assertRootfsOptionsAreCoherent(config: DockerHardeningConfig): void;
|
|
280
|
+
/**
|
|
281
|
+
* Refuse a `--cpus` value that cannot mean what it says.
|
|
282
|
+
*
|
|
283
|
+
* This covers non-finite and non-positive values and does NOT claim to cover
|
|
284
|
+
* every bound the daemon would refuse. The difference is worth stating, because
|
|
285
|
+
* the two classes fail in different places and only one of them is decidable
|
|
286
|
+
* here. A negative, `NaN` or `Infinity` renders into the argv as text the
|
|
287
|
+
* daemon either rejects or turns into a bound nobody asked for, and `0` is the
|
|
288
|
+
* opposite of a bound (`NanoCPUs` of zero is how a container says "no CPU
|
|
289
|
+
* limit"), so a host that wrote one of those hears about it during wiring
|
|
290
|
+
* rather than as a container that never came up.
|
|
291
|
+
*
|
|
292
|
+
* The upper bound is not ours to check. Moby's `verifyPlatformContainerResources`
|
|
293
|
+
* refuses `NanoCPUs` above the DAEMON host's CPU count (`"range of CPUs is from
|
|
294
|
+
* 0.01 to N.00, as there are only N CPUs available"`), and the same function
|
|
295
|
+
* deliberately sets no floor of its own on Linux, leaving that to the kernel.
|
|
296
|
+
* Neither number is knowable from here: the `docker` binary this backend drives
|
|
297
|
+
* can be pointed at a daemon on another machine (`DOCKER_HOST`), and even
|
|
298
|
+
* locally `os.cpus().length` is this machine's view rather than the daemon's
|
|
299
|
+
* own `runtime.NumCPU()`. Refusing on a guess at it would break a host whose
|
|
300
|
+
* daemon has more cores than the process driving it, which is a worse failure
|
|
301
|
+
* than the one it would catch — those arrive from the daemon with its own
|
|
302
|
+
* message, at spawn, where every other daemon-side refusal arrives too.
|
|
303
|
+
*/
|
|
304
|
+
export declare function assertCpuLimitIsRenderable(cpuLimit: number | undefined): void;
|
|
305
|
+
/**
|
|
306
|
+
* `--tmpfs` flags for the paths that stay writable under `--read-only`.
|
|
307
|
+
*
|
|
308
|
+
* See {@link DEFAULT_WRITABLE_ROOTFS_PATHS} for the paths themselves and why
|
|
309
|
+
* each is there. Returns nothing when the read-only root filesystem is off, and
|
|
310
|
+
* the two ways a host names paths that cannot be mounted — a contradiction with
|
|
311
|
+
* `readOnlyRootfs: false`, or a path the layout already mounts — are refusals
|
|
312
|
+
* rather than a silently shorter list.
|
|
313
|
+
*/
|
|
314
|
+
export declare function renderWritableRootfsArgs(config: DockerHardeningConfig): string[];
|
|
315
|
+
/**
|
|
316
|
+
* The confinement preamble for one container, in argv order.
|
|
317
|
+
*
|
|
318
|
+
* A function rather than a bare constant because `--read-only` is switchable
|
|
319
|
+
* and the flags that follow it describe what stays writable while it is on:
|
|
320
|
+
* `readOnlyRootfs: false` removes both the flag and the mounts. That is the only
|
|
321
|
+
* thing it removes. Everything in {@link HARDENING_ARGS} is applied
|
|
322
|
+
* unconditionally and no field can turn one of those off, so the argv for
|
|
323
|
+
* `readOnlyRootfs: false` is the argv this backend produced before any of this
|
|
324
|
+
* existed PLUS `--ipc private` — those two flags are the whole previous argv,
|
|
325
|
+
* and `--ipc private` is now unconditional. `--ipc` is not folded under this
|
|
326
|
+
* switch, because the field names the root filesystem: a host that turned the
|
|
327
|
+
* read-only rootfs off would be turning IPC isolation off as well, silently,
|
|
328
|
+
* for a reason the name of the field does not say. A switch has to mean one
|
|
329
|
+
* thing.
|
|
330
|
+
*/
|
|
331
|
+
export declare function renderHardeningArgs(config: DockerHardeningConfig): string[];
|
|
332
|
+
/**
|
|
333
|
+
* Everything {@link buildDockerRunArgs} renders, as a value.
|
|
334
|
+
*
|
|
335
|
+
* The pieces that come from the daemon or from the host are inputs rather than
|
|
336
|
+
* lookups: which network the container attaches to, and whether an egress proxy
|
|
337
|
+
* is listening and on which port. Both are already resolved by the caller, and
|
|
338
|
+
* reading them here would put a daemon call back inside the function whose
|
|
339
|
+
* whole point is that it needs none.
|
|
340
|
+
*/
|
|
341
|
+
export interface DockerRunArgvInput {
|
|
342
|
+
readonly config: DockerBackendInternalConfig;
|
|
343
|
+
readonly options: SandboxBackendOptions;
|
|
344
|
+
readonly containerName: string;
|
|
345
|
+
readonly network: string;
|
|
346
|
+
readonly hostReachability: 'host-port' | 'container-network';
|
|
347
|
+
/**
|
|
348
|
+
* Port the host-side egress proxy listens on, when one is running. Absent
|
|
349
|
+
* means no proxy, and no proxy environment is passed in — which is not the
|
|
350
|
+
* same fact as a proxy that was configured and is unreachable.
|
|
351
|
+
*/
|
|
352
|
+
readonly egressProxyPort?: number;
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* The complete `docker run` argv, as a value.
|
|
356
|
+
*
|
|
357
|
+
* Extracted for the same reason {@link resolveNetwork} and
|
|
358
|
+
* {@link egressProxyOptions} were: everything downstream of it needs a running
|
|
359
|
+
* Docker daemon, so a confinement flag that never reached the argv — or one
|
|
360
|
+
* that reached it in an order that cancels another — could only be caught by an
|
|
361
|
+
* operator noticing its effect missing in production. Spawning a fake `docker`
|
|
362
|
+
* and reading back what it was handed proves what the fake was told and nothing
|
|
363
|
+
* about the container the daemon would build. Here the whole baseline is one
|
|
364
|
+
* array, and an edit that drops a flag fails a test rather than a deployment.
|
|
365
|
+
*
|
|
366
|
+
* Order matters in exactly two places, and both are asserted by the test that
|
|
367
|
+
* pins this: the image is the last argument, because everything after it is a
|
|
368
|
+
* command for the container rather than a flag for docker; and every flag that
|
|
369
|
+
* takes a value is pushed as two argv entries rather than one string, so no
|
|
370
|
+
* value is ever re-split by anything downstream.
|
|
371
|
+
*/
|
|
372
|
+
export declare function buildDockerRunArgs(input: DockerRunArgvInput): string[];
|
|
210
373
|
/**
|
|
211
374
|
* Validate and resolve a {@link ContainerSandboxLayout}. Returns a
|
|
212
375
|
* {@link ResolvedContainerSandboxLayout} with every container path
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/backends/docker/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAIH,OAAO,EACN,KAAK,sBAAsB,EAE3B,KAAK,8BAA8B,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/backends/docker/index.ts"],"names":[],"mappings":"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"}
|