regscale-cli 6.21.2.0__py3-none-any.whl → 6.28.2.1__py3-none-any.whl

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 (314) hide show
  1. regscale/_version.py +1 -1
  2. regscale/airflow/hierarchy.py +2 -2
  3. regscale/core/app/api.py +5 -2
  4. regscale/core/app/application.py +36 -6
  5. regscale/core/app/internal/control_editor.py +73 -21
  6. regscale/core/app/internal/evidence.py +727 -204
  7. regscale/core/app/internal/login.py +4 -2
  8. regscale/core/app/internal/model_editor.py +219 -64
  9. regscale/core/app/utils/app_utils.py +86 -12
  10. regscale/core/app/utils/catalog_utils/common.py +1 -1
  11. regscale/core/login.py +21 -4
  12. regscale/core/utils/async_graphql_client.py +363 -0
  13. regscale/core/utils/date.py +77 -1
  14. regscale/dev/cli.py +26 -0
  15. regscale/dev/code_gen.py +109 -24
  16. regscale/dev/version.py +72 -0
  17. regscale/integrations/commercial/__init__.py +30 -2
  18. regscale/integrations/commercial/aws/audit_manager_compliance.py +3908 -0
  19. regscale/integrations/commercial/aws/cli.py +3107 -54
  20. regscale/integrations/commercial/aws/cloudtrail_control_mappings.py +333 -0
  21. regscale/integrations/commercial/aws/cloudtrail_evidence.py +501 -0
  22. regscale/integrations/commercial/aws/cloudwatch_control_mappings.py +357 -0
  23. regscale/integrations/commercial/aws/cloudwatch_evidence.py +490 -0
  24. regscale/integrations/commercial/{amazon → aws}/common.py +71 -19
  25. regscale/integrations/commercial/aws/config_compliance.py +914 -0
  26. regscale/integrations/commercial/aws/conformance_pack_mappings.py +198 -0
  27. regscale/integrations/commercial/aws/control_compliance_analyzer.py +439 -0
  28. regscale/integrations/commercial/aws/evidence_generator.py +283 -0
  29. regscale/integrations/commercial/aws/guardduty_control_mappings.py +340 -0
  30. regscale/integrations/commercial/aws/guardduty_evidence.py +1053 -0
  31. regscale/integrations/commercial/aws/iam_control_mappings.py +368 -0
  32. regscale/integrations/commercial/aws/iam_evidence.py +574 -0
  33. regscale/integrations/commercial/aws/inventory/__init__.py +338 -22
  34. regscale/integrations/commercial/aws/inventory/base.py +107 -5
  35. regscale/integrations/commercial/aws/inventory/resources/analytics.py +390 -0
  36. regscale/integrations/commercial/aws/inventory/resources/applications.py +234 -0
  37. regscale/integrations/commercial/aws/inventory/resources/audit_manager.py +513 -0
  38. regscale/integrations/commercial/aws/inventory/resources/cloudtrail.py +315 -0
  39. regscale/integrations/commercial/aws/inventory/resources/cloudtrail_logs_metadata.py +476 -0
  40. regscale/integrations/commercial/aws/inventory/resources/cloudwatch.py +191 -0
  41. regscale/integrations/commercial/aws/inventory/resources/compute.py +328 -9
  42. regscale/integrations/commercial/aws/inventory/resources/config.py +464 -0
  43. regscale/integrations/commercial/aws/inventory/resources/containers.py +74 -9
  44. regscale/integrations/commercial/aws/inventory/resources/database.py +481 -31
  45. regscale/integrations/commercial/aws/inventory/resources/developer_tools.py +253 -0
  46. regscale/integrations/commercial/aws/inventory/resources/guardduty.py +286 -0
  47. regscale/integrations/commercial/aws/inventory/resources/iam.py +470 -0
  48. regscale/integrations/commercial/aws/inventory/resources/inspector.py +476 -0
  49. regscale/integrations/commercial/aws/inventory/resources/integration.py +175 -61
  50. regscale/integrations/commercial/aws/inventory/resources/kms.py +447 -0
  51. regscale/integrations/commercial/aws/inventory/resources/machine_learning.py +358 -0
  52. regscale/integrations/commercial/aws/inventory/resources/networking.py +390 -67
  53. regscale/integrations/commercial/aws/inventory/resources/s3.py +394 -0
  54. regscale/integrations/commercial/aws/inventory/resources/security.py +268 -72
  55. regscale/integrations/commercial/aws/inventory/resources/securityhub.py +473 -0
  56. regscale/integrations/commercial/aws/inventory/resources/storage.py +288 -29
  57. regscale/integrations/commercial/aws/inventory/resources/systems_manager.py +657 -0
  58. regscale/integrations/commercial/aws/inventory/resources/vpc.py +655 -0
  59. regscale/integrations/commercial/aws/kms_control_mappings.py +288 -0
  60. regscale/integrations/commercial/aws/kms_evidence.py +879 -0
  61. regscale/integrations/commercial/aws/ocsf/__init__.py +7 -0
  62. regscale/integrations/commercial/aws/ocsf/constants.py +115 -0
  63. regscale/integrations/commercial/aws/ocsf/mapper.py +435 -0
  64. regscale/integrations/commercial/aws/org_control_mappings.py +286 -0
  65. regscale/integrations/commercial/aws/org_evidence.py +666 -0
  66. regscale/integrations/commercial/aws/s3_control_mappings.py +356 -0
  67. regscale/integrations/commercial/aws/s3_evidence.py +632 -0
  68. regscale/integrations/commercial/aws/scanner.py +1072 -205
  69. regscale/integrations/commercial/aws/security_hub.py +319 -0
  70. regscale/integrations/commercial/aws/session_manager.py +282 -0
  71. regscale/integrations/commercial/aws/ssm_control_mappings.py +291 -0
  72. regscale/integrations/commercial/aws/ssm_evidence.py +492 -0
  73. regscale/integrations/commercial/jira.py +489 -153
  74. regscale/integrations/commercial/microsoft_defender/defender.py +326 -5
  75. regscale/integrations/commercial/microsoft_defender/defender_api.py +348 -14
  76. regscale/integrations/commercial/microsoft_defender/defender_constants.py +157 -0
  77. regscale/integrations/commercial/qualys/__init__.py +167 -68
  78. regscale/integrations/commercial/qualys/scanner.py +305 -39
  79. regscale/integrations/commercial/sarif/sairf_importer.py +432 -0
  80. regscale/integrations/commercial/sarif/sarif_converter.py +67 -0
  81. regscale/integrations/commercial/sicura/api.py +79 -42
  82. regscale/integrations/commercial/sicura/commands.py +8 -2
  83. regscale/integrations/commercial/sicura/scanner.py +83 -44
  84. regscale/integrations/commercial/stigv2/ckl_parser.py +5 -5
  85. regscale/integrations/commercial/synqly/assets.py +133 -16
  86. regscale/integrations/commercial/synqly/edr.py +2 -8
  87. regscale/integrations/commercial/synqly/query_builder.py +536 -0
  88. regscale/integrations/commercial/synqly/ticketing.py +27 -0
  89. regscale/integrations/commercial/synqly/vulnerabilities.py +165 -28
  90. regscale/integrations/commercial/tenablev2/cis_parsers.py +453 -0
  91. regscale/integrations/commercial/tenablev2/cis_scanner.py +447 -0
  92. regscale/integrations/commercial/tenablev2/commands.py +146 -5
  93. regscale/integrations/commercial/tenablev2/scanner.py +1 -3
  94. regscale/integrations/commercial/tenablev2/stig_parsers.py +113 -57
  95. regscale/integrations/commercial/wizv2/WizDataMixin.py +1 -1
  96. regscale/integrations/commercial/wizv2/click.py +191 -76
  97. regscale/integrations/commercial/wizv2/compliance/__init__.py +15 -0
  98. regscale/integrations/commercial/wizv2/{policy_compliance_helpers.py → compliance/helpers.py} +78 -60
  99. regscale/integrations/commercial/wizv2/compliance_report.py +1592 -0
  100. regscale/integrations/commercial/wizv2/core/__init__.py +133 -0
  101. regscale/integrations/commercial/wizv2/{async_client.py → core/client.py} +7 -3
  102. regscale/integrations/commercial/wizv2/{constants.py → core/constants.py} +92 -89
  103. regscale/integrations/commercial/wizv2/core/file_operations.py +237 -0
  104. regscale/integrations/commercial/wizv2/fetchers/__init__.py +11 -0
  105. regscale/integrations/commercial/wizv2/{data_fetcher.py → fetchers/policy_assessment.py} +66 -9
  106. regscale/integrations/commercial/wizv2/file_cleanup.py +104 -0
  107. regscale/integrations/commercial/wizv2/issue.py +776 -28
  108. regscale/integrations/commercial/wizv2/models/__init__.py +0 -0
  109. regscale/integrations/commercial/wizv2/parsers/__init__.py +34 -0
  110. regscale/integrations/commercial/wizv2/{parsers.py → parsers/main.py} +1 -1
  111. regscale/integrations/commercial/wizv2/processors/__init__.py +11 -0
  112. regscale/integrations/commercial/wizv2/{finding_processor.py → processors/finding.py} +1 -1
  113. regscale/integrations/commercial/wizv2/reports.py +243 -0
  114. regscale/integrations/commercial/wizv2/sbom.py +1 -1
  115. regscale/integrations/commercial/wizv2/scanner.py +1031 -441
  116. regscale/integrations/commercial/wizv2/utils/__init__.py +48 -0
  117. regscale/integrations/commercial/wizv2/{utils.py → utils/main.py} +116 -61
  118. regscale/integrations/commercial/wizv2/variables.py +89 -3
  119. regscale/integrations/compliance_integration.py +1036 -151
  120. regscale/integrations/control_matcher.py +432 -0
  121. regscale/integrations/due_date_handler.py +333 -0
  122. regscale/integrations/milestone_manager.py +291 -0
  123. regscale/integrations/public/__init__.py +14 -0
  124. regscale/integrations/public/cci_importer.py +834 -0
  125. regscale/integrations/public/csam/__init__.py +0 -0
  126. regscale/integrations/public/csam/csam.py +938 -0
  127. regscale/integrations/public/csam/csam_agency_defined.py +179 -0
  128. regscale/integrations/public/csam/csam_common.py +154 -0
  129. regscale/integrations/public/csam/csam_controls.py +432 -0
  130. regscale/integrations/public/csam/csam_poam.py +124 -0
  131. regscale/integrations/public/fedramp/click.py +77 -6
  132. regscale/integrations/public/fedramp/docx_parser.py +10 -1
  133. regscale/integrations/public/fedramp/fedramp_cis_crm.py +675 -289
  134. regscale/integrations/public/fedramp/fedramp_five.py +1 -1
  135. regscale/integrations/public/fedramp/poam/scanner.py +75 -7
  136. regscale/integrations/public/fedramp/poam_export_v5.py +888 -0
  137. regscale/integrations/scanner_integration.py +1961 -430
  138. regscale/models/integration_models/CCI_List.xml +1 -0
  139. regscale/models/integration_models/aqua.py +2 -2
  140. regscale/models/integration_models/cisa_kev_data.json +805 -11
  141. regscale/models/integration_models/flat_file_importer/__init__.py +5 -8
  142. regscale/models/integration_models/nexpose.py +36 -10
  143. regscale/models/integration_models/qualys.py +3 -4
  144. regscale/models/integration_models/synqly_models/capabilities.json +1 -1
  145. regscale/models/integration_models/synqly_models/connectors/vulnerabilities.py +87 -18
  146. regscale/models/integration_models/synqly_models/filter_parser.py +332 -0
  147. regscale/models/integration_models/synqly_models/ocsf_mapper.py +124 -25
  148. regscale/models/integration_models/synqly_models/synqly_model.py +89 -16
  149. regscale/models/locking.py +12 -8
  150. regscale/models/platform.py +4 -2
  151. regscale/models/regscale_models/__init__.py +7 -0
  152. regscale/models/regscale_models/assessment.py +2 -1
  153. regscale/models/regscale_models/catalog.py +1 -1
  154. regscale/models/regscale_models/compliance_settings.py +251 -1
  155. regscale/models/regscale_models/component.py +1 -0
  156. regscale/models/regscale_models/control_implementation.py +236 -41
  157. regscale/models/regscale_models/control_objective.py +74 -5
  158. regscale/models/regscale_models/file.py +2 -0
  159. regscale/models/regscale_models/form_field_value.py +5 -3
  160. regscale/models/regscale_models/inheritance.py +44 -0
  161. regscale/models/regscale_models/issue.py +301 -102
  162. regscale/models/regscale_models/milestone.py +33 -14
  163. regscale/models/regscale_models/organization.py +3 -0
  164. regscale/models/regscale_models/regscale_model.py +310 -73
  165. regscale/models/regscale_models/security_plan.py +4 -2
  166. regscale/models/regscale_models/vulnerability.py +3 -3
  167. regscale/regscale.py +25 -4
  168. regscale/templates/__init__.py +0 -0
  169. regscale/utils/threading/threadhandler.py +20 -15
  170. regscale/validation/record.py +23 -1
  171. {regscale_cli-6.21.2.0.dist-info → regscale_cli-6.28.2.1.dist-info}/METADATA +17 -33
  172. {regscale_cli-6.21.2.0.dist-info → regscale_cli-6.28.2.1.dist-info}/RECORD +310 -111
  173. tests/core/__init__.py +0 -0
  174. tests/core/utils/__init__.py +0 -0
  175. tests/core/utils/test_async_graphql_client.py +472 -0
  176. tests/fixtures/test_fixture.py +13 -8
  177. tests/regscale/core/test_login.py +171 -4
  178. tests/regscale/integrations/commercial/__init__.py +0 -0
  179. tests/regscale/integrations/commercial/aws/__init__.py +0 -0
  180. tests/regscale/integrations/commercial/aws/test_audit_manager_compliance.py +1304 -0
  181. tests/regscale/integrations/commercial/aws/test_audit_manager_evidence_aggregation.py +341 -0
  182. tests/regscale/integrations/commercial/aws/test_aws_analytics_collector.py +260 -0
  183. tests/regscale/integrations/commercial/aws/test_aws_applications_collector.py +242 -0
  184. tests/regscale/integrations/commercial/aws/test_aws_audit_manager_collector.py +1155 -0
  185. tests/regscale/integrations/commercial/aws/test_aws_cloudtrail_collector.py +534 -0
  186. tests/regscale/integrations/commercial/aws/test_aws_config_collector.py +400 -0
  187. tests/regscale/integrations/commercial/aws/test_aws_developer_tools_collector.py +203 -0
  188. tests/regscale/integrations/commercial/aws/test_aws_guardduty_collector.py +315 -0
  189. tests/regscale/integrations/commercial/aws/test_aws_iam_collector.py +458 -0
  190. tests/regscale/integrations/commercial/aws/test_aws_inspector_collector.py +353 -0
  191. tests/regscale/integrations/commercial/aws/test_aws_inventory_integration.py +530 -0
  192. tests/regscale/integrations/commercial/aws/test_aws_kms_collector.py +919 -0
  193. tests/regscale/integrations/commercial/aws/test_aws_machine_learning_collector.py +237 -0
  194. tests/regscale/integrations/commercial/aws/test_aws_s3_collector.py +722 -0
  195. tests/regscale/integrations/commercial/aws/test_aws_scanner_integration.py +722 -0
  196. tests/regscale/integrations/commercial/aws/test_aws_securityhub_collector.py +792 -0
  197. tests/regscale/integrations/commercial/aws/test_aws_systems_manager_collector.py +918 -0
  198. tests/regscale/integrations/commercial/aws/test_aws_vpc_collector.py +996 -0
  199. tests/regscale/integrations/commercial/aws/test_cli_evidence.py +431 -0
  200. tests/regscale/integrations/commercial/aws/test_cloudtrail_control_mappings.py +452 -0
  201. tests/regscale/integrations/commercial/aws/test_cloudtrail_evidence.py +788 -0
  202. tests/regscale/integrations/commercial/aws/test_config_compliance.py +298 -0
  203. tests/regscale/integrations/commercial/aws/test_conformance_pack_mappings.py +200 -0
  204. tests/regscale/integrations/commercial/aws/test_control_compliance_analyzer.py +375 -0
  205. tests/regscale/integrations/commercial/aws/test_datetime_parsing.py +223 -0
  206. tests/regscale/integrations/commercial/aws/test_evidence_generator.py +386 -0
  207. tests/regscale/integrations/commercial/aws/test_guardduty_control_mappings.py +564 -0
  208. tests/regscale/integrations/commercial/aws/test_guardduty_evidence.py +1041 -0
  209. tests/regscale/integrations/commercial/aws/test_iam_control_mappings.py +718 -0
  210. tests/regscale/integrations/commercial/aws/test_iam_evidence.py +1375 -0
  211. tests/regscale/integrations/commercial/aws/test_kms_control_mappings.py +656 -0
  212. tests/regscale/integrations/commercial/aws/test_kms_evidence.py +1163 -0
  213. tests/regscale/integrations/commercial/aws/test_ocsf_mapper.py +370 -0
  214. tests/regscale/integrations/commercial/aws/test_org_control_mappings.py +546 -0
  215. tests/regscale/integrations/commercial/aws/test_org_evidence.py +1240 -0
  216. tests/regscale/integrations/commercial/aws/test_s3_control_mappings.py +672 -0
  217. tests/regscale/integrations/commercial/aws/test_s3_evidence.py +987 -0
  218. tests/regscale/integrations/commercial/aws/test_scanner_evidence.py +373 -0
  219. tests/regscale/integrations/commercial/aws/test_security_hub_config_filtering.py +539 -0
  220. tests/regscale/integrations/commercial/aws/test_session_manager.py +516 -0
  221. tests/regscale/integrations/commercial/aws/test_ssm_control_mappings.py +588 -0
  222. tests/regscale/integrations/commercial/aws/test_ssm_evidence.py +735 -0
  223. tests/regscale/integrations/commercial/conftest.py +28 -0
  224. tests/regscale/integrations/commercial/microsoft_defender/__init__.py +1 -0
  225. tests/regscale/integrations/commercial/microsoft_defender/test_defender.py +1517 -0
  226. tests/regscale/integrations/commercial/microsoft_defender/test_defender_api.py +1748 -0
  227. tests/regscale/integrations/commercial/microsoft_defender/test_defender_constants.py +327 -0
  228. tests/regscale/integrations/commercial/microsoft_defender/test_defender_scanner.py +487 -0
  229. tests/regscale/integrations/commercial/test_aws.py +3742 -0
  230. tests/regscale/integrations/commercial/test_burp.py +48 -0
  231. tests/regscale/integrations/commercial/test_crowdstrike.py +49 -0
  232. tests/regscale/integrations/commercial/test_dependabot.py +341 -0
  233. tests/regscale/integrations/commercial/test_gcp.py +1543 -0
  234. tests/regscale/integrations/commercial/test_gitlab.py +549 -0
  235. tests/regscale/integrations/commercial/test_ip_mac_address_length.py +84 -0
  236. tests/regscale/integrations/commercial/test_jira.py +2204 -0
  237. tests/regscale/integrations/commercial/test_npm_audit.py +42 -0
  238. tests/regscale/integrations/commercial/test_okta.py +1228 -0
  239. tests/regscale/integrations/commercial/test_sarif_converter.py +251 -0
  240. tests/regscale/integrations/commercial/test_sicura.py +349 -0
  241. tests/regscale/integrations/commercial/test_snow.py +423 -0
  242. tests/regscale/integrations/commercial/test_sonarcloud.py +394 -0
  243. tests/regscale/integrations/commercial/test_sqlserver.py +186 -0
  244. tests/regscale/integrations/commercial/test_stig.py +33 -0
  245. tests/regscale/integrations/commercial/test_stig_mapper.py +153 -0
  246. tests/regscale/integrations/commercial/test_stigv2.py +406 -0
  247. tests/regscale/integrations/commercial/test_wiz.py +1365 -0
  248. tests/regscale/integrations/commercial/test_wiz_inventory.py +256 -0
  249. tests/regscale/integrations/commercial/wizv2/__init__.py +339 -0
  250. tests/regscale/integrations/commercial/wizv2/compliance/__init__.py +1 -0
  251. tests/regscale/integrations/commercial/wizv2/compliance/test_helpers.py +903 -0
  252. tests/regscale/integrations/commercial/wizv2/core/__init__.py +1 -0
  253. tests/regscale/integrations/commercial/wizv2/core/test_auth.py +701 -0
  254. tests/regscale/integrations/commercial/wizv2/core/test_client.py +1037 -0
  255. tests/regscale/integrations/commercial/wizv2/core/test_file_operations.py +989 -0
  256. tests/regscale/integrations/commercial/wizv2/fetchers/__init__.py +1 -0
  257. tests/regscale/integrations/commercial/wizv2/fetchers/test_policy_assessment.py +805 -0
  258. tests/regscale/integrations/commercial/wizv2/parsers/__init__.py +1 -0
  259. tests/regscale/integrations/commercial/wizv2/parsers/test_main.py +1153 -0
  260. tests/regscale/integrations/commercial/wizv2/processors/__init__.py +1 -0
  261. tests/regscale/integrations/commercial/wizv2/processors/test_finding.py +671 -0
  262. tests/regscale/integrations/commercial/wizv2/test_WizDataMixin.py +537 -0
  263. tests/regscale/integrations/commercial/wizv2/test_click_comprehensive.py +851 -0
  264. tests/regscale/integrations/commercial/wizv2/test_compliance_report_comprehensive.py +910 -0
  265. tests/regscale/integrations/commercial/wizv2/test_compliance_report_normalization.py +138 -0
  266. tests/regscale/integrations/commercial/wizv2/test_file_cleanup.py +283 -0
  267. tests/regscale/integrations/commercial/wizv2/test_file_operations.py +260 -0
  268. tests/regscale/integrations/commercial/wizv2/test_issue.py +343 -0
  269. tests/regscale/integrations/commercial/wizv2/test_issue_comprehensive.py +1203 -0
  270. tests/regscale/integrations/commercial/wizv2/test_reports.py +497 -0
  271. tests/regscale/integrations/commercial/wizv2/test_sbom.py +643 -0
  272. tests/regscale/integrations/commercial/wizv2/test_scanner_comprehensive.py +805 -0
  273. tests/regscale/integrations/commercial/wizv2/test_wiz_click_client_id.py +165 -0
  274. tests/regscale/integrations/commercial/wizv2/test_wiz_compliance_report.py +1394 -0
  275. tests/regscale/integrations/commercial/wizv2/test_wiz_compliance_unit.py +341 -0
  276. tests/regscale/integrations/commercial/wizv2/test_wiz_control_normalization.py +138 -0
  277. tests/regscale/integrations/commercial/wizv2/test_wiz_findings_comprehensive.py +364 -0
  278. tests/regscale/integrations/commercial/wizv2/test_wiz_inventory_comprehensive.py +644 -0
  279. tests/regscale/integrations/commercial/wizv2/test_wiz_status_mapping.py +149 -0
  280. tests/regscale/integrations/commercial/wizv2/test_wizv2.py +1218 -0
  281. tests/regscale/integrations/commercial/wizv2/test_wizv2_utils.py +519 -0
  282. tests/regscale/integrations/commercial/wizv2/utils/__init__.py +1 -0
  283. tests/regscale/integrations/commercial/wizv2/utils/test_main.py +1523 -0
  284. tests/regscale/integrations/public/__init__.py +0 -0
  285. tests/regscale/integrations/public/fedramp/__init__.py +1 -0
  286. tests/regscale/integrations/public/fedramp/test_gen_asset_list.py +150 -0
  287. tests/regscale/integrations/public/fedramp/test_poam_export_v5.py +1293 -0
  288. tests/regscale/integrations/public/test_alienvault.py +220 -0
  289. tests/regscale/integrations/public/test_cci.py +1053 -0
  290. tests/regscale/integrations/public/test_cisa.py +1021 -0
  291. tests/regscale/integrations/public/test_emass.py +518 -0
  292. tests/regscale/integrations/public/test_fedramp.py +1152 -0
  293. tests/regscale/integrations/public/test_fedramp_cis_crm.py +3661 -0
  294. tests/regscale/integrations/public/test_file_uploads.py +506 -0
  295. tests/regscale/integrations/public/test_oscal.py +453 -0
  296. tests/regscale/integrations/test_compliance_status_mapping.py +406 -0
  297. tests/regscale/integrations/test_control_matcher.py +1421 -0
  298. tests/regscale/integrations/test_control_matching.py +155 -0
  299. tests/regscale/integrations/test_milestone_manager.py +408 -0
  300. tests/regscale/models/test_control_implementation.py +118 -3
  301. tests/regscale/models/test_form_field_value_integration.py +304 -0
  302. tests/regscale/models/test_issue.py +378 -1
  303. tests/regscale/models/test_module_integration.py +582 -0
  304. tests/regscale/models/test_tenable_integrations.py +811 -105
  305. regscale/integrations/commercial/wizv2/policy_compliance.py +0 -3057
  306. regscale/integrations/public/fedramp/mappings/fedramp_r4_parts.json +0 -7388
  307. regscale/integrations/public/fedramp/mappings/fedramp_r5_parts.json +0 -9605
  308. regscale/integrations/public/fedramp/parts_mapper.py +0 -107
  309. /regscale/integrations/commercial/{amazon → sarif}/__init__.py +0 -0
  310. /regscale/integrations/commercial/wizv2/{wiz_auth.py → core/auth.py} +0 -0
  311. {regscale_cli-6.21.2.0.dist-info → regscale_cli-6.28.2.1.dist-info}/LICENSE +0 -0
  312. {regscale_cli-6.21.2.0.dist-info → regscale_cli-6.28.2.1.dist-info}/WHEEL +0 -0
  313. {regscale_cli-6.21.2.0.dist-info → regscale_cli-6.28.2.1.dist-info}/entry_points.txt +0 -0
  314. {regscale_cli-6.21.2.0.dist-info → regscale_cli-6.28.2.1.dist-info}/top_level.txt +0 -0
