@actsecurity/iam-lens 0.1.156

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 (383) hide show
  1. package/LICENSE.txt +661 -0
  2. package/README.md +203 -0
  3. package/dist/cjs/cli.d.ts +3 -0
  4. package/dist/cjs/cli.d.ts.map +1 -0
  5. package/dist/cjs/cli.js +206 -0
  6. package/dist/cjs/cli.js.map +1 -0
  7. package/dist/cjs/collect/client.d.ts +550 -0
  8. package/dist/cjs/collect/client.d.ts.map +1 -0
  9. package/dist/cjs/collect/client.js +1119 -0
  10. package/dist/cjs/collect/client.js.map +1 -0
  11. package/dist/cjs/collect/collect.d.ts +44 -0
  12. package/dist/cjs/collect/collect.d.ts.map +1 -0
  13. package/dist/cjs/collect/collect.js +55 -0
  14. package/dist/cjs/collect/collect.js.map +1 -0
  15. package/dist/cjs/collect/inMemoryClient.d.ts +6 -0
  16. package/dist/cjs/collect/inMemoryClient.d.ts.map +1 -0
  17. package/dist/cjs/collect/inMemoryClient.js +11 -0
  18. package/dist/cjs/collect/inMemoryClient.js.map +1 -0
  19. package/dist/cjs/index.d.ts +13 -0
  20. package/dist/cjs/index.d.ts.map +1 -0
  21. package/dist/cjs/index.js +28 -0
  22. package/dist/cjs/index.js.map +1 -0
  23. package/dist/cjs/package.json +3 -0
  24. package/dist/cjs/principalCan/permission.d.ts +125 -0
  25. package/dist/cjs/principalCan/permission.d.ts.map +1 -0
  26. package/dist/cjs/principalCan/permission.js +1229 -0
  27. package/dist/cjs/principalCan/permission.js.map +1 -0
  28. package/dist/cjs/principalCan/permissionSet.d.ts +140 -0
  29. package/dist/cjs/principalCan/permissionSet.d.ts.map +1 -0
  30. package/dist/cjs/principalCan/permissionSet.js +437 -0
  31. package/dist/cjs/principalCan/permissionSet.js.map +1 -0
  32. package/dist/cjs/principalCan/principalCan.d.ts +26 -0
  33. package/dist/cjs/principalCan/principalCan.d.ts.map +1 -0
  34. package/dist/cjs/principalCan/principalCan.js +195 -0
  35. package/dist/cjs/principalCan/principalCan.js.map +1 -0
  36. package/dist/cjs/principalCan/principalConstraints.d.ts +147 -0
  37. package/dist/cjs/principalCan/principalConstraints.d.ts.map +1 -0
  38. package/dist/cjs/principalCan/principalConstraints.js +472 -0
  39. package/dist/cjs/principalCan/principalConstraints.js.map +1 -0
  40. package/dist/cjs/principalCan/resources/actions.d.ts +9 -0
  41. package/dist/cjs/principalCan/resources/actions.d.ts.map +1 -0
  42. package/dist/cjs/principalCan/resources/actions.js +27 -0
  43. package/dist/cjs/principalCan/resources/actions.js.map +1 -0
  44. package/dist/cjs/principalCan/resources/resourceTypes/iamRoles.d.ts +31 -0
  45. package/dist/cjs/principalCan/resources/resourceTypes/iamRoles.d.ts.map +1 -0
  46. package/dist/cjs/principalCan/resources/resourceTypes/iamRoles.js +114 -0
  47. package/dist/cjs/principalCan/resources/resourceTypes/iamRoles.js.map +1 -0
  48. package/dist/cjs/principalCan/resources/resourceTypes/kmsKeys.d.ts +30 -0
  49. package/dist/cjs/principalCan/resources/resourceTypes/kmsKeys.d.ts.map +1 -0
  50. package/dist/cjs/principalCan/resources/resourceTypes/kmsKeys.js +110 -0
  51. package/dist/cjs/principalCan/resources/resourceTypes/kmsKeys.js.map +1 -0
  52. package/dist/cjs/principalCan/resources/resourceTypes/s3Buckets.d.ts +18 -0
  53. package/dist/cjs/principalCan/resources/resourceTypes/s3Buckets.d.ts.map +1 -0
  54. package/dist/cjs/principalCan/resources/resourceTypes/s3Buckets.js +123 -0
  55. package/dist/cjs/principalCan/resources/resourceTypes/s3Buckets.js.map +1 -0
  56. package/dist/cjs/principalCan/resources/statements.d.ts +27 -0
  57. package/dist/cjs/principalCan/resources/statements.d.ts.map +1 -0
  58. package/dist/cjs/principalCan/resources/statements.js +119 -0
  59. package/dist/cjs/principalCan/resources/statements.js.map +1 -0
  60. package/dist/cjs/principalIndex/makePrincipalIndex.d.ts +8 -0
  61. package/dist/cjs/principalIndex/makePrincipalIndex.d.ts.map +1 -0
  62. package/dist/cjs/principalIndex/makePrincipalIndex.js +105 -0
  63. package/dist/cjs/principalIndex/makePrincipalIndex.js.map +1 -0
  64. package/dist/cjs/principals.d.ts +54 -0
  65. package/dist/cjs/principals.d.ts.map +1 -0
  66. package/dist/cjs/principals.js +143 -0
  67. package/dist/cjs/principals.js.map +1 -0
  68. package/dist/cjs/resources.d.ts +32 -0
  69. package/dist/cjs/resources.d.ts.map +1 -0
  70. package/dist/cjs/resources.js +71 -0
  71. package/dist/cjs/resources.js.map +1 -0
  72. package/dist/cjs/simulate/contextKeys.d.ts +68 -0
  73. package/dist/cjs/simulate/contextKeys.d.ts.map +1 -0
  74. package/dist/cjs/simulate/contextKeys.js +293 -0
  75. package/dist/cjs/simulate/contextKeys.js.map +1 -0
  76. package/dist/cjs/simulate/simulate.d.ts +72 -0
  77. package/dist/cjs/simulate/simulate.d.ts.map +1 -0
  78. package/dist/cjs/simulate/simulate.js +296 -0
  79. package/dist/cjs/simulate/simulate.js.map +1 -0
  80. package/dist/cjs/test-datasets/testClient.d.ts +17 -0
  81. package/dist/cjs/test-datasets/testClient.d.ts.map +1 -0
  82. package/dist/cjs/test-datasets/testClient.js +58 -0
  83. package/dist/cjs/test-datasets/testClient.js.map +1 -0
  84. package/dist/cjs/utils/arn.d.ts +22 -0
  85. package/dist/cjs/utils/arn.d.ts.map +1 -0
  86. package/dist/cjs/utils/arn.js +49 -0
  87. package/dist/cjs/utils/arn.js.map +1 -0
  88. package/dist/cjs/utils/bitset.d.ts +45 -0
  89. package/dist/cjs/utils/bitset.d.ts.map +1 -0
  90. package/dist/cjs/utils/bitset.js +149 -0
  91. package/dist/cjs/utils/bitset.js.map +1 -0
  92. package/dist/cjs/utils/dynamicImport.d.ts +31 -0
  93. package/dist/cjs/utils/dynamicImport.d.ts.map +1 -0
  94. package/dist/cjs/utils/dynamicImport.js +64 -0
  95. package/dist/cjs/utils/dynamicImport.js.map +1 -0
  96. package/dist/cjs/utils/packageVersion.d.ts +5 -0
  97. package/dist/cjs/utils/packageVersion.d.ts.map +1 -0
  98. package/dist/cjs/utils/packageVersion.js +25 -0
  99. package/dist/cjs/utils/packageVersion.js.map +1 -0
  100. package/dist/cjs/utils/readPackageFile.d.ts +3 -0
  101. package/dist/cjs/utils/readPackageFile.d.ts.map +1 -0
  102. package/dist/cjs/utils/readPackageFile.js +16 -0
  103. package/dist/cjs/utils/readPackageFile.js.map +1 -0
  104. package/dist/cjs/utils/s3Abac.d.ts +3 -0
  105. package/dist/cjs/utils/s3Abac.d.ts.map +1 -0
  106. package/dist/cjs/utils/s3Abac.js +5 -0
  107. package/dist/cjs/utils/s3Abac.js.map +1 -0
  108. package/dist/cjs/utils/stringOrFileArgument.d.ts +9 -0
  109. package/dist/cjs/utils/stringOrFileArgument.d.ts.map +1 -0
  110. package/dist/cjs/utils/stringOrFileArgument.js +25 -0
  111. package/dist/cjs/utils/stringOrFileArgument.js.map +1 -0
  112. package/dist/cjs/utils/sts.d.ts +2 -0
  113. package/dist/cjs/utils/sts.d.ts.map +1 -0
  114. package/dist/cjs/utils/sts.js +9 -0
  115. package/dist/cjs/utils/sts.js.map +1 -0
  116. package/dist/cjs/utils/testUtils.d.ts +56 -0
  117. package/dist/cjs/utils/testUtils.d.ts.map +1 -0
  118. package/dist/cjs/utils/testUtils.js +95 -0
  119. package/dist/cjs/utils/testUtils.js.map +1 -0
  120. package/dist/cjs/utils/workerScript.d.ts +8 -0
  121. package/dist/cjs/utils/workerScript.d.ts.map +1 -0
  122. package/dist/cjs/utils/workerScript.js +23 -0
  123. package/dist/cjs/utils/workerScript.js.map +1 -0
  124. package/dist/cjs/whoCan/WhoCanMainThreadWorker.d.ts +73 -0
  125. package/dist/cjs/whoCan/WhoCanMainThreadWorker.d.ts.map +1 -0
  126. package/dist/cjs/whoCan/WhoCanMainThreadWorker.js +80 -0
  127. package/dist/cjs/whoCan/WhoCanMainThreadWorker.js.map +1 -0
  128. package/dist/cjs/whoCan/WhoCanProcessor.d.ts +400 -0
  129. package/dist/cjs/whoCan/WhoCanProcessor.d.ts.map +1 -0
  130. package/dist/cjs/whoCan/WhoCanProcessor.js +1088 -0
  131. package/dist/cjs/whoCan/WhoCanProcessor.js.map +1 -0
  132. package/dist/cjs/whoCan/WhoCanWorker.d.ts +87 -0
  133. package/dist/cjs/whoCan/WhoCanWorker.d.ts.map +1 -0
  134. package/dist/cjs/whoCan/WhoCanWorker.js +201 -0
  135. package/dist/cjs/whoCan/WhoCanWorker.js.map +1 -0
  136. package/dist/cjs/whoCan/WhoCanWorkerThreadWorker.d.ts +2 -0
  137. package/dist/cjs/whoCan/WhoCanWorkerThreadWorker.d.ts.map +1 -0
  138. package/dist/cjs/whoCan/WhoCanWorkerThreadWorker.js +189 -0
  139. package/dist/cjs/whoCan/WhoCanWorkerThreadWorker.js.map +1 -0
  140. package/dist/cjs/whoCan/principalArnFilter.d.ts +84 -0
  141. package/dist/cjs/whoCan/principalArnFilter.d.ts.map +1 -0
  142. package/dist/cjs/whoCan/principalArnFilter.js +258 -0
  143. package/dist/cjs/whoCan/principalArnFilter.js.map +1 -0
  144. package/dist/cjs/whoCan/principalScope.d.ts +35 -0
  145. package/dist/cjs/whoCan/principalScope.d.ts.map +1 -0
  146. package/dist/cjs/whoCan/principalScope.js +104 -0
  147. package/dist/cjs/whoCan/principalScope.js.map +1 -0
  148. package/dist/cjs/whoCan/requestAnalysis.d.ts +73 -0
  149. package/dist/cjs/whoCan/requestAnalysis.d.ts.map +1 -0
  150. package/dist/cjs/whoCan/requestAnalysis.js +87 -0
  151. package/dist/cjs/whoCan/requestAnalysis.js.map +1 -0
  152. package/dist/cjs/whoCan/untrustingActions.d.ts +7 -0
  153. package/dist/cjs/whoCan/untrustingActions.d.ts.map +1 -0
  154. package/dist/cjs/whoCan/untrustingActions.js +30 -0
  155. package/dist/cjs/whoCan/untrustingActions.js.map +1 -0
  156. package/dist/cjs/whoCan/whoCan.d.ts +295 -0
  157. package/dist/cjs/whoCan/whoCan.d.ts.map +1 -0
  158. package/dist/cjs/whoCan/whoCan.js +574 -0
  159. package/dist/cjs/whoCan/whoCan.js.map +1 -0
  160. package/dist/cjs/whoCan/workerBootstrapPlugin.d.ts +17 -0
  161. package/dist/cjs/whoCan/workerBootstrapPlugin.d.ts.map +1 -0
  162. package/dist/cjs/whoCan/workerBootstrapPlugin.js +3 -0
  163. package/dist/cjs/whoCan/workerBootstrapPlugin.js.map +1 -0
  164. package/dist/cjs/workers/ArrayStreamingWorkQueue.d.ts +15 -0
  165. package/dist/cjs/workers/ArrayStreamingWorkQueue.d.ts.map +1 -0
  166. package/dist/cjs/workers/ArrayStreamingWorkQueue.js +35 -0
  167. package/dist/cjs/workers/ArrayStreamingWorkQueue.js.map +1 -0
  168. package/dist/cjs/workers/JobRunner.d.ts +47 -0
  169. package/dist/cjs/workers/JobRunner.d.ts.map +1 -0
  170. package/dist/cjs/workers/JobRunner.js +101 -0
  171. package/dist/cjs/workers/JobRunner.js.map +1 -0
  172. package/dist/cjs/workers/RingQueue.d.ts +14 -0
  173. package/dist/cjs/workers/RingQueue.d.ts.map +1 -0
  174. package/dist/cjs/workers/RingQueue.js +43 -0
  175. package/dist/cjs/workers/RingQueue.js.map +1 -0
  176. package/dist/cjs/workers/SharedArrayBufferMainCache.d.ts +10 -0
  177. package/dist/cjs/workers/SharedArrayBufferMainCache.d.ts.map +1 -0
  178. package/dist/cjs/workers/SharedArrayBufferMainCache.js +37 -0
  179. package/dist/cjs/workers/SharedArrayBufferMainCache.js.map +1 -0
  180. package/dist/cjs/workers/SharedArrayBufferWorkerCache.d.ts +10 -0
  181. package/dist/cjs/workers/SharedArrayBufferWorkerCache.d.ts.map +1 -0
  182. package/dist/cjs/workers/SharedArrayBufferWorkerCache.js +49 -0
  183. package/dist/cjs/workers/SharedArrayBufferWorkerCache.js.map +1 -0
  184. package/dist/cjs/workers/StreamingWorkQueue.d.ts +18 -0
  185. package/dist/cjs/workers/StreamingWorkQueue.d.ts.map +1 -0
  186. package/dist/cjs/workers/StreamingWorkQueue.js +67 -0
  187. package/dist/cjs/workers/StreamingWorkQueue.js.map +1 -0
  188. package/dist/cjs/workers/buffers.d.ts +4 -0
  189. package/dist/cjs/workers/buffers.d.ts.map +1 -0
  190. package/dist/cjs/workers/buffers.js +26 -0
  191. package/dist/cjs/workers/buffers.js.map +1 -0
  192. package/dist/esm/cli.d.ts +3 -0
  193. package/dist/esm/cli.d.ts.map +1 -0
  194. package/dist/esm/cli.js +204 -0
  195. package/dist/esm/cli.js.map +1 -0
  196. package/dist/esm/collect/client.d.ts +550 -0
  197. package/dist/esm/collect/client.d.ts.map +1 -0
  198. package/dist/esm/collect/client.js +1114 -0
  199. package/dist/esm/collect/client.js.map +1 -0
  200. package/dist/esm/collect/collect.d.ts +44 -0
  201. package/dist/esm/collect/collect.d.ts.map +1 -0
  202. package/dist/esm/collect/collect.js +51 -0
  203. package/dist/esm/collect/collect.js.map +1 -0
  204. package/dist/esm/collect/inMemoryClient.d.ts +6 -0
  205. package/dist/esm/collect/inMemoryClient.d.ts.map +1 -0
  206. package/dist/esm/collect/inMemoryClient.js +8 -0
  207. package/dist/esm/collect/inMemoryClient.js.map +1 -0
  208. package/dist/esm/index.d.ts +13 -0
  209. package/dist/esm/index.d.ts.map +1 -0
  210. package/dist/esm/index.js +11 -0
  211. package/dist/esm/index.js.map +1 -0
  212. package/dist/esm/package.json +3 -0
  213. package/dist/esm/principalCan/permission.d.ts +125 -0
  214. package/dist/esm/principalCan/permission.d.ts.map +1 -0
  215. package/dist/esm/principalCan/permission.js +1212 -0
  216. package/dist/esm/principalCan/permission.js.map +1 -0
  217. package/dist/esm/principalCan/permissionSet.d.ts +140 -0
  218. package/dist/esm/principalCan/permissionSet.d.ts.map +1 -0
  219. package/dist/esm/principalCan/permissionSet.js +429 -0
  220. package/dist/esm/principalCan/permissionSet.js.map +1 -0
  221. package/dist/esm/principalCan/principalCan.d.ts +26 -0
  222. package/dist/esm/principalCan/principalCan.d.ts.map +1 -0
  223. package/dist/esm/principalCan/principalCan.js +193 -0
  224. package/dist/esm/principalCan/principalCan.js.map +1 -0
  225. package/dist/esm/principalCan/principalConstraints.d.ts +147 -0
  226. package/dist/esm/principalCan/principalConstraints.d.ts.map +1 -0
  227. package/dist/esm/principalCan/principalConstraints.js +456 -0
  228. package/dist/esm/principalCan/principalConstraints.js.map +1 -0
  229. package/dist/esm/principalCan/resources/actions.d.ts +9 -0
  230. package/dist/esm/principalCan/resources/actions.d.ts.map +1 -0
  231. package/dist/esm/principalCan/resources/actions.js +24 -0
  232. package/dist/esm/principalCan/resources/actions.js.map +1 -0
  233. package/dist/esm/principalCan/resources/resourceTypes/iamRoles.d.ts +31 -0
  234. package/dist/esm/principalCan/resources/resourceTypes/iamRoles.d.ts.map +1 -0
  235. package/dist/esm/principalCan/resources/resourceTypes/iamRoles.js +110 -0
  236. package/dist/esm/principalCan/resources/resourceTypes/iamRoles.js.map +1 -0
  237. package/dist/esm/principalCan/resources/resourceTypes/kmsKeys.d.ts +30 -0
  238. package/dist/esm/principalCan/resources/resourceTypes/kmsKeys.d.ts.map +1 -0
  239. package/dist/esm/principalCan/resources/resourceTypes/kmsKeys.js +106 -0
  240. package/dist/esm/principalCan/resources/resourceTypes/kmsKeys.js.map +1 -0
  241. package/dist/esm/principalCan/resources/resourceTypes/s3Buckets.d.ts +18 -0
  242. package/dist/esm/principalCan/resources/resourceTypes/s3Buckets.d.ts.map +1 -0
  243. package/dist/esm/principalCan/resources/resourceTypes/s3Buckets.js +120 -0
  244. package/dist/esm/principalCan/resources/resourceTypes/s3Buckets.js.map +1 -0
  245. package/dist/esm/principalCan/resources/statements.d.ts +27 -0
  246. package/dist/esm/principalCan/resources/statements.d.ts.map +1 -0
  247. package/dist/esm/principalCan/resources/statements.js +117 -0
  248. package/dist/esm/principalCan/resources/statements.js.map +1 -0
  249. package/dist/esm/principalIndex/makePrincipalIndex.d.ts +8 -0
  250. package/dist/esm/principalIndex/makePrincipalIndex.d.ts.map +1 -0
  251. package/dist/esm/principalIndex/makePrincipalIndex.js +104 -0
  252. package/dist/esm/principalIndex/makePrincipalIndex.js.map +1 -0
  253. package/dist/esm/principals.d.ts +54 -0
  254. package/dist/esm/principals.d.ts.map +1 -0
  255. package/dist/esm/principals.js +133 -0
  256. package/dist/esm/principals.js.map +1 -0
  257. package/dist/esm/resources.d.ts +32 -0
  258. package/dist/esm/resources.d.ts.map +1 -0
  259. package/dist/esm/resources.js +69 -0
  260. package/dist/esm/resources.js.map +1 -0
  261. package/dist/esm/simulate/contextKeys.d.ts +68 -0
  262. package/dist/esm/simulate/contextKeys.d.ts.map +1 -0
  263. package/dist/esm/simulate/contextKeys.js +287 -0
  264. package/dist/esm/simulate/contextKeys.js.map +1 -0
  265. package/dist/esm/simulate/simulate.d.ts +72 -0
  266. package/dist/esm/simulate/simulate.d.ts.map +1 -0
  267. package/dist/esm/simulate/simulate.js +295 -0
  268. package/dist/esm/simulate/simulate.js.map +1 -0
  269. package/dist/esm/test-datasets/testClient.d.ts +17 -0
  270. package/dist/esm/test-datasets/testClient.d.ts.map +1 -0
  271. package/dist/esm/test-datasets/testClient.js +56 -0
  272. package/dist/esm/test-datasets/testClient.js.map +1 -0
  273. package/dist/esm/utils/arn.d.ts +22 -0
  274. package/dist/esm/utils/arn.d.ts.map +1 -0
  275. package/dist/esm/utils/arn.js +43 -0
  276. package/dist/esm/utils/arn.js.map +1 -0
  277. package/dist/esm/utils/bitset.d.ts +45 -0
  278. package/dist/esm/utils/bitset.d.ts.map +1 -0
  279. package/dist/esm/utils/bitset.js +141 -0
  280. package/dist/esm/utils/bitset.js.map +1 -0
  281. package/dist/esm/utils/dynamicImport.d.ts +31 -0
  282. package/dist/esm/utils/dynamicImport.d.ts.map +1 -0
  283. package/dist/esm/utils/dynamicImport.js +60 -0
  284. package/dist/esm/utils/dynamicImport.js.map +1 -0
  285. package/dist/esm/utils/packageVersion.d.ts +5 -0
  286. package/dist/esm/utils/packageVersion.d.ts.map +1 -0
  287. package/dist/esm/utils/packageVersion.js +22 -0
  288. package/dist/esm/utils/packageVersion.js.map +1 -0
  289. package/dist/esm/utils/readPackageFile.d.ts +3 -0
  290. package/dist/esm/utils/readPackageFile.d.ts.map +1 -0
  291. package/dist/esm/utils/readPackageFile.js +15 -0
  292. package/dist/esm/utils/readPackageFile.js.map +1 -0
  293. package/dist/esm/utils/readPackageFileEsm.d.ts.map +1 -0
  294. package/dist/esm/utils/s3Abac.d.ts +3 -0
  295. package/dist/esm/utils/s3Abac.d.ts.map +1 -0
  296. package/dist/esm/utils/s3Abac.js +2 -0
  297. package/dist/esm/utils/s3Abac.js.map +1 -0
  298. package/dist/esm/utils/stringOrFileArgument.d.ts +9 -0
  299. package/dist/esm/utils/stringOrFileArgument.d.ts.map +1 -0
  300. package/dist/esm/utils/stringOrFileArgument.js +22 -0
  301. package/dist/esm/utils/stringOrFileArgument.js.map +1 -0
  302. package/dist/esm/utils/sts.d.ts +2 -0
  303. package/dist/esm/utils/sts.d.ts.map +1 -0
  304. package/dist/esm/utils/sts.js +6 -0
  305. package/dist/esm/utils/sts.js.map +1 -0
  306. package/dist/esm/utils/testUtils.d.ts +56 -0
  307. package/dist/esm/utils/testUtils.d.ts.map +1 -0
  308. package/dist/esm/utils/testUtils.js +90 -0
  309. package/dist/esm/utils/testUtils.js.map +1 -0
  310. package/dist/esm/utils/workerScript.d.ts +8 -0
  311. package/dist/esm/utils/workerScript.d.ts.map +1 -0
  312. package/dist/esm/utils/workerScript.js +18 -0
  313. package/dist/esm/utils/workerScript.js.map +1 -0
  314. package/dist/esm/utils/workerScriptEsm.d.ts.map +1 -0
  315. package/dist/esm/whoCan/WhoCanMainThreadWorker.d.ts +73 -0
  316. package/dist/esm/whoCan/WhoCanMainThreadWorker.d.ts.map +1 -0
  317. package/dist/esm/whoCan/WhoCanMainThreadWorker.js +81 -0
  318. package/dist/esm/whoCan/WhoCanMainThreadWorker.js.map +1 -0
  319. package/dist/esm/whoCan/WhoCanProcessor.d.ts +400 -0
  320. package/dist/esm/whoCan/WhoCanProcessor.d.ts.map +1 -0
  321. package/dist/esm/whoCan/WhoCanProcessor.js +1080 -0
  322. package/dist/esm/whoCan/WhoCanProcessor.js.map +1 -0
  323. package/dist/esm/whoCan/WhoCanWorker.d.ts +87 -0
  324. package/dist/esm/whoCan/WhoCanWorker.d.ts.map +1 -0
  325. package/dist/esm/whoCan/WhoCanWorker.js +198 -0
  326. package/dist/esm/whoCan/WhoCanWorker.js.map +1 -0
  327. package/dist/esm/whoCan/WhoCanWorkerThreadWorker.d.ts +2 -0
  328. package/dist/esm/whoCan/WhoCanWorkerThreadWorker.d.ts.map +1 -0
  329. package/dist/esm/whoCan/WhoCanWorkerThreadWorker.js +193 -0
  330. package/dist/esm/whoCan/WhoCanWorkerThreadWorker.js.map +1 -0
  331. package/dist/esm/whoCan/principalArnFilter.d.ts +84 -0
  332. package/dist/esm/whoCan/principalArnFilter.d.ts.map +1 -0
  333. package/dist/esm/whoCan/principalArnFilter.js +253 -0
  334. package/dist/esm/whoCan/principalArnFilter.js.map +1 -0
  335. package/dist/esm/whoCan/principalScope.d.ts +35 -0
  336. package/dist/esm/whoCan/principalScope.d.ts.map +1 -0
  337. package/dist/esm/whoCan/principalScope.js +102 -0
  338. package/dist/esm/whoCan/principalScope.js.map +1 -0
  339. package/dist/esm/whoCan/requestAnalysis.d.ts +73 -0
  340. package/dist/esm/whoCan/requestAnalysis.d.ts.map +1 -0
  341. package/dist/esm/whoCan/requestAnalysis.js +83 -0
  342. package/dist/esm/whoCan/requestAnalysis.js.map +1 -0
  343. package/dist/esm/whoCan/untrustingActions.d.ts +7 -0
  344. package/dist/esm/whoCan/untrustingActions.d.ts.map +1 -0
  345. package/dist/esm/whoCan/untrustingActions.js +27 -0
  346. package/dist/esm/whoCan/untrustingActions.js.map +1 -0
  347. package/dist/esm/whoCan/whoCan.d.ts +295 -0
  348. package/dist/esm/whoCan/whoCan.d.ts.map +1 -0
  349. package/dist/esm/whoCan/whoCan.js +571 -0
  350. package/dist/esm/whoCan/whoCan.js.map +1 -0
  351. package/dist/esm/whoCan/workerBootstrapPlugin.d.ts +17 -0
  352. package/dist/esm/whoCan/workerBootstrapPlugin.d.ts.map +1 -0
  353. package/dist/esm/whoCan/workerBootstrapPlugin.js +2 -0
  354. package/dist/esm/whoCan/workerBootstrapPlugin.js.map +1 -0
  355. package/dist/esm/workers/ArrayStreamingWorkQueue.d.ts +15 -0
  356. package/dist/esm/workers/ArrayStreamingWorkQueue.d.ts.map +1 -0
  357. package/dist/esm/workers/ArrayStreamingWorkQueue.js +31 -0
  358. package/dist/esm/workers/ArrayStreamingWorkQueue.js.map +1 -0
  359. package/dist/esm/workers/JobRunner.d.ts +47 -0
  360. package/dist/esm/workers/JobRunner.d.ts.map +1 -0
  361. package/dist/esm/workers/JobRunner.js +94 -0
  362. package/dist/esm/workers/JobRunner.js.map +1 -0
  363. package/dist/esm/workers/RingQueue.d.ts +14 -0
  364. package/dist/esm/workers/RingQueue.d.ts.map +1 -0
  365. package/dist/esm/workers/RingQueue.js +36 -0
  366. package/dist/esm/workers/RingQueue.js.map +1 -0
  367. package/dist/esm/workers/SharedArrayBufferMainCache.d.ts +10 -0
  368. package/dist/esm/workers/SharedArrayBufferMainCache.d.ts.map +1 -0
  369. package/dist/esm/workers/SharedArrayBufferMainCache.js +34 -0
  370. package/dist/esm/workers/SharedArrayBufferMainCache.js.map +1 -0
  371. package/dist/esm/workers/SharedArrayBufferWorkerCache.d.ts +10 -0
  372. package/dist/esm/workers/SharedArrayBufferWorkerCache.d.ts.map +1 -0
  373. package/dist/esm/workers/SharedArrayBufferWorkerCache.js +46 -0
  374. package/dist/esm/workers/SharedArrayBufferWorkerCache.js.map +1 -0
  375. package/dist/esm/workers/StreamingWorkQueue.d.ts +18 -0
  376. package/dist/esm/workers/StreamingWorkQueue.d.ts.map +1 -0
  377. package/dist/esm/workers/StreamingWorkQueue.js +61 -0
  378. package/dist/esm/workers/StreamingWorkQueue.js.map +1 -0
  379. package/dist/esm/workers/buffers.d.ts +4 -0
  380. package/dist/esm/workers/buffers.d.ts.map +1 -0
  381. package/dist/esm/workers/buffers.js +21 -0
  382. package/dist/esm/workers/buffers.js.map +1 -0
  383. package/package.json +132 -0
