@zincapp/znvault-cli 4.20.0 → 4.21.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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/superadmin/index.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,8BAA8B,CAAC;AA6BtC,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,eAAe,GAAG,IAAI,CAwCzF"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/superadmin/index.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,8BAA8B,CAAC;AA8BtC,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,eAAe,GAAG,IAAI,CAyCzF"}
@@ -18,6 +18,7 @@ import { registerHostCommands } from '../host/index.js';
18
18
  import { registerKmsCommands } from '../kms/index.js';
19
19
  import { registerKmipSuperadminCommands } from '../kmip/index.js';
20
20
  import { registerDynsecFenceCommands } from './dynsec-fence.js';
21
+ import { registerRootkeyCommands } from './rootkey.js';
21
22
  import { registerPolicyCommands } from '../policy/index.js';
22
23
  import { registerQuarantineCommands } from '../quarantine.js';
23
24
  import { registerRoleCommands } from '../role.js';
@@ -53,6 +54,7 @@ export function registerSuperadminCommands(parent, _opts) {
53
54
  registerKmsCommands(superadmin, { context: 'superadmin' });
54
55
  registerKmipSuperadminCommands(superadmin);
55
56
  registerDynsecFenceCommands(superadmin);
57
+ registerRootkeyCommands(superadmin);
56
58
  registerPolicyCommands(superadmin, { context: 'superadmin' });
57
59
  registerQuarantineCommands(superadmin, { context: 'superadmin' });
58
60
  registerRoleCommands(superadmin, { context: 'superadmin' });
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/superadmin/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/superadmin/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { Command } from 'commander';
2
+ export declare function rootkeyStatus(options: {
3
+ json?: boolean;
4
+ }): Promise<void>;
5
+ export declare function rootkeyVerify(options: {
6
+ json?: boolean;
7
+ }): Promise<void>;
8
+ export declare function rootkeyWrap(options: {
9
+ provider: string;
10
+ json?: boolean;
11
+ }): Promise<void>;
12
+ export declare function registerRootkeyCommands(parent: Command): void;
13
+ //# sourceMappingURL=rootkey.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rootkey.d.ts","sourceRoot":"","sources":["../../../src/commands/superadmin/rootkey.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA2FzC,wBAAsB,aAAa,CAAC,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAgG9E;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsD9E;AASD,wBAAsB,WAAW,CAAC,OAAO,EAAE;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2ChB;AAID,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAuB7D"}
@@ -0,0 +1,223 @@
1
+ // Path: src/commands/superadmin/rootkey.ts
2
+ /**
3
+ * `znvault superadmin rootkey` — root-of-trust provider chain for the
4
+ * vault's bootstrap key (BSK).
5
+ *
6
+ * Routes (superadmin only, deployment-wide, no tenant scoping):
7
+ * GET /v1/superadmin/rootkey/status
8
+ * POST /v1/superadmin/rootkey/verify
9
+ * POST /v1/superadmin/rootkey/wrap { provider }
10
+ *
11
+ * Contract: no command prints key material — the server never returns
12
+ * any; the publishable KCV fingerprint is the only key identity shown.
13
+ * No command can remove an envelope or the cleartext key file
14
+ * (retirement is a separate, deliberate server-side procedure that has
15
+ * no API in this release). `verify` exits 1 when any configured provider
16
+ * fails or mismatches, so it can gate migrations and drive monitoring.
17
+ */
18
+ import Table from 'cli-table3';
19
+ import { client } from '../../lib/client.js';
20
+ import * as output from '../../lib/output.js';
21
+ // ─── Helpers ───────────────────────────────────────────────────────────────
22
+ function formatDate(iso) {
23
+ if (!iso)
24
+ return '-';
25
+ try {
26
+ return new Date(iso).toLocaleString();
27
+ }
28
+ catch {
29
+ return iso;
30
+ }
31
+ }
32
+ // ─── Handlers ──────────────────────────────────────────────────────────────
33
+ export async function rootkeyStatus(options) {
34
+ const spinner = output.spinner('Fetching root key provider status...').start();
35
+ try {
36
+ const response = await client.get('/v1/superadmin/rootkey/status');
37
+ spinner.stop();
38
+ if (options.json) {
39
+ output.json(response);
40
+ return;
41
+ }
42
+ const resolution = response.resolution;
43
+ // Effective degraded = boot resolution OR the latest periodic probe;
44
+ // status must never report last-boot nostalgia as current health.
45
+ const effectiveDegraded = resolution !== null &&
46
+ (resolution.degraded || resolution.lastProbe?.degraded === true);
47
+ output.section('Root Key Provider Status');
48
+ output.keyValue({
49
+ 'Degraded': resolution ? (effectiveDegraded ? 'YES — investigate' : 'no') : 'unknown (no resolution)',
50
+ 'Served by (last boot)': resolution?.servedBy ?? '-',
51
+ 'Active KCV': resolution?.kcv ?? '-',
52
+ 'Resolved at': formatDate(resolution?.resolvedAt),
53
+ 'Total latency': resolution ? `${String(resolution.totalLatencyMs)}ms` : '-',
54
+ 'Last probe': resolution?.lastProbe
55
+ ? `${formatDate(resolution.lastProbe.at)} — ${resolution.lastProbe.degraded ? 'DEGRADED' : 'healthy'}`
56
+ : 'never (probe has not run yet)',
57
+ 'Cleartext file on this node': response.localFile.present ? 'present' : 'absent',
58
+ });
59
+ if (effectiveDegraded) {
60
+ output.warn('The chain is DEGRADED: a configured provider failed or had no material ' +
61
+ 'at the last resolution or probe. The node is up, but redundancy is reduced.');
62
+ }
63
+ if (resolution) {
64
+ const table = new Table({
65
+ head: ['Priority', 'Provider', 'Outcome', 'Latency'],
66
+ style: { head: ['cyan'] },
67
+ });
68
+ for (const attempt of resolution.attempts) {
69
+ const priority = resolution.configured.find((c) => c.id === attempt.providerId)?.priority ?? '-';
70
+ table.push([
71
+ String(priority),
72
+ attempt.providerId,
73
+ attempt.outcome + (attempt.error ? ` (${attempt.error})` : ''),
74
+ attempt.latencyMs === undefined ? '-' : `${String(attempt.latencyMs)}ms`,
75
+ ]);
76
+ }
77
+ console.log(table.toString());
78
+ }
79
+ if (resolution?.lastProbe) {
80
+ const probeTable = new Table({
81
+ head: ['Probe: Provider', 'Outcome', 'KCV', 'Latency'],
82
+ style: { head: ['cyan'] },
83
+ });
84
+ for (const result of resolution.lastProbe.results) {
85
+ probeTable.push([
86
+ result.providerId,
87
+ result.outcome + (result.error ? ` (${result.error})` : ''),
88
+ result.kcv ?? '-',
89
+ `${String(result.latencyMs)}ms`,
90
+ ]);
91
+ }
92
+ console.log(probeTable.toString());
93
+ }
94
+ if (response.envelopes.length > 0) {
95
+ const table = new Table({
96
+ head: ['Envelope', 'Key ID', 'KCV', 'Updated'],
97
+ style: { head: ['cyan'] },
98
+ });
99
+ for (const envelope of response.envelopes) {
100
+ table.push([
101
+ envelope.provider_id,
102
+ envelope.key_id ?? '-',
103
+ envelope.kcv,
104
+ formatDate(envelope.updated_at),
105
+ ]);
106
+ }
107
+ console.log(table.toString());
108
+ }
109
+ else {
110
+ output.info('No provider envelopes exist yet (create one with: rootkey wrap --provider <id>).');
111
+ }
112
+ }
113
+ catch (err) {
114
+ spinner.fail('Failed to fetch root key status');
115
+ output.error(err instanceof Error ? err.message : String(err));
116
+ process.exit(1);
117
+ }
118
+ }
119
+ export async function rootkeyVerify(options) {
120
+ const spinner = output.spinner('Verifying every configured root key provider...').start();
121
+ try {
122
+ const response = await client.post('/v1/superadmin/rootkey/verify', {});
123
+ spinner.stop();
124
+ if (options.json) {
125
+ output.json(response);
126
+ }
127
+ else {
128
+ const table = new Table({
129
+ head: ['Provider', 'Outcome', 'KCV', 'Latency'],
130
+ style: { head: ['cyan'] },
131
+ });
132
+ for (const result of response.results) {
133
+ table.push([
134
+ result.providerId,
135
+ result.outcome + (result.error ? ` (${result.error})` : ''),
136
+ result.kcv ?? '-',
137
+ `${String(result.latencyMs)}ms`,
138
+ ]);
139
+ }
140
+ console.log(table.toString());
141
+ }
142
+ if (response.allMatch) {
143
+ if (!options.json) {
144
+ output.success(`All configured providers agree with the active key (KCV ${response.activeKcv}).`);
145
+ }
146
+ return;
147
+ }
148
+ // STRICT gate: anything other than 'match' fails — including a
149
+ // provider with no material. A green result on an unprovisioned
150
+ // provider would let an operator reorder priorities onto nothing.
151
+ const failing = response.results
152
+ .filter((r) => r.outcome !== 'match')
153
+ .map((r) => r.providerId);
154
+ output.error(`Root key verification FAILED for: ${failing.join(', ')}. ` +
155
+ 'Do not change provider priorities or retire anything until every ' +
156
+ 'configured provider verifies.');
157
+ process.exit(1);
158
+ }
159
+ catch (err) {
160
+ spinner.fail('Root key verification failed');
161
+ output.error(err instanceof Error ? err.message : String(err));
162
+ process.exit(1);
163
+ }
164
+ }
165
+ /**
166
+ * Mirror of the server's schema constraint. Enforced BEFORE any output or
167
+ * request: an operator who accidentally pastes a secret as --provider must
168
+ * see nothing echo it — not the spinner, not an error, not CI logs.
169
+ */
170
+ const PROVIDER_ID_PATTERN = /^[a-z0-9][a-z0-9-]{0,31}$/;
171
+ export async function rootkeyWrap(options) {
172
+ if (!PROVIDER_ID_PATTERN.test(options.provider)) {
173
+ output.error('Invalid provider id: expected 1-32 lowercase letters, digits or hyphens ' +
174
+ "(e.g. 'aws-kms'). The value you passed is not echoed on purpose.");
175
+ process.exit(1);
176
+ }
177
+ const spinner = output.spinner(`Wrapping the bootstrap key into '${options.provider}'...`).start();
178
+ try {
179
+ const receipt = await client.post('/v1/superadmin/rootkey/wrap', { provider: options.provider });
180
+ spinner.stop();
181
+ if (options.json) {
182
+ output.json(receipt);
183
+ return;
184
+ }
185
+ output.section('Root Key Envelope Written');
186
+ output.keyValue({
187
+ 'Provider': receipt.providerId,
188
+ 'Key ID': receipt.keyId ?? '-',
189
+ 'KCV': receipt.kcv,
190
+ 'Created': formatDate(receipt.createdAt),
191
+ });
192
+ output.success(`Envelope for '${receipt.providerId}' persisted (replicates to every node via the database).`);
193
+ output.info("Next: run 'znvault superadmin rootkey verify' to prove every provider opens the same key.");
194
+ }
195
+ catch (err) {
196
+ spinner.fail('Failed to wrap the bootstrap key');
197
+ output.error(err instanceof Error ? err.message : String(err));
198
+ process.exit(1);
199
+ }
200
+ }
201
+ // ─── Registration ──────────────────────────────────────────────────────────
202
+ export function registerRootkeyCommands(parent) {
203
+ const rootkey = parent
204
+ .command('rootkey')
205
+ .description('Root-of-trust provider chain for the bootstrap key (superadmin only)');
206
+ rootkey
207
+ .command('status')
208
+ .description('Show configured providers, last-boot resolution, degraded flag and KCV')
209
+ .option('--json', 'Output as JSON')
210
+ .action(rootkeyStatus);
211
+ rootkey
212
+ .command('verify')
213
+ .description('Probe every configured provider and compare KCVs; exits 1 on any failure')
214
+ .option('--json', 'Output as JSON')
215
+ .action(rootkeyVerify);
216
+ rootkey
217
+ .command('wrap')
218
+ .description("Wrap the current bootstrap key into a provider's envelope (never retires anything)")
219
+ .requiredOption('--provider <id>', "Configured envelope provider id (e.g. 'aws-kms')")
220
+ .option('--json', 'Output the receipt as JSON')
221
+ .action(rootkeyWrap);
222
+ }
223
+ //# sourceMappingURL=rootkey.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rootkey.js","sourceRoot":"","sources":["../../../src/commands/superadmin/rootkey.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zincapp/znvault-cli",
3
- "version": "4.20.0",
3
+ "version": "4.21.0",
4
4
  "description": "Official CLI for ZnVault administration",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",