@@ -1,58 +1,118 @@
1
1
  """AWS security resource collectors."""
2
2
 
3
- from typing import Dict, List, Any
3
+ from typing import Dict, List, Any, Optional
4
4
 
5
+ from regscale.integrations.commercial.aws.inventory.resources.audit_manager import AuditManagerCollector
6
+ from regscale.integrations.commercial.aws.inventory.resources.cloudtrail import CloudTrailCollector
7
+ from regscale.integrations.commercial.aws.inventory.resources.config import ConfigCollector
8
+ from regscale.integrations.commercial.aws.inventory.resources.guardduty import GuardDutyCollector
9
+ from regscale.integrations.commercial.aws.inventory.resources.iam import IAMCollector
10
+ from regscale.integrations.commercial.aws.inventory.resources.inspector import InspectorCollector
11
+ from regscale.integrations.commercial.aws.inventory.resources.kms import KMSCollector
12
+ from regscale.integrations.commercial.aws.inventory.resources.securityhub import SecurityHubCollector
5
13
  from ..base import BaseCollector
6
14
 
7
15
 
8
16
  class SecurityCollector(BaseCollector):
9
17
  """Collector for AWS security resources."""
10
18
 
11
- def get_iam_info(self) -> Dict[str, List[Dict[str, Any]]]:
19
+ def __init__(
20
+ self,
21
+ session: Any,
22
+ region: str,
23
+ account_id: Optional[str] = None,
24
+ tags: Optional[Dict[str, str]] = None,
25
+ enabled_services: Optional[Dict[str, bool]] = None,
26
+ collect_findings: bool = True,
27
+ ):
12
28
  """
13
- Get information about IAM users and roles.
29
+ Initialize security collector.
14
30
 
15
- :return: Dictionary containing IAM user and role information
16
- :rtype: Dict[str, List[Dict[str, Any]]]
31
+ :param session: AWS session to use for API calls
32
+ :param str region: AWS region to collect from
33
+ :param str account_id: Optional AWS account ID to filter resources
34
+ :param dict tags: Optional tags to filter resources (key-value pairs)
35
+ :param dict enabled_services: Optional dict of service names to boolean flags for enabling/disabling collection
36
+ :param bool collect_findings: Whether to collect security findings (GuardDuty, Security Hub, Inspector)
37
+ """
38
+ super().__init__(session, region)
39
+ self.account_id = account_id
40
+ self.tags = tags or {}
41
+ self.enabled_services = enabled_services or {}
42
+ self.collect_findings = collect_findings
43
+
44
+ def get_cloudtrail_info(self) -> Dict[str, Any]:
45
+ """
46
+ Get information about CloudTrail trails.
47
+
48
+ :return: Dictionary containing CloudTrail trail information
49
+ :rtype: Dict[str, Any]
17
50
  """
