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
|
@@ -34,9 +34,8 @@ from regscale.integrations.commercial.qualys.scanner import QualysTotalCloudJSON
|
|
|
34
34
|
from regscale.integrations.commercial.qualys.variables import QualysVariables
|
|
35
35
|
from regscale.integrations.scanner_integration import IntegrationAsset, IntegrationFinding
|
|
36
36
|
from regscale.integrations.variables import ScannerVariables
|
|
37
|
-
from regscale.models import Asset, Issue, Search, regscale_models
|
|
38
|
-
from regscale.models.app_models.click import NotRequiredIf,
|
|
39
|
-
from regscale.models.integration_models.ecr_models.data import Finding
|
|
37
|
+
from regscale.models import Asset, Issue, Search, regscale_models, IssueStatus, IssueSeverity
|
|
38
|
+
from regscale.models.app_models.click import NotRequiredIf, save_output_to, ssp_or_component_id
|
|
40
39
|
from regscale.models.integration_models.flat_file_importer import FlatFileImporter
|
|
41
40
|
from regscale.models.integration_models.qualys import (
|
|
42
41
|
Qualys,
|
|
@@ -280,7 +279,7 @@ class FindingProgressTracker:
|
|
|
280
279
|
try:
|
|
281
280
|
finding = next(self.findings_iter)
|
|
282
281
|
self.count += 1
|
|
283
|
-
if finding and hasattr(finding, "external_id"):
|
|
282
|
+
if finding and hasattr(finding, "external_id") and finding.external_id is not None:
|
|
284
283
|
self.finding_ids.append(finding.external_id)
|
|
285
284
|
self.progress.update(self.finding_task, advance=1)
|
|
286
285
|
return finding
|
|
@@ -378,6 +377,11 @@ def import_total_cloud(
|
|
|
378
377
|
if exclude_tags and not include_tags:
|
|
379
378
|
error_and_exit("You must provide --include_tags when using --exclude_tags to import Qualys Total Cloud data.")
|
|
380
379
|
|
|
380
|
+
# Ensure vulnerability creation is properly set
|
|
381
|
+
if not vulnerability_creation:
|
|
382
|
+
vulnerability_creation = "IssueCreation" # Default to IssueCreation for Qualys
|
|
383
|
+
logger.info("No vulnerability creation setting provided, defaulting to IssueCreation for Qualys Total Cloud")
|
|
384
|
+
|
|
381
385
|
containers_lst = []
|
|
382
386
|
try:
|
|
383
387
|
# Configure scanner variables and fetch data
|
|
@@ -1631,26 +1635,12 @@ def sync_assets(
|
|
|
1631
1635
|
"""
|
|
1632
1636
|
parent_module = "components" if is_component else "securityplans"
|
|
1633
1637
|
update_assets = []
|
|
1634
|
-
|
|
1635
|
-
|
|
1636
|
-
|
|
1637
|
-
|
|
1638
|
-
|
|
1639
|
-
|
|
1640
|
-
if lookup_assets := lookup_asset(reg_assets, qualys_asset["ASSET_ID"]):
|
|
1641
|
-
for asset in set(lookup_assets):
|
|
1642
|
-
asset.parentId = ssp_id
|
|
1643
|
-
asset.parentModule = parent_module
|
|
1644
|
-
asset.otherTrackingNumber = qualys_asset["ID"]
|
|
1645
|
-
asset.ipAddress = qualys_asset["IP"]
|
|
1646
|
-
asset.qualysId = qualys_asset["ASSET_ID"]
|
|
1647
|
-
try:
|
|
1648
|
-
assert asset.id
|
|
1649
|
-
# avoid duplication
|
|
1650
|
-
if asset.qualysId not in [v["qualysId"] for v in update_assets]:
|
|
1651
|
-
update_assets.append(asset)
|
|
1652
|
-
except AssertionError as aex:
|
|
1653
|
-
logger.error("Asset does not have an id, unable to update!\n%s", aex)
|
|
1638
|
+
|
|
1639
|
+
for qualys_asset in qualys_assets:
|
|
1640
|
+
processed_asset = _process_single_qualys_asset(qualys_asset, reg_assets, ssp_id, parent_module)
|
|
1641
|
+
if processed_asset:
|
|
1642
|
+
update_assets.append(processed_asset)
|
|
1643
|
+
|
|
1654
1644
|
update_and_insert_assets(
|
|
1655
1645
|
qualys_assets=qualys_assets,
|
|
1656
1646
|
reg_assets=reg_assets,
|
|
@@ -1661,6 +1651,57 @@ def sync_assets(
|
|
|
1661
1651
|
)
|
|
1662
1652
|
|
|
1663
1653
|
|
|
1654
|
+
def _process_single_qualys_asset(
|
|
1655
|
+
qualys_asset: dict, reg_assets: list[Asset], ssp_id: int, parent_module: str
|
|
1656
|
+
) -> Optional[Asset]:
|
|
1657
|
+
"""
|
|
1658
|
+
Process a single Qualys asset and return the updated RegScale asset if found.
|
|
1659
|
+
|
|
1660
|
+
:param dict qualys_asset: Single Qualys asset dictionary
|
|
1661
|
+
:param list[Asset] reg_assets: List of RegScale assets
|
|
1662
|
+
:param int ssp_id: RegScale System Security Plan or Component ID
|
|
1663
|
+
:param str parent_module: Parent module name
|
|
1664
|
+
:return: Updated RegScale asset or None if not found
|
|
1665
|
+
:rtype: Optional[Asset]
|
|
1666
|
+
"""
|
|
1667
|
+
logger.debug("qualys_asset: %s", qualys_asset)
|
|
1668
|
+
|
|
1669
|
+
if not isinstance(qualys_asset, dict):
|
|
1670
|
+
logger.error("Expected dict, got %s: %s", type(qualys_asset), qualys_asset)
|
|
1671
|
+
return None
|
|
1672
|
+
|
|
1673
|
+
lookup_assets = lookup_asset(reg_assets, qualys_asset["ASSET_ID"])
|
|
1674
|
+
if not lookup_assets:
|
|
1675
|
+
return None
|
|
1676
|
+
|
|
1677
|
+
return _update_regscale_asset(lookup_assets[0], qualys_asset, ssp_id, parent_module)
|
|
1678
|
+
|
|
1679
|
+
|
|
1680
|
+
def _update_regscale_asset(asset: Asset, qualys_asset: dict, ssp_id: int, parent_module: str) -> Optional[Asset]:
|
|
1681
|
+
"""
|
|
1682
|
+
Update a RegScale asset with Qualys asset data.
|
|
1683
|
+
|
|
1684
|
+
:param Asset asset: RegScale asset to update
|
|
1685
|
+
:param dict qualys_asset: Qualys asset data
|
|
1686
|
+
:param int ssp_id: RegScale System Security Plan or Component ID
|
|
1687
|
+
:param str parent_module: Parent module name
|
|
1688
|
+
:return: Updated asset or None if update failed
|
|
1689
|
+
:rtype: Optional[Asset]
|
|
1690
|
+
"""
|
|
1691
|
+
try:
|
|
1692
|
+
asset.parentId = ssp_id
|
|
1693
|
+
asset.parentModule = parent_module
|
|
1694
|
+
asset.otherTrackingNumber = qualys_asset["ID"]
|
|
1695
|
+
asset.ipAddress = qualys_asset["IP"]
|
|
1696
|
+
asset.qualysId = qualys_asset["ASSET_ID"]
|
|
1697
|
+
|
|
1698
|
+
assert asset.id
|
|
1699
|
+
return asset
|
|
1700
|
+
except AssertionError as aex:
|
|
1701
|
+
logger.error("Asset does not have an id, unable to update!\n%s", aex)
|
|
1702
|
+
return None
|
|
1703
|
+
|
|
1704
|
+
|
|
1664
1705
|
def update_and_insert_assets(
|
|
1665
1706
|
qualys_assets: list[dict],
|
|
1666
1707
|
reg_assets: list[Asset],
|
|
@@ -1681,48 +1722,106 @@ def update_and_insert_assets(
|
|
|
1681
1722
|
:rtype: None
|
|
1682
1723
|
"""
|
|
1683
1724
|
parent_module = "components" if is_component else "securityplans"
|
|
1684
|
-
|
|
1685
|
-
|
|
1725
|
+
|
|
1726
|
+
# Handle asset insertion
|
|
1727
|
+
insert_assets = _prepare_assets_for_insertion(qualys_assets, reg_assets, ssp_id, parent_module, config)
|
|
1728
|
+
if insert_assets:
|
|
1729
|
+
_create_assets_in_batch(insert_assets)
|
|
1730
|
+
|
|
1731
|
+
# Handle asset updates
|
|
1732
|
+
if update_assets:
|
|
1733
|
+
_update_assets_in_batch(update_assets)
|
|
1734
|
+
|
|
1735
|
+
|
|
1736
|
+
def _prepare_assets_for_insertion(
|
|
1737
|
+
qualys_assets: list[dict], reg_assets: list[Asset], ssp_id: int, parent_module: str, config: dict
|
|
1738
|
+
) -> list[Asset]:
|
|
1739
|
+
"""
|
|
1740
|
+
Prepare new assets for insertion into RegScale.
|
|
1741
|
+
|
|
1742
|
+
:param list[dict] qualys_assets: List of Qualys assets
|
|
1743
|
+
:param list[Asset] reg_assets: List of RegScale assets
|
|
1744
|
+
:param int ssp_id: RegScale System Security Plan or Component ID
|
|
1745
|
+
:param str parent_module: Parent module name
|
|
1746
|
+
:param dict config: Configuration dictionary
|
|
1747
|
+
:return: List of assets to insert
|
|
1748
|
+
:rtype: list[Asset]
|
|
1749
|
+
"""
|
|
1750
|
+
assets_to_be_inserted = [
|
|
1686
1751
|
qualys_asset
|
|
1687
1752
|
for qualys_asset in qualys_assets
|
|
1688
1753
|
if qualys_asset["ASSET_ID"] not in [asset["ASSET_ID"] for asset in inner_join(reg_assets, qualys_assets)]
|
|
1689
|
-
]
|
|
1690
|
-
|
|
1691
|
-
|
|
1692
|
-
|
|
1693
|
-
|
|
1694
|
-
|
|
1695
|
-
|
|
1696
|
-
|
|
1697
|
-
|
|
1698
|
-
|
|
1699
|
-
|
|
1700
|
-
|
|
1701
|
-
|
|
1702
|
-
|
|
1703
|
-
|
|
1704
|
-
|
|
1705
|
-
|
|
1706
|
-
|
|
1707
|
-
|
|
1708
|
-
|
|
1709
|
-
|
|
1710
|
-
|
|
1711
|
-
|
|
1712
|
-
|
|
1713
|
-
|
|
1714
|
-
|
|
1715
|
-
|
|
1716
|
-
|
|
1717
|
-
|
|
1718
|
-
|
|
1719
|
-
|
|
1720
|
-
|
|
1721
|
-
|
|
1722
|
-
|
|
1723
|
-
|
|
1724
|
-
|
|
1725
|
-
|
|
1754
|
+
]
|
|
1755
|
+
|
|
1756
|
+
insert_assets = []
|
|
1757
|
+
for qualys_asset in assets_to_be_inserted:
|
|
1758
|
+
r_asset = _create_regscale_asset_from_qualys(qualys_asset, ssp_id, parent_module, config)
|
|
1759
|
+
# avoid duplication
|
|
1760
|
+
if r_asset.qualysId not in {v["qualysId"] for v in insert_assets}:
|
|
1761
|
+
insert_assets.append(r_asset)
|
|
1762
|
+
|
|
1763
|
+
return insert_assets
|
|
1764
|
+
|
|
1765
|
+
|
|
1766
|
+
def _create_regscale_asset_from_qualys(qualys_asset: dict, ssp_id: int, parent_module: str, config: dict) -> Asset:
|
|
1767
|
+
"""
|
|
1768
|
+
Create a RegScale asset from Qualys asset data.
|
|
1769
|
+
|
|
1770
|
+
:param dict qualys_asset: Qualys asset data
|
|
1771
|
+
:param int ssp_id: RegScale System Security Plan or Component ID
|
|
1772
|
+
:param str parent_module: Parent module name
|
|
1773
|
+
:param dict config: Configuration dictionary
|
|
1774
|
+
:return: New RegScale asset
|
|
1775
|
+
:rtype: Asset
|
|
1776
|
+
"""
|
|
1777
|
+
return Asset(
|
|
1778
|
+
name=f'Qualys Asset #{qualys_asset["ASSET_ID"]} IP: {qualys_asset["IP"]}',
|
|
1779
|
+
otherTrackingNumber=qualys_asset["ID"],
|
|
1780
|
+
parentId=ssp_id,
|
|
1781
|
+
parentModule=parent_module,
|
|
1782
|
+
ipAddress=qualys_asset["IP"],
|
|
1783
|
+
assetOwnerId=config["userId"],
|
|
1784
|
+
assetType="Other",
|
|
1785
|
+
assetCategory=regscale_models.AssetCategory.Hardware,
|
|
1786
|
+
status="Off-Network",
|
|
1787
|
+
qualysId=qualys_asset["ASSET_ID"],
|
|
1788
|
+
)
|
|
1789
|
+
|
|
1790
|
+
|
|
1791
|
+
def _create_assets_in_batch(insert_assets: list[Asset]) -> None:
|
|
1792
|
+
"""
|
|
1793
|
+
Create assets in batch and handle any errors.
|
|
1794
|
+
|
|
1795
|
+
:param list[Asset] insert_assets: List of assets to create
|
|
1796
|
+
:rtype: None
|
|
1797
|
+
"""
|
|
1798
|
+
try:
|
|
1799
|
+
created_assets = Asset.batch_create(insert_assets, job_progress)
|
|
1800
|
+
logger.info(
|
|
1801
|
+
"RegScale Asset(s) successfully created: %i/%i",
|
|
1802
|
+
len(created_assets),
|
|
1803
|
+
len(insert_assets),
|
|
1804
|
+
)
|
|
1805
|
+
except requests.exceptions.RequestException as rex:
|
|
1806
|
+
logger.error("Unable to create Qualys Assets in RegScale\n%s", rex)
|
|
1807
|
+
|
|
1808
|
+
|
|
1809
|
+
def _update_assets_in_batch(update_assets: list[Asset]) -> None:
|
|
1810
|
+
"""
|
|
1811
|
+
Update assets in batch and handle any errors.
|
|
1812
|
+
|
|
1813
|
+
:param list[Asset] update_assets: List of assets to update
|
|
1814
|
+
:rtype: None
|
|
1815
|
+
"""
|
|
1816
|
+
try:
|
|
1817
|
+
updated_assets = Asset.batch_update(update_assets, job_progress)
|
|
1818
|
+
logger.info(
|
|
1819
|
+
"RegScale Asset(s) successfully updated: %i/%i",
|
|
1820
|
+
len(updated_assets),
|
|
1821
|
+
len(update_assets),
|
|
1822
|
+
)
|
|
1823
|
+
except requests.RequestException as rex:
|
|
1824
|
+
logger.error("Unable to Update Qualys Assets to RegScale\n%s", rex)
|
|
1726
1825
|
|
|
1727
1826
|
|
|
1728
1827
|
def sync_issues(ssp_id: int, qualys_assets_and_issues: list[dict], is_component: bool = False) -> None:
|
|
@@ -2016,7 +2115,7 @@ def lookup_asset(asset_list: list, asset_id: str = None) -> list[Asset]:
|
|
|
2016
2115
|
return list(set(asset_list)) or []
|
|
2017
2116
|
|
|
2018
2117
|
|
|
2019
|
-
def map_qualys_severity_to_regscale(severity: int) -> tuple[
|
|
2118
|
+
def map_qualys_severity_to_regscale(severity: int) -> tuple[IssueSeverity, str]:
|
|
2020
2119
|
"""
|
|
2021
2120
|
Map Qualys vulnerability severity to RegScale Issue severity
|
|
2022
2121
|
|
|
@@ -2025,12 +2124,12 @@ def map_qualys_severity_to_regscale(severity: int) -> tuple[str, str]:
|
|
|
2025
2124
|
:rtype: tuple[str, str]
|
|
2026
2125
|
"""
|
|
2027
2126
|
if severity <= 2:
|
|
2028
|
-
return
|
|
2127
|
+
return IssueSeverity.Low, "low"
|
|
2029
2128
|
if severity == 3:
|
|
2030
|
-
return
|
|
2129
|
+
return IssueSeverity.Moderate, "moderate"
|
|
2031
2130
|
if severity > 3:
|
|
2032
|
-
return
|
|
2033
|
-
return
|
|
2131
|
+
return IssueSeverity.High, "high"
|
|
2132
|
+
return IssueSeverity.NotAssigned, "low"
|
|
2034
2133
|
|
|
2035
2134
|
|
|
2036
2135
|
def create_regscale_issue_from_vuln(
|