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.
- regscale/_version.py +1 -1
- regscale/airflow/hierarchy.py +2 -2
- regscale/core/app/api.py +5 -2
- regscale/core/app/application.py +36 -6
- regscale/core/app/internal/control_editor.py +73 -21
- regscale/core/app/internal/evidence.py +727 -204
- regscale/core/app/internal/login.py +4 -2
- regscale/core/app/internal/model_editor.py +219 -64
- regscale/core/app/utils/app_utils.py +86 -12
- regscale/core/app/utils/catalog_utils/common.py +1 -1
- regscale/core/login.py +21 -4
- regscale/core/utils/async_graphql_client.py +363 -0
- regscale/core/utils/date.py +77 -1
- regscale/dev/cli.py +26 -0
- regscale/dev/code_gen.py +109 -24
- regscale/dev/version.py +72 -0
- regscale/integrations/commercial/__init__.py +30 -2
- regscale/integrations/commercial/aws/audit_manager_compliance.py +3908 -0
- regscale/integrations/commercial/aws/cli.py +3107 -54
- regscale/integrations/commercial/aws/cloudtrail_control_mappings.py +333 -0
- regscale/integrations/commercial/aws/cloudtrail_evidence.py +501 -0
- regscale/integrations/commercial/aws/cloudwatch_control_mappings.py +357 -0
- regscale/integrations/commercial/aws/cloudwatch_evidence.py +490 -0
- regscale/integrations/commercial/{amazon → aws}/common.py +71 -19
- regscale/integrations/commercial/aws/config_compliance.py +914 -0
- regscale/integrations/commercial/aws/conformance_pack_mappings.py +198 -0
- regscale/integrations/commercial/aws/control_compliance_analyzer.py +439 -0
- regscale/integrations/commercial/aws/evidence_generator.py +283 -0
- regscale/integrations/commercial/aws/guardduty_control_mappings.py +340 -0
- regscale/integrations/commercial/aws/guardduty_evidence.py +1053 -0
- regscale/integrations/commercial/aws/iam_control_mappings.py +368 -0
- regscale/integrations/commercial/aws/iam_evidence.py +574 -0
- regscale/integrations/commercial/aws/inventory/__init__.py +338 -22
- regscale/integrations/commercial/aws/inventory/base.py +107 -5
- regscale/integrations/commercial/aws/inventory/resources/analytics.py +390 -0
- regscale/integrations/commercial/aws/inventory/resources/applications.py +234 -0
- regscale/integrations/commercial/aws/inventory/resources/audit_manager.py +513 -0
- regscale/integrations/commercial/aws/inventory/resources/cloudtrail.py +315 -0
- regscale/integrations/commercial/aws/inventory/resources/cloudtrail_logs_metadata.py +476 -0
- regscale/integrations/commercial/aws/inventory/resources/cloudwatch.py +191 -0
- regscale/integrations/commercial/aws/inventory/resources/compute.py +328 -9
- regscale/integrations/commercial/aws/inventory/resources/config.py +464 -0
- regscale/integrations/commercial/aws/inventory/resources/containers.py +74 -9
- regscale/integrations/commercial/aws/inventory/resources/database.py +481 -31
- regscale/integrations/commercial/aws/inventory/resources/developer_tools.py +253 -0
- regscale/integrations/commercial/aws/inventory/resources/guardduty.py +286 -0
- regscale/integrations/commercial/aws/inventory/resources/iam.py +470 -0
- regscale/integrations/commercial/aws/inventory/resources/inspector.py +476 -0
- regscale/integrations/commercial/aws/inventory/resources/integration.py +175 -61
- regscale/integrations/commercial/aws/inventory/resources/kms.py +447 -0
- regscale/integrations/commercial/aws/inventory/resources/machine_learning.py +358 -0
- regscale/integrations/commercial/aws/inventory/resources/networking.py +390 -67
- regscale/integrations/commercial/aws/inventory/resources/s3.py +394 -0
- regscale/integrations/commercial/aws/inventory/resources/security.py +268 -72
- regscale/integrations/commercial/aws/inventory/resources/securityhub.py +473 -0
- regscale/integrations/commercial/aws/inventory/resources/storage.py +288 -29
- regscale/integrations/commercial/aws/inventory/resources/systems_manager.py +657 -0
- regscale/integrations/commercial/aws/inventory/resources/vpc.py +655 -0
- regscale/integrations/commercial/aws/kms_control_mappings.py +288 -0
- regscale/integrations/commercial/aws/kms_evidence.py +879 -0
- regscale/integrations/commercial/aws/ocsf/__init__.py +7 -0
- regscale/integrations/commercial/aws/ocsf/constants.py +115 -0
- regscale/integrations/commercial/aws/ocsf/mapper.py +435 -0
- regscale/integrations/commercial/aws/org_control_mappings.py +286 -0
- regscale/integrations/commercial/aws/org_evidence.py +666 -0
- regscale/integrations/commercial/aws/s3_control_mappings.py +356 -0
- regscale/integrations/commercial/aws/s3_evidence.py +632 -0
- regscale/integrations/commercial/aws/scanner.py +1072 -205
- regscale/integrations/commercial/aws/security_hub.py +319 -0
- regscale/integrations/commercial/aws/session_manager.py +282 -0
- regscale/integrations/commercial/aws/ssm_control_mappings.py +291 -0
- regscale/integrations/commercial/aws/ssm_evidence.py +492 -0
- regscale/integrations/commercial/jira.py +489 -153
- regscale/integrations/commercial/microsoft_defender/defender.py +326 -5
- regscale/integrations/commercial/microsoft_defender/defender_api.py +348 -14
- regscale/integrations/commercial/microsoft_defender/defender_constants.py +157 -0
- regscale/integrations/commercial/qualys/__init__.py +167 -68
- regscale/integrations/commercial/qualys/scanner.py +305 -39
- regscale/integrations/commercial/sarif/sairf_importer.py +432 -0
- regscale/integrations/commercial/sarif/sarif_converter.py +67 -0
- regscale/integrations/commercial/sicura/api.py +79 -42
- regscale/integrations/commercial/sicura/commands.py +8 -2
- regscale/integrations/commercial/sicura/scanner.py +83 -44
- regscale/integrations/commercial/stigv2/ckl_parser.py +5 -5
- regscale/integrations/commercial/synqly/assets.py +133 -16
- regscale/integrations/commercial/synqly/edr.py +2 -8
- regscale/integrations/commercial/synqly/query_builder.py +536 -0
- regscale/integrations/commercial/synqly/ticketing.py +27 -0
- regscale/integrations/commercial/synqly/vulnerabilities.py +165 -28
- regscale/integrations/commercial/tenablev2/cis_parsers.py +453 -0
- regscale/integrations/commercial/tenablev2/cis_scanner.py +447 -0
- regscale/integrations/commercial/tenablev2/commands.py +146 -5
- regscale/integrations/commercial/tenablev2/scanner.py +1 -3
- regscale/integrations/commercial/tenablev2/stig_parsers.py +113 -57
- regscale/integrations/commercial/wizv2/WizDataMixin.py +1 -1
- regscale/integrations/commercial/wizv2/click.py +191 -76
- regscale/integrations/commercial/wizv2/compliance/__init__.py +15 -0
- regscale/integrations/commercial/wizv2/{policy_compliance_helpers.py → compliance/helpers.py} +78 -60
- regscale/integrations/commercial/wizv2/compliance_report.py +1592 -0
- regscale/integrations/commercial/wizv2/core/__init__.py +133 -0
- regscale/integrations/commercial/wizv2/{async_client.py → core/client.py} +7 -3
- regscale/integrations/commercial/wizv2/{constants.py → core/constants.py} +92 -89
- regscale/integrations/commercial/wizv2/core/file_operations.py +237 -0
- regscale/integrations/commercial/wizv2/fetchers/__init__.py +11 -0
- regscale/integrations/commercial/wizv2/{data_fetcher.py → fetchers/policy_assessment.py} +66 -9
- regscale/integrations/commercial/wizv2/file_cleanup.py +104 -0
- regscale/integrations/commercial/wizv2/issue.py +776 -28
- regscale/integrations/commercial/wizv2/models/__init__.py +0 -0
- regscale/integrations/commercial/wizv2/parsers/__init__.py +34 -0
- regscale/integrations/commercial/wizv2/{parsers.py → parsers/main.py} +1 -1
- regscale/integrations/commercial/wizv2/processors/__init__.py +11 -0
- regscale/integrations/commercial/wizv2/{finding_processor.py → processors/finding.py} +1 -1
- regscale/integrations/commercial/wizv2/reports.py +243 -0
- regscale/integrations/commercial/wizv2/sbom.py +1 -1
- regscale/integrations/commercial/wizv2/scanner.py +1031 -441
- regscale/integrations/commercial/wizv2/utils/__init__.py +48 -0
- regscale/integrations/commercial/wizv2/{utils.py → utils/main.py} +116 -61
- regscale/integrations/commercial/wizv2/variables.py +89 -3
- regscale/integrations/compliance_integration.py +1036 -151
- regscale/integrations/control_matcher.py +432 -0
- regscale/integrations/due_date_handler.py +333 -0
- regscale/integrations/milestone_manager.py +291 -0
- regscale/integrations/public/__init__.py +14 -0
- regscale/integrations/public/cci_importer.py +834 -0
- regscale/integrations/public/csam/__init__.py +0 -0
- regscale/integrations/public/csam/csam.py +938 -0
- regscale/integrations/public/csam/csam_agency_defined.py +179 -0
- regscale/integrations/public/csam/csam_common.py +154 -0
- regscale/integrations/public/csam/csam_controls.py +432 -0
- regscale/integrations/public/csam/csam_poam.py +124 -0
- regscale/integrations/public/fedramp/click.py +77 -6
- regscale/integrations/public/fedramp/docx_parser.py +10 -1
- regscale/integrations/public/fedramp/fedramp_cis_crm.py +675 -289
- regscale/integrations/public/fedramp/fedramp_five.py +1 -1
- regscale/integrations/public/fedramp/poam/scanner.py +75 -7
- regscale/integrations/public/fedramp/poam_export_v5.py +888 -0
- regscale/integrations/scanner_integration.py +1961 -430
- regscale/models/integration_models/CCI_List.xml +1 -0
- regscale/models/integration_models/aqua.py +2 -2
- regscale/models/integration_models/cisa_kev_data.json +805 -11
- regscale/models/integration_models/flat_file_importer/__init__.py +5 -8
- regscale/models/integration_models/nexpose.py +36 -10
- regscale/models/integration_models/qualys.py +3 -4
- regscale/models/integration_models/synqly_models/capabilities.json +1 -1
- regscale/models/integration_models/synqly_models/connectors/vulnerabilities.py +87 -18
- regscale/models/integration_models/synqly_models/filter_parser.py +332 -0
- regscale/models/integration_models/synqly_models/ocsf_mapper.py +124 -25
- regscale/models/integration_models/synqly_models/synqly_model.py +89 -16
- regscale/models/locking.py +12 -8
- regscale/models/platform.py +4 -2
- regscale/models/regscale_models/__init__.py +7 -0
- regscale/models/regscale_models/assessment.py +2 -1
- regscale/models/regscale_models/catalog.py +1 -1
- regscale/models/regscale_models/compliance_settings.py +251 -1
- regscale/models/regscale_models/component.py +1 -0
- regscale/models/regscale_models/control_implementation.py +236 -41
- regscale/models/regscale_models/control_objective.py +74 -5
- regscale/models/regscale_models/file.py +2 -0
- regscale/models/regscale_models/form_field_value.py +5 -3
- regscale/models/regscale_models/inheritance.py +44 -0
- regscale/models/regscale_models/issue.py +301 -102
- regscale/models/regscale_models/milestone.py +33 -14
- regscale/models/regscale_models/organization.py +3 -0
- regscale/models/regscale_models/regscale_model.py +310 -73
- regscale/models/regscale_models/security_plan.py +4 -2
- regscale/models/regscale_models/vulnerability.py +3 -3
- regscale/regscale.py +25 -4
- regscale/templates/__init__.py +0 -0
- regscale/utils/threading/threadhandler.py +20 -15
- regscale/validation/record.py +23 -1
- {regscale_cli-6.21.2.0.dist-info → regscale_cli-6.28.2.1.dist-info}/METADATA +17 -33
- {regscale_cli-6.21.2.0.dist-info → regscale_cli-6.28.2.1.dist-info}/RECORD +310 -111
- tests/core/__init__.py +0 -0
- tests/core/utils/__init__.py +0 -0
- tests/core/utils/test_async_graphql_client.py +472 -0
- tests/fixtures/test_fixture.py +13 -8
- tests/regscale/core/test_login.py +171 -4
- tests/regscale/integrations/commercial/__init__.py +0 -0
- tests/regscale/integrations/commercial/aws/__init__.py +0 -0
- tests/regscale/integrations/commercial/aws/test_audit_manager_compliance.py +1304 -0
- tests/regscale/integrations/commercial/aws/test_audit_manager_evidence_aggregation.py +341 -0
- tests/regscale/integrations/commercial/aws/test_aws_analytics_collector.py +260 -0
- tests/regscale/integrations/commercial/aws/test_aws_applications_collector.py +242 -0
- tests/regscale/integrations/commercial/aws/test_aws_audit_manager_collector.py +1155 -0
- tests/regscale/integrations/commercial/aws/test_aws_cloudtrail_collector.py +534 -0
- tests/regscale/integrations/commercial/aws/test_aws_config_collector.py +400 -0
- tests/regscale/integrations/commercial/aws/test_aws_developer_tools_collector.py +203 -0
- tests/regscale/integrations/commercial/aws/test_aws_guardduty_collector.py +315 -0
- tests/regscale/integrations/commercial/aws/test_aws_iam_collector.py +458 -0
- tests/regscale/integrations/commercial/aws/test_aws_inspector_collector.py +353 -0
- tests/regscale/integrations/commercial/aws/test_aws_inventory_integration.py +530 -0
- tests/regscale/integrations/commercial/aws/test_aws_kms_collector.py +919 -0
- tests/regscale/integrations/commercial/aws/test_aws_machine_learning_collector.py +237 -0
- tests/regscale/integrations/commercial/aws/test_aws_s3_collector.py +722 -0
- tests/regscale/integrations/commercial/aws/test_aws_scanner_integration.py +722 -0
- tests/regscale/integrations/commercial/aws/test_aws_securityhub_collector.py +792 -0
- tests/regscale/integrations/commercial/aws/test_aws_systems_manager_collector.py +918 -0
- tests/regscale/integrations/commercial/aws/test_aws_vpc_collector.py +996 -0
- tests/regscale/integrations/commercial/aws/test_cli_evidence.py +431 -0
- tests/regscale/integrations/commercial/aws/test_cloudtrail_control_mappings.py +452 -0
- tests/regscale/integrations/commercial/aws/test_cloudtrail_evidence.py +788 -0
- tests/regscale/integrations/commercial/aws/test_config_compliance.py +298 -0
- tests/regscale/integrations/commercial/aws/test_conformance_pack_mappings.py +200 -0
- tests/regscale/integrations/commercial/aws/test_control_compliance_analyzer.py +375 -0
- tests/regscale/integrations/commercial/aws/test_datetime_parsing.py +223 -0
- tests/regscale/integrations/commercial/aws/test_evidence_generator.py +386 -0
- tests/regscale/integrations/commercial/aws/test_guardduty_control_mappings.py +564 -0
- tests/regscale/integrations/commercial/aws/test_guardduty_evidence.py +1041 -0
- tests/regscale/integrations/commercial/aws/test_iam_control_mappings.py +718 -0
- tests/regscale/integrations/commercial/aws/test_iam_evidence.py +1375 -0
- tests/regscale/integrations/commercial/aws/test_kms_control_mappings.py +656 -0
- tests/regscale/integrations/commercial/aws/test_kms_evidence.py +1163 -0
- tests/regscale/integrations/commercial/aws/test_ocsf_mapper.py +370 -0
- tests/regscale/integrations/commercial/aws/test_org_control_mappings.py +546 -0
- tests/regscale/integrations/commercial/aws/test_org_evidence.py +1240 -0
- tests/regscale/integrations/commercial/aws/test_s3_control_mappings.py +672 -0
- tests/regscale/integrations/commercial/aws/test_s3_evidence.py +987 -0
- tests/regscale/integrations/commercial/aws/test_scanner_evidence.py +373 -0
- tests/regscale/integrations/commercial/aws/test_security_hub_config_filtering.py +539 -0
- tests/regscale/integrations/commercial/aws/test_session_manager.py +516 -0
- tests/regscale/integrations/commercial/aws/test_ssm_control_mappings.py +588 -0
- tests/regscale/integrations/commercial/aws/test_ssm_evidence.py +735 -0
- tests/regscale/integrations/commercial/conftest.py +28 -0
- tests/regscale/integrations/commercial/microsoft_defender/__init__.py +1 -0
- tests/regscale/integrations/commercial/microsoft_defender/test_defender.py +1517 -0
- tests/regscale/integrations/commercial/microsoft_defender/test_defender_api.py +1748 -0
- tests/regscale/integrations/commercial/microsoft_defender/test_defender_constants.py +327 -0
- tests/regscale/integrations/commercial/microsoft_defender/test_defender_scanner.py +487 -0
- tests/regscale/integrations/commercial/test_aws.py +3742 -0
- tests/regscale/integrations/commercial/test_burp.py +48 -0
- tests/regscale/integrations/commercial/test_crowdstrike.py +49 -0
- tests/regscale/integrations/commercial/test_dependabot.py +341 -0
- tests/regscale/integrations/commercial/test_gcp.py +1543 -0
- tests/regscale/integrations/commercial/test_gitlab.py +549 -0
- tests/regscale/integrations/commercial/test_ip_mac_address_length.py +84 -0
- tests/regscale/integrations/commercial/test_jira.py +2204 -0
- tests/regscale/integrations/commercial/test_npm_audit.py +42 -0
- tests/regscale/integrations/commercial/test_okta.py +1228 -0
- tests/regscale/integrations/commercial/test_sarif_converter.py +251 -0
- tests/regscale/integrations/commercial/test_sicura.py +349 -0
- tests/regscale/integrations/commercial/test_snow.py +423 -0
- tests/regscale/integrations/commercial/test_sonarcloud.py +394 -0
- tests/regscale/integrations/commercial/test_sqlserver.py +186 -0
- tests/regscale/integrations/commercial/test_stig.py +33 -0
- tests/regscale/integrations/commercial/test_stig_mapper.py +153 -0
- tests/regscale/integrations/commercial/test_stigv2.py +406 -0
- tests/regscale/integrations/commercial/test_wiz.py +1365 -0
- tests/regscale/integrations/commercial/test_wiz_inventory.py +256 -0
- tests/regscale/integrations/commercial/wizv2/__init__.py +339 -0
- tests/regscale/integrations/commercial/wizv2/compliance/__init__.py +1 -0
- tests/regscale/integrations/commercial/wizv2/compliance/test_helpers.py +903 -0
- tests/regscale/integrations/commercial/wizv2/core/__init__.py +1 -0
- tests/regscale/integrations/commercial/wizv2/core/test_auth.py +701 -0
- tests/regscale/integrations/commercial/wizv2/core/test_client.py +1037 -0
- tests/regscale/integrations/commercial/wizv2/core/test_file_operations.py +989 -0
- tests/regscale/integrations/commercial/wizv2/fetchers/__init__.py +1 -0
- tests/regscale/integrations/commercial/wizv2/fetchers/test_policy_assessment.py +805 -0
- tests/regscale/integrations/commercial/wizv2/parsers/__init__.py +1 -0
- tests/regscale/integrations/commercial/wizv2/parsers/test_main.py +1153 -0
- tests/regscale/integrations/commercial/wizv2/processors/__init__.py +1 -0
- tests/regscale/integrations/commercial/wizv2/processors/test_finding.py +671 -0
- tests/regscale/integrations/commercial/wizv2/test_WizDataMixin.py +537 -0
- tests/regscale/integrations/commercial/wizv2/test_click_comprehensive.py +851 -0
- tests/regscale/integrations/commercial/wizv2/test_compliance_report_comprehensive.py +910 -0
- tests/regscale/integrations/commercial/wizv2/test_compliance_report_normalization.py +138 -0
- tests/regscale/integrations/commercial/wizv2/test_file_cleanup.py +283 -0
- tests/regscale/integrations/commercial/wizv2/test_file_operations.py +260 -0
- tests/regscale/integrations/commercial/wizv2/test_issue.py +343 -0
- tests/regscale/integrations/commercial/wizv2/test_issue_comprehensive.py +1203 -0
- tests/regscale/integrations/commercial/wizv2/test_reports.py +497 -0
- tests/regscale/integrations/commercial/wizv2/test_sbom.py +643 -0
- tests/regscale/integrations/commercial/wizv2/test_scanner_comprehensive.py +805 -0
- tests/regscale/integrations/commercial/wizv2/test_wiz_click_client_id.py +165 -0
- tests/regscale/integrations/commercial/wizv2/test_wiz_compliance_report.py +1394 -0
- tests/regscale/integrations/commercial/wizv2/test_wiz_compliance_unit.py +341 -0
- tests/regscale/integrations/commercial/wizv2/test_wiz_control_normalization.py +138 -0
- tests/regscale/integrations/commercial/wizv2/test_wiz_findings_comprehensive.py +364 -0
- tests/regscale/integrations/commercial/wizv2/test_wiz_inventory_comprehensive.py +644 -0
- tests/regscale/integrations/commercial/wizv2/test_wiz_status_mapping.py +149 -0
- tests/regscale/integrations/commercial/wizv2/test_wizv2.py +1218 -0
- tests/regscale/integrations/commercial/wizv2/test_wizv2_utils.py +519 -0
- tests/regscale/integrations/commercial/wizv2/utils/__init__.py +1 -0
- tests/regscale/integrations/commercial/wizv2/utils/test_main.py +1523 -0
- tests/regscale/integrations/public/__init__.py +0 -0
- tests/regscale/integrations/public/fedramp/__init__.py +1 -0
- tests/regscale/integrations/public/fedramp/test_gen_asset_list.py +150 -0
- tests/regscale/integrations/public/fedramp/test_poam_export_v5.py +1293 -0
- tests/regscale/integrations/public/test_alienvault.py +220 -0
- tests/regscale/integrations/public/test_cci.py +1053 -0
- tests/regscale/integrations/public/test_cisa.py +1021 -0
- tests/regscale/integrations/public/test_emass.py +518 -0
- tests/regscale/integrations/public/test_fedramp.py +1152 -0
- tests/regscale/integrations/public/test_fedramp_cis_crm.py +3661 -0
- tests/regscale/integrations/public/test_file_uploads.py +506 -0
- tests/regscale/integrations/public/test_oscal.py +453 -0
- tests/regscale/integrations/test_compliance_status_mapping.py +406 -0
- tests/regscale/integrations/test_control_matcher.py +1421 -0
- tests/regscale/integrations/test_control_matching.py +155 -0
- tests/regscale/integrations/test_milestone_manager.py +408 -0
- tests/regscale/models/test_control_implementation.py +118 -3
- tests/regscale/models/test_form_field_value_integration.py +304 -0
- tests/regscale/models/test_issue.py +378 -1
- tests/regscale/models/test_module_integration.py +582 -0
- tests/regscale/models/test_tenable_integrations.py +811 -105
- regscale/integrations/commercial/wizv2/policy_compliance.py +0 -3057
- regscale/integrations/public/fedramp/mappings/fedramp_r4_parts.json +0 -7388
- regscale/integrations/public/fedramp/mappings/fedramp_r5_parts.json +0 -9605
- regscale/integrations/public/fedramp/parts_mapper.py +0 -107
- /regscale/integrations/commercial/{amazon → sarif}/__init__.py +0 -0
- /regscale/integrations/commercial/wizv2/{wiz_auth.py → core/auth.py} +0 -0
- {regscale_cli-6.21.2.0.dist-info → regscale_cli-6.28.2.1.dist-info}/LICENSE +0 -0
- {regscale_cli-6.21.2.0.dist-info → regscale_cli-6.28.2.1.dist-info}/WHEEL +0 -0
- {regscale_cli-6.21.2.0.dist-info → regscale_cli-6.28.2.1.dist-info}/entry_points.txt +0 -0
- {regscale_cli-6.21.2.0.dist-info → regscale_cli-6.28.2.1.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
"""Utils module for Wiz integration - re-exports from main.py for clean imports."""
|
|
4
|
+
|
|
5
|
+
# Import all util functions from the main utils module
|
|
6
|
+
from regscale.integrations.commercial.wizv2.utils.main import (
|
|
7
|
+
create_asset_type,
|
|
8
|
+
get_notes_from_wiz_props,
|
|
9
|
+
handle_management_type,
|
|
10
|
+
map_category,
|
|
11
|
+
is_report_expired,
|
|
12
|
+
convert_first_seen_to_days,
|
|
13
|
+
fetch_report_by_id,
|
|
14
|
+
download_file,
|
|
15
|
+
fetch_sbom_report,
|
|
16
|
+
compliance_job_progress,
|
|
17
|
+
get_report_url_and_status,
|
|
18
|
+
get_or_create_report_id,
|
|
19
|
+
create_compliance_report,
|
|
20
|
+
download_report,
|
|
21
|
+
rerun_expired_report,
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
# Import constants needed by tests and other modules
|
|
25
|
+
from regscale.integrations.commercial.wizv2.core.constants import (
|
|
26
|
+
CHECK_INTERVAL_FOR_DOWNLOAD_REPORT,
|
|
27
|
+
MAX_RETRIES,
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
__all__ = [
|
|
31
|
+
"create_asset_type",
|
|
32
|
+
"get_notes_from_wiz_props",
|
|
33
|
+
"handle_management_type",
|
|
34
|
+
"map_category",
|
|
35
|
+
"is_report_expired",
|
|
36
|
+
"convert_first_seen_to_days",
|
|
37
|
+
"fetch_report_by_id",
|
|
38
|
+
"download_file",
|
|
39
|
+
"fetch_sbom_report",
|
|
40
|
+
"compliance_job_progress",
|
|
41
|
+
"get_report_url_and_status",
|
|
42
|
+
"get_or_create_report_id",
|
|
43
|
+
"create_compliance_report",
|
|
44
|
+
"download_report",
|
|
45
|
+
"rerun_expired_report",
|
|
46
|
+
"CHECK_INTERVAL_FOR_DOWNLOAD_REPORT",
|
|
47
|
+
"MAX_RETRIES",
|
|
48
|
+
]
|
|
@@ -28,7 +28,7 @@ from regscale.core.app.utils.app_utils import (
|
|
|
28
28
|
)
|
|
29
29
|
from regscale.core.utils.date import datetime_obj
|
|
30
30
|
from regscale.integrations.commercial.cpe import extract_product_name_and_version
|
|
31
|
-
from regscale.integrations.commercial.wizv2.constants import (
|
|
31
|
+
from regscale.integrations.commercial.wizv2.core.constants import (
|
|
32
32
|
BEARER,
|
|
33
33
|
CHECK_INTERVAL_FOR_DOWNLOAD_REPORT,
|
|
34
34
|
CONTENT_TYPE,
|
|
@@ -42,7 +42,7 @@ from regscale.integrations.commercial.wizv2.constants import (
|
|
|
42
42
|
)
|
|
43
43
|
from regscale.models.integration_models.wizv2 import ComplianceReport, ComplianceCheckStatus
|
|
44
44
|
from regscale.integrations.commercial.wizv2.variables import WizVariables
|
|
45
|
-
from regscale.integrations.commercial.wizv2.
|
|
45
|
+
from regscale.integrations.commercial.wizv2.core.auth import wiz_authenticate
|
|
46
46
|
from regscale.models import (
|
|
47
47
|
File,
|
|
48
48
|
Sbom,
|
|
@@ -167,34 +167,57 @@ def map_category(node: dict[str, Any]) -> regscale_models.AssetCategory:
|
|
|
167
167
|
:return: RegScale AssetCategory
|
|
168
168
|
:rtype: regscale_models.AssetCategory
|
|
169
169
|
"""
|
|
170
|
-
|
|
171
170
|
# First check if there is a CPE which can tell us the category directly.
|
|
171
|
+
if category := _get_category_from_cpe(node):
|
|
172
|
+
return category
|
|
173
|
+
|
|
174
|
+
# Then try mapping by the configured Wiz hardware asset and technology deployment model types.
|
|
175
|
+
asset_type = node.get("type", "")
|
|
176
|
+
if category := _get_category_from_hardware_types(node, asset_type):
|
|
177
|
+
return category
|
|
178
|
+
|
|
179
|
+
# Finally try matching the asset type directly by name.
|
|
180
|
+
if category := _get_category_from_asset_type(asset_type, node):
|
|
181
|
+
return category
|
|
182
|
+
|
|
183
|
+
# If all else fails, default to software.
|
|
184
|
+
return regscale_models.AssetCategory.Software
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
def _get_category_from_cpe(node: dict[str, Any]) -> Optional[regscale_models.AssetCategory]:
|
|
188
|
+
"""Get asset category from CPE information."""
|
|
172
189
|
cpe = node.get("graphEntity", {}).get("properties", {}).get("cpe", "")
|
|
173
190
|
cpe_part = extract_product_name_and_version(cpe).get("part", "")
|
|
174
191
|
if cpe_part and cpe_part.lower() in CPE_PART_TO_CATEGORY_MAPPING:
|
|
175
192
|
return CPE_PART_TO_CATEGORY_MAPPING[cpe_part]
|
|
193
|
+
return None
|
|
176
194
|
|
|
177
|
-
# Then try mapping by the configured Wiz hardware asset and technology deployment model types.
|
|
178
|
-
asset_type = node.get("type", "")
|
|
179
|
-
if WizVariables.useWizHardwareAssetTypes:
|
|
180
|
-
if asset_type in WizVariables.wizHardwareAssetTypes:
|
|
181
|
-
return regscale_models.AssetCategory.Hardware
|
|
182
|
-
if (graph_entity := node.get("graphEntity", {})) and (techs := graph_entity.get("technologies", [])):
|
|
183
|
-
for tech in techs:
|
|
184
|
-
# We double check just in case we get an explicit None for the technologies.
|
|
185
|
-
if tech and tech.get("deploymentModel", None) in WizVariables.wizHardwareAssetTypes:
|
|
186
|
-
return regscale_models.AssetCategory.Hardware
|
|
187
|
-
else:
|
|
188
|
-
logger.debug("No graphEntity set for node %r, default to Software.", node)
|
|
189
195
|
|
|
190
|
-
|
|
196
|
+
def _get_category_from_hardware_types(node: dict[str, Any], asset_type: str) -> Optional[regscale_models.AssetCategory]:
|
|
197
|
+
"""Get asset category from configured hardware types."""
|
|
198
|
+
if not WizVariables.useWizHardwareAssetTypes:
|
|
199
|
+
return None
|
|
200
|
+
|
|
201
|
+
if asset_type in WizVariables.wizHardwareAssetTypes:
|
|
202
|
+
return regscale_models.AssetCategory.Hardware
|
|
203
|
+
|
|
204
|
+
if (graph_entity := node.get("graphEntity", {})) and (techs := graph_entity.get("technologies", [])):
|
|
205
|
+
for tech in techs:
|
|
206
|
+
if tech and tech.get("deploymentModel", None) in WizVariables.wizHardwareAssetTypes:
|
|
207
|
+
return regscale_models.AssetCategory.Hardware
|
|
208
|
+
else:
|
|
209
|
+
logger.debug("No graphEntity set for node %r, default to Software.", node)
|
|
210
|
+
|
|
211
|
+
return None
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
def _get_category_from_asset_type(asset_type: str, node: dict[str, Any]) -> Optional[regscale_models.AssetCategory]:
|
|
215
|
+
"""Get asset category from asset type name."""
|
|
191
216
|
if hasattr(regscale_models.AssetCategory, asset_type):
|
|
192
217
|
if asset_category := getattr(regscale_models.AssetCategory, asset_type):
|
|
193
218
|
return asset_category
|
|
194
219
|
logger.debug("Unknown AssetType %r for node %r. Defaulting to Software.", asset_type, node)
|
|
195
|
-
|
|
196
|
-
# If all else fails, default to software.
|
|
197
|
-
return regscale_models.AssetCategory.Software
|
|
220
|
+
return None
|
|
198
221
|
|
|
199
222
|
|
|
200
223
|
def convert_first_seen_to_days(first_seen: str) -> int:
|
|
@@ -753,27 +776,41 @@ def get_report_url_and_status(report_id: str) -> str:
|
|
|
753
776
|
raise requests.RequestException("Failed to download report")
|
|
754
777
|
|
|
755
778
|
response_json = response.json()
|
|
756
|
-
if
|
|
757
|
-
|
|
758
|
-
if RATE_LIMIT_MSG in message:
|
|
759
|
-
rate = errors[0]["extensions"]["retryAfter"]
|
|
760
|
-
logger.warning("Sleeping %i seconds due to rate limit", rate)
|
|
761
|
-
time.sleep(rate)
|
|
762
|
-
continue
|
|
763
|
-
|
|
764
|
-
logger.error(errors)
|
|
765
|
-
else:
|
|
766
|
-
status = response_json.get("data", {}).get("report", {}).get("lastRun", {}).get("status")
|
|
767
|
-
if status == "COMPLETED":
|
|
768
|
-
return response_json["data"]["report"]["lastRun"]["url"]
|
|
769
|
-
elif status == "EXPIRED":
|
|
770
|
-
logger.warning("Report %s is expired, rerunning report...", report_id)
|
|
771
|
-
rerun_expired_report({"reportId": report_id})
|
|
772
|
-
return get_report_url_and_status(report_id)
|
|
779
|
+
if url := _handle_report_response(response_json, report_id):
|
|
780
|
+
return url
|
|
773
781
|
|
|
774
782
|
raise requests.RequestException("Download failed, exceeding the maximum number of retries")
|
|
775
783
|
|
|
776
784
|
|
|
785
|
+
def _handle_report_response(response_json: dict, report_id: str) -> Optional[str]:
|
|
786
|
+
"""Handle report response and return URL if ready."""
|
|
787
|
+
if errors := response_json.get("errors"):
|
|
788
|
+
if _handle_rate_limit_error(errors):
|
|
789
|
+
return None
|
|
790
|
+
logger.error(errors)
|
|
791
|
+
return None
|
|
792
|
+
|
|
793
|
+
status = response_json.get("data", {}).get("report", {}).get("lastRun", {}).get("status")
|
|
794
|
+
if status == "COMPLETED":
|
|
795
|
+
return response_json["data"]["report"]["lastRun"]["url"]
|
|
796
|
+
if status == "EXPIRED":
|
|
797
|
+
logger.warning("Report %s is expired, rerunning report...", report_id)
|
|
798
|
+
rerun_expired_report({"reportId": report_id})
|
|
799
|
+
return get_report_url_and_status(report_id)
|
|
800
|
+
return None
|
|
801
|
+
|
|
802
|
+
|
|
803
|
+
def _handle_rate_limit_error(errors: list) -> bool:
|
|
804
|
+
"""Handle rate limit error and return True if rate limited."""
|
|
805
|
+
message = errors[0]["message"]
|
|
806
|
+
if RATE_LIMIT_MSG in message:
|
|
807
|
+
rate = errors[0]["extensions"]["retryAfter"]
|
|
808
|
+
logger.warning("Sleeping %i seconds due to rate limit", rate)
|
|
809
|
+
time.sleep(rate)
|
|
810
|
+
return True
|
|
811
|
+
return False
|
|
812
|
+
|
|
813
|
+
|
|
777
814
|
def download_report(variables: Dict) -> requests.Response:
|
|
778
815
|
"""
|
|
779
816
|
Return a download URL for a provided Wiz report id
|
|
@@ -1264,35 +1301,53 @@ def report_result_to_implementation_status(result: str) -> str:
|
|
|
1264
1301
|
compliance_settings = get_wiz_compliance_settings()
|
|
1265
1302
|
|
|
1266
1303
|
if compliance_settings:
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
status_labels = compliance_settings.get_field_labels("implementationStatus")
|
|
1270
|
-
|
|
1271
|
-
# Map compliance check result to implementation status
|
|
1272
|
-
result_lower = result.lower()
|
|
1273
|
-
for label in status_labels:
|
|
1274
|
-
label_lower = label.lower()
|
|
1275
|
-
if result_lower == ComplianceCheckStatus.PASS.value.lower():
|
|
1276
|
-
if label_lower in ["implemented", "complete", "compliant"]:
|
|
1277
|
-
return label
|
|
1278
|
-
elif result_lower == ComplianceCheckStatus.FAIL.value.lower():
|
|
1279
|
-
if label_lower in ["inremediation", "in remediation", "remediation", "failed", "non-compliant"]:
|
|
1280
|
-
return label
|
|
1281
|
-
else: # Not implemented or other status
|
|
1282
|
-
if label_lower in ["notimplemented", "not implemented", "pending", "planned"]:
|
|
1283
|
-
return label
|
|
1284
|
-
|
|
1285
|
-
logger.debug(f"No matching compliance setting found for result: {result}")
|
|
1286
|
-
except Exception as e:
|
|
1287
|
-
logger.debug(f"Error using compliance settings for implementation status mapping: {e}")
|
|
1304
|
+
if status := _try_get_status_from_settings(compliance_settings, result):
|
|
1305
|
+
return status
|
|
1288
1306
|
|
|
1289
1307
|
# Fallback to default mapping
|
|
1308
|
+
return _get_default_status_mapping(result)
|
|
1309
|
+
|
|
1310
|
+
|
|
1311
|
+
def _try_get_status_from_settings(compliance_settings, result: str) -> Optional[str]:
|
|
1312
|
+
"""Try to get status from compliance settings."""
|
|
1313
|
+
try:
|
|
1314
|
+
status_labels = compliance_settings.get_field_labels("implementationStatus")
|
|
1315
|
+
result_lower = result.lower()
|
|
1316
|
+
|
|
1317
|
+
for label in status_labels:
|
|
1318
|
+
if status := _match_label_to_result(label, result_lower):
|
|
1319
|
+
return status
|
|
1320
|
+
|
|
1321
|
+
logger.debug(f"No matching compliance setting found for result: {result}")
|
|
1322
|
+
except Exception as e:
|
|
1323
|
+
logger.debug(f"Error using compliance settings for implementation status mapping: {e}")
|
|
1324
|
+
return None
|
|
1325
|
+
|
|
1326
|
+
|
|
1327
|
+
def _match_label_to_result(label: str, result_lower: str) -> Optional[str]:
|
|
1328
|
+
"""Match a label to a result status."""
|
|
1329
|
+
label_lower = label.lower()
|
|
1330
|
+
|
|
1331
|
+
if result_lower == ComplianceCheckStatus.PASS.value.lower():
|
|
1332
|
+
if label_lower in ["implemented", "complete", "compliant"]:
|
|
1333
|
+
return label
|
|
1334
|
+
elif result_lower == ComplianceCheckStatus.FAIL.value.lower():
|
|
1335
|
+
if label_lower in ["inremediation", "in remediation", "remediation", "failed", "non-compliant"]:
|
|
1336
|
+
return label
|
|
1337
|
+
else: # Not implemented or other status
|
|
1338
|
+
if label_lower in ["notimplemented", "not implemented", "pending", "planned"]:
|
|
1339
|
+
return label
|
|
1340
|
+
|
|
1341
|
+
return None
|
|
1342
|
+
|
|
1343
|
+
|
|
1344
|
+
def _get_default_status_mapping(result: str) -> str:
|
|
1345
|
+
"""Get default status mapping for result."""
|
|
1290
1346
|
if result == ComplianceCheckStatus.PASS.value:
|
|
1291
1347
|
return ControlImplementationStatus.Implemented.value
|
|
1292
|
-
|
|
1348
|
+
if result == ComplianceCheckStatus.FAIL.value:
|
|
1293
1349
|
return ControlImplementationStatus.InRemediation.value
|
|
1294
|
-
|
|
1295
|
-
return ControlImplementationStatus.NotImplemented.value
|
|
1350
|
+
return ControlImplementationStatus.NotImplemented.value
|
|
1296
1351
|
|
|
1297
1352
|
|
|
1298
1353
|
def create_vulnerabilities_from_wiz_findings(
|
|
@@ -1385,7 +1440,7 @@ def create_single_vulnerability_from_wiz_data(
|
|
|
1385
1440
|
"""
|
|
1386
1441
|
# Import here to avoid circular imports
|
|
1387
1442
|
from regscale.integrations.commercial.wizv2.scanner import WizVulnerabilityIntegration
|
|
1388
|
-
from regscale.integrations.commercial.wizv2.constants import WizVulnerabilityType
|
|
1443
|
+
from regscale.integrations.commercial.wizv2.core.constants import WizVulnerabilityType
|
|
1389
1444
|
|
|
1390
1445
|
try:
|
|
1391
1446
|
# Create integration instance
|
|
@@ -3,7 +3,93 @@
|
|
|
3
3
|
"""Wiz Variables"""
|
|
4
4
|
|
|
5
5
|
from regscale.core.app.utils.variables import RsVariableType, RsVariablesMeta
|
|
6
|
-
|
|
6
|
+
|
|
7
|
+
# Define constants locally to avoid circular import with core.constants
|
|
8
|
+
_RECOMMENDED_WIZ_INVENTORY_TYPES = [
|
|
9
|
+
# Compute resources
|
|
10
|
+
"CONTAINER",
|
|
11
|
+
"CONTAINER_GROUP",
|
|
12
|
+
"CONTAINER_IMAGE",
|
|
13
|
+
"POD",
|
|
14
|
+
"SERVERLESS",
|
|
15
|
+
"SERVERLESS_PACKAGE",
|
|
16
|
+
"VIRTUAL_DESKTOP",
|
|
17
|
+
"VIRTUAL_MACHINE",
|
|
18
|
+
"VIRTUAL_MACHINE_IMAGE",
|
|
19
|
+
# Network and exposure
|
|
20
|
+
"API_GATEWAY",
|
|
21
|
+
"CDN",
|
|
22
|
+
"CERTIFICATE",
|
|
23
|
+
"DNS_RECORD",
|
|
24
|
+
"ENDPOINT",
|
|
25
|
+
"FIREWALL",
|
|
26
|
+
"GATEWAY",
|
|
27
|
+
"LOAD_BALANCER",
|
|
28
|
+
"MANAGED_CERTIFICATE",
|
|
29
|
+
"NETWORK_ADDRESS",
|
|
30
|
+
"NETWORK_INTERFACE",
|
|
31
|
+
"PRIVATE_ENDPOINT",
|
|
32
|
+
"PRIVATE_LINK",
|
|
33
|
+
"PROXY",
|
|
34
|
+
"WEB_SERVICE",
|
|
35
|
+
# Storage and data
|
|
36
|
+
"BACKUP_SERVICE",
|
|
37
|
+
"BUCKET",
|
|
38
|
+
"DATABASE",
|
|
39
|
+
"DATA_WORKLOAD",
|
|
40
|
+
"DB_SERVER",
|
|
41
|
+
"FILE_SYSTEM_SERVICE",
|
|
42
|
+
"SECRET",
|
|
43
|
+
"SECRET_CONTAINER",
|
|
44
|
+
"STORAGE_ACCOUNT",
|
|
45
|
+
"VOLUME",
|
|
46
|
+
# Identity and access management
|
|
47
|
+
"ACCESS_ROLE",
|
|
48
|
+
"AUTHENTICATION_CONFIGURATION",
|
|
49
|
+
"IAM_BINDING",
|
|
50
|
+
"RAW_ACCESS_POLICY",
|
|
51
|
+
"SERVICE_ACCOUNT",
|
|
52
|
+
# Development and CI/CD
|
|
53
|
+
"APPLICATION",
|
|
54
|
+
"CICD_SERVICE",
|
|
55
|
+
"CONFIG_MAP",
|
|
56
|
+
"CONTAINER_REGISTRY",
|
|
57
|
+
"CONTAINER_SERVICE",
|
|
58
|
+
# Kubernetes resources
|
|
59
|
+
"CONTROLLER_REVISION",
|
|
60
|
+
"KUBERNETES_CLUSTER",
|
|
61
|
+
"KUBERNETES_INGRESS",
|
|
62
|
+
"KUBERNETES_NODE",
|
|
63
|
+
"KUBERNETES_SERVICE",
|
|
64
|
+
"NAMESPACE",
|
|
65
|
+
# Infrastructure and management
|
|
66
|
+
"CLOUD_LOG_CONFIGURATION",
|
|
67
|
+
"CLOUD_ORGANIZATION",
|
|
68
|
+
"DOMAIN",
|
|
69
|
+
"EMAIL_SERVICE",
|
|
70
|
+
"ENCRYPTION_KEY",
|
|
71
|
+
"MANAGEMENT_SERVICE",
|
|
72
|
+
"MESSAGING_SERVICE",
|
|
73
|
+
"REGISTERED_DOMAIN",
|
|
74
|
+
"RESOURCE_GROUP",
|
|
75
|
+
"SERVICE_CONFIGURATION",
|
|
76
|
+
"SUBNET",
|
|
77
|
+
"SUBSCRIPTION",
|
|
78
|
+
"VIRTUAL_NETWORK",
|
|
79
|
+
]
|
|
80
|
+
|
|
81
|
+
_DEFAULT_WIZ_HARDWARE_TYPES = [
|
|
82
|
+
# CloudResource types
|
|
83
|
+
"VIRTUAL_MACHINE",
|
|
84
|
+
"VIRTUAL_MACHINE_IMAGE",
|
|
85
|
+
"CONTAINER",
|
|
86
|
+
"CONTAINER_IMAGE",
|
|
87
|
+
"DB_SERVER",
|
|
88
|
+
# technology deploymentModels
|
|
89
|
+
"SERVER_APPLICATION",
|
|
90
|
+
"CLIENT_APPLICATION",
|
|
91
|
+
"VIRTUAL_APPLIANCE",
|
|
92
|
+
]
|
|
7
93
|
|
|
8
94
|
|
|
9
95
|
class WizVariables(metaclass=RsVariablesMeta):
|
|
@@ -23,7 +109,7 @@ class WizVariables(metaclass=RsVariablesMeta):
|
|
|
23
109
|
wizInventoryFilterBy: RsVariableType(
|
|
24
110
|
str,
|
|
25
111
|
'{"projectId": ["xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"], "type": ["API_GATEWAY"]}',
|
|
26
|
-
default="""{"type": ["%s"] }""" % '","'.join(
|
|
112
|
+
default="""{"type": ["%s"] }""" % '","'.join(_RECOMMENDED_WIZ_INVENTORY_TYPES), # type: ignore
|
|
27
113
|
) # type: ignore
|
|
28
114
|
wizAccessToken: RsVariableType(str, "", sensitive=True, required=False) # type: ignore
|
|
29
115
|
wizClientId: RsVariableType(str, "", sensitive=True) # type: ignore
|
|
@@ -34,7 +120,7 @@ class WizVariables(metaclass=RsVariablesMeta):
|
|
|
34
120
|
list,
|
|
35
121
|
'["CONTAINER", "CONTAINER_IMAGE", "VIRTUAL_MACHINE", "VIRTUAL_MACHINE_IMAGE", "DB_SERVER", '
|
|
36
122
|
'"CLIENT_APPLICATION", "SERVER_APPLICATION", "VIRTUAL_APPLIANCE"]',
|
|
37
|
-
default=
|
|
123
|
+
default=_DEFAULT_WIZ_HARDWARE_TYPES,
|
|
38
124
|
required=False,
|
|
39
125
|
) # type: ignore
|
|
40
126
|
wizReportAge: RsVariableType(int, "14", default=14, required=False) # type: ignore
|