18
- iam_info = {"Users": [], "Roles": []}
19
51
  try:
20
- iam = self._get_client("iam")
52
+ cloudtrail_collector = CloudTrailCollector(self.session, self.region, self.account_id)
53
+ return cloudtrail_collector.collect()
54
+ except Exception as e:
55
+ self._handle_error(e, "CloudTrail trails")
56
+ return {"Trails": [], "TrailStatuses": {}}
21
57
 
22
- # Get users
23
- user_paginator = iam.get_paginator("list_users")
24
- for page in user_paginator.paginate():
25
- for user in page.get("Users", []):
26
- iam_info["Users"].append(
27
- {
28
- "UserName": user.get("UserName"),
29
- "UserId": user.get("UserId"),
30
- "Arn": user.get("Arn"),
31
- "CreateDate": str(user.get("CreateDate")),
32
- "PasswordLastUsed": (
33
- str(user.get("PasswordLastUsed")) if user.get("PasswordLastUsed") else None
34
- ),
35
- }
36
- )
58
+ def get_config_info(self) -> Dict[str, Any]:
59
+ """
60
+ Get information about AWS Config resources.
37
61
 
38
- # Get roles
39
- role_paginator = iam.get_paginator("list_roles")
40
- for page in role_paginator.paginate():
41
- for role in page.get("Roles", []):
42
- iam_info["Roles"].append(
43
- {
44
- "RoleName": role.get("RoleName"),
45
- "RoleId": role.get("RoleId"),
46
- "Arn": role.get("Arn"),
47
- "CreateDate": str(role.get("CreateDate")),
48
- "AssumeRolePolicyDocument": role.get("AssumeRolePolicyDocument"),
49
- "Description": role.get("Description"),
50
- "MaxSessionDuration": role.get("MaxSessionDuration"),
51
- }
52
- )
62
+ :return: Dictionary containing AWS Config information
63
+ :rtype: Dict[str, Any]
64
+ """
65
+ try:
66
+ config_collector = ConfigCollector(self.session, self.region, self.account_id)
67
+ return config_collector.collect()
68
+ except Exception as e:
69
+ self._handle_error(e, "AWS Config resources")
70
+ return {
71
+ "ConfigurationRecorders": [],
72
+ "RecorderStatuses": [],
73
+ "DeliveryChannels": [],
74
+ "ConfigRules": [],
75
+ "ComplianceSummary": [],
76
+ }
77
+
78
+ def get_guardduty_info(self) -> Dict[str, Any]:
79
+ """
80
+ Get information about GuardDuty resources.
81
+
82
+ :return: Dictionary containing GuardDuty information
83
+ :rtype: Dict[str, Any]
84
+ """
85
+ try:
86
+ guardduty_collector = GuardDutyCollector(
87
+ self.session, self.region, self.account_id, self.tags, self.collect_findings
88
+ )
89
+ return guardduty_collector.collect()
90
+ except Exception as e:
91
+ self._handle_error(e, "GuardDuty resources")
92
+ return {"Detectors": [], "Findings": [], "Members": []}
93
+
94
+ def get_iam_info(self) -> Dict[str, Any]:
95
+ """
96
+ Get information about IAM resources.
97
+
98
+ :return: Dictionary containing IAM resource information
99
+ :rtype: Dict[str, Any]
100
+ """
101
+ try:
102
+ iam_collector = IAMCollector(self.session, self.region, self.account_id)
103
+ return iam_collector.collect()
53
104
  except Exception as e:
