@cloud-copilot/iam-lens 0.1.43 → 0.1.45
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/cli.js +3 -3
- package/dist/cjs/cli.js.map +1 -1
- package/dist/cjs/collect/client.d.ts +1 -0
- package/dist/cjs/collect/client.d.ts.map +1 -1
- package/dist/cjs/collect/client.js +11 -0
- package/dist/cjs/collect/client.js.map +1 -1
- package/dist/cjs/index.d.ts +1 -1
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +3 -3
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/{canWhat → principalCan}/permission.d.ts +3 -0
- package/dist/cjs/principalCan/permission.d.ts.map +1 -0
- package/dist/cjs/{canWhat → principalCan}/permission.js +3 -0
- package/dist/cjs/principalCan/permission.js.map +1 -0
- package/dist/cjs/principalCan/permissionSet.d.ts +129 -0
- package/dist/cjs/principalCan/permissionSet.d.ts.map +1 -0
- package/dist/cjs/{canWhat → principalCan}/permissionSet.js +122 -26
- package/dist/cjs/principalCan/permissionSet.js.map +1 -0
- package/dist/cjs/{canWhat/canWhat.d.ts → principalCan/principalCan.d.ts} +3 -3
- package/dist/cjs/principalCan/principalCan.d.ts.map +1 -0
- package/dist/cjs/{canWhat/canWhat.js → principalCan/principalCan.js} +16 -3
- package/dist/cjs/principalCan/principalCan.js.map +1 -0
- package/dist/cjs/principalCan/resources/actions.d.ts +9 -0
- package/dist/cjs/principalCan/resources/actions.d.ts.map +1 -0
- package/dist/cjs/principalCan/resources/actions.js +27 -0
- package/dist/cjs/principalCan/resources/actions.js.map +1 -0
- package/dist/cjs/principalCan/resources/resourceTypes/s3Buckets.d.ts +14 -0
- package/dist/cjs/principalCan/resources/resourceTypes/s3Buckets.d.ts.map +1 -0
- package/dist/cjs/principalCan/resources/resourceTypes/s3Buckets.js +64 -0
- package/dist/cjs/principalCan/resources/resourceTypes/s3Buckets.js.map +1 -0
- package/dist/cjs/principalCan/resources/statements.d.ts +27 -0
- package/dist/cjs/principalCan/resources/statements.d.ts.map +1 -0
- package/dist/cjs/principalCan/resources/statements.js +113 -0
- package/dist/cjs/principalCan/resources/statements.js.map +1 -0
- package/dist/esm/cli.js +3 -3
- package/dist/esm/cli.js.map +1 -1
- package/dist/esm/collect/client.d.ts +1 -0
- package/dist/esm/collect/client.d.ts.map +1 -1
- package/dist/esm/collect/client.js +11 -0
- package/dist/esm/collect/client.js.map +1 -1
- package/dist/esm/index.d.ts +1 -1
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/{canWhat → principalCan}/permission.d.ts +3 -0
- package/dist/esm/principalCan/permission.d.ts.map +1 -0
- package/dist/esm/{canWhat → principalCan}/permission.js +3 -0
- package/dist/esm/principalCan/permission.js.map +1 -0
- package/dist/esm/principalCan/permissionSet.d.ts +129 -0
- package/dist/esm/principalCan/permissionSet.d.ts.map +1 -0
- package/dist/esm/{canWhat → principalCan}/permissionSet.js +121 -26
- package/dist/esm/principalCan/permissionSet.js.map +1 -0
- package/dist/esm/{canWhat/canWhat.d.ts → principalCan/principalCan.d.ts} +3 -3
- package/dist/esm/principalCan/principalCan.d.ts.map +1 -0
- package/dist/esm/{canWhat/canWhat.js → principalCan/principalCan.js} +16 -3
- package/dist/esm/principalCan/principalCan.js.map +1 -0
- package/dist/esm/principalCan/resources/actions.d.ts +9 -0
- package/dist/esm/principalCan/resources/actions.d.ts.map +1 -0
- package/dist/esm/principalCan/resources/actions.js +24 -0
- package/dist/esm/principalCan/resources/actions.js.map +1 -0
- package/dist/esm/principalCan/resources/resourceTypes/s3Buckets.d.ts +14 -0
- package/dist/esm/principalCan/resources/resourceTypes/s3Buckets.d.ts.map +1 -0
- package/dist/esm/principalCan/resources/resourceTypes/s3Buckets.js +61 -0
- package/dist/esm/principalCan/resources/resourceTypes/s3Buckets.js.map +1 -0
- package/dist/esm/principalCan/resources/statements.d.ts +27 -0
- package/dist/esm/principalCan/resources/statements.d.ts.map +1 -0
- package/dist/esm/principalCan/resources/statements.js +109 -0
- package/dist/esm/principalCan/resources/statements.js.map +1 -0
- package/package.json +2 -2
- package/dist/cjs/canWhat/canWhat.d.ts.map +0 -1
- package/dist/cjs/canWhat/canWhat.js.map +0 -1
- package/dist/cjs/canWhat/permission.d.ts.map +0 -1
- package/dist/cjs/canWhat/permission.js.map +0 -1
- package/dist/cjs/canWhat/permissionSet.d.ts +0 -59
- package/dist/cjs/canWhat/permissionSet.d.ts.map +0 -1
- package/dist/cjs/canWhat/permissionSet.js.map +0 -1
- package/dist/esm/canWhat/canWhat.d.ts.map +0 -1
- package/dist/esm/canWhat/canWhat.js.map +0 -1
- package/dist/esm/canWhat/permission.d.ts.map +0 -1
- package/dist/esm/canWhat/permission.js.map +0 -1
- package/dist/esm/canWhat/permissionSet.d.ts +0 -59
- package/dist/esm/canWhat/permissionSet.d.ts.map +0 -1
- package/dist/esm/canWhat/permissionSet.js.map +0 -1
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.PermissionSet = void 0;
|
|
4
4
|
exports.buildPermissionSetFromPolicies = buildPermissionSetFromPolicies;
|
|
5
5
|
exports.addPoliciesToPermissionSet = addPoliciesToPermissionSet;
|
|
6
|
+
exports.addStatementToPermissionSet = addStatementToPermissionSet;
|
|
6
7
|
exports.toPolicyStatements = toPolicyStatements;
|
|
7
8
|
const iam_expand_1 = require("@cloud-copilot/iam-expand");
|
|
8
9
|
const permission_js_1 = require("./permission.js");
|
|
@@ -17,6 +18,12 @@ class PermissionSet {
|
|
|
17
18
|
constructor(effect) {
|
|
18
19
|
this.effect = effect;
|
|
19
20
|
}
|
|
21
|
+
/**
|
|
22
|
+
* Add a new permission to the set. If the new permission overlaps with an existing one,
|
|
23
|
+
* they will be unioned together to avoid redundancy.
|
|
24
|
+
*
|
|
25
|
+
* @param newPermission the permission to add
|
|
26
|
+
*/
|
|
20
27
|
addPermission(newPermission) {
|
|
21
28
|
if (newPermission.effect !== this.effect) {
|
|
22
29
|
throw new Error(`Permission effect ${newPermission.effect} does not match PermissionSet effect ${this.effect}`);
|
|
@@ -72,18 +79,50 @@ class PermissionSet {
|
|
|
72
79
|
}
|
|
73
80
|
this.permissions[service][action] = newPermissions;
|
|
74
81
|
}
|
|
82
|
+
/**
|
|
83
|
+
* Get the permissions for a specific service and action.
|
|
84
|
+
*
|
|
85
|
+
* @param service the service to get permissions for
|
|
86
|
+
* @param action the action to get permissions for
|
|
87
|
+
* @returns the permissions that match the service and action
|
|
88
|
+
*/
|
|
75
89
|
getPermissions(service, action) {
|
|
76
90
|
if (!this.permissions[service] || !this.permissions[service][action]) {
|
|
77
91
|
return [];
|
|
78
92
|
}
|
|
79
93
|
return this.permissions[service][action];
|
|
80
94
|
}
|
|
95
|
+
/**
|
|
96
|
+
* Check if the permission set has any permissions for a specific service
|
|
97
|
+
*
|
|
98
|
+
* @param service the service to check permissions for
|
|
99
|
+
* @returns true if the permission set has permissions for the service, false otherwise
|
|
100
|
+
*/
|
|
81
101
|
hasService(service) {
|
|
82
102
|
return !!this.permissions[service];
|
|
83
103
|
}
|
|
104
|
+
/**
|
|
105
|
+
* Check if the permission set has any permissions for a specific action
|
|
106
|
+
*
|
|
107
|
+
* @param service the service the action belongs to
|
|
108
|
+
* @param action the action to check permissions for
|
|
109
|
+
* @returns true if the permission set has permissions for the action, false otherwise
|
|
110
|
+
*/
|
|
84
111
|
hasAction(service, action) {
|
|
85
112
|
return !!(this.permissions[service] && this.permissions[service][action]);
|
|
86
113
|
}
|
|
114
|
+
/**
|
|
115
|
+
* Check if the permission set is empty (has no permissions)
|
|
116
|
+
* @returns true if the permission set is empty, false otherwise
|
|
117
|
+
*/
|
|
118
|
+
isEmpty() {
|
|
119
|
+
return Object.keys(this.permissions).length === 0;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Get all the permissions in the permission set
|
|
123
|
+
*
|
|
124
|
+
* @returns a copy of all the permissions in the permission set
|
|
125
|
+
*/
|
|
87
126
|
getAllPermissions() {
|
|
88
127
|
const allPermissions = [];
|
|
89
128
|
for (const service in this.permissions) {
|
|
@@ -97,6 +136,10 @@ class PermissionSet {
|
|
|
97
136
|
* Return a new PermissionSet containing the intersection of this set and another.
|
|
98
137
|
* Only permissions that overlap (same effect, service, action, and intersecting resources/conditions)
|
|
99
138
|
* will be included.
|
|
139
|
+
*
|
|
140
|
+
* @param other The other PermissionSet to intersect with.
|
|
141
|
+
* @returns A new PermissionSet containing the intersecting permissions.
|
|
142
|
+
* @throws Error if the effects of the two PermissionSets do not match.
|
|
100
143
|
*/
|
|
101
144
|
intersection(other) {
|
|
102
145
|
if (this.effect !== other.effect) {
|
|
@@ -123,6 +166,15 @@ class PermissionSet {
|
|
|
123
166
|
}
|
|
124
167
|
return result;
|
|
125
168
|
}
|
|
169
|
+
/**
|
|
170
|
+
* Subtract a Deny PermissionSet from this Allow PermissionSet.
|
|
171
|
+
*
|
|
172
|
+
* Returns two PermissionSets: one with the remaining Allow permissions,
|
|
173
|
+
* and one with any Deny permissions that were created as a result of the subtraction.
|
|
174
|
+
*
|
|
175
|
+
* @param deny the Deny PermissionSet to subtract
|
|
176
|
+
* @returns an object containing the resulting Allow and Deny PermissionSets
|
|
177
|
+
*/
|
|
126
178
|
subtract(deny) {
|
|
127
179
|
if (this.effect !== 'Allow' || deny.effect !== 'Deny') {
|
|
128
180
|
throw new Error('Can only subtract a Deny PermissionSet from an Allow PermissionSet');
|
|
@@ -168,6 +220,27 @@ class PermissionSet {
|
|
|
168
220
|
}
|
|
169
221
|
return { allow: allowSet, deny: denySet };
|
|
170
222
|
}
|
|
223
|
+
/**
|
|
224
|
+
* Add all permissions from another PermissionSet to this one.
|
|
225
|
+
*
|
|
226
|
+
* @param others the other PermissionSet (or array of PermissionSets) to add permissions from
|
|
227
|
+
* @throws Error if the effects of the two PermissionSets do not match
|
|
228
|
+
*/
|
|
229
|
+
addAll(others) {
|
|
230
|
+
if (!Array.isArray(others)) {
|
|
231
|
+
others = [others];
|
|
232
|
+
}
|
|
233
|
+
for (const other of others) {
|
|
234
|
+
if (other.effect !== this.effect) {
|
|
235
|
+
throw new Error('Cannot add PermissionSets with different effects');
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
for (const other of others) {
|
|
239
|
+
for (const perm of other.getAllPermissions()) {
|
|
240
|
+
this.addPermission(perm);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
171
244
|
/**
|
|
172
245
|
* Deep clones the PermissionSet.
|
|
173
246
|
*
|
|
@@ -220,37 +293,54 @@ async function addPoliciesToPermissionSet(permissionSet, effect, policies) {
|
|
|
220
293
|
if (effect === 'Allow' && !stmt.isAllow()) {
|
|
221
294
|
continue; // skip Deny or any other non-Allow effect
|
|
222
295
|
}
|
|
223
|
-
else if (effect === 'Deny' && stmt.
|
|
296
|
+
else if (effect === 'Deny' && !stmt.isDeny()) {
|
|
224
297
|
continue; // skip Allow statements if we're building a Deny set
|
|
225
298
|
}
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
299
|
+
await addStatementToPermissionSet(stmt, permissionSet);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Add a single Statement to a PermissionSet, expanding it into one or more Permissions as needed.
|
|
305
|
+
*
|
|
306
|
+
* @param statement the IAM policy statement to add
|
|
307
|
+
* @param permissionSet the PermissionSet to add the statement to
|
|
308
|
+
* @returns nothing; the PermissionSet is modified in place
|
|
309
|
+
*/
|
|
310
|
+
async function addStatementToPermissionSet(statement, permissionSet) {
|
|
311
|
+
const effect = statement.effect();
|
|
312
|
+
let statementActions;
|
|
313
|
+
if (statement.isActionStatement()) {
|
|
314
|
+
const allActions = statement.actions().map((a) => a.value());
|
|
315
|
+
statementActions = await (0, iam_expand_1.expandIamActions)(allActions, { expandAsterisk: true });
|
|
316
|
+
}
|
|
317
|
+
else if (statement.isNotActionStatement()) {
|
|
318
|
+
statementActions = await (0, iam_expand_1.invertIamActions)(statement.notActions().map((a) => a.value()));
|
|
319
|
+
}
|
|
320
|
+
else {
|
|
321
|
+
return;
|
|
322
|
+
}
|
|
323
|
+
for (const fullAction of statementActions) {
|
|
324
|
+
const [service, actionName] = fullAction.split(':');
|
|
325
|
+
if (!service || !actionName)
|
|
326
|
+
continue;
|
|
327
|
+
let resource = undefined;
|
|
328
|
+
let notResource = undefined;
|
|
329
|
+
if (statement.isResourceStatement()) {
|
|
330
|
+
resource = statement.resources().map((r) => r.value());
|
|
251
331
|
}
|
|
332
|
+
else if (statement.isNotResourceStatement()) {
|
|
333
|
+
notResource = statement.notResources().map((r) => r.value());
|
|
334
|
+
}
|
|
335
|
+
permissionSet.addPermission(new permission_js_1.Permission(effect, service, actionName, resource, notResource, statement.conditionMap()));
|
|
252
336
|
}
|
|
253
337
|
}
|
|
338
|
+
/**
|
|
339
|
+
* Create a consistent key for any permission
|
|
340
|
+
*
|
|
341
|
+
* @param p the permission to create a key for
|
|
342
|
+
* @returns a string key that uniquely identifies the permission's resources and conditions
|
|
343
|
+
*/
|
|
254
344
|
function canonicalKey(p) {
|
|
255
345
|
// Sort resource arrays so ["B","A"] == ["A","B"]
|
|
256
346
|
const resources = p.resource?.slice().sort() ?? null;
|
|
@@ -270,6 +360,12 @@ function canonicalKey(p) {
|
|
|
270
360
|
// Effect is fixed for the whole PermissionSet, so not needed in the key.
|
|
271
361
|
return JSON.stringify({ resources, notResource, canonicalCond });
|
|
272
362
|
}
|
|
363
|
+
/**
|
|
364
|
+
* Convert a PermissionSet into an array of IAM policy statements.
|
|
365
|
+
*
|
|
366
|
+
* @param set the PermissionSet to convert
|
|
367
|
+
* @returns an array of IAM policy statements
|
|
368
|
+
*/
|
|
273
369
|
function toPolicyStatements(set) {
|
|
274
370
|
const buckets = new Map();
|
|
275
371
|
for (const perm of set.getAllPermissions()) {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissionSet.js","sourceRoot":"","sources":["../../../src/principalCan/permissionSet.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import { IamCollectClient } from '../collect/client.js';
|
|
|
2
2
|
/**
|
|
3
3
|
* Input for the can-what command.
|
|
4
4
|
*/
|
|
5
|
-
export interface
|
|
5
|
+
export interface PrincipalCanInput {
|
|
6
6
|
/**
|
|
7
7
|
* The ARN of the principal to check permissions for.
|
|
8
8
|
*/
|
|
@@ -19,8 +19,8 @@ export interface CanWhatInput {
|
|
|
19
19
|
* @param input the input containing the principal and options.
|
|
20
20
|
* @returns A promise that resolves to the permissions the principal can perform, or void if the implementation is incomplete.
|
|
21
21
|
*/
|
|
22
|
-
export declare function
|
|
22
|
+
export declare function principalCan(collectClient: IamCollectClient, input: PrincipalCanInput): Promise<{
|
|
23
23
|
Version: string;
|
|
24
24
|
Statement: any[];
|
|
25
25
|
}>;
|
|
26
|
-
//# sourceMappingURL=
|
|
26
|
+
//# sourceMappingURL=principalCan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"principalCan.d.ts","sourceRoot":"","sources":["../../../src/principalCan/principalCan.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAUvD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,SAAS,EAAE,MAAM,CAAA;IAEjB;;OAEG;IACH,iBAAiB,EAAE,OAAO,CAAA;CAC3B;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAAC,aAAa,EAAE,gBAAgB,EAAE,KAAK,EAAE,iBAAiB;;;GAwF3F"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.principalCan = principalCan;
|
|
4
4
|
const iam_policy_1 = require("@cloud-copilot/iam-policy");
|
|
5
5
|
const iam_shrink_1 = require("@cloud-copilot/iam-shrink");
|
|
6
|
+
const iam_utils_1 = require("@cloud-copilot/iam-utils");
|
|
6
7
|
const principals_js_1 = require("../principals.js");
|
|
7
8
|
const permissionSet_js_1 = require("./permissionSet.js");
|
|
9
|
+
const s3Buckets_js_1 = require("./resources/resourceTypes/s3Buckets.js");
|
|
8
10
|
/**
|
|
9
11
|
* Get what actions a principal can perform based on their policies.
|
|
10
12
|
*
|
|
@@ -12,11 +14,13 @@ const permissionSet_js_1 = require("./permissionSet.js");
|
|
|
12
14
|
* @param input the input containing the principal and options.
|
|
13
15
|
* @returns A promise that resolves to the permissions the principal can perform, or void if the implementation is incomplete.
|
|
14
16
|
*/
|
|
15
|
-
async function
|
|
17
|
+
async function principalCan(collectClient, input) {
|
|
16
18
|
const { principal } = input;
|
|
17
19
|
if (!principal) {
|
|
18
20
|
throw new Error('Principal must be provided for can-what command');
|
|
19
21
|
}
|
|
22
|
+
const principalArnParts = (0, iam_utils_1.splitArnParts)(principal);
|
|
23
|
+
const principalAccountId = principalArnParts.accountId;
|
|
20
24
|
const principalPolicies = await (0, principals_js_1.getAllPoliciesForPrincipal)(collectClient, principal);
|
|
21
25
|
const identityPolicies = [
|
|
22
26
|
...principalPolicies.managedPolicies,
|
|
@@ -27,6 +31,13 @@ async function canWhat(collectClient, input) {
|
|
|
27
31
|
const allowedPermissions = await (0, permissionSet_js_1.buildPermissionSetFromPolicies)('Allow', identityPolicies);
|
|
28
32
|
const identityDenyPermissions = await (0, permissionSet_js_1.buildPermissionSetFromPolicies)('Deny', identityPolicies);
|
|
29
33
|
let finalPermissions = allowedPermissions;
|
|
34
|
+
/*********** Start Buckets *************/
|
|
35
|
+
const resourceDenyPermissions = new permissionSet_js_1.PermissionSet('Deny');
|
|
36
|
+
const { allows: bucketAllows, denies: bucketDenies } = await (0, s3Buckets_js_1.s3BucketsSameAccount)(collectClient, principal);
|
|
37
|
+
finalPermissions.addAll(bucketAllows);
|
|
38
|
+
resourceDenyPermissions.addAll(bucketDenies);
|
|
39
|
+
/*********** End Buckets *************/
|
|
40
|
+
// TODO: There is a slight wrinkle where same account resource policies can override implicit denies from Permission Boundaries.
|
|
30
41
|
if (principalPolicies.permissionBoundary) {
|
|
31
42
|
const boundaryPolicy = (0, iam_policy_1.loadPolicy)(principalPolicies.permissionBoundary.policy);
|
|
32
43
|
const boundaryPermissions = await (0, permissionSet_js_1.buildPermissionSetFromPolicies)('Allow', [boundaryPolicy]);
|
|
@@ -51,6 +62,8 @@ async function canWhat(collectClient, input) {
|
|
|
51
62
|
for (const rcpAllow of rcpAllowsByLevel) {
|
|
52
63
|
finalPermissions = finalPermissions.intersection(rcpAllow);
|
|
53
64
|
}
|
|
65
|
+
//Put together all the denies
|
|
66
|
+
principalAccountDenyPermissions.addAll(resourceDenyPermissions);
|
|
54
67
|
const permissionsAfterDeny = finalPermissions.subtract(principalAccountDenyPermissions);
|
|
55
68
|
finalPermissions = permissionsAfterDeny.allow;
|
|
56
69
|
const deniedPermissions = permissionsAfterDeny.deny;
|
|
@@ -65,4 +78,4 @@ async function canWhat(collectClient, input) {
|
|
|
65
78
|
}
|
|
66
79
|
return policyDocument;
|
|
67
80
|
}
|
|
68
|
-
//# sourceMappingURL=
|
|
81
|
+
//# sourceMappingURL=principalCan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"principalCan.js","sourceRoot":"","sources":["../../../src/principalCan/principalCan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Get the actions for a resource type in a service.
|
|
3
|
+
*
|
|
4
|
+
* @param service the service to get actions for
|
|
5
|
+
* @param resourceType the resource type to get the actions for
|
|
6
|
+
* @returns the actions that can be performed on the resource type
|
|
7
|
+
*/
|
|
8
|
+
export declare function actionsForResourceType(service: string, resourceType: string): Promise<string[]>;
|
|
9
|
+
//# sourceMappingURL=actions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../../../src/principalCan/resources/actions.ts"],"names":[],"mappings":"AAMA;;;;;;GAMG;AACH,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,qBAgBjF"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.actionsForResourceType = actionsForResourceType;
|
|
4
|
+
const iam_data_1 = require("@cloud-copilot/iam-data");
|
|
5
|
+
/**
|
|
6
|
+
* Get the actions for a resource type in a service.
|
|
7
|
+
*
|
|
8
|
+
* @param service the service to get actions for
|
|
9
|
+
* @param resourceType the resource type to get the actions for
|
|
10
|
+
* @returns the actions that can be performed on the resource type
|
|
11
|
+
*/
|
|
12
|
+
async function actionsForResourceType(service, resourceType) {
|
|
13
|
+
const resourceTypeExists = await (0, iam_data_1.iamResourceTypeExists)(service, resourceType);
|
|
14
|
+
if (!resourceTypeExists) {
|
|
15
|
+
throw new Error(`Resource type ${resourceType} does not exist in service ${service}`);
|
|
16
|
+
}
|
|
17
|
+
const actions = await (0, iam_data_1.iamActionsForService)(service);
|
|
18
|
+
const matchingAction = [];
|
|
19
|
+
for (const action of actions) {
|
|
20
|
+
const actionDetails = await (0, iam_data_1.iamActionDetails)(service, action);
|
|
21
|
+
if (actionDetails?.resourceTypes?.some((rt) => rt.name === resourceType)) {
|
|
22
|
+
matchingAction.push(action);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return matchingAction;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=actions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actions.js","sourceRoot":"","sources":["../../../../src/principalCan/resources/actions.ts"],"names":[],"mappings":";;AAaA,wDAgBC;AA7BD,sDAIgC;AAEhC;;;;;;GAMG;AACI,KAAK,UAAU,sBAAsB,CAAC,OAAe,EAAE,YAAoB;IAChF,MAAM,kBAAkB,GAAG,MAAM,IAAA,gCAAqB,EAAC,OAAO,EAAE,YAAY,CAAC,CAAA;IAC7E,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,iBAAiB,YAAY,8BAA8B,OAAO,EAAE,CAAC,CAAA;IACvF,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,IAAA,+BAAoB,EAAC,OAAO,CAAC,CAAA;IAEnD,MAAM,cAAc,GAAa,EAAE,CAAA;IACnC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,aAAa,GAAG,MAAM,IAAA,2BAAgB,EAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QAC7D,IAAI,aAAa,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,YAAY,CAAC,EAAE,CAAC;YACzE,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAC7B,CAAC;IACH,CAAC;IAED,OAAO,cAAc,CAAA;AACvB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { IamCollectClient } from '../../../collect/client.js';
|
|
2
|
+
import { PermissionSet } from '../../permissionSet.js';
|
|
3
|
+
/**
|
|
4
|
+
* Get the permission sets for S3 buckets in the same account as the principal.
|
|
5
|
+
*
|
|
6
|
+
* @param collectClient the IAM collect client to use for retrieving policies and resources
|
|
7
|
+
* @param principal the ARN of the principal to check
|
|
8
|
+
* @returns the Allow and Deny permission sets for S3 buckets in the same account as the principal
|
|
9
|
+
*/
|
|
10
|
+
export declare function s3BucketsSameAccount(collectClient: IamCollectClient, principal: string): Promise<{
|
|
11
|
+
allows: PermissionSet[];
|
|
12
|
+
denies: PermissionSet[];
|
|
13
|
+
}>;
|
|
14
|
+
//# sourceMappingURL=s3Buckets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"s3Buckets.d.ts","sourceRoot":"","sources":["../../../../../src/principalCan/resources/resourceTypes/s3Buckets.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAE7D,OAAO,EAA+B,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAInF;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CACxC,aAAa,EAAE,gBAAgB,EAC/B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,MAAM,EAAE,aAAa,EAAE,CAAC;IAAC,MAAM,EAAE,aAAa,EAAE,CAAA;CAAE,CAAC,CA+D/D"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.s3BucketsSameAccount = s3BucketsSameAccount;
|
|
4
|
+
const iam_policy_1 = require("@cloud-copilot/iam-policy");
|
|
5
|
+
const iam_utils_1 = require("@cloud-copilot/iam-utils");
|
|
6
|
+
const permission_js_1 = require("../../permission.js");
|
|
7
|
+
const permissionSet_js_1 = require("../../permissionSet.js");
|
|
8
|
+
const actions_js_1 = require("../actions.js");
|
|
9
|
+
const statements_js_1 = require("../statements.js");
|
|
10
|
+
/**
|
|
11
|
+
* Get the permission sets for S3 buckets in the same account as the principal.
|
|
12
|
+
*
|
|
13
|
+
* @param collectClient the IAM collect client to use for retrieving policies and resources
|
|
14
|
+
* @param principal the ARN of the principal to check
|
|
15
|
+
* @returns the Allow and Deny permission sets for S3 buckets in the same account as the principal
|
|
16
|
+
*/
|
|
17
|
+
async function s3BucketsSameAccount(collectClient, principal) {
|
|
18
|
+
const principalArnParts = (0, iam_utils_1.splitArnParts)(principal);
|
|
19
|
+
const principalAccountId = principalArnParts.accountId;
|
|
20
|
+
const allBuckets = await collectClient.listResources(principalAccountId, 's3', 'bucket', undefined);
|
|
21
|
+
const bucketActions = await (0, actions_js_1.actionsForResourceType)('s3', 'bucket');
|
|
22
|
+
const objectActions = await (0, actions_js_1.actionsForResourceType)('s3', 'object');
|
|
23
|
+
const s3Actions = [...bucketActions, ...objectActions];
|
|
24
|
+
const bucketAllowPermissionSets = [];
|
|
25
|
+
const bucketDenyPermissionSets = [];
|
|
26
|
+
for (const bucket of allBuckets) {
|
|
27
|
+
const bucketPolicy = await collectClient.getResourcePolicyForArn(bucket, principalAccountId);
|
|
28
|
+
if (bucketPolicy) {
|
|
29
|
+
const loadedPolicy = (0, iam_policy_1.loadPolicy)(bucketPolicy);
|
|
30
|
+
if (loadedPolicy) {
|
|
31
|
+
const bucketArns = [bucket, `${bucket}/*`];
|
|
32
|
+
const bucketAllowPerimeter = new permissionSet_js_1.PermissionSet('Allow');
|
|
33
|
+
const bucketDenyPerimeter = new permissionSet_js_1.PermissionSet('Deny');
|
|
34
|
+
for (const action of s3Actions) {
|
|
35
|
+
bucketAllowPerimeter.addPermission(new permission_js_1.Permission('Allow', 's3', action, bucketArns, undefined, undefined));
|
|
36
|
+
bucketDenyPerimeter.addPermission(new permission_js_1.Permission('Deny', 's3', action, bucketArns, undefined, undefined));
|
|
37
|
+
}
|
|
38
|
+
const allowPermissionSet = new permissionSet_js_1.PermissionSet('Allow');
|
|
39
|
+
const denyPermissionSet = new permissionSet_js_1.PermissionSet('Deny');
|
|
40
|
+
for (const statement of loadedPolicy.statements()) {
|
|
41
|
+
const applies = await (0, statements_js_1.statementAppliesToPrincipal)(statement, principal, collectClient);
|
|
42
|
+
if (applies === 'PrincipalMatch') {
|
|
43
|
+
if (statement.isAllow()) {
|
|
44
|
+
await (0, permissionSet_js_1.addStatementToPermissionSet)(statement, allowPermissionSet);
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
await (0, permissionSet_js_1.addStatementToPermissionSet)(statement, denyPermissionSet);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
const effectiveAllows = allowPermissionSet.intersection(bucketAllowPerimeter);
|
|
52
|
+
const effectiveDenies = denyPermissionSet.intersection(bucketDenyPerimeter);
|
|
53
|
+
if (!effectiveAllows.isEmpty()) {
|
|
54
|
+
bucketAllowPermissionSets.push(effectiveAllows);
|
|
55
|
+
}
|
|
56
|
+
if (!effectiveDenies.isEmpty()) {
|
|
57
|
+
bucketDenyPermissionSets.push(effectiveDenies);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return { allows: bucketAllowPermissionSets, denies: bucketDenyPermissionSets };
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=s3Buckets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"s3Buckets.js","sourceRoot":"","sources":["../../../../../src/principalCan/resources/resourceTypes/s3Buckets.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Policy, Statement } from '@cloud-copilot/iam-policy';
|
|
2
|
+
import { IamCollectClient } from '../../collect/client.js';
|
|
3
|
+
export type StatementPrincipalMatchType = 'PrincipalMatch' | 'AccountMatch' | 'NoMatch';
|
|
4
|
+
/**
|
|
5
|
+
* Checks to see if a statement applies to a principal by running a simulation.
|
|
6
|
+
*
|
|
7
|
+
* If the principal is a match return 'PrincipalMatch'
|
|
8
|
+
* If the account is a match return 'AccountMatch'
|
|
9
|
+
* Otherwise return 'NoMatch'
|
|
10
|
+
*
|
|
11
|
+
* @param statement the statement to check
|
|
12
|
+
* @param principalArn the arn of the principal to check
|
|
13
|
+
* @param client the IAM collect client to use for retrieving principal information
|
|
14
|
+
* @returns Whether the statement applies to the principal
|
|
15
|
+
*/
|
|
16
|
+
export declare function statementAppliesToPrincipal(statement: Statement, principalArn: string, client: IamCollectClient): Promise<StatementPrincipalMatchType>;
|
|
17
|
+
/**
|
|
18
|
+
* Makes a policy that captures the principal and principal conditions from a statement
|
|
19
|
+
* and allows all actions on all resources.
|
|
20
|
+
*
|
|
21
|
+
* The conditions returned are only those that relate to the principal.
|
|
22
|
+
*
|
|
23
|
+
* @param statement the statement to extract the principal from
|
|
24
|
+
* @returns
|
|
25
|
+
*/
|
|
26
|
+
export declare function makePrincipalOnlyPolicyFromStatement(statement: Statement): Policy;
|
|
27
|
+
//# sourceMappingURL=statements.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"statements.d.ts","sourceRoot":"","sources":["../../../../src/principalCan/resources/statements.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,MAAM,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AAGzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAI1D,MAAM,MAAM,2BAA2B,GAAG,gBAAgB,GAAG,cAAc,GAAG,SAAS,CAAA;AAEvF;;;;;;;;;;;GAWG;AACH,wBAAsB,2BAA2B,CAC/C,SAAS,EAAE,SAAS,EACpB,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,2BAA2B,CAAC,CA2CtC;AAeD;;;;;;;;GAQG;AACH,wBAAgB,oCAAoC,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,CAiCjF"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.statementAppliesToPrincipal = statementAppliesToPrincipal;
|
|
4
|
+
exports.makePrincipalOnlyPolicyFromStatement = makePrincipalOnlyPolicyFromStatement;
|
|
5
|
+
const iam_policy_1 = require("@cloud-copilot/iam-policy");
|
|
6
|
+
const iam_simulate_1 = require("@cloud-copilot/iam-simulate");
|
|
7
|
+
const iam_utils_1 = require("@cloud-copilot/iam-utils");
|
|
8
|
+
const contextKeys_js_1 = require("../../simulate/contextKeys.js");
|
|
9
|
+
/**
|
|
10
|
+
* Checks to see if a statement applies to a principal by running a simulation.
|
|
11
|
+
*
|
|
12
|
+
* If the principal is a match return 'PrincipalMatch'
|
|
13
|
+
* If the account is a match return 'AccountMatch'
|
|
14
|
+
* Otherwise return 'NoMatch'
|
|
15
|
+
*
|
|
16
|
+
* @param statement the statement to check
|
|
17
|
+
* @param principalArn the arn of the principal to check
|
|
18
|
+
* @param client the IAM collect client to use for retrieving principal information
|
|
19
|
+
* @returns Whether the statement applies to the principal
|
|
20
|
+
*/
|
|
21
|
+
async function statementAppliesToPrincipal(statement, principalArn, client) {
|
|
22
|
+
const principalAccount = (0, iam_utils_1.splitArnParts)(principalArn).accountId;
|
|
23
|
+
const resourcePolicy = makePrincipalOnlyPolicyFromStatement(statement);
|
|
24
|
+
const simulationRequest = {
|
|
25
|
+
principal: principalArn,
|
|
26
|
+
action: 's3:ListBucket',
|
|
27
|
+
resourceAccount: principalAccount,
|
|
28
|
+
resourceArn: undefined,
|
|
29
|
+
customContextKeys: {},
|
|
30
|
+
simulationMode: 'Strict'
|
|
31
|
+
};
|
|
32
|
+
const contextKeys = await (0, contextKeys_js_1.createContextKeys)(client, simulationRequest, 's3', {});
|
|
33
|
+
const request = {
|
|
34
|
+
action: 's3:ListBucket',
|
|
35
|
+
resource: {
|
|
36
|
+
resource: 'arn:aws:s3:::example-bucket',
|
|
37
|
+
accountId: principalAccount
|
|
38
|
+
},
|
|
39
|
+
principal: principalArn,
|
|
40
|
+
contextVariables: contextKeys
|
|
41
|
+
};
|
|
42
|
+
const simulation = {
|
|
43
|
+
request,
|
|
44
|
+
identityPolicies: [],
|
|
45
|
+
resourcePolicy: resourcePolicy.toJSON(),
|
|
46
|
+
serviceControlPolicies: [],
|
|
47
|
+
resourceControlPolicies: []
|
|
48
|
+
};
|
|
49
|
+
const result = await (0, iam_simulate_1.runSimulation)(simulation, {
|
|
50
|
+
simulationMode: simulationRequest.simulationMode
|
|
51
|
+
});
|
|
52
|
+
if (result.analysis?.result === 'Allowed') {
|
|
53
|
+
return 'PrincipalMatch';
|
|
54
|
+
}
|
|
55
|
+
if (result.analysis?.resourceAnalysis?.result === 'AllowedForAccount') {
|
|
56
|
+
return 'AccountMatch';
|
|
57
|
+
}
|
|
58
|
+
return 'NoMatch';
|
|
59
|
+
}
|
|
60
|
+
const principalKeys = new Set([
|
|
61
|
+
'aws:PrincipalArn',
|
|
62
|
+
'aws:PrincipalAccount',
|
|
63
|
+
'aws:PrincipalOrgId',
|
|
64
|
+
'aws:PrincipalOrgPaths',
|
|
65
|
+
'aws:PrincipalType',
|
|
66
|
+
'aws:userid',
|
|
67
|
+
'aws:username',
|
|
68
|
+
'aws:PrincipalIsAWSService'
|
|
69
|
+
].map((k) => k.toLowerCase()));
|
|
70
|
+
/**
|
|
71
|
+
* Makes a policy that captures the principal and principal conditions from a statement
|
|
72
|
+
* and allows all actions on all resources.
|
|
73
|
+
*
|
|
74
|
+
* The conditions returned are only those that relate to the principal.
|
|
75
|
+
*
|
|
76
|
+
* @param statement the statement to extract the principal from
|
|
77
|
+
* @returns
|
|
78
|
+
*/
|
|
79
|
+
function makePrincipalOnlyPolicyFromStatement(statement) {
|
|
80
|
+
const rawStatement = structuredClone(statement.toJSON());
|
|
81
|
+
const rawStatementValues = {};
|
|
82
|
+
if (statement.isPrincipalStatement()) {
|
|
83
|
+
rawStatementValues.Principal = rawStatement.Principal;
|
|
84
|
+
}
|
|
85
|
+
else if (statement.isNotPrincipalStatement()) {
|
|
86
|
+
rawStatementValues.NotPrincipal = rawStatement.NotPrincipal;
|
|
87
|
+
}
|
|
88
|
+
if (rawStatement.Condition) {
|
|
89
|
+
for (const operator of Object.keys(rawStatement.Condition)) {
|
|
90
|
+
for (const key of Object.keys(rawStatement.Condition[operator])) {
|
|
91
|
+
if (!principalKeys.has(key.toLowerCase())) {
|
|
92
|
+
delete rawStatement.Condition[operator][key];
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
if (Object.keys(rawStatement.Condition[operator]).length === 0) {
|
|
96
|
+
delete rawStatement.Condition[operator];
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
if (Object.keys(rawStatement.Condition).length > 0) {
|
|
100
|
+
rawStatementValues.Condition = rawStatement.Condition;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return (0, iam_policy_1.loadPolicy)({
|
|
104
|
+
Version: '2012-10-17',
|
|
105
|
+
Statement: {
|
|
106
|
+
Effect: 'Allow',
|
|
107
|
+
Resource: '*',
|
|
108
|
+
Action: '*',
|
|
109
|
+
...rawStatementValues
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=statements.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"statements.js","sourceRoot":"","sources":["../../../../src/principalCan/resources/statements.ts"],"names":[],"mappings":"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"}
|