@calltelemetry/ct-lab-mcp 0.8.98 → 0.8.100
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/assets/stig/SHA256SUMS +18 -0
- package/assets/stig/files/ct-luks-firstboot.service +13 -0
- package/assets/stig/files/ct-luks-firstboot.sh +35 -0
- package/assets/stig/guest/keyhash.sh +4 -0
- package/assets/stig/guest/read-recovery.sh +2 -0
- package/assets/stig/guest/scan-disa.sh +17 -0
- package/assets/stig/guest/scan.sh +22 -0
- package/assets/stig/guest/shred-recovery.sh +2 -0
- package/assets/stig/guest/test-recovery.sh +3 -0
- package/assets/stig/guest/trim.sh +3 -0
- package/assets/stig/guest/verify-root.sh +9 -0
- package/assets/stig/guest/verify-user.sh +9 -0
- package/assets/stig/ks.cfg.pkrtpl +95 -0
- package/assets/stig/scripts/assess.sh +39 -0
- package/assets/stig/scripts/errata.sh +19 -0
- package/assets/stig/scripts/remediate.sh +127 -0
- package/assets/stig/scripts/seal.sh +46 -0
- package/assets/stig/tailoring.xml +16 -0
- package/assets/stig/template.pkr.hcl +252 -0
- package/dist/src/generated-version.d.ts +1 -1
- package/dist/src/generated-version.d.ts.map +1 -1
- package/dist/src/generated-version.js +1 -1
- package/dist/src/generated-version.js.map +1 -1
- package/dist/src/provenance.d.ts.map +1 -1
- package/dist/src/provenance.js +18 -1
- package/dist/src/provenance.js.map +1 -1
- package/dist/src/stig/live.d.ts +116 -0
- package/dist/src/stig/live.d.ts.map +1 -0
- package/dist/src/stig/live.js +339 -0
- package/dist/src/stig/live.js.map +1 -0
- package/dist/src/stig/model.d.ts +160 -0
- package/dist/src/stig/model.d.ts.map +1 -0
- package/dist/src/stig/model.js +384 -0
- package/dist/src/stig/model.js.map +1 -0
- package/dist/src/stig/ports.d.ts +149 -0
- package/dist/src/stig/ports.d.ts.map +1 -0
- package/dist/src/stig/ports.js +7 -0
- package/dist/src/stig/ports.js.map +1 -0
- package/dist/src/stig/receipt.d.ts +35 -0
- package/dist/src/stig/receipt.d.ts.map +1 -0
- package/dist/src/stig/receipt.js +112 -0
- package/dist/src/stig/receipt.js.map +1 -0
- package/dist/src/stig/runner.d.ts +109 -0
- package/dist/src/stig/runner.d.ts.map +1 -0
- package/dist/src/stig/runner.js +471 -0
- package/dist/src/stig/runner.js.map +1 -0
- package/dist/src/tools/appliance-claim-spec-schema.v1.json +1 -1
- package/dist/src/tools/appliance-claim-tools.d.ts +10 -4
- package/dist/src/tools/appliance-claim-tools.d.ts.map +1 -1
- package/dist/src/tools/appliance-claim-tools.js +10 -2
- package/dist/src/tools/appliance-claim-tools.js.map +1 -1
- package/dist/src/tools/claim-creation-projection.d.ts +1 -1
- package/dist/src/tools/claim-creation-projection.js +1 -1
- package/dist/src/tools/claim-custody.d.ts +7 -7
- package/dist/src/tools/claimed-import-qcow.d.ts +2 -2
- package/dist/src/tools/host-maintenance-shutdown.d.ts +4 -4
- package/dist/src/tools/host-migrate-vm.d.ts +4 -4
- package/dist/src/tools/index.d.ts.map +1 -1
- package/dist/src/tools/index.js +3 -0
- package/dist/src/tools/index.js.map +1 -1
- package/dist/src/tools/purge-slots.d.ts +1 -1
- package/dist/src/tools/sandbox-tools.d.ts +8 -8
- package/dist/src/tools/stig-tools.d.ts +47 -0
- package/dist/src/tools/stig-tools.d.ts.map +1 -0
- package/dist/src/tools/stig-tools.js +125 -0
- package/dist/src/tools/stig-tools.js.map +1 -0
- package/dist/src/tools/vm-action.d.ts +2 -2
- package/package.json +2 -1
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* STIG receipt builder: a faithful port of the known-good `receipt.sh` (ct-meta rhel8-stig-template skill).
|
|
3
|
+
* Reads run evidence from disk, returns the same JSON object and Markdown the shell recipe writes.
|
|
4
|
+
* Parity with the shell output is asserted by test/stig/receipt.test.ts and tools/stig-parity.mjs.
|
|
5
|
+
*/
|
|
6
|
+
import { createHash } from "node:crypto";
|
|
7
|
+
import { readFileSync, statSync } from "node:fs";
|
|
8
|
+
import { join } from "node:path";
|
|
9
|
+
import { parseKv, COUNT_KEYS } from "./model.js";
|
|
10
|
+
export const MANUAL_EVIDENCE_NOTES = Object.freeze({
|
|
11
|
+
encrypt_partitions: "LUKS2 on the LVM PV; see 'encrypt_partitions' sections of manual-evidence (lsblk -f, luksDump header).",
|
|
12
|
+
security_patches_up_to_date: "dnf updateinfo security count after errata (0 outstanding); see manual-evidence.",
|
|
13
|
+
selinux_user_login_roles: "semanage login -l: __default__ -> staff_u; sudo elevates to sysadm_r.",
|
|
14
|
+
configured_firewalld_default_deny: "default zone drop; drop zone lists only ssh (see manual-evidence).",
|
|
15
|
+
configure_firewalld_ports: "only ssh allowed in drop zone (see manual-evidence).",
|
|
16
|
+
account_temp_expire_date: "no temporary accounts exist (see manual-evidence).",
|
|
17
|
+
accounts_user_home_paths_only: "manual: no user PATH points outside local directories; default profile only.",
|
|
18
|
+
ssh_keys_passphrase_protected: "no private SSH keys in user homes (see manual-evidence).",
|
|
19
|
+
sssd_has_trust_anchor: "customer supplies the CAC trust anchor; certmap rule present in /etc/sssd/sssd.conf.",
|
|
20
|
+
auditd_audispd_configure_sufficiently_large_partition: "audit log LV is 8 GiB (see manual-evidence).",
|
|
21
|
+
});
|
|
22
|
+
export const sha256File = (path) => createHash("sha256").update(readFileSync(path)).digest("hex");
|
|
23
|
+
/** Python `datetime.fromtimestamp(mtime, utc).isoformat()`: microsecond precision, +00:00 suffix. */
|
|
24
|
+
export function pythonIsoUtc(mtimeNs) {
|
|
25
|
+
let micros = mtimeNs / 1000n;
|
|
26
|
+
const rem = mtimeNs % 1000n;
|
|
27
|
+
if (rem > 500n || (rem === 500n && micros % 2n === 1n))
|
|
28
|
+
micros += 1n; // round half even, like float->datetime
|
|
29
|
+
const ms = Number(micros / 1000n);
|
|
30
|
+
const us = Number(micros % 1000n);
|
|
31
|
+
const iso = new Date(ms).toISOString(); // 2026-10-16T16:09:03.387Z
|
|
32
|
+
const base = iso.slice(0, 19);
|
|
33
|
+
const frac = String(Number(iso.slice(20, 23))).padStart(3, "0") + String(us).padStart(3, "0");
|
|
34
|
+
return frac === "000000" ? `${base}+00:00` : `${base}.${frac}+00:00`;
|
|
35
|
+
}
|
|
36
|
+
export function buildReceipt(i) {
|
|
37
|
+
const ev = join(i.runDir, "evidence", "stig-report");
|
|
38
|
+
const read = (p) => readFileSync(p, "utf8");
|
|
39
|
+
const summ = parseKv(read(join(ev, "summary.txt")));
|
|
40
|
+
const err = parseKv(read(join(ev, "errata.txt")));
|
|
41
|
+
const csum = parseKv(read(join(i.cloneDir, "evidence", "clone-summary.txt")));
|
|
42
|
+
const ver = parseKv(read(join(i.cloneDir, "verify.txt")));
|
|
43
|
+
const nc = [...read(join(i.cloneDir, "evidence", "clone-notchecked.txt")).matchAll(/Title\s+(.*)\nRule\s+xccdf_org\.ssgproject\.content_rule_(\S+)/g)];
|
|
44
|
+
const proofName = i.proofName ?? "ct-rhel8-stig-proof2";
|
|
45
|
+
const keyhash = read(join(i.cloneDir, "keyhash.txt")).trim();
|
|
46
|
+
const proofHash = read(join(i.proofDir, "keyhash.txt")).trim();
|
|
47
|
+
const scanOf = (kv) => Object.fromEntries(Object.entries(kv).filter(([k]) => k.startsWith("result_")).map(([k, v]) => [k, Number.parseInt(v, 10)]));
|
|
48
|
+
const built = pythonIsoUtc(statSync(join(ev, "summary.txt"), { bigint: true }).mtimeNs);
|
|
49
|
+
const ssgRpm = read(join(ev, "summary.txt")).split("\n").filter((l) => l.startsWith("scap-security-guide"))[0].trim();
|
|
50
|
+
return {
|
|
51
|
+
template: { name: i.template, vmid: Number.parseInt(i.template.slice(i.template.lastIndexOf("-") + 1), 10), built },
|
|
52
|
+
os: { release: summ.VERSION_ID.replace(/^"|"$/g, ""), kernel: summ.kernel, errata: err },
|
|
53
|
+
stig: {
|
|
54
|
+
name: "DISA RHEL 8 STIG", version: "V2R8", profile: "xccdf_org.ssgproject.content_profile_stig",
|
|
55
|
+
tailored_profile: "xccdf_com.calltelemetry_profile_stig_ct", ssg_rpm: ssgRpm, ssg_datastream_version: "0.1.82",
|
|
56
|
+
datastream_sha256: i.datastreamPath ? sha256File(i.datastreamPath) : summ.ds_sha256,
|
|
57
|
+
tailoring_sha256: sha256File(join(ev, "tailoring.xml")),
|
|
58
|
+
},
|
|
59
|
+
template_scan: scanOf(summ),
|
|
60
|
+
clone_scan: { clone: i.clone, ...scanOf(csum) },
|
|
61
|
+
notchecked: nc.map((m) => ({ rule: m[2], title: m[1], manual_evidence: MANUAL_EVIDENCE_NOTES[m[2]] ?? "manual review required" })),
|
|
62
|
+
artifacts_sha256: {
|
|
63
|
+
template_arf: sha256File(join(ev, "final-arf.xml")),
|
|
64
|
+
template_report_html: sha256File(join(ev, "final-report.html")),
|
|
65
|
+
template_rpm_list: sha256File(join(ev, "rpm-qa-final.txt")),
|
|
66
|
+
clone_arf: sha256File(join(i.cloneDir, "evidence", "clone-arf.xml")),
|
|
67
|
+
clone_report_html: sha256File(join(i.cloneDir, "evidence", "clone-report.html")),
|
|
68
|
+
},
|
|
69
|
+
clone_verification: ver,
|
|
70
|
+
luks_two_clone_proof: {
|
|
71
|
+
volume_key_sha256: { [i.clone]: keyhash, [`${proofName} (released after proof)`]: proofHash },
|
|
72
|
+
keys_differ: keyhash !== proofHash,
|
|
73
|
+
reboot_unattended_tpm_unlock: "both clones rebooted and returned over SSH with no console input; verified after reboot",
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
export function renderReceiptMarkdown(rec, summary, cloneSummary, errataApplied, securityOutstanding, manualEvidence) {
|
|
78
|
+
const md = [
|
|
79
|
+
`# STIG receipt: ${rec.template.name}`, "",
|
|
80
|
+
`- RHEL ${rec.os.release}, kernel \`${rec.os.kernel}\`, errata applied ${errataApplied} (security advisories outstanding: ${securityOutstanding})`,
|
|
81
|
+
`- DISA RHEL 8 STIG V2R8, SSG ${rec.stig.ssg_datastream_version} datastream sha256 \`${rec.stig.datastream_sha256}\``,
|
|
82
|
+
`- Profile \`${rec.stig.profile}\` tailored by \`${rec.stig.tailored_profile}\`, tailoring sha256 \`${rec.stig.tailoring_sha256}\``,
|
|
83
|
+
`- Template VMID ${rec.template.vmid}, built ${rec.template.built}`,
|
|
84
|
+
"", "## Scan counts", "", "| scan | pass | fail | notapplicable | notchecked |", "|---|---|---|---|---|",
|
|
85
|
+
`| template | ${summary.result_pass} | ${summary.result_fail} | ${summary.result_notapplicable} | ${summary.result_notchecked} |`,
|
|
86
|
+
`| clone ${rec.clone_scan.clone} | ${cloneSummary.result_pass} | ${cloneSummary.result_fail} | ${cloneSummary.result_notapplicable} | ${cloneSummary.result_notchecked} |`,
|
|
87
|
+
"", "## Notchecked rules (manual evidence)", "",
|
|
88
|
+
...rec.notchecked.map((n) => `- \`${n.rule}\`: ${n.manual_evidence}`),
|
|
89
|
+
"", "## Artifact sha256", "",
|
|
90
|
+
...Object.entries(rec.artifacts_sha256).map(([k, v]) => `- ${k}: \`${v}\``),
|
|
91
|
+
"", "## Clone verification", "", "```",
|
|
92
|
+
...Object.entries(rec.clone_verification).map(([k, v]) => `${k}=${v}`),
|
|
93
|
+
"```", "", "## LUKS two-clone proof", "",
|
|
94
|
+
...Object.entries(rec.luks_two_clone_proof.volume_key_sha256).map(([k, v]) => `- volume key sha256 (${k}): \`${v}\``),
|
|
95
|
+
`- keys differ: ${rec.luks_two_clone_proof.keys_differ ? "True" : "False"}; both clones rebooted and unlocked unattended via TPM2`, "",
|
|
96
|
+
"## Manual evidence (clone)", "", "```", manualEvidence.trim(), "```", "",
|
|
97
|
+
];
|
|
98
|
+
return md.join("\n");
|
|
99
|
+
}
|
|
100
|
+
/** Convenience: build both artifacts from evidence on disk. */
|
|
101
|
+
export function buildReceiptFiles(i) {
|
|
102
|
+
const ev = join(i.runDir, "evidence", "stig-report");
|
|
103
|
+
const summ = parseKv(readFileSync(join(ev, "summary.txt"), "utf8"));
|
|
104
|
+
const err = parseKv(readFileSync(join(ev, "errata.txt"), "utf8"));
|
|
105
|
+
const csum = parseKv(readFileSync(join(i.cloneDir, "evidence", "clone-summary.txt"), "utf8"));
|
|
106
|
+
const receipt = buildReceipt(i);
|
|
107
|
+
const manual = readFileSync(join(i.cloneDir, "evidence", "clone-manual-evidence.txt"), "utf8");
|
|
108
|
+
const markdown = renderReceiptMarkdown(receipt, summ, csum, err.errata_applied, summ.dnf_security_outstanding, manual);
|
|
109
|
+
return { json: JSON.stringify(receipt, null, 2), markdown, receipt };
|
|
110
|
+
}
|
|
111
|
+
export const SCAN_COUNT_KEYS = COUNT_KEYS;
|
|
112
|
+
//# sourceMappingURL=receipt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"receipt.js","sourceRoot":"","sources":["../../../src/stig/receipt.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { type StigCounts, type StigDescriptor, type StigReceiptSummary, stigStatusPreview } from "./model.js";
|
|
2
|
+
import type { ClaimRecord, StigDeps } from "./ports.js";
|
|
3
|
+
export declare const BUILD_CLAIM_TTL_HOURS = 6;
|
|
4
|
+
export declare const DEFAULT_CLONE_TTL_HOURS = 48;
|
|
5
|
+
export declare const VMID_RANGE: {
|
|
6
|
+
readonly min: 8100;
|
|
7
|
+
readonly max: 8899;
|
|
8
|
+
};
|
|
9
|
+
export interface ClonePlan {
|
|
10
|
+
mode: "plan";
|
|
11
|
+
cloneName: string;
|
|
12
|
+
claim: string;
|
|
13
|
+
vmid: number;
|
|
14
|
+
template: {
|
|
15
|
+
ref: string;
|
|
16
|
+
vmid: number;
|
|
17
|
+
};
|
|
18
|
+
ttlHours: number;
|
|
19
|
+
poolPercent: number;
|
|
20
|
+
poolMaxPercent: number;
|
|
21
|
+
poolOk: boolean;
|
|
22
|
+
blockedBy: string | null;
|
|
23
|
+
escrowKey: string;
|
|
24
|
+
steps: readonly string[];
|
|
25
|
+
planDigest: string;
|
|
26
|
+
}
|
|
27
|
+
export interface BuildPlan {
|
|
28
|
+
mode: "plan";
|
|
29
|
+
name: string;
|
|
30
|
+
claim: string;
|
|
31
|
+
vmid: number;
|
|
32
|
+
claimTtlHours: number;
|
|
33
|
+
steps: readonly string[];
|
|
34
|
+
preflight: {
|
|
35
|
+
packer: string;
|
|
36
|
+
dvd: boolean;
|
|
37
|
+
datastreamSha256: string;
|
|
38
|
+
};
|
|
39
|
+
planDigest: string;
|
|
40
|
+
}
|
|
41
|
+
export declare class StigRunner {
|
|
42
|
+
private readonly d;
|
|
43
|
+
private static reencrypting;
|
|
44
|
+
constructor(d: StigDeps);
|
|
45
|
+
private log;
|
|
46
|
+
private listGuests;
|
|
47
|
+
private pickVmid;
|
|
48
|
+
private poolPercent;
|
|
49
|
+
private newestTemplate;
|
|
50
|
+
private step;
|
|
51
|
+
private ensureDir;
|
|
52
|
+
private writeSecretFile;
|
|
53
|
+
planClone(i: {
|
|
54
|
+
cloneName: string;
|
|
55
|
+
templateRef?: string;
|
|
56
|
+
ttlHours?: number;
|
|
57
|
+
dns?: string[];
|
|
58
|
+
ntp?: string[];
|
|
59
|
+
poolMaxPercent?: number;
|
|
60
|
+
}): Promise<ClonePlan>;
|
|
61
|
+
createClone(i: {
|
|
62
|
+
cloneName: string;
|
|
63
|
+
apply?: boolean;
|
|
64
|
+
planDigest?: string;
|
|
65
|
+
templateRef?: string;
|
|
66
|
+
ttlHours?: number;
|
|
67
|
+
dns?: string[];
|
|
68
|
+
ntp?: string[];
|
|
69
|
+
poolMaxPercent?: number;
|
|
70
|
+
}): Promise<any>;
|
|
71
|
+
private applyClone;
|
|
72
|
+
private pveOk;
|
|
73
|
+
private verifyGuest;
|
|
74
|
+
planBuild(i: {
|
|
75
|
+
name?: string;
|
|
76
|
+
ssgDatastream: string;
|
|
77
|
+
ssgDatastreamSha256: string;
|
|
78
|
+
now?: string;
|
|
79
|
+
}): Promise<BuildPlan>;
|
|
80
|
+
build(i: {
|
|
81
|
+
name?: string;
|
|
82
|
+
ssgDatastream: string;
|
|
83
|
+
ssgDatastreamSha256: string;
|
|
84
|
+
now?: string;
|
|
85
|
+
apply?: boolean;
|
|
86
|
+
planDigest?: string;
|
|
87
|
+
dns?: string[];
|
|
88
|
+
ntp?: string[];
|
|
89
|
+
}): Promise<any>;
|
|
90
|
+
private annotateSummary;
|
|
91
|
+
validate(i: {
|
|
92
|
+
cloneName: string;
|
|
93
|
+
requireDisa?: boolean;
|
|
94
|
+
}): Promise<any>;
|
|
95
|
+
getReceipt(i: {
|
|
96
|
+
claim: string;
|
|
97
|
+
}): Promise<{
|
|
98
|
+
claim: string;
|
|
99
|
+
descriptor: Record<string, any> | null;
|
|
100
|
+
summary: StigReceiptSummary | null;
|
|
101
|
+
statusPreview: ReturnType<typeof stigStatusPreview>;
|
|
102
|
+
}>;
|
|
103
|
+
releaseTemplate(i: {
|
|
104
|
+
claim: string;
|
|
105
|
+
confirmDestroy: boolean;
|
|
106
|
+
}): Promise<any>;
|
|
107
|
+
}
|
|
108
|
+
export type { StigCounts, StigDescriptor, ClaimRecord };
|
|
109
|
+
//# sourceMappingURL=runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../src/stig/runner.ts"],"names":[],"mappings":"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"}
|