54
- self._handle_error(e, "IAM users and roles")
55
- return iam_info
105
+ self._handle_error(e, "IAM resources")
106
+ return {
107
+ "Users": [],
108
+ "Roles": [],
109
+ "Groups": [],
110
+ "Policies": [],
111
+ "AccessKeys": [],
112
+ "MFADevices": [],
113
+ "AccountSummary": {},
114
+ "PasswordPolicy": {},
115
+ }
56
116
 
57
117
  def get_kms_keys(self) -> List[Dict[str, Any]]:
58
118
  """
@@ -61,33 +121,13 @@ class SecurityCollector(BaseCollector):
61
121
  :return: List of KMS key information
62
122
  :rtype: List[Dict[str, Any]]
63
123
  """
64
- keys = []
65
124
  try:
66
- kms = self._get_client("kms")
67
- paginator = kms.get_paginator("list_keys")
68
-
69
- for page in paginator.paginate():
70
- for key in page.get("Keys", []):
71
- try:
72
- key_info = kms.describe_key(KeyId=key["KeyId"])["KeyMetadata"]
73
- keys.append(
74
- {
75
- "Region": self.region,
76
- "KeyId": key_info.get("KeyId"),
77
- "Arn": key_info.get("Arn"),
78
- "Description": key_info.get("Description"),
79
- "Enabled": key_info.get("Enabled"),
80
- "KeyState": key_info.get("KeyState"),
81
- "CreationDate": str(key_info.get("CreationDate")),
82
- "Origin": key_info.get("Origin"),
83
- "KeyManager": key_info.get("KeyManager"),
84
- }
85
- )
86
- except Exception as e:
87
- self._handle_error(e, f"KMS key {key['KeyId']}")
125
+ kms_collector = KMSCollector(self.session, self.region, self.account_id)
126
+ result = kms_collector.collect()
127
+ return result.get("Keys", [])
88
128
  except Exception as e:
