@cloud-copilot/iam-lens 0.1.44 → 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.
Files changed (83) hide show
  1. package/dist/cjs/cli.js +3 -3
  2. package/dist/cjs/cli.js.map +1 -1
  3. package/dist/cjs/collect/client.d.ts +1 -0
  4. package/dist/cjs/collect/client.d.ts.map +1 -1
  5. package/dist/cjs/collect/client.js +11 -0
  6. package/dist/cjs/collect/client.js.map +1 -1
  7. package/dist/cjs/index.d.ts +1 -1
  8. package/dist/cjs/index.d.ts.map +1 -1
  9. package/dist/cjs/index.js +3 -3
  10. package/dist/cjs/index.js.map +1 -1
  11. package/dist/cjs/{canWhat → principalCan}/permission.d.ts +3 -0
  12. package/dist/cjs/principalCan/permission.d.ts.map +1 -0
  13. package/dist/cjs/{canWhat → principalCan}/permission.js +3 -0
  14. package/dist/cjs/principalCan/permission.js.map +1 -0
  15. package/dist/cjs/principalCan/permissionSet.d.ts +129 -0
  16. package/dist/cjs/principalCan/permissionSet.d.ts.map +1 -0
  17. package/dist/cjs/{canWhat → principalCan}/permissionSet.js +122 -26
  18. package/dist/cjs/principalCan/permissionSet.js.map +1 -0
  19. package/dist/cjs/{canWhat/canWhat.d.ts → principalCan/principalCan.d.ts} +3 -3
  20. package/dist/cjs/principalCan/principalCan.d.ts.map +1 -0
  21. package/dist/cjs/{canWhat/canWhat.js → principalCan/principalCan.js} +16 -3
  22. package/dist/cjs/principalCan/principalCan.js.map +1 -0
  23. package/dist/cjs/principalCan/resources/actions.d.ts +9 -0
  24. package/dist/cjs/principalCan/resources/actions.d.ts.map +1 -0
  25. package/dist/cjs/principalCan/resources/actions.js +27 -0
  26. package/dist/cjs/principalCan/resources/actions.js.map +1 -0
  27. package/dist/cjs/principalCan/resources/resourceTypes/s3Buckets.d.ts +14 -0
  28. package/dist/cjs/principalCan/resources/resourceTypes/s3Buckets.d.ts.map +1 -0
  29. package/dist/cjs/principalCan/resources/resourceTypes/s3Buckets.js +64 -0
  30. package/dist/cjs/principalCan/resources/resourceTypes/s3Buckets.js.map +1 -0
  31. package/dist/cjs/principalCan/resources/statements.d.ts +27 -0
  32. package/dist/cjs/principalCan/resources/statements.d.ts.map +1 -0
  33. package/dist/cjs/principalCan/resources/statements.js +113 -0
  34. package/dist/cjs/principalCan/resources/statements.js.map +1 -0
  35. package/dist/esm/cli.js +3 -3
  36. package/dist/esm/cli.js.map +1 -1
  37. package/dist/esm/collect/client.d.ts +1 -0
  38. package/dist/esm/collect/client.d.ts.map +1 -1
  39. package/dist/esm/collect/client.js +11 -0
  40. package/dist/esm/collect/client.js.map +1 -1
  41. package/dist/esm/index.d.ts +1 -1
  42. package/dist/esm/index.d.ts.map +1 -1
  43. package/dist/esm/index.js +1 -1
  44. package/dist/esm/index.js.map +1 -1
  45. package/dist/esm/{canWhat → principalCan}/permission.d.ts +3 -0
  46. package/dist/esm/principalCan/permission.d.ts.map +1 -0
  47. package/dist/esm/{canWhat → principalCan}/permission.js +3 -0
  48. package/dist/esm/principalCan/permission.js.map +1 -0
  49. package/dist/esm/principalCan/permissionSet.d.ts +129 -0
  50. package/dist/esm/principalCan/permissionSet.d.ts.map +1 -0
  51. package/dist/esm/{canWhat → principalCan}/permissionSet.js +121 -26
  52. package/dist/esm/principalCan/permissionSet.js.map +1 -0
  53. package/dist/esm/{canWhat/canWhat.d.ts → principalCan/principalCan.d.ts} +3 -3
  54. package/dist/esm/principalCan/principalCan.d.ts.map +1 -0
  55. package/dist/esm/{canWhat/canWhat.js → principalCan/principalCan.js} +16 -3
  56. package/dist/esm/principalCan/principalCan.js.map +1 -0
  57. package/dist/esm/principalCan/resources/actions.d.ts +9 -0
  58. package/dist/esm/principalCan/resources/actions.d.ts.map +1 -0
  59. package/dist/esm/principalCan/resources/actions.js +24 -0
  60. package/dist/esm/principalCan/resources/actions.js.map +1 -0
  61. package/dist/esm/principalCan/resources/resourceTypes/s3Buckets.d.ts +14 -0
  62. package/dist/esm/principalCan/resources/resourceTypes/s3Buckets.d.ts.map +1 -0
  63. package/dist/esm/principalCan/resources/resourceTypes/s3Buckets.js +61 -0
  64. package/dist/esm/principalCan/resources/resourceTypes/s3Buckets.js.map +1 -0
  65. package/dist/esm/principalCan/resources/statements.d.ts +27 -0
  66. package/dist/esm/principalCan/resources/statements.d.ts.map +1 -0
  67. package/dist/esm/principalCan/resources/statements.js +109 -0
  68. package/dist/esm/principalCan/resources/statements.js.map +1 -0
  69. package/package.json +1 -1
  70. package/dist/cjs/canWhat/canWhat.d.ts.map +0 -1
  71. package/dist/cjs/canWhat/canWhat.js.map +0 -1
  72. package/dist/cjs/canWhat/permission.d.ts.map +0 -1
  73. package/dist/cjs/canWhat/permission.js.map +0 -1
  74. package/dist/cjs/canWhat/permissionSet.d.ts +0 -59
  75. package/dist/cjs/canWhat/permissionSet.d.ts.map +0 -1
  76. package/dist/cjs/canWhat/permissionSet.js.map +0 -1
  77. package/dist/esm/canWhat/canWhat.d.ts.map +0 -1
  78. package/dist/esm/canWhat/canWhat.js.map +0 -1
  79. package/dist/esm/canWhat/permission.d.ts.map +0 -1
  80. package/dist/esm/canWhat/permission.js.map +0 -1
  81. package/dist/esm/canWhat/permissionSet.d.ts +0 -59
  82. package/dist/esm/canWhat/permissionSet.d.ts.map +0 -1
  83. 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.isAllow()) {
296
+ else if (effect === 'Deny' && !stmt.isDeny()) {
224
297
  continue; // skip Allow statements if we're building a Deny set
225
298
  }
226
- let statementActions;
227
- if (stmt.isActionStatement()) {
228
- const allActions = stmt.actions().map((a) => a.value());
229
- statementActions = await (0, iam_expand_1.expandIamActions)(allActions, { expandAsterisk: true });
230
- }
231
- else if (stmt.isNotActionStatement()) {
232
- statementActions = await (0, iam_expand_1.invertIamActions)(stmt.notActions().map((a) => a.value()));
233
- }
234
- else {
235
- continue;
236
- }
237
- for (const fullAction of statementActions) {
238
- const [service, actionName] = fullAction.split(':');
239
- if (!service || !actionName)
240
- continue;
241
- let resource = undefined;
242
- let notResource = undefined;
243
- if (stmt.isResourceStatement()) {
244
- resource = stmt.resources().map((r) => r.value());
245
- }
246
- else if (stmt.isNotResourceStatement()) {
247
- notResource = stmt.notResources().map((r) => r.value());
248
- }
249
- permissionSet.addPermission(new permission_js_1.Permission(effect, service, actionName, resource, notResource, stmt.conditionMap()));
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 CanWhatInput {
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 canWhat(collectClient: IamCollectClient, input: CanWhatInput): Promise<{
22
+ export declare function principalCan(collectClient: IamCollectClient, input: PrincipalCanInput): Promise<{
23
23
  Version: string;
24
24
  Statement: any[];
25
25
  }>;
26
- //# sourceMappingURL=canWhat.d.ts.map
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.canWhat = canWhat;
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 canWhat(collectClient, input) {
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=canWhat.js.map
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":";;AAqBA,kEA+CC;AAwBD,oFAiCC;AA7HD,0DAAyE;AACzE,8DAAuE;AACvE,wDAAwD;AAExD,kEAAiE;AAKjE;;;;;;;;;;;GAWG;AACI,KAAK,UAAU,2BAA2B,CAC/C,SAAoB,EACpB,YAAoB,EACpB,MAAwB;IAExB,MAAM,gBAAgB,GAAG,IAAA,yBAAa,EAAC,YAAY,CAAC,CAAC,SAAU,CAAA;IAC/D,MAAM,cAAc,GAAG,oCAAoC,CAAC,SAAS,CAAC,CAAA;IACtE,MAAM,iBAAiB,GAAsB;QAC3C,SAAS,EAAE,YAAY;QACvB,MAAM,EAAE,eAAe;QACvB,eAAe,EAAE,gBAAgB;QACjC,WAAW,EAAE,SAAS;QACtB,iBAAiB,EAAE,EAAE;QACrB,cAAc,EAAE,QAAQ;KACzB,CAAA;IAED,MAAM,WAAW,GAAG,MAAM,IAAA,kCAAiB,EAAC,MAAM,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,CAAC,CAAA;IAEhF,MAAM,OAAO,GAA0B;QACrC,MAAM,EAAE,eAAe;QACvB,QAAQ,EAAE;YACR,QAAQ,EAAE,6BAA6B;YACvC,SAAS,EAAE,gBAAgB;SAC5B;QACD,SAAS,EAAE,YAAY;QACvB,gBAAgB,EAAE,WAAW;KAC9B,CAAA;IAED,MAAM,UAAU,GAAe;QAC7B,OAAO;QACP,gBAAgB,EAAE,EAAE;QACpB,cAAc,EAAE,cAAc,CAAC,MAAM,EAAE;QACvC,sBAAsB,EAAE,EAAE;QAC1B,uBAAuB,EAAE,EAAE;KAC5B,CAAA;IAED,MAAM,MAAM,GAAG,MAAM,IAAA,4BAAa,EAAC,UAAU,EAAE;QAC7C,cAAc,EAAE,iBAAiB,CAAC,cAAc;KACjD,CAAC,CAAA;IAEF,IAAI,MAAM,CAAC,QAAQ,EAAE,MAAM,KAAK,SAAS,EAAE,CAAC;QAC1C,OAAO,gBAAgB,CAAA;IACzB,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,EAAE,gBAAgB,EAAE,MAAM,KAAK,mBAAmB,EAAE,CAAC;QACtE,OAAO,cAAc,CAAA;IACvB,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,MAAM,aAAa,GAAG,IAAI,GAAG,CAC3B;IACE,kBAAkB;IAClB,sBAAsB;IACtB,oBAAoB;IACpB,uBAAuB;IACvB,mBAAmB;IACnB,YAAY;IACZ,cAAc;IACd,2BAA2B;CAC5B,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAC9B,CAAA;AAED;;;;;;;;GAQG;AACH,SAAgB,oCAAoC,CAAC,SAAoB;IACvE,MAAM,YAAY,GAAG,eAAe,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAA;IACxD,MAAM,kBAAkB,GAAQ,EAAE,CAAA;IAClC,IAAI,SAAS,CAAC,oBAAoB,EAAE,EAAE,CAAC;QACrC,kBAAkB,CAAC,SAAS,GAAG,YAAY,CAAC,SAAS,CAAA;IACvD,CAAC;SAAM,IAAI,SAAS,CAAC,uBAAuB,EAAE,EAAE,CAAC;QAC/C,kBAAkB,CAAC,YAAY,GAAG,YAAY,CAAC,YAAY,CAAA;IAC7D,CAAC;IACD,IAAI,YAAY,CAAC,SAAS,EAAE,CAAC;QAC3B,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3D,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;gBAChE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;oBAC1C,OAAO,YAAY,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAA;gBAC9C,CAAC;YACH,CAAC;YACD,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC/D,OAAO,YAAY,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;YACzC,CAAC;QACH,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnD,kBAAkB,CAAC,SAAS,GAAG,YAAY,CAAC,SAAS,CAAA;QACvD,CAAC;IACH,CAAC;IAED,OAAO,IAAA,uBAAU,EAAC;QAChB,OAAO,EAAE,YAAY;QACrB,SAAS,EAAE;YACT,MAAM,EAAE,OAAO;YACf,QAAQ,EAAE,GAAG;YACb,MAAM,EAAE,GAAG;YACX,GAAG,kBAAkB;SACtB;KACF,CAAC,CAAA;AACJ,CAAC"}