@zincapp/znvault-cli 2.26.5 → 2.29.1
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/dist/commands/group.d.ts +3 -0
- package/dist/commands/group.d.ts.map +1 -0
- package/dist/commands/group.js +319 -0
- package/dist/commands/group.js.map +1 -0
- package/dist/commands/host/bootstrap-token.d.ts.map +1 -1
- package/dist/commands/host/bootstrap-token.js +28 -10
- package/dist/commands/host/bootstrap-token.js.map +1 -1
- package/dist/commands/ssh-ca/ca.d.ts +14 -0
- package/dist/commands/ssh-ca/ca.d.ts.map +1 -0
- package/dist/commands/ssh-ca/ca.js +169 -0
- package/dist/commands/ssh-ca/ca.js.map +1 -0
- package/dist/commands/ssh-ca/certificates.d.ts +7 -0
- package/dist/commands/ssh-ca/certificates.d.ts.map +1 -0
- package/dist/commands/ssh-ca/certificates.js +131 -0
- package/dist/commands/ssh-ca/certificates.js.map +1 -0
- package/dist/commands/ssh-ca/helpers.d.ts +37 -0
- package/dist/commands/ssh-ca/helpers.d.ts.map +1 -0
- package/dist/commands/ssh-ca/helpers.js +104 -0
- package/dist/commands/ssh-ca/helpers.js.map +1 -0
- package/dist/commands/ssh-ca/index.d.ts +7 -0
- package/dist/commands/ssh-ca/index.d.ts.map +1 -0
- package/dist/commands/ssh-ca/index.js +180 -0
- package/dist/commands/ssh-ca/index.js.map +1 -0
- package/dist/commands/ssh-ca/mappings.d.ts +11 -0
- package/dist/commands/ssh-ca/mappings.d.ts.map +1 -0
- package/dist/commands/ssh-ca/mappings.js +178 -0
- package/dist/commands/ssh-ca/mappings.js.map +1 -0
- package/dist/commands/ssh-ca/server-groups.d.ts +21 -0
- package/dist/commands/ssh-ca/server-groups.d.ts.map +1 -0
- package/dist/commands/ssh-ca/server-groups.js +252 -0
- package/dist/commands/ssh-ca/server-groups.js.map +1 -0
- package/dist/commands/ssh-ca/sign.d.ts +3 -0
- package/dist/commands/ssh-ca/sign.d.ts.map +1 -0
- package/dist/commands/ssh-ca/sign.js +79 -0
- package/dist/commands/ssh-ca/sign.js.map +1 -0
- package/dist/commands/ssh-ca/types.d.ts +135 -0
- package/dist/commands/ssh-ca/types.d.ts.map +1 -0
- package/dist/commands/ssh-ca/types.js +3 -0
- package/dist/commands/ssh-ca/types.js.map +1 -0
- package/dist/commands/ssh-ca.d.ts +7 -0
- package/dist/commands/ssh-ca.d.ts.map +1 -0
- package/dist/commands/ssh-ca.js +7 -0
- package/dist/commands/ssh-ca.js.map +1 -0
- package/dist/commands/ssh.d.ts +3 -0
- package/dist/commands/ssh.d.ts.map +1 -0
- package/dist/commands/ssh.js +814 -0
- package/dist/commands/ssh.js.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/client/tenants.d.ts.map +1 -1
- package/dist/lib/client/tenants.js +3 -6
- package/dist/lib/client/tenants.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"certificates.d.ts","sourceRoot":"","sources":["../../../src/commands/ssh-ca/certificates.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAGV,eAAe,EACf,aAAa,EACd,MAAM,YAAY,CAAC;AAGpB,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAgD9E;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAwC/F;AAED,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAuC7F"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
// Path: src/commands/ssh-ca/certificates.ts
|
|
2
|
+
/**
|
|
3
|
+
* Certificate management commands for SSH CA
|
|
4
|
+
*/
|
|
5
|
+
import ora from 'ora';
|
|
6
|
+
import Table from 'cli-table3';
|
|
7
|
+
import inquirer from 'inquirer';
|
|
8
|
+
import { client } from '../../lib/client.js';
|
|
9
|
+
import * as output from '../../lib/output.js';
|
|
10
|
+
import { formatDate, formatValidity, formatPrincipals } from './helpers.js';
|
|
11
|
+
export async function listCertificates(options) {
|
|
12
|
+
const spinner = ora('Fetching certificates...').start();
|
|
13
|
+
try {
|
|
14
|
+
const params = new URLSearchParams();
|
|
15
|
+
if (options.activeOnly)
|
|
16
|
+
params.set('activeOnly', 'true');
|
|
17
|
+
if (options.revoked)
|
|
18
|
+
params.set('revoked', 'true');
|
|
19
|
+
if (options.userId)
|
|
20
|
+
params.set('userId', options.userId);
|
|
21
|
+
if (options.limit)
|
|
22
|
+
params.set('limit', options.limit);
|
|
23
|
+
const query = params.toString();
|
|
24
|
+
const response = await client.get(`/v1/ssh/certificates${query ? `?${query}` : ''}`);
|
|
25
|
+
spinner.stop();
|
|
26
|
+
if (options.json) {
|
|
27
|
+
output.json(response);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
if (response.items.length === 0) {
|
|
31
|
+
output.info('No certificates found.');
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const table = new Table({
|
|
35
|
+
head: ['Serial', 'User', 'Principals', 'Valid Until', 'Status'],
|
|
36
|
+
style: { head: ['cyan'] },
|
|
37
|
+
});
|
|
38
|
+
for (const cert of response.items) {
|
|
39
|
+
table.push([
|
|
40
|
+
cert.serial,
|
|
41
|
+
cert.username ?? cert.userId.substring(0, 8),
|
|
42
|
+
formatPrincipals(cert.principals),
|
|
43
|
+
formatDate(cert.validBefore),
|
|
44
|
+
formatValidity(cert.validBefore, cert.revoked),
|
|
45
|
+
]);
|
|
46
|
+
}
|
|
47
|
+
console.log(table.toString());
|
|
48
|
+
output.info(`${response.items.length} certificate(s) found (total: ${response.pagination.total})`);
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
spinner.fail('Failed to list certificates');
|
|
52
|
+
output.error(err instanceof Error ? err.message : String(err));
|
|
53
|
+
process.exit(1);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
export async function getCertificate(certId, options) {
|
|
57
|
+
const spinner = ora('Fetching certificate...').start();
|
|
58
|
+
try {
|
|
59
|
+
const cert = await client.get(`/v1/ssh/certificates/${certId}`);
|
|
60
|
+
spinner.stop();
|
|
61
|
+
if (options.json) {
|
|
62
|
+
output.json(cert);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
output.keyValue({
|
|
66
|
+
'ID': cert.id,
|
|
67
|
+
'Serial': cert.serial,
|
|
68
|
+
'User': cert.username ?? cert.userId,
|
|
69
|
+
'Fingerprint': cert.fingerprint,
|
|
70
|
+
'Principals': cert.principals.join(', '),
|
|
71
|
+
'Extensions': cert.extensions?.join(', ') ?? '-',
|
|
72
|
+
'Valid From': formatDate(cert.validAfter),
|
|
73
|
+
'Valid Until': formatDate(cert.validBefore),
|
|
74
|
+
'Status': formatValidity(cert.validBefore, cert.revoked),
|
|
75
|
+
'Request IP': cert.requestIp ?? '-',
|
|
76
|
+
'Created': formatDate(cert.createdAt),
|
|
77
|
+
});
|
|
78
|
+
if (cert.revoked) {
|
|
79
|
+
console.log();
|
|
80
|
+
output.warn('Certificate is revoked:');
|
|
81
|
+
output.keyValue({
|
|
82
|
+
'Revoked At': formatDate(cert.revokedAt),
|
|
83
|
+
'Revoked By': cert.revokedBy ?? '-',
|
|
84
|
+
'Reason': cert.revocationReason ?? '-',
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
spinner.fail('Failed to get certificate');
|
|
90
|
+
output.error(err instanceof Error ? err.message : String(err));
|
|
91
|
+
process.exit(1);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
export async function revokeCertificate(certId, options) {
|
|
95
|
+
if (!options.force) {
|
|
96
|
+
const { confirm } = await inquirer.prompt([{
|
|
97
|
+
type: 'confirm',
|
|
98
|
+
name: 'confirm',
|
|
99
|
+
message: `Revoke certificate ${certId}?`,
|
|
100
|
+
default: false,
|
|
101
|
+
}]);
|
|
102
|
+
if (!confirm) {
|
|
103
|
+
output.info('Operation cancelled.');
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
const reason = options.reason ?? (await inquirer.prompt([{
|
|
108
|
+
type: 'input',
|
|
109
|
+
name: 'reason',
|
|
110
|
+
message: 'Revocation reason (optional):',
|
|
111
|
+
default: 'Manually revoked via CLI',
|
|
112
|
+
}])).reason;
|
|
113
|
+
const spinner = ora('Revoking certificate...').start();
|
|
114
|
+
try {
|
|
115
|
+
await client.post(`/v1/ssh/certificates/${certId}/revoke`, { reason });
|
|
116
|
+
spinner.succeed('Certificate revoked');
|
|
117
|
+
if (options.json) {
|
|
118
|
+
output.json({ success: true, certId, reason });
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
output.info('Certificate has been added to the Key Revocation List.');
|
|
122
|
+
output.info('Servers should refresh their KRL: znvault ssh-ca krl');
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
catch (err) {
|
|
126
|
+
spinner.fail('Failed to revoke certificate');
|
|
127
|
+
output.error(err instanceof Error ? err.message : String(err));
|
|
128
|
+
process.exit(1);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=certificates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"certificates.js","sourceRoot":"","sources":["../../../src/commands/ssh-ca/certificates.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Format TTL in human-readable form
|
|
3
|
+
*/
|
|
4
|
+
export declare function formatTtl(seconds: number | undefined | null): string;
|
|
5
|
+
/**
|
|
6
|
+
* Format date in a readable format
|
|
7
|
+
*/
|
|
8
|
+
export declare function formatDate(date: string | null | undefined): string;
|
|
9
|
+
/**
|
|
10
|
+
* Format certificate validity status
|
|
11
|
+
*/
|
|
12
|
+
export declare function formatValidity(validBefore: string, revoked: boolean): string;
|
|
13
|
+
/**
|
|
14
|
+
* Format key type for display
|
|
15
|
+
*/
|
|
16
|
+
export declare function formatKeyType(keyType: string | undefined): string;
|
|
17
|
+
/**
|
|
18
|
+
* Format principals array
|
|
19
|
+
*/
|
|
20
|
+
export declare function formatPrincipals(principals: string[]): string;
|
|
21
|
+
/**
|
|
22
|
+
* Parse principals from comma-separated string
|
|
23
|
+
*/
|
|
24
|
+
export declare function parsePrincipals(input: string): string[];
|
|
25
|
+
/**
|
|
26
|
+
* Parse extensions from comma-separated string
|
|
27
|
+
*/
|
|
28
|
+
export declare function parseExtensions(input: string): string[];
|
|
29
|
+
/**
|
|
30
|
+
* Validate principal name
|
|
31
|
+
*/
|
|
32
|
+
export declare function isValidPrincipal(name: string): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Read public key from file or stdin
|
|
35
|
+
*/
|
|
36
|
+
export declare function readPublicKey(file?: string): Promise<string>;
|
|
37
|
+
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/commands/ssh-ca/helpers.ts"],"names":[],"mappings":"AAQA;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAOpE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAIlE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAkB5E;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAGjE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,CAI7D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAEvD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAEvD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAoBlE"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
// Path: src/commands/ssh-ca/helpers.ts
|
|
2
|
+
/**
|
|
3
|
+
* Helper functions for SSH CA commands
|
|
4
|
+
*/
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
/**
|
|
7
|
+
* Format TTL in human-readable form
|
|
8
|
+
*/
|
|
9
|
+
export function formatTtl(seconds) {
|
|
10
|
+
if (seconds === undefined || seconds === null)
|
|
11
|
+
return '-';
|
|
12
|
+
if (seconds < 60)
|
|
13
|
+
return `${seconds}s`;
|
|
14
|
+
if (seconds < 3600)
|
|
15
|
+
return `${Math.floor(seconds / 60)}m`;
|
|
16
|
+
if (seconds < 86400)
|
|
17
|
+
return `${Math.floor(seconds / 3600)}h`;
|
|
18
|
+
return `${Math.floor(seconds / 86400)}d`;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Format date in a readable format
|
|
22
|
+
*/
|
|
23
|
+
export function formatDate(date) {
|
|
24
|
+
if (!date)
|
|
25
|
+
return '-';
|
|
26
|
+
const d = new Date(date);
|
|
27
|
+
return d.toLocaleString();
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Format certificate validity status
|
|
31
|
+
*/
|
|
32
|
+
export function formatValidity(validBefore, revoked) {
|
|
33
|
+
if (revoked) {
|
|
34
|
+
return chalk.red('REVOKED');
|
|
35
|
+
}
|
|
36
|
+
const expiry = new Date(validBefore);
|
|
37
|
+
const now = new Date();
|
|
38
|
+
if (expiry < now) {
|
|
39
|
+
return chalk.gray('EXPIRED');
|
|
40
|
+
}
|
|
41
|
+
const hoursLeft = Math.floor((expiry.getTime() - now.getTime()) / (1000 * 60 * 60));
|
|
42
|
+
if (hoursLeft < 1) {
|
|
43
|
+
return chalk.yellow('EXPIRING');
|
|
44
|
+
}
|
|
45
|
+
return chalk.green('VALID');
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Format key type for display
|
|
49
|
+
*/
|
|
50
|
+
export function formatKeyType(keyType) {
|
|
51
|
+
if (!keyType)
|
|
52
|
+
return '-';
|
|
53
|
+
return keyType === 'ed25519' ? 'Ed25519' : 'RSA-4096';
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Format principals array
|
|
57
|
+
*/
|
|
58
|
+
export function formatPrincipals(principals) {
|
|
59
|
+
if (!principals || principals.length === 0)
|
|
60
|
+
return '-';
|
|
61
|
+
if (principals.length <= 3)
|
|
62
|
+
return principals.join(', ');
|
|
63
|
+
return `${principals.slice(0, 3).join(', ')} (+${principals.length - 3})`;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Parse principals from comma-separated string
|
|
67
|
+
*/
|
|
68
|
+
export function parsePrincipals(input) {
|
|
69
|
+
return input.split(',').map(p => p.trim()).filter(p => p.length > 0);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Parse extensions from comma-separated string
|
|
73
|
+
*/
|
|
74
|
+
export function parseExtensions(input) {
|
|
75
|
+
return input.split(',').map(e => e.trim()).filter(e => e.length > 0);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Validate principal name
|
|
79
|
+
*/
|
|
80
|
+
export function isValidPrincipal(name) {
|
|
81
|
+
return /^[a-zA-Z0-9_-]+$/.test(name);
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Read public key from file or stdin
|
|
85
|
+
*/
|
|
86
|
+
export async function readPublicKey(file) {
|
|
87
|
+
const fs = await import('fs/promises');
|
|
88
|
+
if (file) {
|
|
89
|
+
const content = await fs.readFile(file, 'utf8');
|
|
90
|
+
return content.trim();
|
|
91
|
+
}
|
|
92
|
+
// Read from stdin if piped
|
|
93
|
+
if (!process.stdin.isTTY) {
|
|
94
|
+
return new Promise((resolve, reject) => {
|
|
95
|
+
let data = '';
|
|
96
|
+
process.stdin.setEncoding('utf8');
|
|
97
|
+
process.stdin.on('data', chunk => { data += chunk; });
|
|
98
|
+
process.stdin.on('end', () => resolve(data.trim()));
|
|
99
|
+
process.stdin.on('error', reject);
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
throw new Error('No public key provided. Use --public-key, --file, or pipe to stdin.');
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/commands/ssh-ca/helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/ssh-ca/index.ts"],"names":[],"mappings":"AAEA;;GAEG;AAEH,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBzC,cAAc,YAAY,CAAC;AAE3B,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgM5D"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
// Path: src/commands/ssh-ca/index.ts
|
|
2
|
+
import { getStatus, initCA, deleteCA, getPublicKey } from './ca.js';
|
|
3
|
+
import { listMappings, createMapping, updateMapping, deleteMapping } from './mappings.js';
|
|
4
|
+
import { listServerGroups, getServerGroup, createServerGroup, deleteServerGroup, setAccessRule, deleteAccessRule, getAuthorizedPrincipals, } from './server-groups.js';
|
|
5
|
+
import { listCertificates, getCertificate, revokeCertificate } from './certificates.js';
|
|
6
|
+
import { signCertificate } from './sign.js';
|
|
7
|
+
// Re-export types
|
|
8
|
+
export * from './types.js';
|
|
9
|
+
export function registerSSHCACommands(program) {
|
|
10
|
+
const sshca = program
|
|
11
|
+
.command('ssh-ca')
|
|
12
|
+
.description('SSH Certificate Authority management')
|
|
13
|
+
.addHelpText('after', `
|
|
14
|
+
Examples:
|
|
15
|
+
# Initialize the CA
|
|
16
|
+
znvault ssh-ca init --key-type ed25519 --default-ttl 28800
|
|
17
|
+
|
|
18
|
+
# Get CA public key for server configuration
|
|
19
|
+
znvault ssh-ca public-key --raw > /etc/ssh/trusted-user-ca-keys.pub
|
|
20
|
+
|
|
21
|
+
# Create a principal mapping
|
|
22
|
+
znvault ssh-ca mapping create --group-id GROUP_ID --principals deploy,developer
|
|
23
|
+
|
|
24
|
+
# Create a server group and add access rules
|
|
25
|
+
znvault ssh-ca server-group create --name production-web
|
|
26
|
+
znvault ssh-ca server-group set-access GROUP_ID --linux-user deploy --principals deploy,admin
|
|
27
|
+
|
|
28
|
+
# Sign your SSH public key
|
|
29
|
+
znvault ssh-ca sign --file ~/.ssh/id_ed25519.pub > ~/.ssh/id_ed25519-cert.pub
|
|
30
|
+
|
|
31
|
+
# List and revoke certificates
|
|
32
|
+
znvault ssh-ca cert list --active-only
|
|
33
|
+
znvault ssh-ca cert revoke CERT_ID --reason "User offboarded"
|
|
34
|
+
`);
|
|
35
|
+
// -------------------------------------------------------------------------
|
|
36
|
+
// CA Commands
|
|
37
|
+
// -------------------------------------------------------------------------
|
|
38
|
+
sshca
|
|
39
|
+
.command('status')
|
|
40
|
+
.description('Get SSH CA status')
|
|
41
|
+
.option('--json', 'Output as JSON')
|
|
42
|
+
.action(getStatus);
|
|
43
|
+
sshca
|
|
44
|
+
.command('init')
|
|
45
|
+
.description('Initialize SSH CA')
|
|
46
|
+
.option('--key-type <type>', 'Key type: ed25519 or rsa-4096')
|
|
47
|
+
.option('--default-ttl <seconds>', 'Default certificate TTL in seconds')
|
|
48
|
+
.option('--max-ttl <seconds>', 'Maximum certificate TTL in seconds')
|
|
49
|
+
.option('--extensions <list>', 'Allowed extensions (comma-separated)')
|
|
50
|
+
.option('--json', 'Output as JSON')
|
|
51
|
+
.action(initCA);
|
|
52
|
+
sshca
|
|
53
|
+
.command('delete')
|
|
54
|
+
.description('Delete SSH CA (destructive!)')
|
|
55
|
+
.option('--force', 'Skip confirmation')
|
|
56
|
+
.option('--json', 'Output as JSON')
|
|
57
|
+
.action(deleteCA);
|
|
58
|
+
sshca
|
|
59
|
+
.command('public-key')
|
|
60
|
+
.description('Get CA public key')
|
|
61
|
+
.option('--raw', 'Output only the key (for piping to file)')
|
|
62
|
+
.option('--json', 'Output as JSON')
|
|
63
|
+
.action(getPublicKey);
|
|
64
|
+
// -------------------------------------------------------------------------
|
|
65
|
+
// Mapping Commands
|
|
66
|
+
// -------------------------------------------------------------------------
|
|
67
|
+
const mapping = sshca.command('mapping').description('Manage principal mappings (SSO group → SSH principals)');
|
|
68
|
+
mapping
|
|
69
|
+
.command('list')
|
|
70
|
+
.alias('ls')
|
|
71
|
+
.description('List principal mappings')
|
|
72
|
+
.option('--json', 'Output as JSON')
|
|
73
|
+
.action(listMappings);
|
|
74
|
+
mapping
|
|
75
|
+
.command('create')
|
|
76
|
+
.description('Create a principal mapping')
|
|
77
|
+
.option('--group-id <id>', 'SSO group ID')
|
|
78
|
+
.option('--principals <list>', 'SSH principals (comma-separated)')
|
|
79
|
+
.option('--json', 'Output as JSON')
|
|
80
|
+
.action(createMapping);
|
|
81
|
+
mapping
|
|
82
|
+
.command('update <mapping-id>')
|
|
83
|
+
.description('Update a principal mapping')
|
|
84
|
+
.option('--principals <list>', 'New SSH principals (comma-separated)')
|
|
85
|
+
.option('--json', 'Output as JSON')
|
|
86
|
+
.action(updateMapping);
|
|
87
|
+
mapping
|
|
88
|
+
.command('delete <mapping-id>')
|
|
89
|
+
.alias('rm')
|
|
90
|
+
.description('Delete a principal mapping')
|
|
91
|
+
.option('--force', 'Skip confirmation')
|
|
92
|
+
.option('--json', 'Output as JSON')
|
|
93
|
+
.action(deleteMapping);
|
|
94
|
+
// -------------------------------------------------------------------------
|
|
95
|
+
// Server Group Commands
|
|
96
|
+
// -------------------------------------------------------------------------
|
|
97
|
+
const serverGroup = sshca.command('server-group').alias('sg').description('Manage server groups');
|
|
98
|
+
serverGroup
|
|
99
|
+
.command('list')
|
|
100
|
+
.alias('ls')
|
|
101
|
+
.description('List server groups')
|
|
102
|
+
.option('--json', 'Output as JSON')
|
|
103
|
+
.action(listServerGroups);
|
|
104
|
+
serverGroup
|
|
105
|
+
.command('get <group-id>')
|
|
106
|
+
.description('Get server group details')
|
|
107
|
+
.option('--json', 'Output as JSON')
|
|
108
|
+
.action(getServerGroup);
|
|
109
|
+
serverGroup
|
|
110
|
+
.command('create')
|
|
111
|
+
.description('Create a server group')
|
|
112
|
+
.option('--name <name>', 'Server group name')
|
|
113
|
+
.option('--description <desc>', 'Description')
|
|
114
|
+
.option('--json', 'Output as JSON')
|
|
115
|
+
.action(createServerGroup);
|
|
116
|
+
serverGroup
|
|
117
|
+
.command('delete <group-id>')
|
|
118
|
+
.alias('rm')
|
|
119
|
+
.description('Delete a server group')
|
|
120
|
+
.option('--force', 'Skip confirmation')
|
|
121
|
+
.option('--json', 'Output as JSON')
|
|
122
|
+
.action(deleteServerGroup);
|
|
123
|
+
serverGroup
|
|
124
|
+
.command('set-access <group-id>')
|
|
125
|
+
.description('Set access rule for a server group')
|
|
126
|
+
.option('--linux-user <user>', 'Linux user name')
|
|
127
|
+
.option('--principals <list>', 'Allowed principals (comma-separated)')
|
|
128
|
+
.option('--json', 'Output as JSON')
|
|
129
|
+
.action(setAccessRule);
|
|
130
|
+
serverGroup
|
|
131
|
+
.command('delete-access <group-id> <linux-user>')
|
|
132
|
+
.description('Delete access rule from a server group')
|
|
133
|
+
.option('--force', 'Skip confirmation')
|
|
134
|
+
.option('--json', 'Output as JSON')
|
|
135
|
+
.action(deleteAccessRule);
|
|
136
|
+
serverGroup
|
|
137
|
+
.command('principals <group-id>')
|
|
138
|
+
.description('Get authorized principals for server configuration')
|
|
139
|
+
.option('--json', 'Output as JSON')
|
|
140
|
+
.action(getAuthorizedPrincipals);
|
|
141
|
+
// -------------------------------------------------------------------------
|
|
142
|
+
// Certificate Commands
|
|
143
|
+
// -------------------------------------------------------------------------
|
|
144
|
+
const cert = sshca.command('cert').alias('certificate').description('Manage SSH certificates');
|
|
145
|
+
cert
|
|
146
|
+
.command('list')
|
|
147
|
+
.alias('ls')
|
|
148
|
+
.description('List certificates')
|
|
149
|
+
.option('--active-only', 'Show only active certificates')
|
|
150
|
+
.option('--revoked', 'Show only revoked certificates')
|
|
151
|
+
.option('--user-id <id>', 'Filter by user ID')
|
|
152
|
+
.option('--limit <n>', 'Maximum number of results')
|
|
153
|
+
.option('--json', 'Output as JSON')
|
|
154
|
+
.action(listCertificates);
|
|
155
|
+
cert
|
|
156
|
+
.command('get <cert-id>')
|
|
157
|
+
.description('Get certificate details')
|
|
158
|
+
.option('--json', 'Output as JSON')
|
|
159
|
+
.action(getCertificate);
|
|
160
|
+
cert
|
|
161
|
+
.command('revoke <cert-id>')
|
|
162
|
+
.description('Revoke a certificate')
|
|
163
|
+
.option('--reason <reason>', 'Revocation reason')
|
|
164
|
+
.option('--force', 'Skip confirmation')
|
|
165
|
+
.option('--json', 'Output as JSON')
|
|
166
|
+
.action(revokeCertificate);
|
|
167
|
+
// -------------------------------------------------------------------------
|
|
168
|
+
// Sign Command
|
|
169
|
+
// -------------------------------------------------------------------------
|
|
170
|
+
sshca
|
|
171
|
+
.command('sign')
|
|
172
|
+
.description('Sign SSH public key to get a certificate')
|
|
173
|
+
.option('--public-key <key>', 'SSH public key string')
|
|
174
|
+
.option('--file <path>', 'Path to SSH public key file')
|
|
175
|
+
.option('--ttl <seconds>', 'Certificate TTL in seconds')
|
|
176
|
+
.option('--principals <list>', 'Direct principal specification (admin override, comma-separated). Requires ssh:ca:admin permission OR admin crypto access.')
|
|
177
|
+
.option('--json', 'Output as JSON')
|
|
178
|
+
.action(signCertificate);
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/ssh-ca/index.ts"],"names":[],"mappings":"AAAA,qCAAqC;AAOrC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC1F,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,aAAa,EACb,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACxF,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE5C,kBAAkB;AAClB,cAAc,YAAY,CAAC;AAE3B,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,MAAM,KAAK,GAAG,OAAO;SAClB,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,sCAAsC,CAAC;SACnD,WAAW,CAAC,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;CAqBzB,CAAC,CAAC;IAED,4EAA4E;IAC5E,cAAc;IACd,4EAA4E;IAC5E,KAAK;SACF,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,mBAAmB,CAAC;SAChC,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,SAAS,CAAC,CAAC;IAErB,KAAK;SACF,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,mBAAmB,CAAC;SAChC,MAAM,CAAC,mBAAmB,EAAE,+BAA+B,CAAC;SAC5D,MAAM,CAAC,yBAAyB,EAAE,oCAAoC,CAAC;SACvE,MAAM,CAAC,qBAAqB,EAAE,oCAAoC,CAAC;SACnE,MAAM,CAAC,qBAAqB,EAAE,sCAAsC,CAAC;SACrE,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,MAAM,CAAC,CAAC;IAElB,KAAK;SACF,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,8BAA8B,CAAC;SAC3C,MAAM,CAAC,SAAS,EAAE,mBAAmB,CAAC;SACtC,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAEpB,KAAK;SACF,OAAO,CAAC,YAAY,CAAC;SACrB,WAAW,CAAC,mBAAmB,CAAC;SAChC,MAAM,CAAC,OAAO,EAAE,0CAA0C,CAAC;SAC3D,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,YAAY,CAAC,CAAC;IAExB,4EAA4E;IAC5E,mBAAmB;IACnB,4EAA4E;IAC5E,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,wDAAwD,CAAC,CAAC;IAE/G,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,KAAK,CAAC,IAAI,CAAC;SACX,WAAW,CAAC,yBAAyB,CAAC;SACtC,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,YAAY,CAAC,CAAC;IAExB,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,4BAA4B,CAAC;SACzC,MAAM,CAAC,iBAAiB,EAAE,cAAc,CAAC;SACzC,MAAM,CAAC,qBAAqB,EAAE,kCAAkC,CAAC;SACjE,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,aAAa,CAAC,CAAC;IAEzB,OAAO;SACJ,OAAO,CAAC,qBAAqB,CAAC;SAC9B,WAAW,CAAC,4BAA4B,CAAC;SACzC,MAAM,CAAC,qBAAqB,EAAE,sCAAsC,CAAC;SACrE,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,aAAa,CAAC,CAAC;IAEzB,OAAO;SACJ,OAAO,CAAC,qBAAqB,CAAC;SAC9B,KAAK,CAAC,IAAI,CAAC;SACX,WAAW,CAAC,4BAA4B,CAAC;SACzC,MAAM,CAAC,SAAS,EAAE,mBAAmB,CAAC;SACtC,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,aAAa,CAAC,CAAC;IAEzB,4EAA4E;IAC5E,wBAAwB;IACxB,4EAA4E;IAC5E,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,sBAAsB,CAAC,CAAC;IAElG,WAAW;SACR,OAAO,CAAC,MAAM,CAAC;SACf,KAAK,CAAC,IAAI,CAAC;SACX,WAAW,CAAC,oBAAoB,CAAC;SACjC,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAE5B,WAAW;SACR,OAAO,CAAC,gBAAgB,CAAC;SACzB,WAAW,CAAC,0BAA0B,CAAC;SACvC,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,cAAc,CAAC,CAAC;IAE1B,WAAW;SACR,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,uBAAuB,CAAC;SACpC,MAAM,CAAC,eAAe,EAAE,mBAAmB,CAAC;SAC5C,MAAM,CAAC,sBAAsB,EAAE,aAAa,CAAC;SAC7C,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAE7B,WAAW;SACR,OAAO,CAAC,mBAAmB,CAAC;SAC5B,KAAK,CAAC,IAAI,CAAC;SACX,WAAW,CAAC,uBAAuB,CAAC;SACpC,MAAM,CAAC,SAAS,EAAE,mBAAmB,CAAC;SACtC,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAE7B,WAAW;SACR,OAAO,CAAC,uBAAuB,CAAC;SAChC,WAAW,CAAC,oCAAoC,CAAC;SACjD,MAAM,CAAC,qBAAqB,EAAE,iBAAiB,CAAC;SAChD,MAAM,CAAC,qBAAqB,EAAE,sCAAsC,CAAC;SACrE,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,aAAa,CAAC,CAAC;IAEzB,WAAW;SACR,OAAO,CAAC,uCAAuC,CAAC;SAChD,WAAW,CAAC,wCAAwC,CAAC;SACrD,MAAM,CAAC,SAAS,EAAE,mBAAmB,CAAC;SACtC,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAE5B,WAAW;SACR,OAAO,CAAC,uBAAuB,CAAC;SAChC,WAAW,CAAC,oDAAoD,CAAC;SACjE,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,uBAAuB,CAAC,CAAC;IAEnC,4EAA4E;IAC5E,uBAAuB;IACvB,4EAA4E;IAC5E,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,WAAW,CAAC,yBAAyB,CAAC,CAAC;IAE/F,IAAI;SACD,OAAO,CAAC,MAAM,CAAC;SACf,KAAK,CAAC,IAAI,CAAC;SACX,WAAW,CAAC,mBAAmB,CAAC;SAChC,MAAM,CAAC,eAAe,EAAE,+BAA+B,CAAC;SACxD,MAAM,CAAC,WAAW,EAAE,gCAAgC,CAAC;SACrD,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC;SAC7C,MAAM,CAAC,aAAa,EAAE,2BAA2B,CAAC;SAClD,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAE5B,IAAI;SACD,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,yBAAyB,CAAC;SACtC,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,cAAc,CAAC,CAAC;IAE1B,IAAI;SACD,OAAO,CAAC,kBAAkB,CAAC;SAC3B,WAAW,CAAC,sBAAsB,CAAC;SACnC,MAAM,CAAC,mBAAmB,EAAE,mBAAmB,CAAC;SAChD,MAAM,CAAC,SAAS,EAAE,mBAAmB,CAAC;SACtC,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAE7B,4EAA4E;IAC5E,eAAe;IACf,4EAA4E;IAC5E,KAAK;SACF,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,0CAA0C,CAAC;SACvD,MAAM,CAAC,oBAAoB,EAAE,uBAAuB,CAAC;SACrD,MAAM,CAAC,eAAe,EAAE,6BAA6B,CAAC;SACtD,MAAM,CAAC,iBAAiB,EAAE,4BAA4B,CAAC;SACvD,MAAM,CAAC,qBAAqB,EAAE,4HAA4H,CAAC;SAC3J,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,eAAe,CAAC,CAAC;AAC7B,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { MappingCreateOptions, MappingUpdateOptions } from './types.js';
|
|
2
|
+
export declare function listMappings(options: {
|
|
3
|
+
json?: boolean;
|
|
4
|
+
}): Promise<void>;
|
|
5
|
+
export declare function createMapping(options: MappingCreateOptions): Promise<void>;
|
|
6
|
+
export declare function updateMapping(mappingId: string, options: MappingUpdateOptions): Promise<void>;
|
|
7
|
+
export declare function deleteMapping(mappingId: string, options: {
|
|
8
|
+
force?: boolean;
|
|
9
|
+
json?: boolean;
|
|
10
|
+
}): Promise<void>;
|
|
11
|
+
//# sourceMappingURL=mappings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mappings.d.ts","sourceRoot":"","sources":["../../../src/commands/ssh-ca/mappings.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAGV,oBAAoB,EACpB,oBAAoB,EACrB,MAAM,YAAY,CAAC;AAapB,wBAAsB,YAAY,CAAC,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAuC7E;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2EhF;AAED,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CA+BnG;AAED,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA6BlH"}
|