@prism-d1/cli 1.2.0 → 1.4.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.
- package/dist/assets/github-workflows/prism-eval-gate-kiro.yml +2 -2
- package/dist/assets/infra/bin/app.ts +61 -37
- package/dist/assets/infra/lib/constructs/security-agent-construct.ts +35 -30
- package/dist/assets/infra/lib/metrics-pipeline-stack.ts +2 -110
- package/dist/assets/infra/lib/security-agent-resources.ts +136 -0
- package/dist/assets/infra/lib/security-agent-stack.ts +69 -0
- package/dist/assets/pentest-cdk/bin/app.ts +12 -0
- package/dist/assets/pentest-cdk/cdk.json +7 -0
- package/dist/assets/pentest-cdk/lib/pentest-target-stack.ts +206 -0
- package/dist/assets/pentest-cdk/package.json +18 -0
- package/dist/assets/pentest-cdk/tsconfig.json +12 -0
- package/dist/src/aws/advice.d.ts +33 -0
- package/dist/src/aws/advice.d.ts.map +1 -0
- package/dist/src/aws/advice.js +174 -0
- package/dist/src/aws/advice.js.map +1 -0
- package/dist/src/aws/check.d.ts +64 -0
- package/dist/src/aws/check.d.ts.map +1 -0
- package/dist/src/aws/check.js +269 -0
- package/dist/src/aws/check.js.map +1 -0
- package/dist/src/aws/connect.d.ts +65 -0
- package/dist/src/aws/connect.d.ts.map +1 -0
- package/dist/src/aws/connect.js +250 -0
- package/dist/src/aws/connect.js.map +1 -0
- package/dist/src/aws/connection.d.ts +67 -0
- package/dist/src/aws/connection.d.ts.map +1 -0
- package/dist/src/aws/connection.js +137 -0
- package/dist/src/aws/connection.js.map +1 -0
- package/dist/src/aws/recommend.d.ts +70 -0
- package/dist/src/aws/recommend.d.ts.map +1 -0
- package/dist/src/aws/recommend.js +244 -0
- package/dist/src/aws/recommend.js.map +1 -0
- package/dist/src/aws/run-check.d.ts +31 -0
- package/dist/src/aws/run-check.d.ts.map +1 -0
- package/dist/src/aws/run-check.js +91 -0
- package/dist/src/aws/run-check.js.map +1 -0
- package/dist/src/codewatch/results.d.ts +155 -4
- package/dist/src/codewatch/results.d.ts.map +1 -1
- package/dist/src/codewatch/results.js +12 -2
- package/dist/src/codewatch/results.js.map +1 -1
- package/dist/src/commands/_top/version.d.ts +62 -0
- package/dist/src/commands/_top/version.d.ts.map +1 -0
- package/dist/src/commands/_top/version.js +175 -0
- package/dist/src/commands/_top/version.js.map +1 -0
- package/dist/src/commands/aws/check.d.ts +25 -0
- package/dist/src/commands/aws/check.d.ts.map +1 -0
- package/dist/src/commands/aws/check.js +42 -0
- package/dist/src/commands/aws/check.js.map +1 -0
- package/dist/src/commands/aws/connect.d.ts +16 -0
- package/dist/src/commands/aws/connect.d.ts.map +1 -0
- package/dist/src/commands/aws/connect.js +39 -0
- package/dist/src/commands/aws/connect.js.map +1 -0
- package/dist/src/commands/aws/recommend.d.ts +12 -0
- package/dist/src/commands/aws/recommend.d.ts.map +1 -0
- package/dist/src/commands/aws/recommend.js +21 -0
- package/dist/src/commands/aws/recommend.js.map +1 -0
- package/dist/src/commands/bedrock-protection/scan-account.d.ts.map +1 -1
- package/dist/src/commands/bedrock-protection/scan-account.js +14 -35
- package/dist/src/commands/bedrock-protection/scan-account.js.map +1 -1
- package/dist/src/commands/bedrock-protection/scan-org.d.ts.map +1 -1
- package/dist/src/commands/bedrock-protection/scan-org.js +12 -5
- package/dist/src/commands/bedrock-protection/scan-org.js.map +1 -1
- package/dist/src/commands/bootstrapper/setup-otel-sync.d.ts +12 -6
- package/dist/src/commands/bootstrapper/setup-otel-sync.d.ts.map +1 -1
- package/dist/src/commands/bootstrapper/setup-otel-sync.js +18 -409
- package/dist/src/commands/bootstrapper/setup-otel-sync.js.map +1 -1
- package/dist/src/commands/enable/codeburn.d.ts +59 -0
- package/dist/src/commands/enable/codeburn.d.ts.map +1 -0
- package/dist/src/commands/enable/codeburn.js +531 -0
- package/dist/src/commands/enable/codeburn.js.map +1 -0
- package/dist/src/commands/enable/security.d.ts +41 -0
- package/dist/src/commands/enable/security.d.ts.map +1 -0
- package/dist/src/commands/enable/security.js +128 -0
- package/dist/src/commands/enable/security.js.map +1 -0
- package/dist/src/commands/export/otel.d.ts +31 -0
- package/dist/src/commands/export/otel.d.ts.map +1 -0
- package/dist/src/commands/export/otel.js +52 -0
- package/dist/src/commands/export/otel.js.map +1 -0
- package/dist/src/commands/security/code-review.d.ts +22 -0
- package/dist/src/commands/security/code-review.d.ts.map +1 -0
- package/dist/src/commands/security/code-review.js +44 -0
- package/dist/src/commands/security/code-review.js.map +1 -0
- package/dist/src/commands/security/findings.d.ts +15 -0
- package/dist/src/commands/security/findings.d.ts.map +1 -0
- package/dist/src/commands/security/findings.js +33 -0
- package/dist/src/commands/security/findings.js.map +1 -0
- package/dist/src/commands/security/pentest.d.ts +18 -0
- package/dist/src/commands/security/pentest.d.ts.map +1 -0
- package/dist/src/commands/security/pentest.js +33 -0
- package/dist/src/commands/security/pentest.js.map +1 -0
- package/dist/src/commands/security/threat-model.d.ts +16 -0
- package/dist/src/commands/security/threat-model.d.ts.map +1 -0
- package/dist/src/commands/security/threat-model.js +25 -0
- package/dist/src/commands/security/threat-model.js.map +1 -0
- package/dist/src/commands/security/threats.d.ts +12 -0
- package/dist/src/commands/security/threats.d.ts.map +1 -0
- package/dist/src/commands/security/threats.js +24 -0
- package/dist/src/commands/security/threats.js.map +1 -0
- package/dist/src/commands/securityagent/setup.d.ts +19 -5
- package/dist/src/commands/securityagent/setup.d.ts.map +1 -1
- package/dist/src/commands/securityagent/setup.js +25 -189
- package/dist/src/commands/securityagent/setup.js.map +1 -1
- package/dist/src/dashboard/aws.d.ts +39 -0
- package/dist/src/dashboard/aws.d.ts.map +1 -0
- package/dist/src/dashboard/aws.js +35 -0
- package/dist/src/dashboard/aws.js.map +1 -0
- package/dist/src/dashboard/codewatch.d.ts.map +1 -1
- package/dist/src/dashboard/codewatch.js +2 -1
- package/dist/src/dashboard/codewatch.js.map +1 -1
- package/dist/src/dashboard/page.d.ts.map +1 -1
- package/dist/src/dashboard/page.js +193 -5
- package/dist/src/dashboard/page.js.map +1 -1
- package/dist/src/dashboard/payload.d.ts +11 -5
- package/dist/src/dashboard/payload.d.ts.map +1 -1
- package/dist/src/dashboard/payload.js +7 -2
- package/dist/src/dashboard/payload.js.map +1 -1
- package/dist/src/dashboard/security.d.ts +130 -0
- package/dist/src/dashboard/security.d.ts.map +1 -0
- package/dist/src/dashboard/security.js +144 -0
- package/dist/src/dashboard/security.js.map +1 -0
- package/dist/src/dashboard/setup.d.ts +15 -0
- package/dist/src/dashboard/setup.d.ts.map +1 -1
- package/dist/src/dashboard/setup.js +20 -3
- package/dist/src/dashboard/setup.js.map +1 -1
- package/dist/src/dashboard/usage.js +1 -1
- package/dist/src/dashboard/usage.js.map +1 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +9 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/security/cfn-diff.d.ts +57 -0
- package/dist/src/security/cfn-diff.d.ts.map +1 -0
- package/dist/src/security/cfn-diff.js +112 -0
- package/dist/src/security/cfn-diff.js.map +1 -0
- package/dist/src/security/errors.d.ts +45 -0
- package/dist/src/security/errors.d.ts.map +1 -0
- package/dist/src/security/errors.js +116 -0
- package/dist/src/security/errors.js.map +1 -0
- package/dist/src/security/marker.d.ts +46 -0
- package/dist/src/security/marker.d.ts.map +1 -0
- package/dist/src/security/marker.js +120 -0
- package/dist/src/security/marker.js.map +1 -0
- package/dist/src/security/pentest-dockerfile.d.ts +8 -0
- package/dist/src/security/pentest-dockerfile.d.ts.map +1 -0
- package/dist/src/security/pentest-dockerfile.js +163 -0
- package/dist/src/security/pentest-dockerfile.js.map +1 -0
- package/dist/src/security/pentest.d.ts +233 -0
- package/dist/src/security/pentest.d.ts.map +1 -0
- package/dist/src/security/pentest.js +1057 -0
- package/dist/src/security/pentest.js.map +1 -0
- package/dist/src/security/repo.d.ts +25 -0
- package/dist/src/security/repo.d.ts.map +1 -0
- package/dist/src/security/repo.js +38 -0
- package/dist/src/security/repo.js.map +1 -0
- package/dist/src/security/review.d.ts +202 -0
- package/dist/src/security/review.d.ts.map +1 -0
- package/dist/src/security/review.js +706 -0
- package/dist/src/security/review.js.map +1 -0
- package/dist/src/security/setup.d.ts +209 -0
- package/dist/src/security/setup.d.ts.map +1 -0
- package/dist/src/security/setup.js +742 -0
- package/dist/src/security/setup.js.map +1 -0
- package/dist/src/security/threat-model.d.ts +133 -0
- package/dist/src/security/threat-model.d.ts.map +1 -0
- package/dist/src/security/threat-model.js +653 -0
- package/dist/src/security/threat-model.js.map +1 -0
- package/dist/src/utils/audit-account.d.ts +50 -0
- package/dist/src/utils/audit-account.d.ts.map +1 -0
- package/dist/src/utils/audit-account.js +69 -0
- package/dist/src/utils/audit-account.js.map +1 -0
- package/dist/src/utils/audit-iam.d.ts +1 -1
- package/dist/src/utils/audit-iam.d.ts.map +1 -1
- package/dist/src/utils/audit-iam.js +11 -7
- package/dist/src/utils/audit-iam.js.map +1 -1
- package/dist/src/utils/exec.d.ts +6 -0
- package/dist/src/utils/exec.d.ts.map +1 -1
- package/dist/src/utils/exec.js +12 -1
- package/dist/src/utils/exec.js.map +1 -1
- package/dist/src/utils/otel-sync-schedule.d.ts +19 -0
- package/dist/src/utils/otel-sync-schedule.d.ts.map +1 -1
- package/dist/src/utils/otel-sync-schedule.js +24 -2
- package/dist/src/utils/otel-sync-schedule.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connect.js","sourceRoot":"","sources":["../../../src/aws/connect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { type RunResult } from '../utils/exec.js';
|
|
2
|
+
export declare const USER_CONNECTION_PATH = "~/.prism/aws.json";
|
|
3
|
+
export declare const REPO_CONNECTION_PATH = ".prism/aws.local.json";
|
|
4
|
+
export interface AwsConnection {
|
|
5
|
+
profile: string;
|
|
6
|
+
region: string;
|
|
7
|
+
account: string;
|
|
8
|
+
alias: string | null;
|
|
9
|
+
verifiedAt: string;
|
|
10
|
+
}
|
|
11
|
+
export type ConnectionScope = 'repo' | 'user';
|
|
12
|
+
export interface SavedConnection extends AwsConnection {
|
|
13
|
+
scope: ConnectionScope;
|
|
14
|
+
path: string;
|
|
15
|
+
}
|
|
16
|
+
/** What a command's options gain from the resolver. */
|
|
17
|
+
export interface ConnectionDefaults {
|
|
18
|
+
profile?: string;
|
|
19
|
+
/** Where `profile` came from, e.g. "--profile" or "aws connect, user". Unset when no profile is used. */
|
|
20
|
+
profileSource?: string;
|
|
21
|
+
/** The saved connection whose region (and account, for the change warning) applies. */
|
|
22
|
+
connection?: SavedConnection;
|
|
23
|
+
}
|
|
24
|
+
/** Credential env vars that the AWS CLI prefers over any profile; when set, the saved profile is not applied. */
|
|
25
|
+
export declare const ENV_CREDENTIAL_VARS: string[];
|
|
26
|
+
export declare const PROFILE_RE: RegExp;
|
|
27
|
+
export declare const REGION_RE: RegExp;
|
|
28
|
+
export declare const userConnectionPath: (home: string) => string;
|
|
29
|
+
export declare const repoConnectionPath: (root: string) => string;
|
|
30
|
+
/** The connection in `path`; null when the file is absent or not a valid connection. */
|
|
31
|
+
export declare function readConnectionFile(path: string): AwsConnection | null;
|
|
32
|
+
/** Atomic write, owner-only (no secrets inside, but it is per-user state). */
|
|
33
|
+
export declare function writeConnectionFile(path: string, c: AwsConnection): void;
|
|
34
|
+
/** Removes the file; true when there was one. */
|
|
35
|
+
export declare function clearConnectionFile(path: string): boolean;
|
|
36
|
+
/** The repo file first, then the user file. `home` '' means no user file. */
|
|
37
|
+
export declare function loadConnection(home: string, repoRoot: string | null): SavedConnection | null;
|
|
38
|
+
export declare const connectionLabel: (c: Pick<SavedConnection, "scope">) => string;
|
|
39
|
+
/**
|
|
40
|
+
* Fills the profile from the saved connection when neither a flag nor the
|
|
41
|
+
* environment chose the credentials, and attaches the connection whose region
|
|
42
|
+
* applies. Pure: the caller loads the connection.
|
|
43
|
+
*/
|
|
44
|
+
export declare function applyConnection<T extends {
|
|
45
|
+
profile?: string;
|
|
46
|
+
region?: string;
|
|
47
|
+
}>(opts: T, saved: SavedConnection | null, env: NodeJS.ProcessEnv): T & ConnectionDefaults;
|
|
48
|
+
/** `git -C dir rev-parse --show-toplevel`, or null outside a repository. */
|
|
49
|
+
export declare function repoRootOf(dir: string, git?: (args: string[]) => RunResult): string | null;
|
|
50
|
+
/**
|
|
51
|
+
* The real-runtime entry point: loads the saved connection for the working
|
|
52
|
+
* directory (or `opts.path`) and applies it. With an explicit `env` (tests),
|
|
53
|
+
* the user file is looked up under env.HOME only, so a developer's own saved
|
|
54
|
+
* connection never leaks into a test run.
|
|
55
|
+
*/
|
|
56
|
+
export declare function connectionDefaults<T extends {
|
|
57
|
+
profile?: string;
|
|
58
|
+
region?: string;
|
|
59
|
+
path?: string;
|
|
60
|
+
}>(opts: T, env?: NodeJS.ProcessEnv): T & ConnectionDefaults;
|
|
61
|
+
/** The account-change warning, or null when the account is the one that was verified. */
|
|
62
|
+
export declare function accountChangeWarning(c: SavedConnection | undefined, account: string): string | null;
|
|
63
|
+
/** `aws configure get region [--profile p]`: local config only, no AWS call. */
|
|
64
|
+
export declare function configuredRegion(profile?: string): string | null;
|
|
65
|
+
/** `aws configure list-profiles`: local config only, no AWS call. */
|
|
66
|
+
export declare function listProfiles(): string[];
|
|
67
|
+
//# sourceMappingURL=connection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../../src/aws/connection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The saved AWS connection from `prism-cli aws connect`, and the one resolver
|
|
3
|
+
* every AWS command uses to pick its default profile and region.
|
|
4
|
+
*
|
|
5
|
+
* What is saved is a profile NAME, a region and what that pair was verified
|
|
6
|
+
* as (account, alias, when). Never a credential: the AWS CLI still resolves
|
|
7
|
+
* the profile's credentials itself, every time.
|
|
8
|
+
*
|
|
9
|
+
* Files:
|
|
10
|
+
* ~/.prism/aws.json per user
|
|
11
|
+
* .prism/aws.local.json per repo override (git-ignored via .git/info/exclude)
|
|
12
|
+
*
|
|
13
|
+
* Precedence, per field:
|
|
14
|
+
* profile: --profile > env credentials (AWS_PROFILE, AWS_ACCESS_KEY_ID, ...) > repo file > user file > default chain
|
|
15
|
+
* region: --region > AWS_REGION > AWS_DEFAULT_REGION > saved region > the profile's configured region
|
|
16
|
+
* The saved region is used only together with its saved profile (the two were
|
|
17
|
+
* verified as a pair): `--profile other` falls through to other's own region.
|
|
18
|
+
*/
|
|
19
|
+
import { existsSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from 'node:fs';
|
|
20
|
+
import { homedir } from 'node:os';
|
|
21
|
+
import { dirname, join, resolve } from 'node:path';
|
|
22
|
+
import { run } from '../utils/exec.js';
|
|
23
|
+
export const USER_CONNECTION_PATH = '~/.prism/aws.json';
|
|
24
|
+
export const REPO_CONNECTION_PATH = '.prism/aws.local.json';
|
|
25
|
+
/** Credential env vars that the AWS CLI prefers over any profile; when set, the saved profile is not applied. */
|
|
26
|
+
export const ENV_CREDENTIAL_VARS = ['AWS_PROFILE', 'AWS_ACCESS_KEY_ID', 'AWS_WEB_IDENTITY_TOKEN_FILE', 'AWS_CONTAINER_CREDENTIALS_FULL_URI', 'AWS_CONTAINER_CREDENTIALS_RELATIVE_URI'];
|
|
27
|
+
export const PROFILE_RE = /^[A-Za-z0-9_.+=,@:-]{1,128}$/;
|
|
28
|
+
export const REGION_RE = /^[a-z]{2}(-[a-z]+)+-\d{1,2}$/;
|
|
29
|
+
const ACCOUNT_RE = /^\d{12}$/;
|
|
30
|
+
export const userConnectionPath = (home) => join(home, '.prism', 'aws.json');
|
|
31
|
+
export const repoConnectionPath = (root) => resolve(root, REPO_CONNECTION_PATH);
|
|
32
|
+
function parse(x) {
|
|
33
|
+
if (!x || typeof x !== 'object')
|
|
34
|
+
return null;
|
|
35
|
+
if (typeof x.profile !== 'string' || !PROFILE_RE.test(x.profile))
|
|
36
|
+
return null;
|
|
37
|
+
if (typeof x.region !== 'string' || !REGION_RE.test(x.region))
|
|
38
|
+
return null;
|
|
39
|
+
if (typeof x.account !== 'string' || !ACCOUNT_RE.test(x.account))
|
|
40
|
+
return null;
|
|
41
|
+
return {
|
|
42
|
+
profile: x.profile, region: x.region, account: x.account,
|
|
43
|
+
alias: typeof x.alias === 'string' && x.alias ? x.alias : null,
|
|
44
|
+
verifiedAt: typeof x.verifiedAt === 'string' ? x.verifiedAt : '',
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
/** The connection in `path`; null when the file is absent or not a valid connection. */
|
|
48
|
+
export function readConnectionFile(path) {
|
|
49
|
+
try {
|
|
50
|
+
return parse(JSON.parse(readFileSync(path, 'utf8')));
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/** Atomic write, owner-only (no secrets inside, but it is per-user state). */
|
|
57
|
+
export function writeConnectionFile(path, c) {
|
|
58
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
59
|
+
const tmp = `${path}.${process.pid}.tmp`;
|
|
60
|
+
const body = { profile: c.profile, region: c.region, account: c.account, alias: c.alias, verifiedAt: c.verifiedAt };
|
|
61
|
+
writeFileSync(tmp, JSON.stringify(body, null, 2) + '\n', { mode: 0o600 });
|
|
62
|
+
renameSync(tmp, path);
|
|
63
|
+
}
|
|
64
|
+
/** Removes the file; true when there was one. */
|
|
65
|
+
export function clearConnectionFile(path) {
|
|
66
|
+
if (!existsSync(path))
|
|
67
|
+
return false;
|
|
68
|
+
rmSync(path, { force: true });
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
/** The repo file first, then the user file. `home` '' means no user file. */
|
|
72
|
+
export function loadConnection(home, repoRoot) {
|
|
73
|
+
if (repoRoot) {
|
|
74
|
+
const p = repoConnectionPath(repoRoot);
|
|
75
|
+
const c = readConnectionFile(p);
|
|
76
|
+
if (c)
|
|
77
|
+
return { ...c, scope: 'repo', path: p };
|
|
78
|
+
}
|
|
79
|
+
if (home) {
|
|
80
|
+
const p = userConnectionPath(home);
|
|
81
|
+
const c = readConnectionFile(p);
|
|
82
|
+
if (c)
|
|
83
|
+
return { ...c, scope: 'user', path: p };
|
|
84
|
+
}
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
export const connectionLabel = (c) => `aws connect, ${c.scope}`;
|
|
88
|
+
/**
|
|
89
|
+
* Fills the profile from the saved connection when neither a flag nor the
|
|
90
|
+
* environment chose the credentials, and attaches the connection whose region
|
|
91
|
+
* applies. Pure: the caller loads the connection.
|
|
92
|
+
*/
|
|
93
|
+
export function applyConnection(opts, saved, env) {
|
|
94
|
+
if (opts.profile)
|
|
95
|
+
return { ...opts, profileSource: '--profile', connection: saved && saved.profile === opts.profile ? saved : undefined };
|
|
96
|
+
if (ENV_CREDENTIAL_VARS.some((k) => env[k])) {
|
|
97
|
+
return { ...opts, connection: saved && env.AWS_PROFILE === saved.profile ? saved : undefined };
|
|
98
|
+
}
|
|
99
|
+
if (saved)
|
|
100
|
+
return { ...opts, profile: saved.profile, profileSource: connectionLabel(saved), connection: saved };
|
|
101
|
+
return { ...opts };
|
|
102
|
+
}
|
|
103
|
+
/** `git -C dir rev-parse --show-toplevel`, or null outside a repository. */
|
|
104
|
+
export function repoRootOf(dir, git = (a) => run('git', a)) {
|
|
105
|
+
const r = git(['-C', dir, 'rev-parse', '--show-toplevel']);
|
|
106
|
+
return r.ok && r.stdout ? r.stdout.trim() : null;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* The real-runtime entry point: loads the saved connection for the working
|
|
110
|
+
* directory (or `opts.path`) and applies it. With an explicit `env` (tests),
|
|
111
|
+
* the user file is looked up under env.HOME only, so a developer's own saved
|
|
112
|
+
* connection never leaks into a test run.
|
|
113
|
+
*/
|
|
114
|
+
export function connectionDefaults(opts, env) {
|
|
115
|
+
const e = env ?? process.env;
|
|
116
|
+
const home = env ? (env.HOME ?? '') : homedir();
|
|
117
|
+
const root = repoRootOf(opts.path ? resolve(opts.path) : process.cwd());
|
|
118
|
+
return applyConnection(opts, loadConnection(home, root), e);
|
|
119
|
+
}
|
|
120
|
+
/** The account-change warning, or null when the account is the one that was verified. */
|
|
121
|
+
export function accountChangeWarning(c, account) {
|
|
122
|
+
if (!c || !account || c.account === account)
|
|
123
|
+
return null;
|
|
124
|
+
return `Warning: aws connect verified profile ${c.profile} as account ${c.account}${c.verifiedAt ? ` on ${c.verifiedAt}` : ''}, but it now resolves to account ${account}. `
|
|
125
|
+
+ `Check the profile, then re-run prism-cli aws connect${c.scope === 'repo' ? ' --repo' : ''}.`;
|
|
126
|
+
}
|
|
127
|
+
/** `aws configure get region [--profile p]`: local config only, no AWS call. */
|
|
128
|
+
export function configuredRegion(profile) {
|
|
129
|
+
const r = run('aws', ['configure', 'get', 'region', ...(profile ? ['--profile', profile] : [])]);
|
|
130
|
+
return r.ok && r.stdout ? r.stdout.trim() : null;
|
|
131
|
+
}
|
|
132
|
+
/** `aws configure list-profiles`: local config only, no AWS call. */
|
|
133
|
+
export function listProfiles() {
|
|
134
|
+
const r = run('aws', ['configure', 'list-profiles']);
|
|
135
|
+
return r.ok ? r.stdout.split('\n').map((l) => l.trim()).filter(Boolean) : [];
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=connection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../../../src/aws/connection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACjG,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,GAAG,EAAkB,MAAM,kBAAkB,CAAC;AAEvD,MAAM,CAAC,MAAM,oBAAoB,GAAG,mBAAmB,CAAC;AACxD,MAAM,CAAC,MAAM,oBAAoB,GAAG,uBAAuB,CAAC;AAsB5D,iHAAiH;AACjH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,aAAa,EAAE,mBAAmB,EAAE,6BAA6B,EAAE,oCAAoC,EAAE,wCAAwC,CAAC,CAAC;AAEvL,MAAM,CAAC,MAAM,UAAU,GAAG,8BAA8B,CAAC;AACzD,MAAM,CAAC,MAAM,SAAS,GAAG,8BAA8B,CAAC;AACxD,MAAM,UAAU,GAAG,UAAU,CAAC;AAE9B,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;AAC7F,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC;AAEhG,SAAS,KAAK,CAAC,CAAM;IACnB,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC7C,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9E,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3E,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9E,OAAO;QACL,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO;QACxD,KAAK,EAAE,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;QAC9D,UAAU,EAAE,OAAO,CAAC,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;KACjE,CAAC;AACJ,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,IAAI,CAAC;QAAC,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;AACtF,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,mBAAmB,CAAC,IAAY,EAAE,CAAgB;IAChE,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,MAAM,CAAC;IACzC,MAAM,IAAI,GAAkB,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC;IACnI,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1E,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AACxB,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACpC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9B,OAAO,IAAI,CAAC;AACd,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,QAAuB;IAClE,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,CAAC,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QACvC,MAAM,CAAC,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;QAChC,IAAI,CAAC;YAAE,OAAO,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IACjD,CAAC;IACD,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,CAAC,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,CAAC,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;QAChC,IAAI,CAAC;YAAE,OAAO,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IACjD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAiC,EAAU,EAAE,CAAC,gBAAgB,CAAC,CAAC,KAAK,EAAE,CAAC;AAExG;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAkD,IAAO,EAAE,KAA6B,EAAE,GAAsB;IAC7I,IAAI,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,GAAG,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;IAC1I,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5C,OAAO,EAAE,GAAG,IAAI,EAAE,UAAU,EAAE,KAAK,IAAI,GAAG,CAAC,WAAW,KAAK,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;IACjG,CAAC;IACD,IAAI,KAAK;QAAE,OAAO,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,aAAa,EAAE,eAAe,CAAC,KAAK,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IAChH,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC;AACrB,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,UAAU,CAAC,GAAW,EAAE,MAAqC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;IAC/F,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAC3D,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACnD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAiE,IAAO,EAAE,GAAuB;IACjI,MAAM,CAAC,GAAG,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IAC7B,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IAChD,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACxE,OAAO,eAAe,CAAC,IAAI,EAAE,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,oBAAoB,CAAC,CAA8B,EAAE,OAAe;IAClF,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IACzD,OAAO,yCAAyC,CAAC,CAAC,OAAO,eAAe,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,oCAAoC,OAAO,IAAI;UACxK,uDAAuD,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC;AACpG,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,gBAAgB,CAAC,OAAgB;IAC/C,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACjG,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACnD,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,YAAY;IAC1B,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC,CAAC;IACrD,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC/E,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { type Finding, type Severity } from '../utils/audit.js';
|
|
2
|
+
import { type PrismResult, type ResultEntry } from '../codewatch/results.js';
|
|
3
|
+
import { type Effort } from './advice.js';
|
|
4
|
+
import { type CheckOptions, type CheckRunDeps } from './run-check.js';
|
|
5
|
+
export declare const RECOMMEND_NOTICE = "No AWS calls (aws recommend): it reads the latest aws check result in .prism/results/. Nothing in AWS is changed.";
|
|
6
|
+
export interface RecommendOptions extends Pick<CheckOptions, 'profile' | 'region' | 'profileSource' | 'connection'> {
|
|
7
|
+
account?: string;
|
|
8
|
+
refresh?: boolean;
|
|
9
|
+
json?: boolean;
|
|
10
|
+
markdown?: boolean;
|
|
11
|
+
}
|
|
12
|
+
/** Why an INDETERMINATE check could not run, as far as its detail tells. */
|
|
13
|
+
export type IndeterminateCause = 'access-denied' | 'no-credential-report' | 'prerequisite' | 'not-integrated' | 'other';
|
|
14
|
+
export interface Recommendation {
|
|
15
|
+
/** fix: one or more FAILs. access: one or more INDETERMINATE checks (could not check). */
|
|
16
|
+
kind: 'fix' | 'access';
|
|
17
|
+
/** The recommendation key; checks that share one fix share it (e.g. "budgets"). */
|
|
18
|
+
id: string;
|
|
19
|
+
/** Every check this item covers, worst first. */
|
|
20
|
+
covers: {
|
|
21
|
+
id: string;
|
|
22
|
+
title: string;
|
|
23
|
+
detail: string;
|
|
24
|
+
}[];
|
|
25
|
+
section: string;
|
|
26
|
+
severity: Severity;
|
|
27
|
+
effort: Effort;
|
|
28
|
+
title: string;
|
|
29
|
+
why: string;
|
|
30
|
+
steps: string[];
|
|
31
|
+
command: string | null;
|
|
32
|
+
doc: string | null;
|
|
33
|
+
/** fix only: its position in the ranked list, 1-based across sections. */
|
|
34
|
+
number?: number;
|
|
35
|
+
/** access only. */
|
|
36
|
+
cause?: IndeterminateCause;
|
|
37
|
+
}
|
|
38
|
+
/** Account and region from the result, filled into the advice's `<account>` and `<region>`. */
|
|
39
|
+
export interface AdviceContext {
|
|
40
|
+
account?: string;
|
|
41
|
+
region?: string;
|
|
42
|
+
}
|
|
43
|
+
export declare const NO_REPORT_STEP = "No credential report exists yet. Run `prism-cli bedrock-protection scan-account` once (it generates one, which is a write) or `aws iam generate-credential-report`, then re-run aws check.";
|
|
44
|
+
/** Only an access-denied detail means "grant"; a missing report or a missing prerequisite says what to do first. */
|
|
45
|
+
export declare function indeterminateCause(f: Finding): IndeterminateCause;
|
|
46
|
+
type Rankable = Pick<Recommendation, 'severity' | 'effort' | 'id'>;
|
|
47
|
+
/** Severity first, then effort (quick wins first), then id. */
|
|
48
|
+
export declare function rank(a: Rankable, b: Rankable): number;
|
|
49
|
+
/** Check ids older results still carry, and the check that replaced them, so a cached result de-duplicates too. */
|
|
50
|
+
export declare const RETIRED_IDS: Record<string, string>;
|
|
51
|
+
export interface SectionAdvice {
|
|
52
|
+
section: string;
|
|
53
|
+
heading: string;
|
|
54
|
+
fixes: Recommendation[];
|
|
55
|
+
access: Recommendation[];
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* FAILs and INDETERMINATEs as recommendations, grouped by section in aws
|
|
59
|
+
* check's order, each group ranked. Fixes are numbered across sections, so a
|
|
60
|
+
* check that waits on a fix can name it ("item 2").
|
|
61
|
+
*/
|
|
62
|
+
export declare function buildRecommendations(checks: Finding[], c?: AdviceContext): SectionAdvice[];
|
|
63
|
+
/** The newest aws-check result, optionally for one account and region. */
|
|
64
|
+
export declare function latestCheck(entries: ResultEntry[], account?: string, region?: string): ResultEntry | null;
|
|
65
|
+
export declare function renderText(r: PrismResult, groups: SectionAdvice[], source: string): string[];
|
|
66
|
+
export declare function renderMarkdown(r: PrismResult, groups: SectionAdvice[], source: string): string;
|
|
67
|
+
/** Runs `aws recommend`. Returns the exit code. */
|
|
68
|
+
export declare function awsRecommend(input: RecommendOptions, d: CheckRunDeps): number;
|
|
69
|
+
export {};
|
|
70
|
+
//# sourceMappingURL=recommend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recommend.d.ts","sourceRoot":"","sources":["../../../src/aws/recommend.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `prism-cli aws recommend`: turns the latest aws check result for the
|
|
3
|
+
* account and region into a ranked fix list. Makes no AWS calls (except
|
|
4
|
+
* through --refresh, which runs aws check first) and no model calls.
|
|
5
|
+
*/
|
|
6
|
+
import { writeFileSync } from 'node:fs';
|
|
7
|
+
import { join } from 'node:path';
|
|
8
|
+
import { severityRank } from '../utils/audit.js';
|
|
9
|
+
import { readResultEntries, RESULTS_DIR } from '../codewatch/results.js';
|
|
10
|
+
import { resolveRegion } from '../security/setup.js';
|
|
11
|
+
import { SECTIONS } from './check.js';
|
|
12
|
+
import { ADVICE, GROUPS } from './advice.js';
|
|
13
|
+
import { awsCheck, resultsRoot } from './run-check.js';
|
|
14
|
+
export const RECOMMEND_NOTICE = 'No AWS calls (aws recommend): it reads the latest aws check result in .prism/results/. Nothing in AWS is changed.';
|
|
15
|
+
const EFFORT_RANK = { quick: 0, medium: 1, large: 2 };
|
|
16
|
+
const fill = (text, c) => text.replace(/<region>/g, c.region || '<region>').replace(/<account>/g, c.account || '<account>');
|
|
17
|
+
const DENIED = /AccessDenied|UnauthorizedOperation|AuthorizationError|not authorized|Unauthorized/i;
|
|
18
|
+
export const NO_REPORT_STEP = 'No credential report exists yet. Run `prism-cli bedrock-protection scan-account` once (it generates one, which is a write) or `aws iam generate-credential-report`, then re-run aws check.';
|
|
19
|
+
/** Only an access-denied detail means "grant"; a missing report or a missing prerequisite says what to do first. */
|
|
20
|
+
export function indeterminateCause(f) {
|
|
21
|
+
const a = ADVICE[f.id];
|
|
22
|
+
if (a?.indeterminate)
|
|
23
|
+
return 'not-integrated';
|
|
24
|
+
if (/ReportNotPresent/.test(f.detail))
|
|
25
|
+
return 'no-credential-report';
|
|
26
|
+
if (DENIED.test(f.detail))
|
|
27
|
+
return 'access-denied';
|
|
28
|
+
if (a?.prerequisite)
|
|
29
|
+
return 'prerequisite';
|
|
30
|
+
return 'other';
|
|
31
|
+
}
|
|
32
|
+
/** Severity first, then effort (quick wins first), then id. */
|
|
33
|
+
export function rank(a, b) {
|
|
34
|
+
return severityRank(b.severity) - severityRank(a.severity) || EFFORT_RANK[a.effort] - EFFORT_RANK[b.effort] || a.id.localeCompare(b.id);
|
|
35
|
+
}
|
|
36
|
+
const unique = (xs) => [...new Set(xs)];
|
|
37
|
+
/** Check ids older results still carry, and the check that replaced them, so a cached result de-duplicates too. */
|
|
38
|
+
export const RETIRED_IDS = { 'baseline.root-mfa': 'bedrock.root-mfa' };
|
|
39
|
+
const adviceId = (id) => RETIRED_IDS[id] ?? id;
|
|
40
|
+
/** FAILs that share a recommendation key become one fix naming every check it covers. */
|
|
41
|
+
function fixes(fails, c) {
|
|
42
|
+
const byKey = new Map();
|
|
43
|
+
for (const f of fails) {
|
|
44
|
+
const key = ADVICE[adviceId(f.id)]?.key ?? adviceId(f.id);
|
|
45
|
+
byKey.set(key, [...(byKey.get(key) ?? []), f]);
|
|
46
|
+
}
|
|
47
|
+
return [...byKey.entries()].map(([key, fs]) => {
|
|
48
|
+
// The worst member sets the severity, the section and the lead text; the current id leads a retired one.
|
|
49
|
+
const retired = (id) => Number(id in RETIRED_IDS);
|
|
50
|
+
const members = fs.map((f) => ({ f, a: ADVICE[adviceId(f.id)], r: { severity: f.severity, effort: ADVICE[adviceId(f.id)]?.effort ?? 'medium', id: f.id } }))
|
|
51
|
+
.sort((x, y) => retired(x.f.id) - retired(y.f.id) || rank(x.r, y.r));
|
|
52
|
+
const lead = members[0];
|
|
53
|
+
const group = GROUPS[key];
|
|
54
|
+
// A check id with no mapping (an older result) falls back to the check's own remediation.
|
|
55
|
+
const steps = unique(members.flatMap(({ f, a }) => (a ? a.steps : f.remediation ? [f.remediation] : []))).map((x) => fill(x, c));
|
|
56
|
+
const cmd = members.map((m) => m.a?.command).find(Boolean);
|
|
57
|
+
const effort = members.map((m) => m.r.effort).sort((x, y) => EFFORT_RANK[x] - EFFORT_RANK[y])[0];
|
|
58
|
+
return {
|
|
59
|
+
kind: 'fix', id: key, section: lead.f.category, severity: lead.f.severity, effort,
|
|
60
|
+
covers: members.map(({ f }) => ({ id: f.id, title: f.title, detail: f.detail })),
|
|
61
|
+
title: fill(group?.title ?? lead.a?.title ?? lead.f.title, c), why: group?.why ?? lead.a?.why ?? lead.f.detail,
|
|
62
|
+
steps, command: cmd ? fill(cmd, c) : null, doc: lead.a?.doc ?? null,
|
|
63
|
+
};
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
function accessItem(f, numbers, c) {
|
|
67
|
+
const a = ADVICE[f.id];
|
|
68
|
+
const cause = indeterminateCause(f);
|
|
69
|
+
let title = `Could not check: ${f.title}`;
|
|
70
|
+
let step = 'The check got no answer (see what it found); re-run prism-cli aws check.';
|
|
71
|
+
if (cause === 'not-integrated') {
|
|
72
|
+
title = a.title;
|
|
73
|
+
step = a.indeterminate;
|
|
74
|
+
}
|
|
75
|
+
else if (cause === 'no-credential-report') {
|
|
76
|
+
title = 'Create an IAM credential report';
|
|
77
|
+
step = NO_REPORT_STEP;
|
|
78
|
+
}
|
|
79
|
+
else if (cause === 'access-denied') {
|
|
80
|
+
title = `Grant read access to check: ${f.title}`;
|
|
81
|
+
step = a?.needs?.length ? `Grant ${a.needs.join(', ')} (read-only), then re-run prism-cli aws check.` : 'Grant read access for this check, then re-run prism-cli aws check.';
|
|
82
|
+
}
|
|
83
|
+
else if (cause === 'prerequisite') {
|
|
84
|
+
const n = numbers.get(a.prerequisite);
|
|
85
|
+
title = `Checked after another fix: ${f.title}`;
|
|
86
|
+
step = `${GROUPS[a.prerequisite]?.first ?? `Fix ${a.prerequisite}`}${n ? ` in item ${n}` : ''} first, then re-run prism-cli aws check.`;
|
|
87
|
+
}
|
|
88
|
+
return {
|
|
89
|
+
kind: 'access', id: f.id, cause, section: f.category, severity: f.severity, effort: 'quick',
|
|
90
|
+
covers: [{ id: f.id, title: f.title, detail: f.detail }], title, why: 'The check could not run, so it is not a pass.',
|
|
91
|
+
steps: [fill(step, c)], command: null, doc: a?.doc ?? null,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
/** INDETERMINATE items with the same step (three checks waiting on one credential report) become one. */
|
|
95
|
+
function mergeAccess(items) {
|
|
96
|
+
const out = new Map();
|
|
97
|
+
for (const x of [...items].sort(rank)) {
|
|
98
|
+
const prev = out.get(x.steps[0]);
|
|
99
|
+
if (prev)
|
|
100
|
+
prev.covers.push(...x.covers);
|
|
101
|
+
else
|
|
102
|
+
out.set(x.steps[0], { ...x, covers: [...x.covers] });
|
|
103
|
+
}
|
|
104
|
+
for (const x of out.values()) {
|
|
105
|
+
if (x.covers.length > 1 && (x.cause === 'access-denied' || x.cause === 'other'))
|
|
106
|
+
x.title = `${x.title.split(': ')[0]}: ${x.covers.map((v) => v.title).join('; ')}`;
|
|
107
|
+
}
|
|
108
|
+
return [...out.values()];
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* FAILs and INDETERMINATEs as recommendations, grouped by section in aws
|
|
112
|
+
* check's order, each group ranked. Fixes are numbered across sections, so a
|
|
113
|
+
* check that waits on a fix can name it ("item 2").
|
|
114
|
+
*/
|
|
115
|
+
export function buildRecommendations(checks, c = {}) {
|
|
116
|
+
const fixList = fixes(checks.filter((f) => f.status === 'FAIL'), c);
|
|
117
|
+
const known = SECTIONS.map((s) => [s.name, s.heading]);
|
|
118
|
+
const extra = unique(checks.filter((f) => f.status !== 'PASS').map((f) => f.category))
|
|
119
|
+
.filter((s) => !known.some(([n]) => n === s)).map((s) => [s, s]);
|
|
120
|
+
const groups = [...known, ...extra].map(([section, heading]) => ({
|
|
121
|
+
section, heading, fixes: fixList.filter((r) => r.section === section).sort(rank), access: [],
|
|
122
|
+
}));
|
|
123
|
+
const numbers = new Map();
|
|
124
|
+
let n = 0;
|
|
125
|
+
for (const g of groups)
|
|
126
|
+
for (const x of g.fixes) {
|
|
127
|
+
x.number = ++n;
|
|
128
|
+
numbers.set(x.id, n);
|
|
129
|
+
}
|
|
130
|
+
const access = mergeAccess(checks.filter((f) => f.status === 'INDETERMINATE').map((f) => accessItem(f, numbers, c)));
|
|
131
|
+
for (const g of groups)
|
|
132
|
+
g.access = access.filter((x) => x.section === g.section);
|
|
133
|
+
return groups.filter((g) => g.fixes.length || g.access.length);
|
|
134
|
+
}
|
|
135
|
+
/** The newest aws-check result, optionally for one account and region. */
|
|
136
|
+
export function latestCheck(entries, account, region) {
|
|
137
|
+
return entries
|
|
138
|
+
.filter((e) => e.result.kind === 'aws-check' && e.result.aws_check && (!account || e.result.aws_check.account === account) && (!region || e.result.aws_check.region === region))
|
|
139
|
+
.sort((a, b) => b.result.started_at.localeCompare(a.result.started_at))[0] ?? null;
|
|
140
|
+
}
|
|
141
|
+
const header = (r) => {
|
|
142
|
+
const c = r.aws_check;
|
|
143
|
+
return `account ${c.account}${c.alias ? ` (${c.alias})` : ''}, region ${c.region}`;
|
|
144
|
+
};
|
|
145
|
+
/** What the check found; one line per check when an item covers several. */
|
|
146
|
+
function found(x) {
|
|
147
|
+
if (x.covers.length === 1)
|
|
148
|
+
return [`Found: ${x.covers[0].detail}`];
|
|
149
|
+
return [`Covers ${x.covers.length} checks:`, ...x.covers.map((v) => `- ${v.title}: ${v.detail}`)];
|
|
150
|
+
}
|
|
151
|
+
const coversText = (x) => (x.covers.length > 1 && !x.title.includes(x.covers[1].title) ? ` (covers: ${x.covers.map((v) => v.title).join('; ')})` : '');
|
|
152
|
+
export function renderText(r, groups, source) {
|
|
153
|
+
const out = [`AWS recommendations for ${header(r)}`, ` From aws check at ${r.started_at} (${source}).`, ''];
|
|
154
|
+
if (!groups.length)
|
|
155
|
+
return [...out, 'Nothing to fix: every check passed.'];
|
|
156
|
+
for (const g of groups) {
|
|
157
|
+
out.push(`── ${g.heading} ──`, '');
|
|
158
|
+
for (const x of g.fixes) {
|
|
159
|
+
out.push(` ${x.number}. [${x.severity} · ${x.effort}] ${x.title}`, ` Why: ${x.why}`, ...found(x).map((l) => ` ${l}`));
|
|
160
|
+
for (const s of x.steps)
|
|
161
|
+
out.push(` - ${s}`);
|
|
162
|
+
if (x.command)
|
|
163
|
+
out.push(` Run: ${x.command}`);
|
|
164
|
+
if (x.doc)
|
|
165
|
+
out.push(` Docs: ${x.doc}`);
|
|
166
|
+
out.push('');
|
|
167
|
+
}
|
|
168
|
+
if (g.access.length) {
|
|
169
|
+
out.push(' Could not check (not a pass):');
|
|
170
|
+
for (const x of g.access)
|
|
171
|
+
out.push(` - [${x.severity}] ${x.title}: ${x.steps[0]}${coversText(x)}`);
|
|
172
|
+
out.push('');
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return out;
|
|
176
|
+
}
|
|
177
|
+
export function renderMarkdown(r, groups, source) {
|
|
178
|
+
const out = [`# AWS recommendations`, '', `For ${header(r)}, from \`prism-cli aws check\` at ${r.started_at} (${source}). Generated by \`prism-cli aws recommend\`; no AWS or model calls.`, ''];
|
|
179
|
+
if (!groups.length)
|
|
180
|
+
out.push('Nothing to fix: every check passed.', '');
|
|
181
|
+
for (const g of groups) {
|
|
182
|
+
out.push(`## ${g.heading}`, '');
|
|
183
|
+
for (const x of g.fixes) {
|
|
184
|
+
out.push(`### ${x.number}. ${x.title}`, '', `**${x.severity}**, effort ${x.effort}. ${x.why}`, '', ...found(x), '');
|
|
185
|
+
for (const s of x.steps)
|
|
186
|
+
out.push(`- ${s}`);
|
|
187
|
+
if (x.command)
|
|
188
|
+
out.push(`- Run \`${x.command}\``);
|
|
189
|
+
if (x.doc)
|
|
190
|
+
out.push(`- Docs: ${x.doc}`);
|
|
191
|
+
out.push('');
|
|
192
|
+
}
|
|
193
|
+
if (g.access.length) {
|
|
194
|
+
out.push('Could not check (not a pass):', '');
|
|
195
|
+
for (const x of g.access)
|
|
196
|
+
out.push(`- **${x.severity}** ${x.title}: ${x.steps[0]}${coversText(x)}`);
|
|
197
|
+
out.push('');
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return out.join('\n');
|
|
201
|
+
}
|
|
202
|
+
/** Runs `aws recommend`. Returns the exit code. */
|
|
203
|
+
export function awsRecommend(input, d) {
|
|
204
|
+
const say = input.json ? d.err : d.log;
|
|
205
|
+
say(input.refresh ? 'aws recommend --refresh: runs prism-cli aws check first (read-only), then reads its result.' : RECOMMEND_NOTICE);
|
|
206
|
+
say('');
|
|
207
|
+
if (input.account && !/^\d{12}$/.test(input.account)) {
|
|
208
|
+
say(`Error: --account must be a 12-digit account id, got "${input.account}".`);
|
|
209
|
+
return 1;
|
|
210
|
+
}
|
|
211
|
+
let account = input.account ?? input.connection?.account;
|
|
212
|
+
const region = resolveRegion(input, d)?.region;
|
|
213
|
+
if (input.refresh) {
|
|
214
|
+
const o = awsCheck({ ...input, json: false, report: !input.json }, { ...d, log: say });
|
|
215
|
+
if (o.code !== 0 && !o.result)
|
|
216
|
+
return o.code;
|
|
217
|
+
account = o.result?.aws_check?.account ?? account;
|
|
218
|
+
say('');
|
|
219
|
+
}
|
|
220
|
+
const roots = [...new Set([resultsRoot(d), d.home])];
|
|
221
|
+
const entry = latestCheck(roots.flatMap((root) => readResultEntries(root).map((e) => ({ ...e, root }))), account, region);
|
|
222
|
+
if (!entry) {
|
|
223
|
+
const scope = [account ? `account ${account}` : '', region ? `region ${region}` : ''].filter(Boolean).join(', ');
|
|
224
|
+
say(`No aws check result${scope ? ` for ${scope}` : ''}. Run prism-cli aws check first, or prism-cli aws recommend --refresh.`);
|
|
225
|
+
return 1;
|
|
226
|
+
}
|
|
227
|
+
const source = join(entry.root, RESULTS_DIR, `${entry.id}.json`);
|
|
228
|
+
const c = entry.result.aws_check;
|
|
229
|
+
const groups = buildRecommendations(c.checks, { account: c.account, region: c.region });
|
|
230
|
+
if (!account)
|
|
231
|
+
say(`Using the latest result (${entry.result.aws_check.account}); pass --account to choose another account.`);
|
|
232
|
+
if (input.json)
|
|
233
|
+
d.log(JSON.stringify({ schema: 'prism.aws-recommend.v1', account: entry.result.aws_check.account, region: entry.result.aws_check.region, checked_at: entry.result.started_at, source, groups }, null, 2));
|
|
234
|
+
else
|
|
235
|
+
for (const l of renderText(entry.result, groups, source))
|
|
236
|
+
d.log(l);
|
|
237
|
+
if (input.markdown) {
|
|
238
|
+
const md = join(entry.root, RESULTS_DIR, `${entry.id}.recommend.md`);
|
|
239
|
+
writeFileSync(md, renderMarkdown(entry.result, groups, source), { mode: 0o600 });
|
|
240
|
+
say(`Wrote ${md}`);
|
|
241
|
+
}
|
|
242
|
+
return 0;
|
|
243
|
+
}
|
|
244
|
+
//# sourceMappingURL=recommend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recommend.js","sourceRoot":"","sources":["../../../src/aws/recommend.ts"],"names":[],"mappings":"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"}
|