40 lines
1.8 KiB
JavaScript
40 lines
1.8 KiB
JavaScript
|
|
"use strict";
|
||
|
|
const test = require("node:test");
|
||
|
|
const assert = require("node:assert/strict");
|
||
|
|
const fs = require("node:fs");
|
||
|
|
const path = require("node:path");
|
||
|
|
const root = path.resolve(__dirname, "..");
|
||
|
|
|
||
|
|
test("six independent recovery nodes are declared", () => {
|
||
|
|
const policy = JSON.parse(fs.readFileSync(path.join(root, "recovery-policy.json")));
|
||
|
|
assert.equal(policy.recovery_nodes.length, 6);
|
||
|
|
assert.equal(new Set(policy.recovery_nodes).size, 6);
|
||
|
|
assert.ok(policy.forbidden.includes("shared-recovery-private-key"));
|
||
|
|
assert.ok(policy.forbidden.includes("private-key-on-personal-computer"));
|
||
|
|
assert.ok(policy.forbidden.includes("reverse-access-from-enterprise"));
|
||
|
|
});
|
||
|
|
|
||
|
|
test("forced command rejects arbitrary shell", () => {
|
||
|
|
const entry = fs.readFileSync(path.join(root, "jd-recovery-entry.sh"), "utf8");
|
||
|
|
assert.match(entry, /SSH_ORIGINAL_COMMAND/);
|
||
|
|
assert.match(entry, /recovery action denied/);
|
||
|
|
assert.doesNotMatch(entry, /eval /);
|
||
|
|
});
|
||
|
|
|
||
|
|
test("recovery runner only restores fixed local backup paths", () => {
|
||
|
|
const runner = fs.readFileSync(path.join(root, "jd-recovery-runner"), "utf8");
|
||
|
|
assert.match(runner, /sha256sum -c/);
|
||
|
|
assert.match(runner, /restore-authz/);
|
||
|
|
assert.match(runner, /install-owner-access/);
|
||
|
|
assert.match(runner, /restore-navigation-map/);
|
||
|
|
assert.doesNotMatch(runner, /eval /);
|
||
|
|
assert.doesNotMatch(runner, /\$2/);
|
||
|
|
});
|
||
|
|
|
||
|
|
test("six-node bootstrap uses unique keys and forced command restrictions", () => {
|
||
|
|
const bootstrap = fs.readFileSync(path.join(root, "bootstrap-six-node-recovery.sh"), "utf8");
|
||
|
|
assert.match(bootstrap, /restrict,command=/);
|
||
|
|
assert.match(bootstrap, /source_ip/);
|
||
|
|
assert.match(bootstrap, /test -f \/etc\/guanghu\/secrets\/jd-recovery\/to-jd-ed25519 \|\| ssh-keygen/);
|
||
|
|
assert.doesNotMatch(bootstrap, /StrictHostKeyChecking no/);
|
||
|
|
});
|