@calltelemetry/ct-lab-mcp 0.8.97 → 0.8.99

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.
Files changed (75) hide show
  1. package/README.md +22 -0
  2. package/assets/stig/SHA256SUMS +18 -0
  3. package/assets/stig/files/ct-luks-firstboot.service +13 -0
  4. package/assets/stig/files/ct-luks-firstboot.sh +35 -0
  5. package/assets/stig/guest/keyhash.sh +4 -0
  6. package/assets/stig/guest/read-recovery.sh +2 -0
  7. package/assets/stig/guest/scan-disa.sh +17 -0
  8. package/assets/stig/guest/scan.sh +22 -0
  9. package/assets/stig/guest/shred-recovery.sh +2 -0
  10. package/assets/stig/guest/test-recovery.sh +3 -0
  11. package/assets/stig/guest/trim.sh +3 -0
  12. package/assets/stig/guest/verify-root.sh +9 -0
  13. package/assets/stig/guest/verify-user.sh +9 -0
  14. package/assets/stig/ks.cfg.pkrtpl +95 -0
  15. package/assets/stig/scripts/assess.sh +39 -0
  16. package/assets/stig/scripts/errata.sh +19 -0
  17. package/assets/stig/scripts/remediate.sh +127 -0
  18. package/assets/stig/scripts/seal.sh +46 -0
  19. package/assets/stig/tailoring.xml +16 -0
  20. package/assets/stig/template.pkr.hcl +252 -0
  21. package/dist/src/credentials/index.d.ts +1 -0
  22. package/dist/src/credentials/index.d.ts.map +1 -1
  23. package/dist/src/credentials/index.js +1 -0
  24. package/dist/src/credentials/index.js.map +1 -1
  25. package/dist/src/credentials/remediation.d.ts +33 -0
  26. package/dist/src/credentials/remediation.d.ts.map +1 -0
  27. package/dist/src/credentials/remediation.js +105 -0
  28. package/dist/src/credentials/remediation.js.map +1 -0
  29. package/dist/src/generated-version.d.ts +1 -1
  30. package/dist/src/generated-version.js +1 -1
  31. package/dist/src/stig/live.d.ts +116 -0
  32. package/dist/src/stig/live.d.ts.map +1 -0
  33. package/dist/src/stig/live.js +339 -0
  34. package/dist/src/stig/live.js.map +1 -0
  35. package/dist/src/stig/model.d.ts +160 -0
  36. package/dist/src/stig/model.d.ts.map +1 -0
  37. package/dist/src/stig/model.js +384 -0
  38. package/dist/src/stig/model.js.map +1 -0
  39. package/dist/src/stig/ports.d.ts +149 -0
  40. package/dist/src/stig/ports.d.ts.map +1 -0
  41. package/dist/src/stig/ports.js +7 -0
  42. package/dist/src/stig/ports.js.map +1 -0
  43. package/dist/src/stig/receipt.d.ts +35 -0
  44. package/dist/src/stig/receipt.d.ts.map +1 -0
  45. package/dist/src/stig/receipt.js +112 -0
  46. package/dist/src/stig/receipt.js.map +1 -0
  47. package/dist/src/stig/runner.d.ts +109 -0
  48. package/dist/src/stig/runner.d.ts.map +1 -0
  49. package/dist/src/stig/runner.js +471 -0
  50. package/dist/src/stig/runner.js.map +1 -0
  51. package/dist/src/tools/appliance-claim-spec-schema.v1.json +1 -1
  52. package/dist/src/tools/appliance-claim-tools.d.ts +10 -4
  53. package/dist/src/tools/appliance-claim-tools.d.ts.map +1 -1
  54. package/dist/src/tools/appliance-claim-tools.js +10 -2
  55. package/dist/src/tools/appliance-claim-tools.js.map +1 -1
  56. package/dist/src/tools/claim-creation-projection.d.ts +1 -1
  57. package/dist/src/tools/claim-creation-projection.js +1 -1
  58. package/dist/src/tools/claim-custody.d.ts +7 -7
  59. package/dist/src/tools/claimed-import-qcow.d.ts +2 -2
  60. package/dist/src/tools/credential-status.d.ts.map +1 -1
  61. package/dist/src/tools/credential-status.js +19 -0
  62. package/dist/src/tools/credential-status.js.map +1 -1
  63. package/dist/src/tools/host-maintenance-shutdown.d.ts +4 -4
  64. package/dist/src/tools/host-migrate-vm.d.ts +4 -4
  65. package/dist/src/tools/index.d.ts.map +1 -1
  66. package/dist/src/tools/index.js +6 -1
  67. package/dist/src/tools/index.js.map +1 -1
  68. package/dist/src/tools/purge-slots.d.ts +1 -1
  69. package/dist/src/tools/sandbox-tools.d.ts +8 -8
  70. package/dist/src/tools/stig-tools.d.ts +47 -0
  71. package/dist/src/tools/stig-tools.d.ts.map +1 -0
  72. package/dist/src/tools/stig-tools.js +125 -0
  73. package/dist/src/tools/stig-tools.js.map +1 -0
  74. package/dist/src/tools/vm-action.d.ts +2 -2
  75. package/package.json +2 -1