89
129
  self._handle_error(e, "KMS keys")
90
- return keys
130
+ return []
91
131
 
92
132
  def get_secrets(self) -> List[Dict[str, Any]]:
93
133
  """
@@ -224,17 +264,173 @@ class SecurityCollector(BaseCollector):
224
264
  self._handle_error(e, "ACM certificates")
225
265
  return certificates
226
266
 
267
+ def get_securityhub_info(self) -> Dict[str, Any]:
268
+ """
269
+ Get information about AWS Security Hub resources.
270
+
271
+ :return: Dictionary containing Security Hub information
272
+ :rtype: Dict[str, Any]
273
+ """
274
+ try:
275
+ securityhub_collector = SecurityHubCollector(
276
+ self.session, self.region, self.account_id, self.tags, self.collect_findings
277
+ )
278
+ return securityhub_collector.collect()
279
+ except Exception as e:
280
+ self._handle_error(e, "Security Hub resources")
281
+ return {
282
+ "Findings": [],
283
+ "Standards": [],
284
+ "EnabledStandards": [],
285
+ "SecurityControls": [],
286
+ "HubConfiguration": {},
287
+ "Members": [],
288
+ "Insights": [],
289
+ }
290
+
291
+ def get_audit_manager_info(self) -> Dict[str, Any]:
292
+ """
293
+ Get information about AWS Audit Manager resources.
294
+
295
+ :return: Dictionary containing Audit Manager information
296
+ :rtype: Dict[str, Any]
297
+ """
298
+ try:
299
+ audit_manager_collector = AuditManagerCollector(self.session, self.region, self.account_id, self.tags)
300
+ return audit_manager_collector.collect()
301
+ except Exception as e:
302
+ self._handle_error(e, "Audit Manager resources")
303
+ return {
304
+ "Assessments": [],
305
+ "AssessmentFrameworks": [],
306
+ "Controls": [],
307
+ "AssessmentReports": [],
308
+ "Evidence": [],
309
+ "Settings": {},
310
+ }
311
+
312
+ def get_inspector_info(self) -> Dict[str, Any]:
313
+ """
314
+ Get information about AWS Inspector resources.
315
+
316
+ :return: Dictionary containing Inspector information
317
+ :rtype: Dict[str, Any]
318
+ """
319
+ try:
320
+ inspector_collector = InspectorCollector(
321
+ self.session, self.region, self.account_id, self.tags, self.collect_findings
322
+ )
323
+ return inspector_collector.collect()
324
+ except Exception as e:
325
+ self._handle_error(e, "Inspector resources")
326
+ return {"Findings": [], "Coverage": [], "AccountStatus": {}, "Members": [], "CoverageStatistics": {}}
327
+
328
+ def _collect_cloudtrail_data(self, result: Dict[str, Any]) -> None:
329
+ """
330
+ Collect CloudTrail data and add to result.
331
+
332
+ :param result: Result dictionary to update
333
+ """
334
+ cloudtrail_info = self.get_cloudtrail_info()
335
+ result["CloudTrail"] = cloudtrail_info.get("Trails", [])
336
+ result["CloudTrailStatuses"] = cloudtrail_info.get("TrailStatuses", {})
337
+
338
+ def _collect_config_data(self, result: Dict[str, Any]) -> None:
339
+ """
340
+ Collect AWS Config data and add to result.
341
+
342
+ :param result: Result dictionary to update
343
+ """
344
+ config_info = self.get_config_info()
345
+ result["ConfigRecorders"] = config_info.get("ConfigurationRecorders", [])
346
+ result["ConfigRecorderStatuses"] = config_info.get("RecorderStatuses", [])
347
+ result["ConfigDeliveryChannels"] = config_info.get("DeliveryChannels", [])
348
+ result["ConfigRules"] = config_info.get("ConfigRules", [])
349
+ result["ConfigComplianceSummary"] = config_info.get("ComplianceSummary", [])
350
+
351
+ def _collect_guardduty_data(self, result: Dict[str, Any]) -> None:
352
+ """
353
+ Collect GuardDuty data and add to result.
354
+
355
+ :param result: Result dictionary to update
356
+ """
357
+ guardduty_info = self.get_guardduty_info()
358
+ result["GuardDutyDetectors"] = guardduty_info.get("Detectors", [])
359
+ if self.collect_findings:
360
+ result["GuardDutyFindings"] = guardduty_info.get("Findings", [])
361
+ result["GuardDutyMembers"] = guardduty_info.get("Members", [])
362
+
363
+ def _collect_securityhub_data(self, result: Dict[str, Any]) -> None:
364
+ """
365
+ Collect Security Hub data and add to result.
366
+
367
+ :param result: Result dictionary to update
368
+ """
369
+ securityhub_info = self.get_securityhub_info()
370
+ if self.collect_findings:
371
+ result["SecurityHubFindings"] = securityhub_info.get("Findings", [])
372
+ result["SecurityHubStandards"] = securityhub_info.get("Standards", [])
373
+ result["SecurityHubEnabledStandards"] = securityhub_info.get("EnabledStandards", [])
374
+ result["SecurityHubControls"] = securityhub_info.get("SecurityControls", [])
375
+ result["SecurityHubConfig"] = securityhub_info.get("HubConfiguration", {})
376
+ result["SecurityHubMembers"] = securityhub_info.get("Members", [])
377
+ result["SecurityHubInsights"] = securityhub_info.get("Insights", [])
378
+
379
+ def _collect_inspector_data(self, result: Dict[str, Any]) -> None:
380
+ """
381
+ Collect Inspector data and add to result.
382
+
383
+ :param result: Result dictionary to update
384
+ """
385
+ inspector_info = self.get_inspector_info()
386
+ if self.collect_findings:
387
+ result["InspectorFindings"] = inspector_info.get("Findings", [])
388
+ result["InspectorCoverage"] = inspector_info.get("Coverage", [])
389
+ result["InspectorAccountStatus"] = inspector_info.get("AccountStatus", {})
390
+ result["InspectorMembers"] = inspector_info.get("Members", [])
391
+ result["InspectorCoverageStats"] = inspector_info.get("CoverageStatistics", {})
392
+
227
393
  def collect(self) -> Dict[str, Any]:
228
394
  """
