@cloud-copilot/iam-lens 0.1.107 → 0.1.109
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/cjs/index.d.ts +2 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +3 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/utils/bitset.js +3 -3
- package/dist/cjs/utils/bitset.js.map +1 -1
- package/dist/cjs/whoCan/WhoCanMainThreadWorker.d.ts +65 -3
- package/dist/cjs/whoCan/WhoCanMainThreadWorker.d.ts.map +1 -1
- package/dist/cjs/whoCan/WhoCanMainThreadWorker.js +52 -31
- package/dist/cjs/whoCan/WhoCanMainThreadWorker.js.map +1 -1
- package/dist/cjs/whoCan/WhoCanProcessor.d.ts +371 -0
- package/dist/cjs/whoCan/WhoCanProcessor.d.ts.map +1 -0
- package/dist/cjs/whoCan/WhoCanProcessor.js +980 -0
- package/dist/cjs/whoCan/WhoCanProcessor.js.map +1 -0
- package/dist/cjs/whoCan/WhoCanWorker.d.ts +2 -0
- package/dist/cjs/whoCan/WhoCanWorker.d.ts.map +1 -1
- package/dist/cjs/whoCan/WhoCanWorker.js.map +1 -1
- package/dist/cjs/whoCan/WhoCanWorkerThreadWorker.js +99 -80
- package/dist/cjs/whoCan/WhoCanWorkerThreadWorker.js.map +1 -1
- package/dist/cjs/whoCan/principalArnFilter.d.ts +84 -0
- package/dist/cjs/whoCan/principalArnFilter.d.ts.map +1 -0
- package/dist/cjs/whoCan/principalArnFilter.js +256 -0
- package/dist/cjs/whoCan/principalArnFilter.js.map +1 -0
- package/dist/cjs/whoCan/untrustingActions.d.ts +7 -0
- package/dist/cjs/whoCan/untrustingActions.d.ts.map +1 -0
- package/dist/cjs/whoCan/untrustingActions.js +30 -0
- package/dist/cjs/whoCan/untrustingActions.js.map +1 -0
- package/dist/cjs/whoCan/whoCan.d.ts +35 -2
- package/dist/cjs/whoCan/whoCan.d.ts.map +1 -1
- package/dist/cjs/whoCan/whoCan.js +277 -233
- package/dist/cjs/whoCan/whoCan.js.map +1 -1
- package/dist/esm/index.d.ts +2 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +2 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/utils/bitset.js +3 -3
- package/dist/esm/utils/bitset.js.map +1 -1
- package/dist/esm/whoCan/WhoCanMainThreadWorker.d.ts +65 -3
- package/dist/esm/whoCan/WhoCanMainThreadWorker.d.ts.map +1 -1
- package/dist/esm/whoCan/WhoCanMainThreadWorker.js +53 -34
- package/dist/esm/whoCan/WhoCanMainThreadWorker.js.map +1 -1
- package/dist/esm/whoCan/WhoCanProcessor.d.ts +371 -0
- package/dist/esm/whoCan/WhoCanProcessor.d.ts.map +1 -0
- package/dist/esm/whoCan/WhoCanProcessor.js +970 -0
- package/dist/esm/whoCan/WhoCanProcessor.js.map +1 -0
- package/dist/esm/whoCan/WhoCanWorker.d.ts +2 -0
- package/dist/esm/whoCan/WhoCanWorker.d.ts.map +1 -1
- package/dist/esm/whoCan/WhoCanWorker.js.map +1 -1
- package/dist/esm/whoCan/WhoCanWorkerThreadWorker.js +102 -81
- package/dist/esm/whoCan/WhoCanWorkerThreadWorker.js.map +1 -1
- package/dist/esm/whoCan/principalArnFilter.d.ts +84 -0
- package/dist/esm/whoCan/principalArnFilter.d.ts.map +1 -0
- package/dist/esm/whoCan/principalArnFilter.js +251 -0
- package/dist/esm/whoCan/principalArnFilter.js.map +1 -0
- package/dist/esm/whoCan/untrustingActions.d.ts +7 -0
- package/dist/esm/whoCan/untrustingActions.d.ts.map +1 -0
- package/dist/esm/whoCan/untrustingActions.js +27 -0
- package/dist/esm/whoCan/untrustingActions.js.map +1 -0
- package/dist/esm/whoCan/whoCan.d.ts +35 -2
- package/dist/esm/whoCan/whoCan.d.ts.map +1 -1
- package/dist/esm/whoCan/whoCan.js +278 -237
- package/dist/esm/whoCan/whoCan.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.iamPatternToRegex = iamPatternToRegex;
|
|
4
|
+
exports.buildPrincipalArnFilter = buildPrincipalArnFilter;
|
|
5
|
+
exports.principalMatchesFilter = principalMatchesFilter;
|
|
6
|
+
const iam_policy_1 = require("@cloud-copilot/iam-policy");
|
|
7
|
+
const iam_utils_1 = require("@cloud-copilot/iam-utils");
|
|
8
|
+
/**
|
|
9
|
+
* Set of condition operators that can be used with aws:PrincipalArn to
|
|
10
|
+
* constrain which principals are allowed. These are the base operators
|
|
11
|
+
* (lowercase) without set modifiers or IfExists.
|
|
12
|
+
*/
|
|
13
|
+
const ALLOW_PRINCIPAL_ARN_OPERATORS = new Set([
|
|
14
|
+
'stringlike',
|
|
15
|
+
'stringequals',
|
|
16
|
+
'arnlike',
|
|
17
|
+
'arnequals'
|
|
18
|
+
]);
|
|
19
|
+
/**
|
|
20
|
+
* Negative condition operators on `aws:PrincipalArn` in Deny statements.
|
|
21
|
+
* The deny applies to principals NOT matching the patterns, so the patterns
|
|
22
|
+
* become an allow-list (only those principals are worth simulating).
|
|
23
|
+
*/
|
|
24
|
+
const DENY_NEGATIVE_OPERATORS = new Set([
|
|
25
|
+
'stringnotlike',
|
|
26
|
+
'stringnotequals',
|
|
27
|
+
'arnnotlike',
|
|
28
|
+
'arnnotequals'
|
|
29
|
+
]);
|
|
30
|
+
/**
|
|
31
|
+
* Positive condition operators on `aws:PrincipalArn` in Deny statements.
|
|
32
|
+
* The deny applies to principals matching the patterns, so those principals
|
|
33
|
+
* can be skipped for the deny statement's actions.
|
|
34
|
+
*/
|
|
35
|
+
const DENY_POSITIVE_OPERATORS = new Set(['stringlike', 'stringequals', 'arnlike', 'arnequals']);
|
|
36
|
+
/**
|
|
37
|
+
* Converts an IAM wildcard pattern to a case-sensitive anchored RegExp.
|
|
38
|
+
* Handles `*` (any characters) and `?` (single character) wildcards.
|
|
39
|
+
* Does not handle replacement variables — callers must ensure patterns
|
|
40
|
+
* with variables are excluded before calling this.
|
|
41
|
+
*
|
|
42
|
+
* @param pattern the IAM pattern string (e.g. `arn:aws:iam::*:role/ec2/*`)
|
|
43
|
+
* @returns an anchored case-sensitive RegExp
|
|
44
|
+
*/
|
|
45
|
+
function iamPatternToRegex(pattern) {
|
|
46
|
+
const escaped = pattern.replace(/[.+^${}()|[\]\\]/g, '\\$&');
|
|
47
|
+
const withWildcards = escaped.replace(/\*/g, '.*').replace(/\?/g, '.');
|
|
48
|
+
return new RegExp(`^${withWildcards}$`);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Checks whether any value in an array contains a replacement variable (`${...}`).
|
|
52
|
+
*
|
|
53
|
+
* @param values the condition values to check
|
|
54
|
+
* @returns true if any value contains a replacement variable
|
|
55
|
+
*/
|
|
56
|
+
function hasAnyReplacementVariable(values) {
|
|
57
|
+
return values.some((v) => v.includes('${'));
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Builds a PrincipalArnFilter from a resource policy by extracting
|
|
61
|
+
* aws:PrincipalArn patterns from Allow statements with wildcard principals.
|
|
62
|
+
*
|
|
63
|
+
* The filter is only constructed if **every** wildcard-Allow statement has
|
|
64
|
+
* a usable aws:PrincipalArn condition. If any wildcard-Allow statement lacks
|
|
65
|
+
* one, the filter cannot safely exclude principals and undefined is returned.
|
|
66
|
+
*
|
|
67
|
+
* @param resourcePolicy the raw resource policy document, or undefined/null if none
|
|
68
|
+
* @returns a PrincipalArnFilter if filtering is possible, undefined otherwise
|
|
69
|
+
*/
|
|
70
|
+
function buildPrincipalArnFilter(resourcePolicy) {
|
|
71
|
+
if (!resourcePolicy) {
|
|
72
|
+
return undefined;
|
|
73
|
+
}
|
|
74
|
+
const policy = (0, iam_policy_1.loadPolicy)(resourcePolicy);
|
|
75
|
+
const allAllowPatterns = [];
|
|
76
|
+
const exemptAccounts = new Set();
|
|
77
|
+
let hasAnyWildcardAllow = false;
|
|
78
|
+
for (const statement of policy.statements()) {
|
|
79
|
+
if (!statement.isAllow()) {
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
// Check if this Allow statement has a wildcard principal, and collect
|
|
83
|
+
// explicit account principals whose accounts should be exempt from filtering
|
|
84
|
+
let hasWildcardPrincipal = false;
|
|
85
|
+
if (statement.isPrincipalStatement()) {
|
|
86
|
+
for (const principal of statement.principals()) {
|
|
87
|
+
if (principal.isWildcardPrincipal()) {
|
|
88
|
+
hasWildcardPrincipal = true;
|
|
89
|
+
}
|
|
90
|
+
else if (principal.isAccountPrincipal()) {
|
|
91
|
+
exemptAccounts.add(principal.accountId());
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
else if (statement.isNotPrincipalStatement()) {
|
|
96
|
+
// NotPrincipal Allow effectively allows everyone except the named principals,
|
|
97
|
+
// so it acts like a wildcard — we can't filter
|
|
98
|
+
return undefined;
|
|
99
|
+
}
|
|
100
|
+
if (!hasWildcardPrincipal) {
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
hasAnyWildcardAllow = true;
|
|
104
|
+
// Look for aws:PrincipalArn conditions with supported operators
|
|
105
|
+
let statementHasUsableFilter = false;
|
|
106
|
+
const conditions = statement.conditions();
|
|
107
|
+
for (const cond of conditions) {
|
|
108
|
+
if (cond.conditionKey().toLowerCase() !== 'aws:principalarn') {
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
const baseOp = cond.operation().baseOperator().toLowerCase();
|
|
112
|
+
if (!ALLOW_PRINCIPAL_ARN_OPERATORS.has(baseOp)) {
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
const values = cond.conditionValues();
|
|
116
|
+
// If any value has a replacement variable, ignore the entire condition
|
|
117
|
+
if (hasAnyReplacementVariable(values)) {
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
// All values count as a usable filter for the statement — even literal
|
|
121
|
+
// ARNs constrain which principals can match. However, only wildcard
|
|
122
|
+
// values are added as filter patterns; literal ARNs are already handled
|
|
123
|
+
// as specific principals by accountsToCheckBasedOnResourcePolicy.
|
|
124
|
+
for (const value of values) {
|
|
125
|
+
statementHasUsableFilter = true;
|
|
126
|
+
if (value.includes('*') || value.includes('?')) {
|
|
127
|
+
allAllowPatterns.push(iamPatternToRegex(value));
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// If this wildcard-Allow has no usable PrincipalArn condition,
|
|
132
|
+
// it could allow any principal — filtering is not safe
|
|
133
|
+
if (!statementHasUsableFilter) {
|
|
134
|
+
return undefined;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
// --- Deny statement extraction ---
|
|
138
|
+
const denyDerivedAllowEntries = [];
|
|
139
|
+
const denyEntries = [];
|
|
140
|
+
for (const statement of policy.statements()) {
|
|
141
|
+
if (statement.isAllow())
|
|
142
|
+
continue;
|
|
143
|
+
if (!statement.isActionStatement())
|
|
144
|
+
continue;
|
|
145
|
+
if (!statement.isResourceStatement())
|
|
146
|
+
continue;
|
|
147
|
+
if (statement.isNotPrincipalStatement())
|
|
148
|
+
continue;
|
|
149
|
+
// Must have a wildcard principal
|
|
150
|
+
let hasWildcardPrincipal = false;
|
|
151
|
+
if (statement.isPrincipalStatement()) {
|
|
152
|
+
for (const principal of statement.principals()) {
|
|
153
|
+
if (principal.isWildcardPrincipal()) {
|
|
154
|
+
hasWildcardPrincipal = true;
|
|
155
|
+
break;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
if (!hasWildcardPrincipal)
|
|
160
|
+
continue;
|
|
161
|
+
// Resource must include '*'
|
|
162
|
+
if (!statement.resources().some((r) => r.isAllResources()))
|
|
163
|
+
continue;
|
|
164
|
+
// Must have exactly one condition and it must be aws:PrincipalArn
|
|
165
|
+
const conditions = statement.conditions();
|
|
166
|
+
if (conditions.length !== 1)
|
|
167
|
+
continue;
|
|
168
|
+
const cond = conditions[0];
|
|
169
|
+
if (cond.conditionKey().toLowerCase() !== 'aws:principalarn')
|
|
170
|
+
continue;
|
|
171
|
+
if (cond.operation().isIfExists())
|
|
172
|
+
continue;
|
|
173
|
+
const values = cond.conditionValues();
|
|
174
|
+
if (hasAnyReplacementVariable(values))
|
|
175
|
+
continue;
|
|
176
|
+
const baseOp = cond.operation().baseOperator().toLowerCase();
|
|
177
|
+
const actionPatterns = statement.actions().map((a) => a.value());
|
|
178
|
+
const principalPatterns = values.map(iamPatternToRegex);
|
|
179
|
+
if (DENY_NEGATIVE_OPERATORS.has(baseOp)) {
|
|
180
|
+
denyDerivedAllowEntries.push({ actionPatterns, principalPatterns });
|
|
181
|
+
}
|
|
182
|
+
else if (DENY_POSITIVE_OPERATORS.has(baseOp)) {
|
|
183
|
+
denyEntries.push({ actionPatterns, principalPatterns });
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
// Return a filter if there's anything useful
|
|
187
|
+
const hasAllowPatterns = hasAnyWildcardAllow && allAllowPatterns.length > 0;
|
|
188
|
+
const hasDenyInfo = denyDerivedAllowEntries.length > 0 || denyEntries.length > 0;
|
|
189
|
+
if (!hasAllowPatterns && !hasDenyInfo) {
|
|
190
|
+
return undefined;
|
|
191
|
+
}
|
|
192
|
+
return {
|
|
193
|
+
allowPatterns: hasAllowPatterns ? allAllowPatterns : [],
|
|
194
|
+
denyDerivedAllowEntries,
|
|
195
|
+
denyEntries,
|
|
196
|
+
exemptAccounts
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Checks whether an action matches any of the given action patterns using
|
|
201
|
+
* IAM wildcard semantics.
|
|
202
|
+
*
|
|
203
|
+
* @param action the action being simulated (e.g., 'secretsmanager:GetSecretValue')
|
|
204
|
+
* @param patterns the action patterns from a deny statement
|
|
205
|
+
* @returns true if the action matches at least one pattern
|
|
206
|
+
*/
|
|
207
|
+
function actionMatchesAnyPattern(action, patterns) {
|
|
208
|
+
return patterns.some((pattern) => (0, iam_utils_1.actionMatchesPattern)(action, pattern));
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Tests whether a principal ARN passes the PrincipalArnFilter for a given action.
|
|
212
|
+
*
|
|
213
|
+
* Principals in the resource account or an exempt account bypass the positive
|
|
214
|
+
* allow-side filtering (allow patterns and deny-derived allow entries) because
|
|
215
|
+
* they may be granted access through account-level principal grants independent
|
|
216
|
+
* of any PrincipalArn conditions. However, they are still subject to deny-side
|
|
217
|
+
* filtering (deny entries) because an explicit deny in a resource policy applies
|
|
218
|
+
* regardless of the principal's account.
|
|
219
|
+
*
|
|
220
|
+
* @param principal the principal ARN to test
|
|
221
|
+
* @param action the action being simulated
|
|
222
|
+
* @param resourceAccount the account that owns the resource being checked
|
|
223
|
+
* @param filter the filter to apply
|
|
224
|
+
* @returns true if the principal should be simulated, false if it can be skipped
|
|
225
|
+
*/
|
|
226
|
+
function principalMatchesFilter(principal, action, resourceAccount, filter) {
|
|
227
|
+
const accountId = (0, iam_utils_1.splitArnParts)(principal).accountId;
|
|
228
|
+
const isExempt = accountId === resourceAccount || filter.exemptAccounts.has(accountId ?? '');
|
|
229
|
+
// Allow patterns from Allow statements: exempt principals bypass this check
|
|
230
|
+
// because they may be granted access through account-level principal grants
|
|
231
|
+
// independent of any PrincipalArn conditions on wildcard statements.
|
|
232
|
+
if (!isExempt && filter.allowPatterns.length > 0) {
|
|
233
|
+
if (!filter.allowPatterns.some((pattern) => pattern.test(principal)))
|
|
234
|
+
return false;
|
|
235
|
+
}
|
|
236
|
+
// Deny-derived filtering applies to ALL principals regardless of account.
|
|
237
|
+
// An explicit deny in a resource policy applies universally.
|
|
238
|
+
// For each deny-derived allow entry whose actions match,
|
|
239
|
+
// the principal must match at least one principal pattern
|
|
240
|
+
for (const entry of filter.denyDerivedAllowEntries) {
|
|
241
|
+
if (actionMatchesAnyPattern(action, entry.actionPatterns)) {
|
|
242
|
+
if (!entry.principalPatterns.some((p) => p.test(principal)))
|
|
243
|
+
return false;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
// For each deny entry whose actions match,
|
|
247
|
+
// skip if the principal matches any principal pattern
|
|
248
|
+
for (const entry of filter.denyEntries) {
|
|
249
|
+
if (actionMatchesAnyPattern(action, entry.actionPatterns)) {
|
|
250
|
+
if (entry.principalPatterns.some((p) => p.test(principal)))
|
|
251
|
+
return false;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
return true;
|
|
255
|
+
}
|
|
256
|
+
//# sourceMappingURL=principalArnFilter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"principalArnFilter.js","sourceRoot":"","sources":["../../../src/whoCan/principalArnFilter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Get a set of actions that do not automatically trust the current account, in all lower case.
|
|
3
|
+
*
|
|
4
|
+
* @returns the set of actions that do not automatically trust the current account in all lower case
|
|
5
|
+
*/
|
|
6
|
+
export declare function actionsThatDoNotAutomaticallyTrustTheCurrentAccount(): Promise<Set<string>>;
|
|
7
|
+
//# sourceMappingURL=untrustingActions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"untrustingActions.d.ts","sourceRoot":"","sources":["../../../src/whoCan/untrustingActions.ts"],"names":[],"mappings":"AAQA;;;;GAIG;AACH,wBAAsB,mDAAmD,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAmBhG"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.actionsThatDoNotAutomaticallyTrustTheCurrentAccount = actionsThatDoNotAutomaticallyTrustTheCurrentAccount;
|
|
4
|
+
const iam_data_1 = require("@cloud-copilot/iam-data");
|
|
5
|
+
const kms = 'kms';
|
|
6
|
+
const kmsKey = 'key';
|
|
7
|
+
const stsAssumeRole = 'sts:AssumeRole';
|
|
8
|
+
let cachedActions = undefined;
|
|
9
|
+
/**
|
|
10
|
+
* Get a set of actions that do not automatically trust the current account, in all lower case.
|
|
11
|
+
*
|
|
12
|
+
* @returns the set of actions that do not automatically trust the current account in all lower case
|
|
13
|
+
*/
|
|
14
|
+
async function actionsThatDoNotAutomaticallyTrustTheCurrentAccount() {
|
|
15
|
+
if (cachedActions) {
|
|
16
|
+
return cachedActions;
|
|
17
|
+
}
|
|
18
|
+
const kmsActions = await (0, iam_data_1.iamActionsForService)(kms);
|
|
19
|
+
const allActions = new Set([stsAssumeRole.toLowerCase()]);
|
|
20
|
+
for (const action of kmsActions) {
|
|
21
|
+
const details = await (0, iam_data_1.iamActionDetails)(kms, action);
|
|
22
|
+
if (details.resourceTypes.length === 1 &&
|
|
23
|
+
details.resourceTypes.some((rt) => rt.name === kmsKey)) {
|
|
24
|
+
allActions.add(`${kms}:${action.toLowerCase()}`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
cachedActions = allActions;
|
|
28
|
+
return allActions;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=untrustingActions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"untrustingActions.js","sourceRoot":"","sources":["../../../src/whoCan/untrustingActions.ts"],"names":[],"mappings":";;AAaA,kHAmBC;AAhCD,sDAAgF;AAEhF,MAAM,GAAG,GAAG,KAAK,CAAA;AACjB,MAAM,MAAM,GAAG,KAAK,CAAA;AACpB,MAAM,aAAa,GAAG,gBAAgB,CAAA;AAEtC,IAAI,aAAa,GAA4B,SAAS,CAAA;AAEtD;;;;GAIG;AACI,KAAK,UAAU,mDAAmD;IACvE,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,aAAa,CAAA;IACtB,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,IAAA,+BAAoB,EAAC,GAAG,CAAC,CAAA;IAClD,MAAM,UAAU,GAAG,IAAI,GAAG,CAAS,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA;IACjE,KAAK,MAAM,MAAM,IAAI,UAAU,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,MAAM,IAAA,2BAAgB,EAAC,GAAG,EAAE,MAAM,CAAC,CAAA;QACnD,IACE,OAAO,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC;YAClC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,MAAM,CAAC,EACtD,CAAC;YACD,UAAU,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC,CAAA;QAClD,CAAC;IACH,CAAC;IAED,aAAa,GAAG,UAAU,CAAA;IAC1B,OAAO,UAAU,CAAA;AACnB,CAAC"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { type TopLevelConfig } from '@cloud-copilot/iam-collect';
|
|
2
|
+
import { IamCollectClient } from '../collect/client.js';
|
|
2
3
|
import { type ClientFactoryPlugin } from '../collect/collect.js';
|
|
3
4
|
import { type ResourceType } from '@cloud-copilot/iam-data';
|
|
5
|
+
import { type Statement } from '@cloud-copilot/iam-policy';
|
|
4
6
|
import { type RequestDenial, type RequestGrant } from '@cloud-copilot/iam-simulate';
|
|
5
|
-
import { IamCollectClient } from '../collect/client.js';
|
|
6
7
|
import { type S3AbacOverride } from '../utils/s3Abac.js';
|
|
7
8
|
import { type LightRequestAnalysis } from './requestAnalysis.js';
|
|
8
9
|
/**
|
|
@@ -71,6 +72,10 @@ export interface ResourceAccessRequest {
|
|
|
71
72
|
* search space.
|
|
72
73
|
*/
|
|
73
74
|
principalScope?: WhoCanPrincipalScope;
|
|
75
|
+
/**
|
|
76
|
+
* Whether to ignore an existing principal index. This is for testing purposes.
|
|
77
|
+
*/
|
|
78
|
+
ignorePrincipalIndex?: boolean;
|
|
74
79
|
}
|
|
75
80
|
/**
|
|
76
81
|
* Represents a resource pattern that is allowed for a principal, used when wildcards
|
|
@@ -199,6 +204,20 @@ export interface WhoCanResponse {
|
|
|
199
204
|
principalsNotFound: string[];
|
|
200
205
|
denyDetails?: WhoCanDenyDetail[] | undefined;
|
|
201
206
|
}
|
|
207
|
+
/**
|
|
208
|
+
* Processes a single whoCan request by creating a temporary WhoCanProcessor,
|
|
209
|
+
* enqueuing the request, waiting for it to settle, and shutting down. This
|
|
210
|
+
* preserves the original one-shot behavior where workers and cache are created
|
|
211
|
+
* and destroyed per call.
|
|
212
|
+
*
|
|
213
|
+
* For better performance when running multiple requests, use WhoCanProcessor
|
|
214
|
+
* directly to keep workers and cache alive across calls.
|
|
215
|
+
*
|
|
216
|
+
* @param collectConfigs the collect configurations for loading IAM data
|
|
217
|
+
* @param partition the AWS partition (e.g. 'aws', 'aws-cn')
|
|
218
|
+
* @param request the whoCan request parameters
|
|
219
|
+
* @returns the whoCan response with allowed principals and optional deny details
|
|
220
|
+
*/
|
|
202
221
|
export declare function whoCan(collectConfigs: TopLevelConfig[], partition: string, request: ResourceAccessRequest): Promise<WhoCanResponse>;
|
|
203
222
|
export declare function uniqueAccountsToCheck(collectClient: IamCollectClient, accountsToCheck: AccountsToCheck): Promise<{
|
|
204
223
|
accountsNotFound: string[];
|
|
@@ -212,9 +231,23 @@ export interface AccountsToCheck {
|
|
|
212
231
|
specificPrincipals: string[];
|
|
213
232
|
specificOrganizations: string[];
|
|
214
233
|
specificOrganizationalUnits: string[];
|
|
234
|
+
/** Tracking flag indicating that an IfExists condition was found, meaning anonymous (unsigned) requests could match. */
|
|
235
|
+
checkAnonymous: boolean;
|
|
236
|
+
/** Whether any Allow statement has a wildcard principal or NotPrincipal, requiring all principals from the resource account to be checked. */
|
|
237
|
+
checkAllForCurrentAccount: boolean;
|
|
215
238
|
}
|
|
239
|
+
/**
|
|
240
|
+
* Determines whether a policy statement requires checking all principals from
|
|
241
|
+
* the resource account. This is true when the statement is an Allow with a
|
|
242
|
+
* wildcard principal (`*` or `{ AWS: "*" }`) or a `NotPrincipal` element,
|
|
243
|
+
* since either form could grant access to any principal in the resource account.
|
|
244
|
+
*
|
|
245
|
+
* @param statement - The policy statement to check.
|
|
246
|
+
* @returns `true` if the statement could allow any principal from the resource account.
|
|
247
|
+
*/
|
|
248
|
+
export declare function statementRequiresAllFromResourceAccount(statement: Statement): boolean;
|
|
216
249
|
export declare function accountsToCheckBasedOnResourcePolicy(resourcePolicy: any, resourceAccount: string | undefined): Promise<AccountsToCheck>;
|
|
217
|
-
export declare function actionsForWhoCan(request: ResourceAccessRequest): Promise<string[]>;
|
|
250
|
+
export declare function actionsForWhoCan(request: Pick<ResourceAccessRequest, 'actions' | 'resource'>): Promise<string[]>;
|
|
218
251
|
/**
|
|
219
252
|
* Get the the possible resource types for an action and resource
|
|
220
253
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"whoCan.d.ts","sourceRoot":"","sources":["../../../src/whoCan/whoCan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,4BAA4B,CAAA;
|
|
1
|
+
{"version":3,"file":"whoCan.d.ts","sourceRoot":"","sources":["../../../src/whoCan/whoCan.ts"],"names":[],"mappings":"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"}
|