@@ -0,0 +1,384 @@
1
+ /**
2
+ * RHEL 8.10 STIG model: descriptor, receipt summary, guards and state machine (pure, no I/O).
3
+ *
4
+ * Mirror of ct-appliance-operator `src/stig.mjs` (docs/design/stig-claims.md). Both are tested against the same
5
+ * fixtures; keep them in step. The executor (Packer, qm, oscap) lives in ./runner.ts.
6
+ */
7
+ import { isDeepStrictEqual } from "node:util";
8
+ export const STIG_ANNOTATION = "calltelemetry.com/stig";
9
+ export const STIG_RECEIPT_ANNOTATION = "calltelemetry.com/stig-receipt";
10
+ export const STIG_STEP_ANNOTATION = "calltelemetry.com/stig-step";
11
+ export const STIG_DESCRIPTOR_SCHEMA = "calltelemetry-stig-claim/v1";
12
+ export const STIG_RECEIPT_SCHEMA = "calltelemetry-stig-receipt-summary/v1";
13
+ export const STIG_ANNOTATION_MAX_BYTES = 2048;
14
+ export const STIG_TTL_CAP_HOURS = 8760;
15
+ export const STIG_POOL_LIMIT_PERCENT = 70;
16
+ export const STIG_TEMPLATE_PREFIX = "rhel810-stig-";
17
+ export const STIG_MODES = ["build-template", "clone", "validate"];
18
+ export const STIG_DATASTREAM_SHA256 = "82592d3cff74a82ce652a65ba67cd755cf57550269798d4c449c2069417c1028";
19
+ export const STIG_TAILORING_SHA256 = "43560c40096a28b180685fe1383344a6d454a3a18666f2ead4a1ddd3d72ed7fd";
20
+ export const STIG_PROFILE_ID = "xccdf_com.calltelemetry_profile_stig_ct";
21
+ export const STIG_DVD_ISO = "synology-cisco-isos:iso/rhel-8.10-x86_64-dvd.iso";
22
+ export const STIG_PINS = Object.freeze({ ssg: "0.1.82", stig: "V2R8", packer: "1.16.0", packerProxmoxPlugin: "1.2.4" });
23
+ export const STIG_STEPS = Object.freeze({
24
+ "build-template": ["claim", "packer", "errata", "remediate", "scan", "seal", "verify-template", "renew", "complete"],
25
+ clone: ["claim", "pool-guard", "clone", "tpm", "cloud-init", "boot", "reencrypt", "escrow", "verify", "trim", "complete"],
26
+ validate: ["preflight", "scan", "receipt", "annotate", "complete"],
27
+ });
28
+ /** Steps during which a clone's disk is being fully re-allocated; only one clone may be here at a time. */
29
+ export const STIG_REENCRYPT_STEPS = ["boot", "reencrypt"];
30
+ export const COUNT_KEYS = ["pass", "fail", "notapplicable", "notchecked", "informational", "error"];
31
+ export const DISA_COUNT_KEYS = [...COUNT_KEYS, "unknown"];
32
+ export const DISA_PROFILE_ID = "xccdf_mil.disa.stig_profile_MAC-1_Classified";
33
+ export const DISA_BENCHMARK_FILE = "U_RHEL_8_V2R8_STIG_SCAP_1-3_Benchmark.xml";
34
+ const IPV4 = /^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
35
+ const HOST = /^[A-Za-z0-9]([A-Za-z0-9.-]{0,251}[A-Za-z0-9])?$/;
36
+ const SEMVER = /^\d+\.\d+\.\d+$/;
37
+ const SHA256 = /^[a-f0-9]{64}$/;
38
+ const TEMPLATE_REF = /^rhel810-stig-\d{8}-\d{4}$/;
39
+ const isObject = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
40
+ /* ---------------------------------------------------------------- secrets */
41
+ const SECRET_KEY = /pass(word|phrase)|secret|token|private|api[-_]?key|credential/i;
42
+ const SECRET_VALUE = [
43
+ /-----BEGIN [A-Z ]*(PRIVATE KEY|CERTIFICATE)/,
44
+ /\$[156y]\$[./A-Za-z0-9]{1,16}\$[./A-Za-z0-9]{8,}/,
45
+ /\bgh[pousr]_[A-Za-z0-9]{20,}/,
46
+ /PVEAPIToken=/i,
47
+ ];
48
+ /** Throws when a value carries secret material by value. Names of secrets (e.g. `doppler:KEY`) are fine. */
49
+ export function assertNoSecrets(value, path = "$") {
50
+ if (typeof value === "string") {
51
+ if (SECRET_VALUE.some((re) => re.test(value)))
52
+ throw new Error(`secret material refused at ${path}`);
53
+ const long = value.length >= 40 && /^[A-Za-z0-9+/=_-]+$/.test(value) && !/^[a-f0-9]{40,128}$/.test(value);
54
+ if (long)
55
+ throw new Error(`secret-like value refused at ${path}`);
56
+ return;
57
+ }
58
+ if (Array.isArray(value)) {
59
+ value.forEach((item, i) => assertNoSecrets(item, `${path}[${i}]`));
60
+ return;
61
+ }
62
+ if (isObject(value)) {
63
+ for (const [key, item] of Object.entries(value)) {
64
+ if (SECRET_KEY.test(key) && typeof item === "string" && item.length >= 8)
65
+ throw new Error(`secret field refused at ${path}.${key}`);
66
+ assertNoSecrets(item, `${path}.${key}`);
67
+ }
68
+ }
69
+ }
70
+ /** Masks anything secret-looking in a log line. Applied to every line the runner emits. */
71
+ export function redact(text) {
72
+ return String(text)
73
+ .replace(/-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?(-----END [A-Z ]*PRIVATE KEY-----|$)/g, "[redacted-key]")
74
+ .replace(/\$[156y]\$[./A-Za-z0-9]{1,16}\$[./A-Za-z0-9]{8,}/g, "[redacted-hash]")
75
+ .replace(/PVEAPIToken=\S+/gi, "PVEAPIToken=[redacted]")
76
+ .replace(/((?:pass(?:word|phrase)|secret|token|api[-_]?key)[A-Za-z_]*\s*[=:]\s*)\S+/gi, "$1[redacted]");
77
+ }
78
+ /* ------------------------------------------------------------- descriptor */
79
+ function exactKeys(obj, allowed, path, errors) {
80
+ for (const key of Object.keys(obj))
81
+ if (!allowed.includes(key))
82
+ errors.push(`${path}.${key} is unknown`);
83
+ }
84
+ export function validateStigDescriptor(d) {
85
+ const errors = [];
86
+ if (!isObject(d))
87
+ return { ok: false, errors: ["descriptor must be an object"], value: null };
88
+ exactKeys(d, ["schema", "mode", "profile", "template", "tailoring", "site", "pins"], "$", errors);
89
+ if (d.schema !== STIG_DESCRIPTOR_SCHEMA)
90
+ errors.push(`schema must be ${STIG_DESCRIPTOR_SCHEMA}`);
91
+ if (!STIG_MODES.includes(d.mode))
92
+ errors.push(`mode must be one of ${STIG_MODES.join(", ")}`);
93
+ if (d.profile !== "rhel8-stig")
94
+ errors.push("profile must be rhel8-stig");
95
+ if (d.mode === "build-template") {
96
+ if (d.template !== undefined)
97
+ errors.push("build-template must not name a template");
98
+ }
99
+ else if (STIG_MODES.includes(d.mode)) {
100
+ if (!isObject(d.template))
101
+ errors.push("template is required for clone and validate");
102
+ }
103
+ if (isObject(d.template)) {
104
+ exactKeys(d.template, ["ref", "vmid"], "$.template", errors);
105
+ if (typeof d.template.ref !== "string" || !TEMPLATE_REF.test(d.template.ref))
106
+ errors.push("template.ref must look like rhel810-stig-YYYYMMDD-VMID");
107
+ if (!Number.isInteger(d.template.vmid) || d.template.vmid < 100 || d.template.vmid > 8999)
108
+ errors.push("template.vmid must be an integer 100-8999");
109
+ }
110
+ if (!isObject(d.tailoring))
111
+ errors.push("tailoring is required");
112
+ else {
113
+ exactKeys(d.tailoring, ["ref", "sha256"], "$.tailoring", errors);
114
+ if (typeof d.tailoring.ref !== "string" || !/^xccdf_[A-Za-z0-9._-]+_profile_[A-Za-z0-9._-]+$/.test(d.tailoring.ref))
115
+ errors.push("tailoring.ref must be an XCCDF profile id");
116
+ if (d.tailoring.sha256 !== undefined && !SHA256.test(d.tailoring.sha256))
117
+ errors.push("tailoring.sha256 must be a sha256 hex digest");
118
+ }
119
+ if (!isObject(d.site))
120
+ errors.push("site is required");
121
+ else {
122
+ exactKeys(d.site, ["dns", "ntp", "adminKeyRef"], "$.site", errors);
123
+ if (!Array.isArray(d.site.dns) || d.site.dns.length < 1 || d.site.dns.length > 4 || !d.site.dns.every((ip) => typeof ip === "string" && IPV4.test(ip)))
124
+ errors.push("site.dns must be 1-4 IPv4 addresses");
125
+ if (!Array.isArray(d.site.ntp) || d.site.ntp.length > 4 || !d.site.ntp.every((h) => typeof h === "string" && (IPV4.test(h) || HOST.test(h))))
126
+ errors.push("site.ntp must be up to 4 hosts or IPv4 addresses");
127
+ if (typeof d.site.adminKeyRef !== "string" || !/^doppler:[A-Z][A-Z0-9_]{2,127}$/.test(d.site.adminKeyRef))
128
+ errors.push("site.adminKeyRef must be doppler:<KEY_NAME> (a name, never a value)");
129
+ }
130
+ if (!isObject(d.pins))
131
+ errors.push("pins is required");
132
+ else {
133
+ exactKeys(d.pins, ["ssg", "stig", "packer", "packerProxmoxPlugin"], "$.pins", errors);
134
+ if (typeof d.pins.ssg !== "string" || !SEMVER.test(d.pins.ssg))
135
+ errors.push("pins.ssg must be a pinned x.y.z version");
136
+ if (typeof d.pins.stig !== "string" || !/^V\d+R\d+$/.test(d.pins.stig))
137
+ errors.push("pins.stig must look like V2R8");
138
+ if (typeof d.pins.packer !== "string" || !SEMVER.test(d.pins.packer))
139
+ errors.push("pins.packer must be a pinned x.y.z version");
140
+ if (typeof d.pins.packerProxmoxPlugin !== "string" || !SEMVER.test(d.pins.packerProxmoxPlugin))
141
+ errors.push("pins.packerProxmoxPlugin must be a pinned x.y.z version");
142
+ }
143
+ if (errors.length === 0) {
144
+ try {
145
+ assertNoSecrets(d);
146
+ }
147
+ catch (error) {
148
+ errors.push(error.message);
149
+ }
150
+ }
151
+ return { ok: errors.length === 0, errors, value: errors.length === 0 ? d : null };
152
+ }
153
+ export function stigDescriptor(claim) {
154
+ if (isObject(claim?.spec?.stig))
155
+ return claim.spec.stig;
156
+ const raw = claim?.metadata?.annotations?.[STIG_ANNOTATION];
157
+ if (raw === undefined || raw === null)
158
+ return null;
159
+ if (typeof raw !== "string")
160
+ throw new Error("stig annotation must be a string");
161
+ if (Buffer.byteLength(raw) > STIG_ANNOTATION_MAX_BYTES)
162
+ throw new Error(`stig annotation exceeds ${STIG_ANNOTATION_MAX_BYTES} bytes`);
163
+ try {
164
+ return JSON.parse(raw);
165
+ }
166
+ catch {
167
+ throw new Error("stig annotation is not valid JSON");
168
+ }
169
+ }
170
+ /** The default descriptor for a mode, from the verified pins and site values. */
171
+ export function defaultDescriptor(mode, opts) {
172
+ const d = {
173
+ schema: STIG_DESCRIPTOR_SCHEMA, mode, profile: "rhel8-stig",
174
+ ...(mode === "build-template" ? {} : { template: opts.template }),
175
+ tailoring: { ref: "xccdf_com.calltelemetry_profile_stig_ct", ...(opts.tailoringSha256 ? { sha256: opts.tailoringSha256 } : {}) },
176
+ site: { dns: opts.dns ?? ["192.168.126.1", "192.168.68.125"], ntp: opts.ntp ?? [], adminKeyRef: opts.adminKeyRef },
177
+ pins: { ...STIG_PINS },
178
+ };
179
+ const checked = validateStigDescriptor(d);
180
+ if (!checked.ok)
181
+ throw new Error(`invalid STIG descriptor: ${checked.errors.join("; ")}`);
182
+ return d;
183
+ }
184
+ /* ------------------------------------------------------- scan result parsing */
185
+ export function parseKv(text) {
186
+ const out = {};
187
+ for (const line of String(text).split("\n")) {
188
+ if (!line.includes("=") || line.startsWith("#"))
189
+ continue;
190
+ const i = line.indexOf("=");
191
+ out[line.slice(0, i).trim()] = line.slice(i + 1).trim();
192
+ }
193
+ return out;
194
+ }
195
+ const emptyCounts = () => ({ pass: 0, fail: 0, notapplicable: 0, notchecked: 0, informational: 0, error: 0 });
196
+ export function countArfResults(xml) {
197
+ const counts = emptyCounts();
198
+ const re = /<(?:\w+:)?rule-result\b[^>]*>[\s\S]*?<(?:\w+:)?result>(\w+)<\//g;
199
+ let m;
200
+ while ((m = re.exec(String(xml))) !== null)
201
+ if (m[1] in counts)
202
+ counts[m[1]] += 1;
203
+ return counts;
204
+ }
205
+ /** Same counting as the shell recipe: `grep -c "^Result.*<kind>$"` over `oscap xccdf eval` stdout. */
206
+ export function parseOscapStdoutCounts(text) {
207
+ const counts = emptyCounts();
208
+ for (const line of String(text).split("\n")) {
209
+ const m = /^Result.*?(pass|fail|notapplicable|notchecked|informational|error)$/.exec(line);
210
+ if (m)
211
+ counts[m[1]] += 1;
212
+ }
213
+ return counts;
214
+ }
215
+ export function countsFromKv(kv) {
216
+ const counts = emptyCounts();
217
+ for (const k of COUNT_KEYS)
218
+ counts[k] = Number.parseInt(kv[`result_${k}`] ?? "0", 10) || 0;
219
+ return counts;
220
+ }
221
+ function failZeroOf(counts) {
222
+ const c = counts || {};
223
+ const total = DISA_COUNT_KEYS.reduce((n, k) => n + (Number.isInteger(c[k]) ? c[k] : 0), 0);
224
+ return total > 0 && c.fail === 0 && (c.error ?? 0) === 0;
225
+ }
226
+ /** fail=0 gate. With a DISA scan present, BOTH scans must be fail=0 (and error=0); an empty scan never passes. */
227
+ export function receiptGate(counts, disa) {
228
+ const ssg = failZeroOf(counts);
229
+ if (disa === undefined)
230
+ return { failZero: ssg };
231
+ const d = failZeroOf(disa);
232
+ return { failZero: ssg && d, disaFailZero: d };
233
+ }
234
+ export function disaCountsFromKv(kv, prefix = "result_") {
235
+ const counts = { ...emptyCounts(), unknown: 0 };
236
+ for (const k of DISA_COUNT_KEYS)
237
+ counts[k] = Number.parseInt(kv[`${prefix}${k}`] ?? "0", 10) || 0;
238
+ return counts;
239
+ }
240
+ export function buildReceiptSummary(receipt, opts = {}) {
241
+ const mode = opts.mode || "clone";
242
+ const scan = mode === "build-template" ? receipt.template_scan : receipt.clone_scan;
243
+ const counts = countsFromKv(Object.fromEntries(Object.entries(scan || {}).map(([k, v]) => [k, String(v)])));
244
+ const art = receipt.artifacts_sha256 || {};
245
+ return {
246
+ schema: STIG_RECEIPT_SCHEMA, mode, template: receipt.template?.name, counts, gate: receiptGate(counts, opts.disa?.counts),
247
+ ...(opts.disa ? { disa: opts.disa } : {}),
248
+ versions: {
249
+ rhel: receipt.os?.release, kernel: receipt.os?.kernel, ssg: receipt.stig?.ssg_datastream_version,
250
+ stig: receipt.stig?.version, packer: STIG_PINS.packer, packerProxmoxPlugin: STIG_PINS.packerProxmoxPlugin,
251
+ ...(opts.openscap ? { openscap: opts.openscap } : {}),
252
+ },
253
+ sha256: {
254
+ datastream: receipt.stig?.datastream_sha256, tailoring: receipt.stig?.tailoring_sha256,
255
+ arf: opts.arfSha256 || (mode === "build-template" ? art.template_arf : art.clone_arf),
256
+ report: opts.reportSha256 || (mode === "build-template" ? art.template_report_html : art.clone_report_html),
257
+ },
258
+ ...(opts.keyDigest ? { keyDigest: opts.keyDigest } : {}),
259
+ validatedAt: opts.validatedAt || new Date().toISOString(),
260
+ };
261
+ }
262
+ const SUMMARY_KEYS = ["schema", "mode", "template", "counts", "gate", "disa", "versions", "sha256", "keyDigest", "validatedAt"];
263
+ const VERSION_KEYS = ["rhel", "kernel", "ssg", "stig", "openscap", "packer", "packerProxmoxPlugin"];
264
+ const SHA_KEYS = ["datastream", "tailoring", "arf", "report"];
265
+ export function validateReceiptSummary(s) {
266
+ if (!isObject(s) || s.schema !== STIG_RECEIPT_SCHEMA)
267
+ return null;
268
+ if (Object.keys(s).some((k) => !SUMMARY_KEYS.includes(k)))
269
+ return null;
270
+ if (!STIG_MODES.includes(s.mode) || typeof s.template !== "string" || !TEMPLATE_REF.test(s.template))
271
+ return null;
272
+ if (!isObject(s.counts) || COUNT_KEYS.some((k) => !Number.isInteger(s.counts[k]) || s.counts[k] < 0) || Object.keys(s.counts).length !== COUNT_KEYS.length)
273
+ return null;
274
+ if (!isObject(s.versions) || Object.keys(s.versions).some((k) => !VERSION_KEYS.includes(k) || typeof s.versions[k] !== "string" || s.versions[k].length > 80))
275
+ return null;
276
+ if (!isObject(s.sha256) || Object.keys(s.sha256).some((k) => !SHA_KEYS.includes(k) || !SHA256.test(s.sha256[k])))
277
+ return null;
278
+ if (s.keyDigest !== undefined && !SHA256.test(s.keyDigest))
279
+ return null;
280
+ if (s.disa !== undefined) {
281
+ const d = s.disa;
282
+ if (!isObject(d) || Object.keys(d).some((k) => !["profile", "benchmarkSha256", "counts"].includes(k)))
283
+ return null;
284
+ if (typeof d.profile !== "string" || !/^xccdf_[A-Za-z0-9._-]+$/.test(d.profile) || !SHA256.test(d.benchmarkSha256))
285
+ return null;
286
+ if (!isObject(d.counts) || DISA_COUNT_KEYS.some((k) => !Number.isInteger(d.counts[k]) || d.counts[k] < 0) || Object.keys(d.counts).length !== DISA_COUNT_KEYS.length)
287
+ return null;
288
+ }
289
+ if (typeof s.validatedAt !== "string" || s.validatedAt.length > 40)
290
+ return null;
291
+ try {
292
+ assertNoSecrets(s);
293
+ }
294
+ catch {
295
+ return null;
296
+ }
297
+ return { ...s, gate: receiptGate(s.counts, s.disa?.counts) };
298
+ }
299
+ /** Same projection the operator performs (CT_OPERATOR_STIG=1), so a tool can show what status.stig will carry. */
300
+ export function stigStatusPreview(claim, now = new Date().toISOString()) {
301
+ const raw = claim?.metadata?.annotations?.[STIG_RECEIPT_ANNOTATION];
302
+ if (typeof raw !== "string" || Buffer.byteLength(raw) > STIG_ANNOTATION_MAX_BYTES)
303
+ return null;
304
+ let parsed;
305
+ try {
306
+ parsed = JSON.parse(raw);
307
+ }
308
+ catch {
309
+ return null;
310
+ }
311
+ const summary = validateReceiptSummary(parsed);
312
+ if (!summary)
313
+ return null;
314
+ return summary.gate.failZero
315
+ ? { stig: summary }
316
+ : { stig: summary, conditions: [{ type: "StigGateFailed", status: "True", lastTransitionTime: now, reason: "FailZeroNotMet", message: `fail=${summary.counts.fail} error=${summary.counts.error}${summary.disa ? ` disaFail=${summary.disa.counts.fail} disaError=${summary.disa.counts.error}` : ""}` }] };
317
+ }
318
+ export { isDeepStrictEqual };
319
+ /* ------------------------------------------------------------------ guards */
320
+ export function capTtl(hours) {
321
+ if (!Number.isInteger(hours))
322
+ throw new Error("ttlHours must be an integer");
323
+ if (hours <= 0)
324
+ throw new Error("ttlHours must be finite (> 0); permanent claims are GitOps fixtures");
325
+ if (hours > STIG_TTL_CAP_HOURS)
326
+ throw new Error(`ttlHours ${hours} is above the ${STIG_TTL_CAP_HOURS}h cap`);
327
+ return hours;
328
+ }
329
+ export function planTemplateRenewal(claim, now = Date.now(), marginHours = 1) {
330
+ const start = Date.parse(claim?.status?.completionTime || "");
331
+ const previous = claim?.spec?.ttlHours ?? 24;
332
+ const elapsedHours = Number.isFinite(start) ? Math.max(0, Math.ceil((now - start) / 3_600_000)) : 0;
333
+ const extendHours = STIG_TTL_CAP_HOURS - elapsedHours - marginHours;
334
+ if (extendHours < 1)
335
+ return { ok: false, error: `claim is ${elapsedHours}h old; no renewal headroom under the ${STIG_TTL_CAP_HOURS}h cap`, elapsedHours };
336
+ return { ok: true, elapsedHours, extendHours, previousTtlHours: previous, newTtlHours: Math.max(previous, elapsedHours + extendHours) };
337
+ }
338
+ export function assertPoolBelow(percent, limit = STIG_POOL_LIMIT_PERCENT) {
339
+ if (typeof percent !== "number" || !Number.isFinite(percent))
340
+ throw new Error("thin pool usage is unreadable; refusing to re-encrypt");
341
+ if (percent > limit)
342
+ throw new Error(`thin pool at ${percent}% exceeds the ${limit}% limit; trim or free space before re-encrypting`);
343
+ }
344
+ export function assertSingleReencrypt(claims, selfName) {
345
+ for (const c of claims || []) {
346
+ if (c?.metadata?.name === selfName)
347
+ continue;
348
+ const step = c?.metadata?.annotations?.[STIG_STEP_ANNOTATION];
349
+ let d = null;
350
+ try {
351
+ d = stigDescriptor(c);
352
+ }
353
+ catch { /* unreadable descriptor: not a re-encrypting clone */ }
354
+ if (d?.mode === "clone" && STIG_REENCRYPT_STEPS.includes(step)) {
355
+ throw new Error(`clone ${c.metadata.name} is still re-encrypting; only one at a time`);
356
+ }
357
+ }
358
+ }
359
+ export function assertTemplateReleaseAllowed(input) {
360
+ const { guest, claim, destroyConfirmed } = input;
361
+ if (!(guest?.template === 1 || guest?.template === true))
362
+ throw new Error(`VM ${guest?.vmid} is not a template; use delete_appliance_claim`);
363
+ if (typeof guest.name !== "string" || !guest.name.startsWith(STIG_TEMPLATE_PREFIX))
364
+ throw new Error(`template name must start with ${STIG_TEMPLATE_PREFIX}`);
365
+ if (claim?.spec?.vmid !== guest.vmid || claim?.spec?.vmName !== guest.name)
366
+ throw new Error("the claim does not name this template (vmid and vmName)");
367
+ const d = stigDescriptor(claim);
368
+ if (d?.mode !== "build-template")
369
+ throw new Error("the claim is not a build-template STIG claim");
370
+ if (destroyConfirmed !== true)
371
+ throw new Error("template destroy must be explicitly confirmed");
372
+ return { ok: true, sequence: ["destroy-template", "delete-claim"] };
373
+ }
374
+ /* ------------------------------------------------------------ state machine */
375
+ export function nextStigStep(mode, current) {
376
+ const steps = STIG_STEPS[mode];
377
+ if (!steps)
378
+ throw new Error(`unknown mode ${mode}`);
379
+ const i = steps.indexOf(current);
380
+ if (i < 0)
381
+ throw new Error(`unknown step ${current} for mode ${mode}`);
382
+ return steps[i + 1] ?? null;
383
+ }
384
+ //# sourceMappingURL=model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../../../src/stig/model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,149 @@
1
+ /**
2
+ * Ports the STIG runner depends on. Every side effect (Proxmox shell, guest SSH, Doppler, Packer, claims, key
3
+ * material, time) crosses one of these, so the runner is unit-testable with fakes and the live adapters in
4
+ * ./live.ts are the only code that touches the lab.
5
+ */
6
+ export interface ShellResult {
7
+ code: number;
8
+ stdout: string;
9
+ stderr: string;
10
+ }
11
+ export interface RunOpts {
12
+ stdin?: string;
13
+ timeoutMs?: number;
14
+ }
15
+ /** root shell on the Proxmox host (interim path: the canonical bridge has no clone-with-fresh-TPM verb yet). */
16
+ export interface PveShell {
17
+ run(script: string, opts?: RunOpts): Promise<ShellResult>;
18
+ }
19
+ /** SSH to one clone as the cloud-init admin. Scripts run as files so stdin stays free for the sudo password. */
20
+ export interface GuestShell {
21
+ configure(cfg: {
22
+ user: string;
23
+ keyFile: string;
24
+ knownHostsFile: string;
25
+ }): void;
26
+ setTarget(ip: string): void;
27
+ /** Runs `script` (file contents) with bash. When `sudo` is set, `stdin` is `<sudo password>\n<extra stdin>`. */
28
+ runScript(script: string, opts?: {
29
+ sudo?: boolean;
30
+ stdin?: string;
31
+ timeoutMs?: number;
32
+ }): Promise<ShellResult>;
33
+ /** true once `ssh true` succeeds; hostKey "accept-new" pins on first contact, "yes" requires the pinned key. */
34
+ waitSsh(hostKey: "accept-new" | "yes", tries: number, intervalMs?: number): Promise<boolean>;
35
+ fileExists(path: string): Promise<boolean>;
36
+ /** Copies a remote directory's contents into a local directory. */
37
+ fetchDir(remote: string, localDir: string): Promise<void>;
38
+ }
39
+ /** Doppler by NAME. Values never appear in logs or return values of the runner. */
40
+ export interface SecretStore {
41
+ get(name: string): Promise<string | undefined>;
42
+ set(name: string, value: string): Promise<void>;
43
+ }
44
+ export interface ClaimRecord {
45
+ metadata: {
46
+ name: string;
47
+ uid: string;
48
+ annotations?: Record<string, string>;
49
+ };
50
+ spec: Record<string, any>;
51
+ status?: Record<string, any>;
52
+ }
53
+ export interface ClaimPort {
54
+ list(): Promise<ClaimRecord[]>;
55
+ get(name: string): Promise<ClaimRecord | null>;
56
+ /** Guarded create (custody annotation included). Must be profile=bare with a finite TTL. */
57
+ create(a: {
58
+ name: string;
59
+ vmid: number;
60
+ vmName: string;
61
+ ttlHours: number;
62
+ stig: Record<string, unknown>;
63
+ }): Promise<ClaimRecord>;
64
+ /** Blocks until an operator reconciled the claim to Ready, or throws. */
65
+ waitReady(name: string): Promise<ClaimRecord>;
66
+ annotate(name: string, annotations: Record<string, string>): Promise<void>;
67
+ renew(name: string, extendHours: number): Promise<{
68
+ ttlHours: number;
69
+ }>;
70
+ pause(name: string, paused: boolean, reason?: string): Promise<void>;
71
+ delete(name: string, expectedUid: string): Promise<void>;
72
+ }
73
+ export interface PackerPort {
74
+ version(): Promise<string>;
75
+ build(a: {
76
+ vars: Record<string, string>;
77
+ env: Record<string, string>;
78
+ logFile: string;
79
+ }): Promise<number>;
80
+ }
81
+ export interface BuildMaterial {
82
+ sshPrivateKeyFile: string;
83
+ sshPublicKey: string;
84
+ buildPassword: string;
85
+ buildPasswordHash: string;
86
+ grubPbkdf2: string;
87
+ luksBootstrap: string;
88
+ }
89
+ /** Key material generation (ssh-keygen ECDSA P-256, OpenSSL 3 sha512-crypt, PBKDF2). */
90
+ export interface Materials {
91
+ buildMaterial(runDir: string, label: string): Promise<BuildMaterial>;
92
+ /** ECDSA P-256 key pair into `dir`; returns the public key line. FIPS rejects ed25519. */
93
+ sshKeypair(dir: string, label: string): Promise<{
94
+ privateKeyFile: string;
95
+ publicKey: string;
96
+ }>;
97
+ randomAlnum(length: number): string;
98
+ sha512Crypt(plain: string): Promise<string>;
99
+ }
100
+ export interface Clock {
101
+ now(): number;
102
+ sleep(ms: number): Promise<void>;
103
+ }
104
+ export interface Logger {
105
+ info(line: string): void;
106
+ }
107
+ /**
108
+ * Canonical Proxmox mutations (the lab-inventory `stig` verbs). When present, the runner uses it instead of raw `qm`
109
+ * over SSH for clone (full clone, fresh TPM, cloud-init, VLAN126, start), template destroy and the guest-agent IP.
110
+ */
111
+ export interface StigProvider {
112
+ clone(a: {
113
+ operationId: string;
114
+ name: string;
115
+ templateName: string;
116
+ vmid: number;
117
+ claimedVmids: number[];
118
+ sshPublicKey: string;
119
+ passwordHash: string;
120
+ dns: string[];
121
+ }): Promise<{
122
+ vmid: number;
123
+ }>;
124
+ destroyTemplate(a: {
125
+ operationId: string;
126
+ name: string;
127
+ vmid: number;
128
+ }): Promise<void>;
129
+ guestIp(vmid: number): Promise<string>;
130
+ }
131
+ export interface StigDeps {
132
+ /** Canonical provider for guest mutations; absent means the root-SSH `qm` fallback. */
133
+ provider?: StigProvider;
134
+ pve: PveShell;
135
+ guest: GuestShell;
136
+ secrets: SecretStore;
137
+ claims: ClaimPort;
138
+ packer: PackerPort;
139
+ materials: Materials;
140
+ clock: Clock;
141
+ log: Logger;
142
+ /** Directory for run evidence (mode 0700, never committed). */
143
+ baseDir: string;
144
+ /** Directory holding the shipped recipe (assets/stig). */
145
+ assetsDir: string;
146
+ /** Reads a file of the shipped recipe. */
147
+ readAsset(relative: string): string;
148
+ }
149
+ //# sourceMappingURL=ports.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../../../src/stig/ports.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Ports the STIG runner depends on. Every side effect (Proxmox shell, guest SSH, Doppler, Packer, claims, key
3
+ * material, time) crosses one of these, so the runner is unit-testable with fakes and the live adapters in
4
+ * ./live.ts are the only code that touches the lab.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=ports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ports.js","sourceRoot":"","sources":["../../../src/stig/ports.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,35 @@
1
+ type Json = Record<string, any>;
2
+ export declare const MANUAL_EVIDENCE_NOTES: Readonly<Record<string, string>>;
3
+ export declare const sha256File: (path: string) => string;
4
+ /** Python `datetime.fromtimestamp(mtime, utc).isoformat()`: microsecond precision, +00:00 suffix. */
5
+ export declare function pythonIsoUtc(mtimeNs: bigint): string;
6
+ export interface ReceiptInputs {
7
+ /** Template run name, e.g. rhel810-stig-20261016-8102. */
8
+ template: string;
9
+ clone: string;
10
+ /** runs/<template> directory (contains evidence/stig-report). */
11
+ runDir: string;
12
+ /** runs/clone-<clone> directory (contains evidence/ and verify.txt, keyhash.txt). */
13
+ cloneDir: string;
14
+ /** runs/clone-<proof> directory used for the two-clone proof. */
15
+ proofDir: string;
16
+ proofName?: string;
17
+ /** Pinned SSG datastream; when absent the digest recorded in summary.txt is used. */
18
+ datastreamPath?: string;
19
+ }
20
+ export declare function buildReceipt(i: ReceiptInputs): Json;
21
+ export declare function renderReceiptMarkdown(rec: Json, summary: {
22
+ result_pass: string;
23
+ result_fail: string;
24
+ result_notapplicable: string;
25
+ result_notchecked: string;
26
+ }, cloneSummary: Record<string, string>, errataApplied: string | undefined, securityOutstanding: string | undefined, manualEvidence: string): string;
27
+ /** Convenience: build both artifacts from evidence on disk. */
28
+ export declare function buildReceiptFiles(i: ReceiptInputs): {
29
+ json: string;
30
+ markdown: string;
31
+ receipt: Json;
32
+ };
33
+ export declare const SCAN_COUNT_KEYS: readonly ["pass", "fail", "notapplicable", "notchecked", "informational", "error"];
34
+ export {};
35
+ //# sourceMappingURL=receipt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"receipt.d.ts","sourceRoot":"","sources":["../../../src/stig/receipt.ts"],"names":[],"mappings":"AAUA,KAAK,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAEhC,eAAO,MAAM,qBAAqB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAWjE,CAAC;AAEH,eAAO,MAAM,UAAU,GAAI,MAAM,MAAM,KAAG,MAAuE,CAAC;AAElH,qGAAqG;AACrG,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAUpD;AAED,MAAM,WAAW,aAAa;IAC5B,0DAA0D;IAC1D,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,iEAAiE;IACjE,MAAM,EAAE,MAAM,CAAC;IACf,qFAAqF;IACrF,QAAQ,EAAE,MAAM,CAAC;IACjB,iEAAiE;IACjE,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qFAAqF;IACrF,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,aAAa,GAAG,IAAI,CAyCnD;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,oBAAoB,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAA;CAAE,EAAE,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,aAAa,EAAE,MAAM,GAAG,SAAS,EAAE,mBAAmB,EAAE,MAAM,GAAG,SAAS,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,CAsBjT;AAED,+DAA+D;AAC/D,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,aAAa,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,IAAI,CAAA;CAAE,CASrG;AAED,eAAO,MAAM,eAAe,oFAAa,CAAC"}