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
@@ -0,0 +1,291 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """AWS Systems Manager Control Mappings for RegScale Compliance Integration."""
4
+
5
+ import logging
6
+ from typing import Dict, List, Optional
7
+
8
+ logger = logging.getLogger("regscale")
9
+
10
+ # NIST 800-53 R5 Control Mappings for AWS Systems Manager
11
+ SSM_CONTROL_MAPPINGS = {
12
+ "CM-2": {
13
+ "name": "Baseline Configuration",
14
+ "description": "Develop, document, and maintain baseline configurations for systems",
15
+ "checks": {
16
+ "managed_instances": {
17
+ "weight": 100,
18
+ "pass_criteria": "Managed instances are registered and reporting to Systems Manager",
19
+ "fail_criteria": "No managed instances or instances not reporting",
20
+ },
21
+ "inventory_collection": {
22
+ "weight": 90,
23
+ "pass_criteria": "SSM Inventory configured to collect system configuration data",
24
+ "fail_criteria": "SSM Inventory not configured",
25
+ },
26
+ "state_manager": {
27
+ "weight": 85,
28
+ "pass_criteria": "State Manager associations configured for baseline enforcement",
29
+ "fail_criteria": "No State Manager associations",
30
+ },
31
+ },
32
+ },
33
+ "CM-6": {
34
+ "name": "Configuration Settings",
35
+ "description": "Establish and document configuration settings for systems using configuration management",
36
+ "checks": {
37
+ "ssm_documents": {
38
+ "weight": 100,
39
+ "pass_criteria": "SSM Documents configured for configuration enforcement",
40
+ "fail_criteria": "No SSM Documents configured",
41
+ },
42
+ "parameters": {
43
+ "weight": 95,
44
+ "pass_criteria": "SSM Parameter Store used for configuration management",
45
+ "fail_criteria": "No parameters configured",
46
+ },
47
+ "associations": {
48
+ "weight": 90,
49
+ "pass_criteria": "Associations configured to enforce configuration settings",
50
+ "fail_criteria": "No associations configured",
51
+ },
52
+ },
53
+ },
54
+ "SI-2": {
55
+ "name": "Flaw Remediation",
56
+ "description": "Identify, report, and correct system flaws including patch management",
57
+ "checks": {
58
+ "patch_baselines": {
59
+ "weight": 100,
60
+ "pass_criteria": "Patch baselines configured for all operating systems",
61
+ "fail_criteria": "No patch baselines configured",
62
+ },
63
+ "patch_compliance": {
64
+ "weight": 100,
65
+ "pass_criteria": "Instances compliant with patch baselines",
66
+ "fail_criteria": "Instances missing critical patches",
67
+ },
68
+ "maintenance_windows": {
69
+ "weight": 85,
70
+ "pass_criteria": "Maintenance windows configured for patching",
71
+ "fail_criteria": "No maintenance windows configured",
72
+ },
73
+ },
74
+ },
75
+ "CM-3": {
76
+ "name": "Configuration Change Control",
77
+ "description": "Determine types of changes that are configuration controlled",
78
+ "checks": {
79
+ "automation_documents": {
80
+ "weight": 100,
81
+ "pass_criteria": "Automation documents for change control processes",
82
+ "fail_criteria": "No automation documents for change control",
83
+ },
84
+ },
85
+ },
86
+ "CM-8": {
87
+ "name": "System Component Inventory",
88
+ "description": "Develop and document an inventory of system components",
89
+ "checks": {
90
+ "inventory_data": {
91
+ "weight": 100,
92
+ "pass_criteria": "SSM Inventory collecting component data",
93
+ "fail_criteria": "No inventory data being collected",
94
+ },
95
+ },
96
+ },
97
+ }
98
+
99
+
100
+ class SSMControlMapper:
101
+ """Map AWS Systems Manager configurations to compliance control status."""
102
+
103
+ def __init__(self, framework: str = "NIST800-53R5"):
104
+ """
105
+ Initialize SSM control mapper.
106
+
107
+ :param str framework: Compliance framework
108
+ """
109
+ self.framework = framework
110
+ self.mappings = SSM_CONTROL_MAPPINGS
111
+
112
+ def assess_ssm_compliance(self, ssm_data: Dict) -> Dict[str, str]:
113
+ """
114
+ Assess Systems Manager compliance against all mapped controls.
115
+
116
+ :param Dict ssm_data: Systems Manager configuration data
117
+ :return: Dictionary mapping control IDs to compliance results (PASS/FAIL)
118
+ :rtype: Dict[str, str]
119
+ """
120
+ results = {}
121
+
122
+ if self.framework == "NIST800-53R5":
123
+ results["CM-2"] = self._assess_cm2(ssm_data)
124
+ results["CM-6"] = self._assess_cm6(ssm_data)
125
+ results["SI-2"] = self._assess_si2(ssm_data)
126
+ results["CM-3"] = self._assess_cm3(ssm_data)
127
+ results["CM-8"] = self._assess_cm8(ssm_data)
128
+
129
+ return results
130
+
131
+ def _assess_cm2(self, ssm_data: Dict) -> str:
132
+ """
133
+ Assess CM-2 (Baseline Configuration) compliance.
134
+
135
+ :param Dict ssm_data: SSM configuration data
136
+ :return: Compliance result (PASS/FAIL)
137
+ :rtype: str
138
+ """
139
+ managed_instances = ssm_data.get("ManagedInstances", [])
140
+ associations = ssm_data.get("Associations", [])
141
+
142
+ # Check if managed instances exist and are reporting
143
+ if not managed_instances:
144
+ logger.debug("SSM FAILS CM-2: No managed instances registered")
145
+ return "FAIL"
146
+
147
+ # Check for online instances
148
+ online_instances = [i for i in managed_instances if i.get("PingStatus") == "Online"]
149
+ if not online_instances:
150
+ logger.debug("SSM FAILS CM-2: No online managed instances")
151
+ return "FAIL"
152
+
153
+ # Check for State Manager associations for baseline enforcement
154
+ if not associations:
155
+ logger.debug("SSM FAILS CM-2: No State Manager associations configured")
156
+ return "FAIL"
157
+
158
+ logger.debug(f"SSM PASSES CM-2: {len(online_instances)} online instances with {len(associations)} associations")
159
+ return "PASS"
160
+
161
+ def _assess_cm6(self, ssm_data: Dict) -> str:
162
+ """
163
+ Assess CM-6 (Configuration Settings) compliance.
164
+
165
+ :param Dict ssm_data: SSM configuration data
166
+ :return: Compliance result (PASS/FAIL)
167
+ :rtype: str
168
+ """
169
+ documents = ssm_data.get("Documents", [])
170
+ parameters = ssm_data.get("Parameters", [])
171
+ associations = ssm_data.get("Associations", [])
172
+
173
+ # Check for SSM Documents for configuration enforcement
174
+ if not documents:
175
+ logger.debug("SSM FAILS CM-6: No SSM Documents configured")
176
+ return "FAIL"
177
+
178
+ # Check for Parameter Store usage
179
+ if not parameters:
180
+ logger.debug("SSM FAILS CM-6: No SSM parameters configured")
181
+ return "FAIL"
182
+
183
+ # Check for associations to enforce configuration
184
+ if not associations:
185
+ logger.debug("SSM FAILS CM-6: No associations configured for configuration enforcement")
186
+ return "FAIL"
187
+
188
+ logger.debug(f"SSM PASSES CM-6: {len(documents)} documents, {len(parameters)} parameters configured")
189
+ return "PASS"
190
+
191
+ def _assess_si2(self, ssm_data: Dict) -> str:
192
+ """
193
+ Assess SI-2 (Flaw Remediation / Patch Management) compliance.
194
+
195
+ :param Dict ssm_data: SSM configuration data
196
+ :return: Compliance result (PASS/FAIL)
197
+ :rtype: str
198
+ """
199
+ patch_baselines = ssm_data.get("PatchBaselines", [])
200
+ managed_instances = ssm_data.get("ManagedInstances", [])
201
+ maintenance_windows = ssm_data.get("MaintenanceWindows", [])
202
+
203
+ # Check for patch baselines
204
+ if not patch_baselines:
205
+ logger.debug("SSM FAILS SI-2: No patch baselines configured")
206
+ return "FAIL"
207
+
208
+ # Check patch compliance on instances
209
+ if managed_instances:
210
+ instances_with_patches = [i for i in managed_instances if i.get("PatchSummary")]
211
+ if not instances_with_patches:
212
+ logger.debug("SSM FAILS SI-2: No patch data available for managed instances")
213
+ return "FAIL"
214
+
215
+ # Check for missing patches
216
+ total_missing = sum(i.get("PatchSummary", {}).get("Missing", 0) for i in instances_with_patches)
217
+ if total_missing > 0:
218
+ logger.debug(f"SSM FAILS SI-2: {total_missing} missing patches across managed instances")
219
+ return "FAIL"
220
+
221
+ # Check for maintenance windows (recommended but not required)
222
+ if not maintenance_windows:
223
+ logger.debug("SSM PASSES SI-2: Patch baselines configured (maintenance windows recommended)")
224
+ else:
225
+ logger.debug(
226
+ f"SSM PASSES SI-2: {len(patch_baselines)} baselines, {len(maintenance_windows)} maintenance windows"
227
+ )
228
+
229
+ return "PASS"
230
+
231
+ def _assess_cm3(self, ssm_data: Dict) -> str:
232
+ """
233
+ Assess CM-3 (Configuration Change Control) compliance.
234
+
235
+ :param Dict ssm_data: SSM configuration data
236
+ :return: Compliance result (PASS/FAIL)
237
+ :rtype: str
238
+ """
239
+ documents = ssm_data.get("Documents", [])
240
+
241
+ # Check for Automation documents for change control
242
+ automation_docs = [d for d in documents if d.get("DocumentType") == "Automation"]
243
+
244
+ if not automation_docs:
245
+ logger.debug("SSM FAILS CM-3: No Automation documents configured for change control")
246
+ return "FAIL"
247
+
248
+ logger.debug(f"SSM PASSES CM-3: {len(automation_docs)} Automation documents configured")
249
+ return "PASS"
250
+
251
+ def _assess_cm8(self, ssm_data: Dict) -> str:
252
+ """
253
+ Assess CM-8 (System Component Inventory) compliance.
254
+
255
+ :param Dict ssm_data: SSM configuration data
256
+ :return: Compliance result (PASS/FAIL)
257
+ :rtype: str
258
+ """
259
+ managed_instances = ssm_data.get("ManagedInstances", [])
260
+
261
+ # Check if SSM Inventory is collecting data
262
+ if not managed_instances:
263
+ logger.debug("SSM FAILS CM-8: No managed instances for inventory collection")
264
+ return "FAIL"
265
+
266
+ # Check if instances are reporting
267
+ online_instances = [i for i in managed_instances if i.get("PingStatus") == "Online"]
268
+ if not online_instances:
269
+ logger.debug("SSM FAILS CM-8: No online instances reporting inventory data")
270
+ return "FAIL"
271
+
272
+ logger.debug(f"SSM PASSES CM-8: {len(online_instances)} instances reporting inventory data")
273
+ return "PASS"
274
+
275
+ def get_control_description(self, control_id: str) -> Optional[str]:
276
+ """Get human-readable description for a control."""
277
+ control_data = self.mappings.get(control_id)
278
+ if control_data:
279
+ return f"{control_data.get('name')}: {control_data.get('description', '')}"
280
+ return None
281
+
282
+ def get_mapped_controls(self) -> List[str]:
283
+ """Get list of all control IDs mapped for this framework."""
284
+ return list(self.mappings.keys())
285
+
286
+ def get_check_details(self, control_id: str) -> Optional[Dict]:
287
+ """Get detailed check criteria for a control."""
288
+ control_data = self.mappings.get(control_id)
289
+ if control_data:
290
+ return control_data.get("checks", {})
291
+ return None