229
- Collect all security resources.
395
+ Collect security resources based on enabled_services configuration.
230
396
 
231
- :return: Dictionary containing all security resource information
397
+ :return: Dictionary containing enabled security resource information
232
398
  :rtype: Dict[str, Any]
233
399
  """
234
- return {
235
- "IAM": self.get_iam_info(),
236
- "KMSKeys": self.get_kms_keys(),
237
- "Secrets": self.get_secrets(),
238
- "WAF": self.get_waf_info(),
239
- "ACMCertificates": self.get_acm_certificates(),
240
- }
400
+ result = {}
401
+
402
+ if self.enabled_services.get("iam", True):
403
+ result["IAM"] = self.get_iam_info()
404
+
405
+ if self.enabled_services.get("kms", True):
406
+ result["KMSKeys"] = self.get_kms_keys()
407
+
408
+ if self.enabled_services.get("secrets_manager", True):
409
+ result["Secrets"] = self.get_secrets()
410
+
411
+ if self.enabled_services.get("waf", True):
412
+ result["WAF"] = self.get_waf_info()
413
+
414
+ if self.enabled_services.get("acm", True):
415
+ result["ACMCertificates"] = self.get_acm_certificates()
416
+
417
+ if self.enabled_services.get("cloudtrail", True):
418
+ self._collect_cloudtrail_data(result)
419
+
420
+ if self.enabled_services.get("config", True):
421
+ self._collect_config_data(result)
422
+
423
+ if self.enabled_services.get("guardduty", True):
424
+ self._collect_guardduty_data(result)
425
+
426
+ if self.enabled_services.get("securityhub", True):
427
+ self._collect_securityhub_data(result)
428
+
429
+ if self.enabled_services.get("inspector", True):
430
+ self._collect_inspector_data(result)
431
+
432
+ if self.enabled_services.get("audit_manager", True):
433
+ audit_manager_info = self.get_audit_manager_info()
434
+ result.update(audit_manager_info)
435
+
436
+ return result