@@ -0,0 +1,287 @@
1
+ import { actionSupportsAwsResourceInfoContextKeys, bucketArn, convertAssumedRoleArnToRoleArn, isS3BucketOrObjectArn, splitArnParts } from '@actsecurity/iam-utils';
2
+ import { IamCollectClient } from '../collect/client.js';
3
+ import { isArnPrincipal, isServicePrincipal } from '../principals.js';
4
+ import {} from './simulate.js';
5
+ export const knownContextKeys = [
6
+ 'aws:SecureTransport',
7
+ 'aws:CurrentTime',
8
+ 'aws:EpochTime',
9
+ 'aws:PrincipalArn',
10
+ 'aws:PrincipalAccount',
11
+ 'aws:PrincipalOrgId',
12
+ 'aws:PrincipalOrgPaths',
13
+ 'aws:PrincipalType',
14
+ 'aws:username',
15
+ 'aws:ResourceAccount',
16
+ 'aws:ResourceOrgID',
17
+ 'aws:ResourceOrgPaths',
18
+ 'aws:PrincipalIsAWSService',
19
+ 'aws:PrincipalServiceName',
20
+ 'aws:SourceAccount',
21
+ 'aws:SourceOrgID',
22
+ 'aws:SourceOrgPaths',
23
+ 'aws:SourceOwner',
24
+ 'aws:SourceArn',
25
+ 'kms:CallerAccount'
26
+ ];
27
+ export const CONTEXT_KEYS = {
28
+ assumedRoot: 'aws:AssumedRoot',
29
+ userId: 'aws:userid',
30
+ vpc: 'aws:SourceVpc',
31
+ vpcEndpointId: 'aws:SourceVpce',
32
+ vpcEndpointAccount: 'aws:VpceAccount',
33
+ vpcEndpointOrgId: 'aws:VpceOrgID',
34
+ vpcEndpointOrgPaths: 'aws:VpceOrgPaths',
35
+ vpcArn: 'aws:SourceVpcArn'
36
+ };
37
+ /**
38
+ * Checks if a context has a specific key (case-insensitive).
39
+ *
40
+ * @param context - The context to check.
41
+ * @param key - The key to check for.
42
+ * @returns True if the context has the key, false otherwise.
43
+ */
44
+ export function contextHasKey(context, key) {
45
+ return !!contextValue(context, key);
46
+ }
47
+ /**
48
+ * Get the value of a context key (case-insensitive).
49
+ *
50
+ * @param context - The context to check.
51
+ * @param key - The key to get the value for.
52
+ * @returns The value of the context key, or undefined if it doesn't exist.
53
+ */
54
+ export function contextValue(context, key) {
55
+ const matchingKey = Object.keys(context).find((contextKey) => contextKey.toLowerCase() === key.toLowerCase());
56
+ return matchingKey ? context[matchingKey] : undefined;
57
+ }
58
+ /**
59
+ * Get the context keys for a simulation request.
60
+ *
61
+ * @param collectClient the collect client to use for fetching data
62
+ * @param simulationRequest the simulation request to create context keys for
63
+ * @param service the service the request is for
64
+ * @param contextKeyOverrides the context key overrides to apply
65
+ * @param resolvedPrincipalArnForContext canonical principal ARN to use for role-backed context keys
66
+ * @returns a promise that resolves to the context keys for the simulation request
67
+ */
68
+ export async function createContextKeys(collectClient, simulationRequest, service, contextKeyOverrides, resolvedPrincipalArnForContext) {
69
+ const contextKeys = {
70
+ 'aws:SecureTransport': 'true',
71
+ 'aws:CurrentTime': new Date().toISOString(),
72
+ 'aws:EpochTime': Math.floor(Date.now() / 1000).toString()
73
+ };
74
+ if (isArnPrincipal(simulationRequest.principal)) {
75
+ const arnParts = splitArnParts(simulationRequest.principal);
76
+ const principalArnForContext = resolvedPrincipalArnForContext ??
77
+ (arnParts.resourceType === 'assumed-role'
78
+ ? convertAssumedRoleArnToRoleArn(simulationRequest.principal)
79
+ : simulationRequest.principal);
80
+ contextKeys['aws:PrincipalArn'] = principalArnForContext;
81
+ const principalAccountId = arnParts.accountId;
82
+ contextKeys['aws:PrincipalAccount'] = arnParts.accountId || '';
83
+ const orgId = await collectClient.getOrgIdForAccount(principalAccountId);
84
+ if (orgId) {
85
+ contextKeys['aws:PrincipalOrgId'] = orgId;
86
+ const orgStructure = await collectClient.getOrgUnitHierarchyForAccount(principalAccountId);
87
+ contextKeys['aws:PrincipalOrgPaths'] = makeOrgPaths(orgId, orgStructure);
88
+ }
89
+ const { tags } = await collectClient.getTagsForResource(principalArnForContext, principalAccountId);
90
+ for (const [key, value] of Object.entries(tags)) {
91
+ contextKeys[`aws:PrincipalTag/${key}`] = value;
92
+ }
93
+ contextKeys['aws:PrincipalIsAWSService'] = 'false';
94
+ if (service.toLowerCase() === 'kms') {
95
+ contextKeys['kms:CallerAccount'] = principalAccountId;
96
+ }
97
+ if (simulationRequest.principal.endsWith(':root')) {
98
+ contextKeys['aws:PrincipalType'] = 'Account';
99
+ contextKeys['aws:userid'] = principalAccountId;
100
+ }
101
+ else if (arnParts.resourceType === 'user') {
102
+ contextKeys['aws:PrincipalType'] = 'User';
103
+ const userUniqueId = await collectClient.getUniqueIdForIamResource(simulationRequest.principal);
104
+ contextKeys['aws:userid'] = userUniqueId || 'UNKNOWN';
105
+ const userName = arnParts.resourcePath?.split('/').at(-1);
106
+ contextKeys['aws:username'] = userName;
107
+ }
108
+ else if (arnParts.resourceType === 'federated-user') {
109
+ contextKeys['aws:PrincipalType'] = 'FederatedUser';
110
+ contextKeys['aws:userid'] = `${arnParts.accountId}:${arnParts.resourcePath}`;
111
+ }
112
+ else if (arnParts.resourceType === 'assumed-role' || arnParts.resourceType === 'role') {
113
+ contextKeys['aws:PrincipalType'] = 'AssumedRole';
114
+ //TODO: Set aws:userId for role principals
115
+ if (arnParts.resourceType === 'assumed-role') {
116
+ const sessionName = arnParts.resourcePath?.split('/').at(-1);
117
+ const roleArn = convertAssumedRoleArnToRoleArn(simulationRequest.principal);
118
+ const roleUniqueId = await collectClient.getUniqueIdForIamResource(roleArn);
119
+ contextKeys['aws:userid'] = `${roleUniqueId || 'UNKNOWN'}:${sessionName}`;
120
+ }
121
+ }
122
+ }
123
+ //Resource context keys
124
+ if (actionSupportsAwsResourceInfoContextKeys(simulationRequest.action)) {
125
+ contextKeys['aws:ResourceAccount'] = simulationRequest.resourceAccount;
126
+ const resourceOrgId = await collectClient.getOrgIdForAccount(simulationRequest.resourceAccount);
127
+ if (resourceOrgId) {
128
+ contextKeys['aws:ResourceOrgID'] = resourceOrgId;
129
+ const orgStructure = await collectClient.getOrgUnitHierarchyForAccount(simulationRequest.resourceAccount);
130
+ contextKeys['aws:ResourceOrgPaths'] = makeOrgPaths(resourceOrgId, orgStructure);
131
+ }
132
+ }
133
+ let resourceTagsAreKnown = false;
134
+ if (simulationRequest.resourceArn) {
135
+ const isBucket = isS3BucketOrObjectArn(simulationRequest.resourceArn);
136
+ const { tags: resourceTags, present: resourceTagsPreset } = await collectClient.getTagsForResource(isBucket ? bucketArn(simulationRequest.resourceArn) : simulationRequest.resourceArn, simulationRequest.resourceAccount);
137
+ resourceTagsAreKnown = resourceTagsPreset;
138
+ for (const [key, value] of Object.entries(resourceTags)) {
139
+ contextKeys[`aws:ResourceTag/${key}`] = value;
140
+ if (isBucket) {
141
+ contextKeys[`s3:BucketTag/${key}`] = value;
142
+ }
143
+ }
144
+ }
145
+ //Service Principal context keys
146
+ if (isServicePrincipal(simulationRequest.principal)) {
147
+ contextKeys['aws:PrincipalIsAWSService'] = 'true';
148
+ contextKeys['aws:PrincipalServiceName'] = simulationRequest.principal;
149
+ contextKeys['aws:SourceAccount'] = simulationRequest.resourceAccount;
150
+ contextKeys['aws:SourceOwner'] = simulationRequest.resourceAccount;
151
+ contextKeys['aws:SourceOrgID'] = contextKeys['aws:ResourceOrgID'];
152
+ contextKeys['aws:SourceOrgPaths'] = contextKeys['aws:ResourceOrgPaths'];
153
+ if (simulationRequest.simulationMode === 'Discovery') {
154
+ // Source key Discovery constraints make the concrete value non-authoritative;
155
+ // this placeholder only marks the key as present for service-originated requests.
156
+ contextKeys['aws:SourceArn'] = 'arn:aws:iam::000000000000:role/unknown-source';
157
+ }
158
+ }
159
+ //Apply any custom context key overrides
160
+ for (const [key, value] of Object.entries(contextKeyOverrides)) {
161
+ contextKeys[key] = value;
162
+ }
163
+ //Add VPC context keys
164
+ const vpcKeys = await getVpcKeys(contextKeys, service, collectClient);
165
+ for (const [key, value] of Object.entries(vpcKeys)) {
166
+ contextKeys[key] = value;
167
+ }
168
+ return {
169
+ resourceTagsAreKnown,
170
+ contextKeys
171
+ };
172
+ }
173
+ /**
174
+ * Get the VPC keys that should be added to the context for a simulation.
175
+ *
176
+ * @param context the existing context
177
+ * @param service the service the request is for
178
+ * @param collectClient the IAM collect client
179
+ * @returns a record of VPC context keys
180
+ */
181
+ export async function getVpcKeys(context, service, collectClient) {
182
+ const vpcKeys = {};
183
+ let vpcEndpointId = contextValue(context, CONTEXT_KEYS.vpcEndpointId);
184
+ const hasVpcEndpoint = !!vpcEndpointId;
185
+ let vpcId = contextValue(context, CONTEXT_KEYS.vpc);
186
+ let vpcArn = contextValue(context, CONTEXT_KEYS.vpcArn);
187
+ //If we know the VPC ID but not the endpoint, lookup the endpoint
188
+ if (!vpcEndpointId && vpcId && typeof vpcId === 'string') {
189
+ vpcEndpointId = await collectClient.getVpcEndpointIdForVpcService(vpcId, service);
190
+ }
191
+ //If we know the VPC ARN but not the endpoint, lookup the endpoint
192
+ if (!vpcEndpointId && vpcArn && typeof vpcArn === 'string') {
193
+ vpcEndpointId = await collectClient.getVpcEndpointIdForVpcService(vpcArn, service);
194
+ }
195
+ if (vpcEndpointId && !vpcId) {
196
+ if (typeof vpcEndpointId == 'string') {
197
+ const vpcId = await collectClient.getVpcIdForVpcEndpointId(vpcEndpointId);
198
+ if (vpcId) {
199
+ vpcKeys[CONTEXT_KEYS.vpc] = vpcId;
200
+ }
201
+ }
202
+ }
203
+ if (vpcEndpointId && !hasVpcEndpoint) {
204
+ vpcKeys[CONTEXT_KEYS.vpcEndpointId] = vpcEndpointId;
205
+ }
206
+ if (vpcEndpointId &&
207
+ typeof vpcEndpointId === 'string' &&
208
+ serviceSupportsExtraVpcEndpointData(service)) {
209
+ const vpcEndpointAccount = await collectClient.getAccountIdForVpcEndpointId(vpcEndpointId);
210
+ const vpcEndpointOrgId = await collectClient.getOrgIdForVpcEndpointId(vpcEndpointId);
211
+ const vpcEndpointOrgStructure = await collectClient.getOrgUnitHierarchyForVpcEndpointId(vpcEndpointId);
212
+ const vpcArn = await collectClient.getVpcArnForVpcEndpointId(vpcEndpointId);
213
+ if (vpcEndpointAccount && !contextHasKey(context, CONTEXT_KEYS.vpcEndpointAccount)) {
214
+ vpcKeys[CONTEXT_KEYS.vpcEndpointAccount] = vpcEndpointAccount;
215
+ }
216
+ if (vpcEndpointOrgId && !contextHasKey(context, CONTEXT_KEYS.vpcEndpointOrgId)) {
217
+ vpcKeys[CONTEXT_KEYS.vpcEndpointOrgId] = vpcEndpointOrgId;
218
+ }
219
+ if (vpcArn && !contextHasKey(context, CONTEXT_KEYS.vpcArn)) {
220
+ vpcKeys[CONTEXT_KEYS.vpcArn] = vpcArn;
221
+ }
222
+ if (vpcEndpointOrgId &&
223
+ vpcEndpointOrgStructure &&
224
+ !contextHasKey(context, CONTEXT_KEYS.vpcEndpointOrgPaths)) {
225
+ vpcKeys[CONTEXT_KEYS.vpcEndpointOrgPaths] = makeOrgPaths(vpcEndpointOrgId, vpcEndpointOrgStructure);
226
+ }
227
+ }
228
+ return vpcKeys;
229
+ }
230
+ const servicesThatSupportExtraVpcEndpointData = new Set([
231
+ 'apprunner',
232
+ 'discovery',
233
+ 'athena',
234
+ 'servicediscovery',
235
+ 'applicationinsights',
236
+ 'cloudformation',
237
+ 'comprehendmedical',
238
+ 'compute-optimizer',
239
+ 'ecr',
240
+ 'ecs',
241
+ 'kinesisanalytics',
242
+ 'route53',
243
+ 'datasync',
244
+ 'ebs',
245
+ 'scheduler',
246
+ 'firehose',
247
+ 'medical-imaging',
248
+ 'healthlake',
249
+ 'omics',
250
+ 'iam',
251
+ 'iotfleetwise',
252
+ 'iotwireless',
253
+ 'kms',
254
+ 'lambda',
255
+ 'payment-cryptography',
256
+ 'polly',
257
+ 'acm-pca',
258
+ 'rbin',
259
+ 'rekognition',
260
+ 'servicequotas',
261
+ 's3',
262
+ 'storagegateway',
263
+ 'ssm-contacts',
264
+ 'textract',
265
+ 'transcribe',
266
+ 'transfer'
267
+ ]);
268
+ /**
269
+ * Check if a service supports extra VPC endpoint data.
270
+ *
271
+ * @param service the service to check
272
+ * @returns true if the service supports extra VPC endpoint data, false otherwise
273
+ */
274
+ export function serviceSupportsExtraVpcEndpointData(service) {
275
+ return servicesThatSupportExtraVpcEndpointData.has(service.toLowerCase());
276
+ }
277
+ /**
278
+ * Create a string array for an aws:xxOrgPaths context key value.
279
+ *
280
+ * @param orgId the organization ID
281
+ * @param hierarchy the organizational hierarchy
282
+ * @returns a string array representing the organizational paths
283
+ */
284
+ function makeOrgPaths(orgId, hierarchy) {
285
+ return [`${orgId}/${hierarchy.join('/')}/`];
286
+ }
287
+ //# sourceMappingURL=contextKeys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contextKeys.js","sourceRoot":"","sources":["../../../src/simulate/contextKeys.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ import { type EvaluationResult, type RunSimulationResults, type Simulation, type SimulationMode } from '@actsecurity/iam-simulate';
2
+ import { IamCollectClient } from '../collect/client.js';
3
+ import { type S3AbacOverride } from '../utils/s3Abac.js';
4
+ import { type ContextKeys } from './contextKeys.js';
5
+ /**
6
+ * The request details for simulating an IAM request.
7
+ */
8
+ export interface SimulationRequest {
9
+ /**
10
+ * The ARN of the resource to simulate access to. Can be undefined for wildcard actions.
11
+ */
12
+ resourceArn: string | undefined;
13
+ /**
14
+ * The account ID of the resource, only required if it cannot be determined from the resource ARN.
15
+ */
16
+ resourceAccount: string | undefined;
17
+ /**
18
+ * The action to simulate; must be a valid IAM service and action such as `s3:ListBucket`.
19
+ */
20
+ action: string;
21
+ /**
22
+ * The ARN of the principal to simulate. Can be a user, role, session, or AWS service.
23
+ */
24
+ principal: string;
25
+ /**
26
+ * Any custom context keys to use for the simulation.
27
+ */
28
+ customContextKeys: ContextKeys;
29
+ /**
30
+ * The simulation mode to use for the request.
31
+ */
32
+ simulationMode: SimulationMode;
33
+ /**
34
+ * Whether to ignore missing principal errors.
35
+ */
36
+ ignoreMissingPrincipal?: boolean;
37
+ /**
38
+ * Override for S3 ABAC settings for the simulation.
39
+ */
40
+ s3AbacOverride?: S3AbacOverride;
41
+ /**
42
+ * The session policy to use for the simulation, if the principal type supports it.
43
+ */
44
+ sessionPolicy?: any;
45
+ /**
46
+ * Additional strict context keys to include for the simulation. These will be added to the default strict context keys.
47
+ */
48
+ additionalStrictContextKeys?: string[];
49
+ }
50
+ /**
51
+ * The result of a simulation request, containing the original request and the simulation result.
52
+ */
53
+ export interface SimulateRequestResult {
54
+ /**
55
+ * The simulation request that was evaluated.
56
+ */
57
+ request: Simulation['request'];
58
+ /**
59
+ * The result of the simulation, which may be an error, a single result, or a wildcard result.
60
+ */
61
+ result: RunSimulationResults;
62
+ }
63
+ /**
64
+ * Simulate an IAM request against the collected IAM data.
65
+ *
66
+ * @param simulationRequest the simulation request details.
67
+ * @param collectClient the IAM collect client to use for data access.
68
+ * @returns the simulation result, including the request and the evaluation result.
69
+ */
70
+ export declare function simulateRequest(simulationRequest: SimulationRequest, collectClient: IamCollectClient): Promise<SimulateRequestResult>;
71
+ export declare function resultMatchesExpectation(expected: EvaluationResult | 'AnyDeny' | undefined, result: EvaluationResult): boolean;
72
+ //# sourceMappingURL=simulate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simulate.d.ts","sourceRoot":"","sources":["../../../src/simulate/simulate.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EAEzB,KAAK,UAAU,EACf,KAAK,cAAc,EACpB,MAAM,2BAA2B,CAAA;AAQlC,OAAO,EAAE,gBAAgB,EAA8B,MAAM,sBAAsB,CAAA;AAYnF,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAExD,OAAO,EAEL,KAAK,WAAW,EAIjB,MAAM,kBAAkB,CAAA;AAEzB;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,WAAW,EAAE,MAAM,GAAG,SAAS,CAAA;IAE/B;;OAEG;IACH,eAAe,EAAE,MAAM,GAAG,SAAS,CAAA;IAEnC;;OAEG;IACH,MAAM,EAAE,MAAM,CAAA;IAEd;;OAEG;IACH,SAAS,EAAE,MAAM,CAAA;IAGjB;;OAEG;IACH,iBAAiB,EAAE,WAAW,CAAA;IAE9B;;OAEG;IACH,cAAc,EAAE,cAAc,CAAA;IAE9B;;OAEG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAEhC;;OAEG;IACH,cAAc,CAAC,EAAE,cAAc,CAAA;IAE/B;;OAEG;IACH,aAAa,CAAC,EAAE,GAAG,CAAA;IAEnB;;OAEG;IACH,2BAA2B,CAAC,EAAE,MAAM,EAAE,CAAA;CACvC;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;OAEG;IACH,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,CAAA;IAE9B;;OAEG;IACH,MAAM,EAAE,oBAAoB,CAAA;CAC7B;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,iBAAiB,EAAE,iBAAiB,EACpC,aAAa,EAAE,gBAAgB,GAC9B,OAAO,CAAC,qBAAqB,CAAC,CA4LhC;AA2KD,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,gBAAgB,GAAG,SAAS,GAAG,SAAS,EAClD,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAQT"}
@@ -0,0 +1,295 @@
1
+ import { iamActionDetails, iamActionExists, iamServiceExists } from '@actsecurity/iam-data';
2
+ import {} from '@actsecurity/iam-policy';
3
+ import { runSimulation } from '@actsecurity/iam-simulate';
4
+ import { convertAssumedRoleArnToRoleArn, isAssumedRoleArn, isIamRoleArn, isS3BucketOrObjectArn, splitArnParts } from '@actsecurity/iam-utils';
5
+ import { IamCollectClient } from '../collect/client.js';
6
+ import { getAllPoliciesForPrincipal, isServiceLinkedRole, principalExists } from '../principals.js';
7
+ import { getAccountIdForResource, getRcpsForResource, getResourcePolicyForResource } from '../resources.js';
8
+ import {} from '../utils/s3Abac.js';
9
+ import { AssumeRoleActions } from '../utils/sts.js';
10
+ import { CONTEXT_KEYS, contextValue, createContextKeys, knownContextKeys } from './contextKeys.js';
11
+ /**
12
+ * Simulate an IAM request against the collected IAM data.
13
+ *
14
+ * @param simulationRequest the simulation request details.
15
+ * @param collectClient the IAM collect client to use for data access.
16
+ * @returns the simulation result, including the request and the evaluation result.
17
+ */
18
+ export async function simulateRequest(simulationRequest, collectClient) {
19
+ const actionParts = simulationRequest.action.split(':');
20
+ const service = actionParts[0];
21
+ const serviceAction = actionParts[1];
22
+ const serviceExists = await iamServiceExists(service);
23
+ const actionExists = serviceExists && (await iamActionExists(service, serviceAction));
24
+ if (!serviceExists || !actionExists) {
25
+ throw new Error(`Unable to find action details for ${simulationRequest.action}`);
26
+ }
27
+ const actionDetails = await iamActionDetails(service, serviceAction);
28
+ // If it is a wildcard action, the resource account is always the principal account
29
+ if (actionDetails.isWildcardOnly) {
30
+ simulationRequest.resourceAccount = splitArnParts(simulationRequest.principal).accountId;
31
+ }
32
+ if (!simulationRequest.resourceAccount && !simulationRequest.resourceArn) {
33
+ throw new Error('Non wildcard actions require a resource ARN or resource account to be specified.');
34
+ }
35
+ simulationRequest.resourceAccount =
36
+ simulationRequest.resourceAccount ||
37
+ (await getAccountIdForResource(collectClient, simulationRequest.resourceArn));
38
+ if (!simulationRequest.resourceAccount) {
39
+ throw new Error(`Unable to find account ID for resource ${simulationRequest.resourceArn}`);
40
+ }
41
+ const principalFound = await principalExists(simulationRequest.principal, collectClient);
42
+ if (!principalFound && !simulationRequest.ignoreMissingPrincipal) {
43
+ throw new Error(`Principal ${simulationRequest.principal} does not exist. Use --ignore-missing-principal to ignore this.`);
44
+ }
45
+ const request = {
46
+ action: simulationRequest.action,
47
+ resource: {
48
+ resource: simulationRequest.resourceArn || '*',
49
+ accountId: simulationRequest.resourceAccount
50
+ },
51
+ principal: simulationRequest.principal,
52
+ contextVariables: {}
53
+ };
54
+ //Lookup the principal policies
55
+ const principalPolicies = await getAllPoliciesForPrincipal(collectClient, simulationRequest.principal);
56
+ const { resourcePolicy, resourceRcps } = await getResourcePolicies(collectClient, simulationRequest.resourceArn, simulationRequest.resourceAccount);
57
+ const useResourcePolicy = simulationRequest.resourceArn &&
58
+ !(isIamRoleArn(simulationRequest.resourceArn) && service.toLowerCase() === 'iam');
59
+ if (AssumeRoleActions.has(simulationRequest.action.toLowerCase()) && !resourcePolicy) {
60
+ throw new Error(`Trust policy not found for resource ${simulationRequest.resourceArn}. sts assume role actions require a trust policy.`);
61
+ }
62
+ const principalArnForContext = await resolvePrincipalArnForContext(collectClient, simulationRequest.principal);
63
+ const { contextKeys, resourceTagsAreKnown } = await createContextKeys(collectClient, simulationRequest, service, simulationRequest.customContextKeys, principalArnForContext);
64
+ const vpcEndpointId = contextValue(contextKeys, CONTEXT_KEYS.vpcEndpointId);
65
+ let vpcEndpointPolicy = undefined;
66
+ if (vpcEndpointId && typeof vpcEndpointId === 'string') {
67
+ const vpcEndpointArn = await collectClient.getVpcEndpointArnForVpcEndpointId(vpcEndpointId);
68
+ if (vpcEndpointArn) {
69
+ const vpcPolicy = await collectClient.getVpcEndpointPolicyForArn(vpcEndpointArn);
70
+ if (vpcPolicy) {
71
+ vpcEndpointPolicy = { name: vpcEndpointArn, policy: vpcPolicy };
72
+ }
73
+ }
74
+ }
75
+ const applicableScps = isServiceLinkedRole(simulationRequest.principal)
76
+ ? []
77
+ : principalPolicies.scps;
78
+ request.contextVariables = contextKeys;
79
+ const simulation = {
80
+ request,
81
+ sessionPolicy: simulationRequest.sessionPolicy,
82
+ identityPolicies: prepareIdentityPolicies(simulationRequest.principal, principalPolicies),
83
+ serviceControlPolicies: applicableScps,
84
+ resourceControlPolicies: rcpsForRequest(simulationRequest.principal, actionDetails.isWildcardOnly, resourceRcps, principalPolicies.rcps),
85
+ resourcePolicy: useResourcePolicy ? resourcePolicy : undefined,
86
+ permissionBoundaryPolicies: preparePermissionBoundary(principalPolicies),
87
+ vpcEndpointPolicies: vpcEndpointPolicy ? [vpcEndpointPolicy] : undefined
88
+ };
89
+ const s3BucketOrObjectRequest = simulationRequest.resourceArn && isS3BucketOrObjectArn(simulationRequest.resourceArn);
90
+ if (s3BucketOrObjectRequest) {
91
+ const [bucketAbacEnabled, blockPublicAccess] = await Promise.all([
92
+ evaluateAbacForBucket(simulationRequest.s3AbacOverride, collectClient, simulationRequest.resourceAccount, simulationRequest.resourceArn),
93
+ collectClient.getBlockPublicAccessEnabledForBucket(simulationRequest.resourceAccount, simulationRequest.resourceArn)
94
+ ]);
95
+ simulation.additionalSettings = {
96
+ s3: {
97
+ bucketAbacEnabled,
98
+ blockPublicAccess
99
+ }
100
+ };
101
+ }
102
+ // Assemble the strict context keys for the simulation
103
+ // Start with the default known context keys
104
+ const strictContextKeys = [
105
+ ...knownContextKeys,
106
+ ...(simulationRequest.additionalStrictContextKeys ?? [])
107
+ ];
108
+ if (!isIamRoleArn(simulationRequest.principal)) {
109
+ strictContextKeys.push(CONTEXT_KEYS.userId);
110
+ }
111
+ if (!simulationRequest.principal.endsWith(':root')) {
112
+ // Treat this as strict unless it is a root principal
113
+ strictContextKeys.push(CONTEXT_KEYS.assumedRoot);
114
+ }
115
+ // S3 Access Points are Not Supported Right Now, Don't Add Noise
116
+ if (simulationRequest.action.startsWith('s3:')) {
117
+ strictContextKeys.push('s3:DataAccessPointAccount');
118
+ strictContextKeys.push('s3:DataAccessPointArn');
119
+ }
120
+ // Add the custom context keys from the simulation request
121
+ for (const key of Object.keys(simulationRequest.customContextKeys)) {
122
+ strictContextKeys.push(key);
123
+ }
124
+ //If we know the tag keys, just make all tag keys strict
125
+ if (resourceTagsAreKnown) {
126
+ strictContextKeys.push('/^aws:ResourceTag\/.*/');
127
+ if (s3BucketOrObjectRequest) {
128
+ strictContextKeys.push('/^s3:BucketTag\/.*/');
129
+ }
130
+ }
131
+ // There also may be other tag context keys, so add those too
132
+ for (const key of Object.keys(contextKeys)) {
133
+ if (key.toLowerCase().includes('tag/')) {
134
+ strictContextKeys.push(key);
135
+ }
136
+ }
137
+ const discoveryContextKeyConstraints = strictContextKeys.map(discoveryConstraintForStrictKey);
138
+ const result = await runSimulation(simulation, {
139
+ simulationMode: simulationRequest.simulationMode,
140
+ discoveryContextKeyConstraints
141
+ });
142
+ return { request, result };
143
+ }
144
+ const awsSourceKeyPrefix = 'aws:source';
145
+ /**
146
+ * Converts an iam-lens strict context key into an iam-simulate Discovery constraint.
147
+ *
148
+ * Most strict keys should preserve the old behavior where both presence and
149
+ * value are authoritative. Service source context keys are different during
150
+ * who-can discovery: iam-lens supplies resource-derived placeholder values, but
151
+ * the actual source account/org for a service principal request may differ.
152
+ * Treating those values as unknown lets who-can return conditional access
153
+ * instead of incorrectly denying service-principal statements.
154
+ *
155
+ * @param keyName the literal context key or slash-delimited key pattern
156
+ * @returns the Discovery constraint to pass to iam-simulate
157
+ */
158
+ function discoveryConstraintForStrictKey(keyName) {
159
+ if (keyName.slice(0, 10).localeCompare(awsSourceKeyPrefix, undefined, { sensitivity: 'base' }) === 0) {
160
+ return {
161
+ keyName,
162
+ presenceIsKnown: true,
163
+ valueIsKnown: false
164
+ };
165
+ }
166
+ return {
167
+ keyName,
168
+ presenceIsKnown: true,
169
+ valueIsKnown: true
170
+ };
171
+ }
172
+ async function getResourcePolicies(collectClient, resourceArn, resourceAccount) {
173
+ if (!resourceArn) {
174
+ return { resourcePolicy: undefined, resourceRcps: [] };
175
+ }
176
+ const resourcePolicy = await getResourcePolicyForResource(collectClient, resourceArn, resourceAccount);
177
+ const resourceRcps = await getRcpsForResource(collectClient, resourceArn, resourceAccount);
178
+ return { resourcePolicy, resourceRcps };
179
+ }
180
+ function rcpsForRequest(principalArn, actionIsWildcard, resourceRcps, principalRcps) {
181
+ if (isServiceLinkedRole(principalArn)) {
182
+ return [];
183
+ }
184
+ let theRcps = resourceRcps;
185
+ if (actionIsWildcard) {
186
+ theRcps = principalRcps;
187
+ }
188
+ return theRcps.map((rcp) => {
189
+ rcp.orgIdentifier;
190
+ return {
191
+ orgIdentifier: rcp.orgIdentifier,
192
+ policies: rcp.policies.filter((policy) => {
193
+ return !policy.name.toLowerCase().endsWith('rcpfullawsaccess');
194
+ })
195
+ };
196
+ });
197
+ }
198
+ /**
199
+ * Resolves the principal ARN to use for role-backed context keys.
200
+ *
201
+ * Direct simulations can use STS assumed-role session ARNs, but collected tags
202
+ * and the canonical `aws:PrincipalArn` value belong to the underlying IAM role.
203
+ * This function performs the collected-data lookup only after the principal ARN
204
+ * passes the cheap assumed-role ARN check, avoiding unnecessary storage lookups
205
+ * for users, role ARNs, root principals, and service principals.
206
+ *
207
+ * @param collectClient the IAM collect client to use for resolving role ARNs
208
+ * @param principalArn the simulation principal ARN or service principal
209
+ * @returns the canonical role ARN for assumed-role sessions, otherwise undefined
210
+ */
211
+ async function resolvePrincipalArnForContext(collectClient, principalArn) {
212
+ if (!isAssumedRoleArn(principalArn)) {
213
+ return undefined;
214
+ }
215
+ return ((await collectClient.resolvePrincipalArn(principalArn)) ??
216
+ convertAssumedRoleArnToRoleArn(principalArn));
217
+ }
218
+ function prepareIdentityPolicies(principalArn, principalPolicies) {
219
+ //Collect unique managed policies
220
+ const uniqueIdentityPolicies = {};
221
+ principalPolicies.managedPolicies.forEach((policy) => {
222
+ if (!uniqueIdentityPolicies[policy.arn]) {
223
+ uniqueIdentityPolicies[policy.arn] = {
224
+ name: policy.arn,
225
+ policy: policy.policy
226
+ };
227
+ }
228
+ });
229
+ principalPolicies.groupPolicies?.forEach((groupPolicy) => {
230
+ groupPolicy.managedPolicies.forEach((policy) => {
231
+ if (!uniqueIdentityPolicies[policy.arn]) {
232
+ uniqueIdentityPolicies[policy.arn] = {
233
+ name: policy.arn,
234
+ policy: policy.policy
235
+ };
236
+ }
237
+ });
238
+ });
239
+ const identityPolicies = Object.values(uniqueIdentityPolicies);
240
+ principalPolicies.inlinePolicies.forEach((policy) => {
241
+ identityPolicies.push({
242
+ name: `${principalArn}#${policy.name}`,
243
+ policy: policy.policy
244
+ });
245
+ });
246
+ principalPolicies.groupPolicies?.forEach((groupPolicy) => {
247
+ groupPolicy.inlinePolicies.forEach((policy) => {
248
+ identityPolicies.push({
249
+ name: `${groupPolicy.group}#${policy.name}`,
250
+ policy: policy.policy
251
+ });
252
+ });
253
+ });
254
+ return identityPolicies;
255
+ }
256
+ function preparePermissionBoundary(principalPolicies) {
257
+ if (principalPolicies.permissionBoundary) {
258
+ return [
259
+ {
260
+ name: principalPolicies.permissionBoundary.arn,
261
+ policy: principalPolicies.permissionBoundary.policy
262
+ }
263
+ ];
264
+ }
265
+ return undefined;
266
+ }
267
+ export function resultMatchesExpectation(expected, result) {
268
+ if (!expected) {
269
+ return true;
270
+ }
271
+ if (expected === 'AnyDeny') {
272
+ return result.includes('Denied');
273
+ }
274
+ return expected === result;
275
+ }
276
+ /**
277
+ * Evaluates whether ABAC (Attribute-Based Access Control) is enabled for a given S3 bucket or object.
278
+ * The evaluation can be overridden by the `s3AbacOverride` parameter.
279
+ *
280
+ * @param s3AbacOverride the override setting for S3 ABAC or undefined to auto-detect
281
+ * @param collectClient the IAM collect client to use for data access
282
+ * @param bucketAccountId the account ID the bucket belongs to
283
+ * @param bucketOrObjectArn the ARN of the bucket or bucket object
284
+ * @returns whether ABAC should be used to evaluate access for the bucket or object
285
+ */
286
+ async function evaluateAbacForBucket(s3AbacOverride, collectClient, bucketAccountId, bucketOrObjectArn) {
287
+ if (s3AbacOverride === 'enabled') {
288
+ return true;
289
+ }
290
+ if (s3AbacOverride === 'disabled') {
291
+ return false;
292
+ }
293
+ return collectClient.getAbacEnabledForBucket(bucketAccountId, bucketOrObjectArn);
294
+ }
295
+ //# sourceMappingURL=simulate.js.map