regscale-cli 6.16.0.0__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.
Potentially problematic release.
This version of regscale-cli might be problematic. Click here for more details.
- regscale/__init__.py +1 -0
- regscale/airflow/__init__.py +9 -0
- regscale/airflow/azure/__init__.py +9 -0
- regscale/airflow/azure/cli.py +89 -0
- regscale/airflow/azure/upload_dags.py +116 -0
- regscale/airflow/click_dags.py +127 -0
- regscale/airflow/click_mixins.py +82 -0
- regscale/airflow/config.py +25 -0
- regscale/airflow/factories/__init__.py +0 -0
- regscale/airflow/factories/connections.py +58 -0
- regscale/airflow/factories/workflows.py +78 -0
- regscale/airflow/hierarchy.py +88 -0
- regscale/airflow/operators/__init__.py +0 -0
- regscale/airflow/operators/click.py +36 -0
- regscale/airflow/sensors/__init__.py +0 -0
- regscale/airflow/sensors/sql.py +107 -0
- regscale/airflow/sessions/__init__.py +0 -0
- regscale/airflow/sessions/sql/__init__.py +3 -0
- regscale/airflow/sessions/sql/queries.py +64 -0
- regscale/airflow/sessions/sql/sql_server_queries.py +248 -0
- regscale/airflow/tasks/__init__.py +0 -0
- regscale/airflow/tasks/branches.py +22 -0
- regscale/airflow/tasks/cli.py +116 -0
- regscale/airflow/tasks/click.py +73 -0
- regscale/airflow/tasks/debugging.py +9 -0
- regscale/airflow/tasks/groups.py +116 -0
- regscale/airflow/tasks/init.py +60 -0
- regscale/airflow/tasks/states.py +47 -0
- regscale/airflow/tasks/workflows.py +36 -0
- regscale/ansible/__init__.py +9 -0
- regscale/core/__init__.py +0 -0
- regscale/core/app/__init__.py +3 -0
- regscale/core/app/api.py +571 -0
- regscale/core/app/application.py +665 -0
- regscale/core/app/internal/__init__.py +136 -0
- regscale/core/app/internal/admin_actions.py +230 -0
- regscale/core/app/internal/assessments_editor.py +873 -0
- regscale/core/app/internal/catalog.py +316 -0
- regscale/core/app/internal/comparison.py +459 -0
- regscale/core/app/internal/control_editor.py +571 -0
- regscale/core/app/internal/encrypt.py +79 -0
- regscale/core/app/internal/evidence.py +1240 -0
- regscale/core/app/internal/file_uploads.py +151 -0
- regscale/core/app/internal/healthcheck.py +66 -0
- regscale/core/app/internal/login.py +305 -0
- regscale/core/app/internal/migrations.py +240 -0
- regscale/core/app/internal/model_editor.py +1701 -0
- regscale/core/app/internal/poam_editor.py +632 -0
- regscale/core/app/internal/workflow.py +105 -0
- regscale/core/app/logz.py +74 -0
- regscale/core/app/utils/XMLIR.py +258 -0
- regscale/core/app/utils/__init__.py +0 -0
- regscale/core/app/utils/api_handler.py +358 -0
- regscale/core/app/utils/app_utils.py +1110 -0
- regscale/core/app/utils/catalog_utils/__init__.py +0 -0
- regscale/core/app/utils/catalog_utils/common.py +91 -0
- regscale/core/app/utils/catalog_utils/compare_catalog.py +193 -0
- regscale/core/app/utils/catalog_utils/diagnostic_catalog.py +97 -0
- regscale/core/app/utils/catalog_utils/download_catalog.py +103 -0
- regscale/core/app/utils/catalog_utils/update_catalog.py +718 -0
- regscale/core/app/utils/catalog_utils/update_catalog_v2.py +1378 -0
- regscale/core/app/utils/catalog_utils/update_catalog_v3.py +1272 -0
- regscale/core/app/utils/catalog_utils/update_plans.py +334 -0
- regscale/core/app/utils/file_utils.py +238 -0
- regscale/core/app/utils/parser_utils.py +81 -0
- regscale/core/app/utils/pickle_file_handler.py +57 -0
- regscale/core/app/utils/regscale_utils.py +319 -0
- regscale/core/app/utils/report_utils.py +119 -0
- regscale/core/app/utils/variables.py +226 -0
- regscale/core/decorators.py +31 -0
- regscale/core/lazy_group.py +65 -0
- regscale/core/login.py +63 -0
- regscale/core/server/__init__.py +0 -0
- regscale/core/server/flask_api.py +473 -0
- regscale/core/server/helpers.py +373 -0
- regscale/core/server/rest.py +64 -0
- regscale/core/server/static/css/bootstrap.css +6030 -0
- regscale/core/server/static/css/bootstrap.min.css +6 -0
- regscale/core/server/static/css/main.css +176 -0
- regscale/core/server/static/images/regscale-cli.svg +49 -0
- regscale/core/server/static/images/regscale.svg +38 -0
- regscale/core/server/templates/base.html +74 -0
- regscale/core/server/templates/index.html +43 -0
- regscale/core/server/templates/login.html +28 -0
- regscale/core/server/templates/make_base64.html +22 -0
- regscale/core/server/templates/upload_STIG.html +109 -0
- regscale/core/server/templates/upload_STIG_result.html +26 -0
- regscale/core/server/templates/upload_ssp.html +144 -0
- regscale/core/server/templates/upload_ssp_result.html +128 -0
- regscale/core/static/__init__.py +0 -0
- regscale/core/static/regex.py +14 -0
- regscale/core/utils/__init__.py +117 -0
- regscale/core/utils/click_utils.py +13 -0
- regscale/core/utils/date.py +238 -0
- regscale/core/utils/graphql.py +254 -0
- regscale/core/utils/urls.py +23 -0
- regscale/dev/__init__.py +6 -0
- regscale/dev/analysis.py +454 -0
- regscale/dev/cli.py +235 -0
- regscale/dev/code_gen.py +492 -0
- regscale/dev/dirs.py +69 -0
- regscale/dev/docs.py +384 -0
- regscale/dev/monitoring.py +26 -0
- regscale/dev/profiling.py +216 -0
- regscale/exceptions/__init__.py +4 -0
- regscale/exceptions/license_exception.py +7 -0
- regscale/exceptions/validation_exception.py +9 -0
- regscale/integrations/__init__.py +1 -0
- regscale/integrations/commercial/__init__.py +486 -0
- regscale/integrations/commercial/ad.py +433 -0
- regscale/integrations/commercial/amazon/__init__.py +0 -0
- regscale/integrations/commercial/amazon/common.py +106 -0
- regscale/integrations/commercial/aqua/__init__.py +0 -0
- regscale/integrations/commercial/aqua/aqua.py +91 -0
- regscale/integrations/commercial/aws/__init__.py +6 -0
- regscale/integrations/commercial/aws/cli.py +322 -0
- regscale/integrations/commercial/aws/inventory/__init__.py +110 -0
- regscale/integrations/commercial/aws/inventory/base.py +64 -0
- regscale/integrations/commercial/aws/inventory/resources/__init__.py +19 -0
- regscale/integrations/commercial/aws/inventory/resources/compute.py +234 -0
- regscale/integrations/commercial/aws/inventory/resources/containers.py +113 -0
- regscale/integrations/commercial/aws/inventory/resources/database.py +101 -0
- regscale/integrations/commercial/aws/inventory/resources/integration.py +237 -0
- regscale/integrations/commercial/aws/inventory/resources/networking.py +253 -0
- regscale/integrations/commercial/aws/inventory/resources/security.py +240 -0
- regscale/integrations/commercial/aws/inventory/resources/storage.py +91 -0
- regscale/integrations/commercial/aws/scanner.py +823 -0
- regscale/integrations/commercial/azure/__init__.py +0 -0
- regscale/integrations/commercial/azure/common.py +32 -0
- regscale/integrations/commercial/azure/intune.py +488 -0
- regscale/integrations/commercial/azure/scanner.py +49 -0
- regscale/integrations/commercial/burp.py +78 -0
- regscale/integrations/commercial/cpe.py +144 -0
- regscale/integrations/commercial/crowdstrike.py +1117 -0
- regscale/integrations/commercial/defender.py +1511 -0
- regscale/integrations/commercial/dependabot.py +210 -0
- regscale/integrations/commercial/durosuite/__init__.py +0 -0
- regscale/integrations/commercial/durosuite/api.py +1546 -0
- regscale/integrations/commercial/durosuite/process_devices.py +101 -0
- regscale/integrations/commercial/durosuite/scanner.py +637 -0
- regscale/integrations/commercial/durosuite/variables.py +21 -0
- regscale/integrations/commercial/ecr.py +90 -0
- regscale/integrations/commercial/gcp/__init__.py +237 -0
- regscale/integrations/commercial/gcp/auth.py +96 -0
- regscale/integrations/commercial/gcp/control_tests.py +238 -0
- regscale/integrations/commercial/gcp/variables.py +18 -0
- regscale/integrations/commercial/gitlab.py +332 -0
- regscale/integrations/commercial/grype.py +165 -0
- regscale/integrations/commercial/ibm.py +90 -0
- regscale/integrations/commercial/import_all/__init__.py +0 -0
- regscale/integrations/commercial/import_all/import_all_cmd.py +467 -0
- regscale/integrations/commercial/import_all/scan_file_fingerprints.json +27 -0
- regscale/integrations/commercial/jira.py +1046 -0
- regscale/integrations/commercial/mappings/__init__.py +0 -0
- regscale/integrations/commercial/mappings/csf_controls.json +713 -0
- regscale/integrations/commercial/mappings/nist_800_53_r5_controls.json +1516 -0
- regscale/integrations/commercial/nessus/__init__.py +0 -0
- regscale/integrations/commercial/nessus/nessus_utils.py +429 -0
- regscale/integrations/commercial/nessus/scanner.py +416 -0
- regscale/integrations/commercial/nexpose.py +90 -0
- regscale/integrations/commercial/okta.py +798 -0
- regscale/integrations/commercial/opentext/__init__.py +0 -0
- regscale/integrations/commercial/opentext/click.py +99 -0
- regscale/integrations/commercial/opentext/scanner.py +143 -0
- regscale/integrations/commercial/prisma.py +91 -0
- regscale/integrations/commercial/qualys.py +1462 -0
- regscale/integrations/commercial/salesforce.py +980 -0
- regscale/integrations/commercial/sap/__init__.py +0 -0
- regscale/integrations/commercial/sap/click.py +31 -0
- regscale/integrations/commercial/sap/sysdig/__init__.py +0 -0
- regscale/integrations/commercial/sap/sysdig/click.py +57 -0
- regscale/integrations/commercial/sap/sysdig/sysdig_scanner.py +190 -0
- regscale/integrations/commercial/sap/tenable/__init__.py +0 -0
- regscale/integrations/commercial/sap/tenable/click.py +49 -0
- regscale/integrations/commercial/sap/tenable/scanner.py +196 -0
- regscale/integrations/commercial/servicenow.py +1756 -0
- regscale/integrations/commercial/sicura/__init__.py +0 -0
- regscale/integrations/commercial/sicura/api.py +855 -0
- regscale/integrations/commercial/sicura/commands.py +73 -0
- regscale/integrations/commercial/sicura/scanner.py +481 -0
- regscale/integrations/commercial/sicura/variables.py +16 -0
- regscale/integrations/commercial/snyk.py +90 -0
- regscale/integrations/commercial/sonarcloud.py +260 -0
- regscale/integrations/commercial/sqlserver.py +369 -0
- regscale/integrations/commercial/stig_mapper_integration/__init__.py +0 -0
- regscale/integrations/commercial/stig_mapper_integration/click_commands.py +38 -0
- regscale/integrations/commercial/stig_mapper_integration/mapping_engine.py +353 -0
- regscale/integrations/commercial/stigv2/__init__.py +0 -0
- regscale/integrations/commercial/stigv2/ckl_parser.py +349 -0
- regscale/integrations/commercial/stigv2/click_commands.py +95 -0
- regscale/integrations/commercial/stigv2/stig_integration.py +202 -0
- regscale/integrations/commercial/synqly/__init__.py +0 -0
- regscale/integrations/commercial/synqly/assets.py +46 -0
- regscale/integrations/commercial/synqly/ticketing.py +132 -0
- regscale/integrations/commercial/synqly/vulnerabilities.py +223 -0
- regscale/integrations/commercial/synqly_jira.py +840 -0
- regscale/integrations/commercial/tenablev2/__init__.py +0 -0
- regscale/integrations/commercial/tenablev2/authenticate.py +31 -0
- regscale/integrations/commercial/tenablev2/click.py +1584 -0
- regscale/integrations/commercial/tenablev2/scanner.py +504 -0
- regscale/integrations/commercial/tenablev2/stig_parsers.py +140 -0
- regscale/integrations/commercial/tenablev2/utils.py +78 -0
- regscale/integrations/commercial/tenablev2/variables.py +17 -0
- regscale/integrations/commercial/trivy.py +162 -0
- regscale/integrations/commercial/veracode.py +96 -0
- regscale/integrations/commercial/wizv2/WizDataMixin.py +97 -0
- regscale/integrations/commercial/wizv2/__init__.py +0 -0
- regscale/integrations/commercial/wizv2/click.py +429 -0
- regscale/integrations/commercial/wizv2/constants.py +1001 -0
- regscale/integrations/commercial/wizv2/issue.py +361 -0
- regscale/integrations/commercial/wizv2/models.py +112 -0
- regscale/integrations/commercial/wizv2/parsers.py +339 -0
- regscale/integrations/commercial/wizv2/sbom.py +115 -0
- regscale/integrations/commercial/wizv2/scanner.py +416 -0
- regscale/integrations/commercial/wizv2/utils.py +796 -0
- regscale/integrations/commercial/wizv2/variables.py +39 -0
- regscale/integrations/commercial/wizv2/wiz_auth.py +159 -0
- regscale/integrations/commercial/xray.py +91 -0
- regscale/integrations/integration/__init__.py +2 -0
- regscale/integrations/integration/integration.py +26 -0
- regscale/integrations/integration/inventory.py +17 -0
- regscale/integrations/integration/issue.py +100 -0
- regscale/integrations/integration_override.py +149 -0
- regscale/integrations/public/__init__.py +103 -0
- regscale/integrations/public/cisa.py +641 -0
- regscale/integrations/public/criticality_updater.py +70 -0
- regscale/integrations/public/emass.py +411 -0
- regscale/integrations/public/emass_slcm_import.py +697 -0
- regscale/integrations/public/fedramp/__init__.py +0 -0
- regscale/integrations/public/fedramp/appendix_parser.py +548 -0
- regscale/integrations/public/fedramp/click.py +479 -0
- regscale/integrations/public/fedramp/components.py +714 -0
- regscale/integrations/public/fedramp/docx_parser.py +259 -0
- regscale/integrations/public/fedramp/fedramp_cis_crm.py +1124 -0
- regscale/integrations/public/fedramp/fedramp_common.py +3181 -0
- regscale/integrations/public/fedramp/fedramp_docx.py +388 -0
- regscale/integrations/public/fedramp/fedramp_five.py +2343 -0
- regscale/integrations/public/fedramp/fedramp_traversal.py +138 -0
- regscale/integrations/public/fedramp/import_fedramp_r4_ssp.py +279 -0
- regscale/integrations/public/fedramp/import_workbook.py +495 -0
- regscale/integrations/public/fedramp/inventory_items.py +244 -0
- regscale/integrations/public/fedramp/mappings/__init__.py +0 -0
- regscale/integrations/public/fedramp/mappings/fedramp_r4_parts.json +7388 -0
- regscale/integrations/public/fedramp/mappings/fedramp_r5_params.json +8636 -0
- regscale/integrations/public/fedramp/mappings/fedramp_r5_parts.json +9605 -0
- regscale/integrations/public/fedramp/mappings/system_roles.py +34 -0
- regscale/integrations/public/fedramp/mappings/user.py +175 -0
- regscale/integrations/public/fedramp/mappings/values.py +141 -0
- regscale/integrations/public/fedramp/markdown_parser.py +150 -0
- regscale/integrations/public/fedramp/metadata.py +689 -0
- regscale/integrations/public/fedramp/models/__init__.py +59 -0
- regscale/integrations/public/fedramp/models/leveraged_auth_new.py +168 -0
- regscale/integrations/public/fedramp/models/poam_importer.py +522 -0
- regscale/integrations/public/fedramp/parts_mapper.py +107 -0
- regscale/integrations/public/fedramp/poam/__init__.py +0 -0
- regscale/integrations/public/fedramp/poam/scanner.py +851 -0
- regscale/integrations/public/fedramp/properties.py +201 -0
- regscale/integrations/public/fedramp/reporting.py +84 -0
- regscale/integrations/public/fedramp/resources.py +496 -0
- regscale/integrations/public/fedramp/rosetta.py +110 -0
- regscale/integrations/public/fedramp/ssp_logger.py +87 -0
- regscale/integrations/public/fedramp/system_characteristics.py +922 -0
- regscale/integrations/public/fedramp/system_control_implementations.py +582 -0
- regscale/integrations/public/fedramp/system_implementation.py +190 -0
- regscale/integrations/public/fedramp/xml_utils.py +87 -0
- regscale/integrations/public/nist_catalog.py +275 -0
- regscale/integrations/public/oscal.py +1946 -0
- regscale/integrations/public/otx.py +169 -0
- regscale/integrations/scanner_integration.py +2692 -0
- regscale/integrations/variables.py +25 -0
- regscale/models/__init__.py +7 -0
- regscale/models/app_models/__init__.py +5 -0
- regscale/models/app_models/catalog_compare.py +213 -0
- regscale/models/app_models/click.py +252 -0
- regscale/models/app_models/datetime_encoder.py +21 -0
- regscale/models/app_models/import_validater.py +321 -0
- regscale/models/app_models/mapping.py +260 -0
- regscale/models/app_models/pipeline.py +37 -0
- regscale/models/click_models.py +413 -0
- regscale/models/config.py +154 -0
- regscale/models/email_style.css +67 -0
- regscale/models/hierarchy.py +8 -0
- regscale/models/inspect_models.py +79 -0
- regscale/models/integration_models/__init__.py +0 -0
- regscale/models/integration_models/amazon_models/__init__.py +0 -0
- regscale/models/integration_models/amazon_models/inspector.py +262 -0
- regscale/models/integration_models/amazon_models/inspector_scan.py +206 -0
- regscale/models/integration_models/aqua.py +247 -0
- regscale/models/integration_models/azure_alerts.py +255 -0
- regscale/models/integration_models/base64.py +23 -0
- regscale/models/integration_models/burp.py +433 -0
- regscale/models/integration_models/burp_models.py +128 -0
- regscale/models/integration_models/cisa_kev_data.json +19333 -0
- regscale/models/integration_models/defender_data.py +93 -0
- regscale/models/integration_models/defenderimport.py +143 -0
- regscale/models/integration_models/drf.py +443 -0
- regscale/models/integration_models/ecr_models/__init__.py +0 -0
- regscale/models/integration_models/ecr_models/data.py +69 -0
- regscale/models/integration_models/ecr_models/ecr.py +239 -0
- regscale/models/integration_models/flat_file_importer.py +1079 -0
- regscale/models/integration_models/grype_import.py +247 -0
- regscale/models/integration_models/ibm.py +126 -0
- regscale/models/integration_models/implementation_results.py +85 -0
- regscale/models/integration_models/nexpose.py +140 -0
- regscale/models/integration_models/prisma.py +202 -0
- regscale/models/integration_models/qualys.py +720 -0
- regscale/models/integration_models/qualys_scanner.py +160 -0
- regscale/models/integration_models/sbom/__init__.py +0 -0
- regscale/models/integration_models/sbom/cyclone_dx.py +139 -0
- regscale/models/integration_models/send_reminders.py +620 -0
- regscale/models/integration_models/snyk.py +155 -0
- regscale/models/integration_models/synqly_models/__init__.py +0 -0
- regscale/models/integration_models/synqly_models/capabilities.json +1 -0
- regscale/models/integration_models/synqly_models/connector_types.py +22 -0
- regscale/models/integration_models/synqly_models/connectors/__init__.py +7 -0
- regscale/models/integration_models/synqly_models/connectors/assets.py +97 -0
- regscale/models/integration_models/synqly_models/connectors/ticketing.py +583 -0
- regscale/models/integration_models/synqly_models/connectors/vulnerabilities.py +169 -0
- regscale/models/integration_models/synqly_models/ocsf_mapper.py +331 -0
- regscale/models/integration_models/synqly_models/param.py +72 -0
- regscale/models/integration_models/synqly_models/synqly_model.py +733 -0
- regscale/models/integration_models/synqly_models/tenants.py +39 -0
- regscale/models/integration_models/tenable_models/__init__.py +0 -0
- regscale/models/integration_models/tenable_models/integration.py +187 -0
- regscale/models/integration_models/tenable_models/models.py +513 -0
- regscale/models/integration_models/trivy_import.py +231 -0
- regscale/models/integration_models/veracode.py +217 -0
- regscale/models/integration_models/xray.py +135 -0
- regscale/models/locking.py +100 -0
- regscale/models/platform.py +110 -0
- regscale/models/regscale_models/__init__.py +67 -0
- regscale/models/regscale_models/assessment.py +570 -0
- regscale/models/regscale_models/assessment_plan.py +52 -0
- regscale/models/regscale_models/asset.py +567 -0
- regscale/models/regscale_models/asset_mapping.py +190 -0
- regscale/models/regscale_models/case.py +42 -0
- regscale/models/regscale_models/catalog.py +261 -0
- regscale/models/regscale_models/cci.py +46 -0
- regscale/models/regscale_models/change.py +167 -0
- regscale/models/regscale_models/checklist.py +372 -0
- regscale/models/regscale_models/comment.py +49 -0
- regscale/models/regscale_models/compliance_settings.py +112 -0
- regscale/models/regscale_models/component.py +412 -0
- regscale/models/regscale_models/component_mapping.py +65 -0
- regscale/models/regscale_models/control.py +38 -0
- regscale/models/regscale_models/control_implementation.py +1128 -0
- regscale/models/regscale_models/control_objective.py +261 -0
- regscale/models/regscale_models/control_parameter.py +100 -0
- regscale/models/regscale_models/control_test.py +34 -0
- regscale/models/regscale_models/control_test_plan.py +75 -0
- regscale/models/regscale_models/control_test_result.py +52 -0
- regscale/models/regscale_models/custom_field.py +245 -0
- regscale/models/regscale_models/data.py +109 -0
- regscale/models/regscale_models/data_center.py +40 -0
- regscale/models/regscale_models/deviation.py +203 -0
- regscale/models/regscale_models/email.py +97 -0
- regscale/models/regscale_models/evidence.py +47 -0
- regscale/models/regscale_models/evidence_mapping.py +40 -0
- regscale/models/regscale_models/facility.py +59 -0
- regscale/models/regscale_models/file.py +382 -0
- regscale/models/regscale_models/filetag.py +37 -0
- regscale/models/regscale_models/form_field_value.py +94 -0
- regscale/models/regscale_models/group.py +169 -0
- regscale/models/regscale_models/implementation_objective.py +335 -0
- regscale/models/regscale_models/implementation_option.py +275 -0
- regscale/models/regscale_models/implementation_role.py +33 -0
- regscale/models/regscale_models/incident.py +177 -0
- regscale/models/regscale_models/interconnection.py +43 -0
- regscale/models/regscale_models/issue.py +1176 -0
- regscale/models/regscale_models/leveraged_authorization.py +125 -0
- regscale/models/regscale_models/line_of_inquiry.py +52 -0
- regscale/models/regscale_models/link.py +205 -0
- regscale/models/regscale_models/meta_data.py +64 -0
- regscale/models/regscale_models/mixins/__init__.py +0 -0
- regscale/models/regscale_models/mixins/parent_cache.py +124 -0
- regscale/models/regscale_models/module.py +224 -0
- regscale/models/regscale_models/modules.py +191 -0
- regscale/models/regscale_models/objective.py +14 -0
- regscale/models/regscale_models/parameter.py +87 -0
- regscale/models/regscale_models/ports_protocol.py +81 -0
- regscale/models/regscale_models/privacy.py +89 -0
- regscale/models/regscale_models/profile.py +50 -0
- regscale/models/regscale_models/profile_link.py +68 -0
- regscale/models/regscale_models/profile_mapping.py +124 -0
- regscale/models/regscale_models/project.py +63 -0
- regscale/models/regscale_models/property.py +278 -0
- regscale/models/regscale_models/question.py +85 -0
- regscale/models/regscale_models/questionnaire.py +87 -0
- regscale/models/regscale_models/questionnaire_instance.py +177 -0
- regscale/models/regscale_models/rbac.py +132 -0
- regscale/models/regscale_models/reference.py +86 -0
- regscale/models/regscale_models/regscale_model.py +1643 -0
- regscale/models/regscale_models/requirement.py +29 -0
- regscale/models/regscale_models/risk.py +274 -0
- regscale/models/regscale_models/sbom.py +54 -0
- regscale/models/regscale_models/scan_history.py +436 -0
- regscale/models/regscale_models/search.py +53 -0
- regscale/models/regscale_models/security_control.py +132 -0
- regscale/models/regscale_models/security_plan.py +204 -0
- regscale/models/regscale_models/software_inventory.py +159 -0
- regscale/models/regscale_models/stake_holder.py +64 -0
- regscale/models/regscale_models/stig.py +647 -0
- regscale/models/regscale_models/supply_chain.py +152 -0
- regscale/models/regscale_models/system_role.py +188 -0
- regscale/models/regscale_models/system_role_external_assignment.py +40 -0
- regscale/models/regscale_models/tag.py +37 -0
- regscale/models/regscale_models/tag_mapping.py +19 -0
- regscale/models/regscale_models/task.py +133 -0
- regscale/models/regscale_models/threat.py +196 -0
- regscale/models/regscale_models/user.py +175 -0
- regscale/models/regscale_models/user_group.py +55 -0
- regscale/models/regscale_models/vulnerability.py +242 -0
- regscale/models/regscale_models/vulnerability_mapping.py +162 -0
- regscale/models/regscale_models/workflow.py +55 -0
- regscale/models/regscale_models/workflow_action.py +34 -0
- regscale/models/regscale_models/workflow_instance.py +269 -0
- regscale/models/regscale_models/workflow_instance_step.py +114 -0
- regscale/models/regscale_models/workflow_template.py +58 -0
- regscale/models/regscale_models/workflow_template_step.py +45 -0
- regscale/regscale.py +815 -0
- regscale/utils/__init__.py +7 -0
- regscale/utils/b64conversion.py +14 -0
- regscale/utils/click_utils.py +118 -0
- regscale/utils/decorators.py +48 -0
- regscale/utils/dict_utils.py +59 -0
- regscale/utils/files.py +79 -0
- regscale/utils/fxns.py +30 -0
- regscale/utils/graphql_client.py +113 -0
- regscale/utils/lists.py +16 -0
- regscale/utils/numbers.py +12 -0
- regscale/utils/shell.py +148 -0
- regscale/utils/string.py +121 -0
- regscale/utils/synqly_utils.py +165 -0
- regscale/utils/threading/__init__.py +8 -0
- regscale/utils/threading/threadhandler.py +131 -0
- regscale/utils/threading/threadsafe_counter.py +47 -0
- regscale/utils/threading/threadsafe_dict.py +242 -0
- regscale/utils/threading/threadsafe_list.py +83 -0
- regscale/utils/version.py +104 -0
- regscale/validation/__init__.py +0 -0
- regscale/validation/address.py +37 -0
- regscale/validation/record.py +48 -0
- regscale/visualization/__init__.py +5 -0
- regscale/visualization/click.py +34 -0
- regscale_cli-6.16.0.0.dist-info/LICENSE +21 -0
- regscale_cli-6.16.0.0.dist-info/METADATA +659 -0
- regscale_cli-6.16.0.0.dist-info/RECORD +481 -0
- regscale_cli-6.16.0.0.dist-info/WHEEL +5 -0
- regscale_cli-6.16.0.0.dist-info/entry_points.txt +6 -0
- regscale_cli-6.16.0.0.dist-info/top_level.txt +2 -0
- tests/fixtures/__init__.py +2 -0
- tests/fixtures/api.py +87 -0
- tests/fixtures/models.py +91 -0
- tests/fixtures/test_fixture.py +144 -0
- tests/mocks/__init__.py +0 -0
- tests/mocks/objects.py +3 -0
- tests/mocks/response.py +32 -0
- tests/mocks/xml.py +13 -0
- tests/regscale/__init__.py +0 -0
- tests/regscale/core/__init__.py +0 -0
- tests/regscale/core/test_api.py +232 -0
- tests/regscale/core/test_app.py +406 -0
- tests/regscale/core/test_login.py +37 -0
- tests/regscale/core/test_logz.py +66 -0
- tests/regscale/core/test_sbom_generator.py +87 -0
- tests/regscale/core/test_validation_utils.py +163 -0
- tests/regscale/core/test_version.py +78 -0
- tests/regscale/models/__init__.py +0 -0
- tests/regscale/models/test_asset.py +71 -0
- tests/regscale/models/test_config.py +26 -0
- tests/regscale/models/test_control_implementation.py +27 -0
- tests/regscale/models/test_import.py +97 -0
- tests/regscale/models/test_issue.py +36 -0
- tests/regscale/models/test_mapping.py +52 -0
- tests/regscale/models/test_platform.py +31 -0
- tests/regscale/models/test_regscale_model.py +346 -0
- tests/regscale/models/test_report.py +32 -0
- tests/regscale/models/test_tenable_integrations.py +118 -0
- tests/regscale/models/test_user_model.py +121 -0
- tests/regscale/test_about.py +19 -0
- tests/regscale/test_authorization.py +65 -0
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
"""Wiz Issue Integration class"""
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
import re
|
|
5
|
+
from typing import List, Dict, Any, Iterator, Optional
|
|
6
|
+
|
|
7
|
+
from regscale.core.app.utils.parser_utils import safe_datetime_str
|
|
8
|
+
from regscale.integrations.scanner_integration import issue_due_date, IntegrationFinding
|
|
9
|
+
from regscale.utils.dict_utils import get_value
|
|
10
|
+
from .constants import (
|
|
11
|
+
get_wiz_issue_queries,
|
|
12
|
+
WizVulnerabilityType,
|
|
13
|
+
)
|
|
14
|
+
from .scanner import WizVulnerabilityIntegration
|
|
15
|
+
|
|
16
|
+
logger = logging.getLogger(__name__)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class WizIssue(WizVulnerabilityIntegration):
|
|
20
|
+
"""
|
|
21
|
+
Wiz Issue class
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
title = "Wiz-Issue"
|
|
25
|
+
asset_identifier_field = "wizId"
|
|
26
|
+
issue_identifier_field = "wizId"
|
|
27
|
+
|
|
28
|
+
def get_query_types(self, project_id: str) -> List[Dict[str, Any]]:
|
|
29
|
+
"""Get the query types for issue scanning.
|
|
30
|
+
|
|
31
|
+
:param str project_id: The project ID to get queries for
|
|
32
|
+
:return: List of query types
|
|
33
|
+
:rtype: List[Dict[str, Any]]
|
|
34
|
+
"""
|
|
35
|
+
return get_wiz_issue_queries(project_id=project_id)
|
|
36
|
+
|
|
37
|
+
def parse_findings(
|
|
38
|
+
self, nodes: List[Dict[str, Any]], vulnerability_type: WizVulnerabilityType
|
|
39
|
+
) -> Iterator[IntegrationFinding]:
|
|
40
|
+
"""
|
|
41
|
+
Parse the Wiz issues into IntegrationFinding objects
|
|
42
|
+
:param nodes:
|
|
43
|
+
:param vulnerability_type:
|
|
44
|
+
:return:
|
|
45
|
+
"""
|
|
46
|
+
for node in nodes:
|
|
47
|
+
finding = self.parse_finding(node, vulnerability_type)
|
|
48
|
+
if finding:
|
|
49
|
+
yield finding
|
|
50
|
+
|
|
51
|
+
def _parse_security_subcategories(self, source_rule: Dict[str, Any]) -> List[str]:
|
|
52
|
+
"""
|
|
53
|
+
Parse security subcategories from a source rule.
|
|
54
|
+
|
|
55
|
+
:param Dict[str, Any] source_rule: The source rule containing security subcategories
|
|
56
|
+
:return: List of formatted security subcategories
|
|
57
|
+
:rtype: List[str]
|
|
58
|
+
"""
|
|
59
|
+
if not source_rule or "securitySubCategories" not in source_rule:
|
|
60
|
+
return []
|
|
61
|
+
|
|
62
|
+
subcategories = []
|
|
63
|
+
for subcat in source_rule.get("securitySubCategories", []):
|
|
64
|
+
if control_id := self._extract_nist_control_id(subcat):
|
|
65
|
+
subcategories.append(control_id)
|
|
66
|
+
|
|
67
|
+
return subcategories
|
|
68
|
+
|
|
69
|
+
def _extract_nist_control_id(self, subcat: Dict[str, Any]) -> Optional[str]:
|
|
70
|
+
"""
|
|
71
|
+
Extract and format NIST control ID from a security subcategory.
|
|
72
|
+
|
|
73
|
+
:param Dict[str, Any] subcat: The security subcategory data
|
|
74
|
+
:return: Formatted control ID or None if invalid
|
|
75
|
+
:rtype: Optional[str]
|
|
76
|
+
"""
|
|
77
|
+
framework = subcat.get("category", {}).get("framework", {}).get("name", "")
|
|
78
|
+
external_id = subcat.get("externalId", "")
|
|
79
|
+
|
|
80
|
+
if not external_id or "NIST SP 800-53" not in framework:
|
|
81
|
+
return None
|
|
82
|
+
|
|
83
|
+
return self._format_control_id(external_id.strip())
|
|
84
|
+
|
|
85
|
+
@staticmethod
|
|
86
|
+
def _format_control_id(control_id: str) -> Optional[str]:
|
|
87
|
+
"""
|
|
88
|
+
Format a control ID into RegScale format.
|
|
89
|
+
|
|
90
|
+
:param str control_id: The raw control ID
|
|
91
|
+
:return: Formatted control ID or None if invalid
|
|
92
|
+
:rtype: Optional[str]
|
|
93
|
+
"""
|
|
94
|
+
match = re.match(r"^([A-Z]{2})-(\d+)(?:\s*\((\d+)\))?$", control_id)
|
|
95
|
+
if not match:
|
|
96
|
+
return None
|
|
97
|
+
|
|
98
|
+
family = match.group(1).lower()
|
|
99
|
+
number = match.group(2)
|
|
100
|
+
enhancement = match.group(3)
|
|
101
|
+
|
|
102
|
+
return f"{family}-{number}" + (f".{enhancement}" if enhancement else "")
|
|
103
|
+
|
|
104
|
+
@staticmethod
|
|
105
|
+
def _get_asset_identifier(wiz_issue: Dict[str, Any]) -> str:
|
|
106
|
+
"""
|
|
107
|
+
Get the asset identifier from a Wiz issue.
|
|
108
|
+
|
|
109
|
+
:param Dict[str, Any] wiz_issue: The Wiz issue
|
|
110
|
+
:return: The asset identifier
|
|
111
|
+
:rtype: str
|
|
112
|
+
"""
|
|
113
|
+
# Check entitySnapshot first
|
|
114
|
+
if entity_snapshot := wiz_issue.get("entitySnapshot"):
|
|
115
|
+
if entity_id := entity_snapshot.get("id"):
|
|
116
|
+
return entity_id
|
|
117
|
+
|
|
118
|
+
# Check related entities
|
|
119
|
+
if "relatedEntities" in wiz_issue:
|
|
120
|
+
entities = wiz_issue.get("relatedEntities", [])
|
|
121
|
+
if entities and isinstance(entities, list):
|
|
122
|
+
for entity in entities:
|
|
123
|
+
if entity and isinstance(entity, dict) and (entity_id := entity.get("id")):
|
|
124
|
+
return entity_id
|
|
125
|
+
|
|
126
|
+
# Check common asset ID paths
|
|
127
|
+
asset_paths = [
|
|
128
|
+
"vulnerableAsset.id",
|
|
129
|
+
"entity.id",
|
|
130
|
+
"resource.id",
|
|
131
|
+
"relatedEntity.id",
|
|
132
|
+
"sourceEntity.id",
|
|
133
|
+
"target.id",
|
|
134
|
+
]
|
|
135
|
+
|
|
136
|
+
for path in asset_paths:
|
|
137
|
+
if asset_id := get_value(wiz_issue, path):
|
|
138
|
+
return asset_id
|
|
139
|
+
|
|
140
|
+
# Try source rule as fallback
|
|
141
|
+
if source_rule := wiz_issue.get("sourceRule"):
|
|
142
|
+
if rule_id := source_rule.get("id"):
|
|
143
|
+
return f"wiz-rule-{rule_id}"
|
|
144
|
+
|
|
145
|
+
# Final fallback - use the issue ID
|
|
146
|
+
return f"wiz-issue-{wiz_issue.get('id', 'unknown')}"
|
|
147
|
+
|
|
148
|
+
@staticmethod
|
|
149
|
+
def _format_control_description(control: Dict[str, Any]) -> str:
|
|
150
|
+
"""
|
|
151
|
+
Format the control description with additional context.
|
|
152
|
+
|
|
153
|
+
:param Dict[str, Any] control: The control data
|
|
154
|
+
:return: Formatted description
|
|
155
|
+
:rtype: str
|
|
156
|
+
"""
|
|
157
|
+
formatted_desc = []
|
|
158
|
+
if description := control.get("controlDescription", ""):
|
|
159
|
+
formatted_desc.append("Description:")
|
|
160
|
+
formatted_desc.append(description)
|
|
161
|
+
|
|
162
|
+
if recommendation := control.get("resolutionRecommendation", ""):
|
|
163
|
+
if formatted_desc:
|
|
164
|
+
formatted_desc.append("\n")
|
|
165
|
+
formatted_desc.append("Resolution Recommendation:")
|
|
166
|
+
formatted_desc.append(recommendation)
|
|
167
|
+
|
|
168
|
+
return "\n".join(formatted_desc) if formatted_desc else "No description available"
|
|
169
|
+
|
|
170
|
+
def _get_plugin_name(self, wiz_issue: Dict[str, Any]) -> str:
|
|
171
|
+
"""
|
|
172
|
+
Generate a unique plugin name based on the Wiz issue type and source rule.
|
|
173
|
+
|
|
174
|
+
:param Dict[str, Any] wiz_issue: The Wiz issue data
|
|
175
|
+
:return: A unique plugin name
|
|
176
|
+
:rtype: str
|
|
177
|
+
"""
|
|
178
|
+
source_rule = wiz_issue.get("sourceRule", {})
|
|
179
|
+
typename = source_rule.get("__typename", "")
|
|
180
|
+
service_type = source_rule.get("serviceType", "")
|
|
181
|
+
name = source_rule.get("name", "")
|
|
182
|
+
|
|
183
|
+
if not typename:
|
|
184
|
+
return "Wiz-Finding"
|
|
185
|
+
|
|
186
|
+
if typename == "CloudConfigurationRule":
|
|
187
|
+
return self._get_config_plugin_name(name, service_type)
|
|
188
|
+
if typename == "Control":
|
|
189
|
+
return self._get_control_plugin_name(source_rule, name)
|
|
190
|
+
if typename == "CloudEventRule":
|
|
191
|
+
return self._get_event_plugin_name(name, service_type)
|
|
192
|
+
|
|
193
|
+
return "Wiz-Finding"
|
|
194
|
+
|
|
195
|
+
@staticmethod
|
|
196
|
+
def _get_config_plugin_name(name: str, service_type: str) -> str:
|
|
197
|
+
"""
|
|
198
|
+
Generate plugin name for CloudConfigurationRule type.
|
|
199
|
+
|
|
200
|
+
:param str name: Rule name
|
|
201
|
+
:param str service_type: Service type
|
|
202
|
+
:return: Plugin name
|
|
203
|
+
:rtype: str
|
|
204
|
+
"""
|
|
205
|
+
if not name:
|
|
206
|
+
return f"Wiz-{service_type}-Config"
|
|
207
|
+
|
|
208
|
+
# Simplified regex pattern that just looks for service name at start
|
|
209
|
+
service_match = re.match(r"^([A-Za-z\s]+?)\s+(?:public|private|should|must|needs|to)", name)
|
|
210
|
+
if not service_match:
|
|
211
|
+
return f"Wiz-{service_type}-Config"
|
|
212
|
+
|
|
213
|
+
service_name = service_match.group(1).strip()
|
|
214
|
+
if service_name == "App Configuration":
|
|
215
|
+
return f"Wiz-{service_type}-AppConfiguration"
|
|
216
|
+
|
|
217
|
+
service_name = "".join(word.capitalize() for word in service_name.split())
|
|
218
|
+
return f"Wiz-{service_type}-{service_name}"
|
|
219
|
+
|
|
220
|
+
@staticmethod
|
|
221
|
+
def _get_control_plugin_name(source_rule: Dict[str, Any], name: str) -> str:
|
|
222
|
+
"""
|
|
223
|
+
Generate plugin name for Control type.
|
|
224
|
+
|
|
225
|
+
:param Dict[str, Any] source_rule: Source rule data
|
|
226
|
+
:param str name: Rule name
|
|
227
|
+
:return: Plugin name
|
|
228
|
+
:rtype: str
|
|
229
|
+
"""
|
|
230
|
+
# Try to get NIST category first
|
|
231
|
+
subcategories = source_rule.get("securitySubCategories", [])
|
|
232
|
+
for subcat in subcategories:
|
|
233
|
+
category = subcat.get("category", {})
|
|
234
|
+
if category.get("framework", {}).get("name", "").lower() == "nist sp 800-53 revision 5":
|
|
235
|
+
category_name = category.get("name", "")
|
|
236
|
+
category_match = re.match(r"^([A-Z]+)\s", category_name)
|
|
237
|
+
if category_match:
|
|
238
|
+
return f"Wiz-Control-{category_match.group(1)}"
|
|
239
|
+
break
|
|
240
|
+
|
|
241
|
+
# Fallback to control name prefix
|
|
242
|
+
if name:
|
|
243
|
+
prefix_match = re.match(r"^([A-Za-z\s]+?)\s+(?:exposed|misconfigured|vulnerable|security|access)", name)
|
|
244
|
+
if prefix_match:
|
|
245
|
+
prefix = "".join(word.capitalize() for word in prefix_match.group(1).strip().split())
|
|
246
|
+
return f"Wiz-Control-{prefix}"
|
|
247
|
+
|
|
248
|
+
return "Wiz-Security-Control"
|
|
249
|
+
|
|
250
|
+
@staticmethod
|
|
251
|
+
def _get_event_plugin_name(name: str, service_type: str) -> str:
|
|
252
|
+
"""
|
|
253
|
+
Generate plugin name for CloudEventRule type.
|
|
254
|
+
|
|
255
|
+
:param str name: Rule name
|
|
256
|
+
:param str service_type: Service type
|
|
257
|
+
:return: Plugin name
|
|
258
|
+
:rtype: str
|
|
259
|
+
"""
|
|
260
|
+
if not service_type:
|
|
261
|
+
return "Wiz-Event"
|
|
262
|
+
if not name:
|
|
263
|
+
return f"Wiz-{service_type}-Event"
|
|
264
|
+
event_match = re.match(r"^([A-Za-z\s]+?)\s+(?:detection|event|alert|activity)", name)
|
|
265
|
+
if not event_match:
|
|
266
|
+
return f"Wiz-{service_type}-Event"
|
|
267
|
+
|
|
268
|
+
event_type = event_match.group(1).strip()
|
|
269
|
+
if event_type == "Suspicious activity":
|
|
270
|
+
return f"Wiz-{service_type}-SuspiciousActivity"
|
|
271
|
+
|
|
272
|
+
event_type = "".join(word.capitalize() for word in event_type.split())
|
|
273
|
+
return f"Wiz-{service_type}-{event_type}"
|
|
274
|
+
|
|
275
|
+
@staticmethod
|
|
276
|
+
def _get_source_rule_id(source_rule: Dict[str, Any]) -> str:
|
|
277
|
+
"""
|
|
278
|
+
Generate a source rule identifier that includes the type and ID.
|
|
279
|
+
|
|
280
|
+
:param Dict[str, Any] source_rule: The source rule data
|
|
281
|
+
:return: A formatted source rule identifier
|
|
282
|
+
:rtype: str
|
|
283
|
+
"""
|
|
284
|
+
typename = source_rule.get("__typename", "")
|
|
285
|
+
rule_id = source_rule.get("id", "")
|
|
286
|
+
service_type = source_rule.get("serviceType", "")
|
|
287
|
+
|
|
288
|
+
if typename and rule_id:
|
|
289
|
+
if service_type:
|
|
290
|
+
return f"{typename}-{service_type}-{rule_id}"
|
|
291
|
+
return f"{typename}-{rule_id}"
|
|
292
|
+
return rule_id
|
|
293
|
+
|
|
294
|
+
# noinspection PyMethodOverriding
|
|
295
|
+
def parse_finding(self, wiz_issue: Dict[str, Any], vulnerability_type: WizVulnerabilityType) -> IntegrationFinding:
|
|
296
|
+
"""
|
|
297
|
+
Parses a Wiz issue into an IntegrationFinding object.
|
|
298
|
+
|
|
299
|
+
:param Dict[str, Any] wiz_issue: The Wiz issue to parse
|
|
300
|
+
:param WizVulnerabilityType vulnerability_type: The type of vulnerability
|
|
301
|
+
:return: The parsed IntegrationFinding
|
|
302
|
+
:rtype: IntegrationFinding
|
|
303
|
+
"""
|
|
304
|
+
wiz_id = wiz_issue.get("id", "N/A")
|
|
305
|
+
severity = self.get_issue_severity(wiz_issue.get("severity", "Low"))
|
|
306
|
+
status = self.map_status_to_issue_status(wiz_issue.get("status", "OPEN"))
|
|
307
|
+
date_created = safe_datetime_str(wiz_issue.get("createdAt"))
|
|
308
|
+
name: str = wiz_issue.get("name", "")
|
|
309
|
+
|
|
310
|
+
# Handle source rule (Control) specific fields
|
|
311
|
+
source_rule = wiz_issue.get("sourceRule", {})
|
|
312
|
+
control_name = source_rule.get("name", "")
|
|
313
|
+
|
|
314
|
+
# Get control labels from security subcategories
|
|
315
|
+
control_labels = self._parse_security_subcategories(source_rule)
|
|
316
|
+
|
|
317
|
+
# Get asset identifier
|
|
318
|
+
asset_id = self._get_asset_identifier(wiz_issue)
|
|
319
|
+
|
|
320
|
+
# Format description with control context
|
|
321
|
+
description = self._format_control_description(source_rule) if source_rule else wiz_issue.get("description", "")
|
|
322
|
+
|
|
323
|
+
# Handle CVE if present
|
|
324
|
+
cve = (
|
|
325
|
+
name
|
|
326
|
+
if name and (name.startswith("CVE") or name.startswith("GHSA")) and not wiz_issue.get("cve")
|
|
327
|
+
else wiz_issue.get("cve")
|
|
328
|
+
)
|
|
329
|
+
|
|
330
|
+
# Get plugin name and source rule ID
|
|
331
|
+
plugin_name = self._get_plugin_name(wiz_issue)
|
|
332
|
+
source_rule_id = self._get_source_rule_id(source_rule)
|
|
333
|
+
|
|
334
|
+
# Get Security Check from plugin name
|
|
335
|
+
security_check = f"Wiz {plugin_name}"
|
|
336
|
+
|
|
337
|
+
return IntegrationFinding(
|
|
338
|
+
control_labels=control_labels,
|
|
339
|
+
category="Wiz Control" if source_rule else "Wiz Vulnerability",
|
|
340
|
+
title=control_name or wiz_issue.get("name") or f"unknown - {wiz_id}",
|
|
341
|
+
security_check=security_check,
|
|
342
|
+
description=description,
|
|
343
|
+
severity=severity,
|
|
344
|
+
status=status,
|
|
345
|
+
asset_identifier=asset_id,
|
|
346
|
+
external_id=wiz_id,
|
|
347
|
+
first_seen=date_created,
|
|
348
|
+
last_seen=safe_datetime_str(wiz_issue.get("lastDetectedAt")),
|
|
349
|
+
remediation=source_rule.get("resolutionRecommendation")
|
|
350
|
+
or f"Update to version {wiz_issue.get('fixedVersion')} or higher",
|
|
351
|
+
cve=cve,
|
|
352
|
+
plugin_name=plugin_name,
|
|
353
|
+
source_rule_id=source_rule_id,
|
|
354
|
+
vulnerability_type=vulnerability_type.value,
|
|
355
|
+
date_created=date_created,
|
|
356
|
+
due_date=issue_due_date(severity, date_created),
|
|
357
|
+
recommendation_for_mitigation=source_rule.get("resolutionRecommendation")
|
|
358
|
+
or wiz_issue.get("description", ""),
|
|
359
|
+
poam_comments=None,
|
|
360
|
+
basis_for_adjustment=None,
|
|
361
|
+
)
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
"""Class for a Wiz.io integration"""
|
|
4
|
+
|
|
5
|
+
# standard python imports
|
|
6
|
+
from enum import Enum
|
|
7
|
+
from typing import Optional
|
|
8
|
+
|
|
9
|
+
from pydantic import BaseModel, Field
|
|
10
|
+
from datetime import datetime
|
|
11
|
+
|
|
12
|
+
from regscale.models import regscale_models
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class AssetCategory(Enum):
|
|
16
|
+
"""Map Wiz assetTypes with RegScale assetCategories"""
|
|
17
|
+
|
|
18
|
+
SERVICE_USAGE_TECHNOLOGY = regscale_models.AssetCategory.Hardware
|
|
19
|
+
GATEWAY = regscale_models.AssetCategory.Hardware
|
|
20
|
+
SECRET = regscale_models.AssetCategory.Hardware
|
|
21
|
+
BUCKET = regscale_models.AssetCategory.Hardware
|
|
22
|
+
WEB_SERVICE = regscale_models.AssetCategory.Hardware
|
|
23
|
+
DB_SERVER = regscale_models.AssetCategory.Hardware
|
|
24
|
+
LOAD_BALANCER = regscale_models.AssetCategory.Hardware
|
|
25
|
+
CLOUD_ORGANIZATION = regscale_models.AssetCategory.Hardware
|
|
26
|
+
SUBNET = regscale_models.AssetCategory.Hardware
|
|
27
|
+
VIRTUAL_MACHINE = regscale_models.AssetCategory.Hardware
|
|
28
|
+
TECHNOLOGY = regscale_models.AssetCategory.Hardware
|
|
29
|
+
SECRET_CONTAINER = regscale_models.AssetCategory.Hardware
|
|
30
|
+
FILE_SYSTEM_SERVICE = regscale_models.AssetCategory.Hardware
|
|
31
|
+
KUBERNETES_CLUSTER = regscale_models.AssetCategory.Hardware
|
|
32
|
+
ROUTE_TABLE = regscale_models.AssetCategory.Hardware
|
|
33
|
+
COMPUTE_INSTANCE_GROUP = regscale_models.AssetCategory.Hardware
|
|
34
|
+
HOSTED_TECHNOLOGY = regscale_models.AssetCategory.Hardware
|
|
35
|
+
USER_ACCOUNT = regscale_models.AssetCategory.Hardware
|
|
36
|
+
DNS_ZONE = regscale_models.AssetCategory.Hardware
|
|
37
|
+
VOLUME = regscale_models.AssetCategory.Hardware
|
|
38
|
+
SERVICE_ACCOUNT = regscale_models.AssetCategory.Hardware
|
|
39
|
+
RESOURCE_GROUP = regscale_models.AssetCategory.Hardware
|
|
40
|
+
ACCESS_ROLE = regscale_models.AssetCategory.Hardware
|
|
41
|
+
SUBSCRIPTION = regscale_models.AssetCategory.Hardware
|
|
42
|
+
SERVICE_CONFIGURATION = regscale_models.AssetCategory.Hardware
|
|
43
|
+
VIRTUAL_NETWORK = regscale_models.AssetCategory.Hardware
|
|
44
|
+
VIRTUAL_MACHINE_IMAGE = regscale_models.AssetCategory.Hardware
|
|
45
|
+
FIREWALL = regscale_models.AssetCategory.Hardware
|
|
46
|
+
DATABASE = regscale_models.AssetCategory.Hardware
|
|
47
|
+
GOVERNANCE_POLICY_GROUP = regscale_models.AssetCategory.Hardware
|
|
48
|
+
STORAGE_ACCOUNT = regscale_models.AssetCategory.Hardware
|
|
49
|
+
CONFIG_MAP = regscale_models.AssetCategory.Hardware
|
|
50
|
+
NETWORK_ADDRESS = regscale_models.AssetCategory.Hardware
|
|
51
|
+
NETWORK_INTERFACE = regscale_models.AssetCategory.Hardware
|
|
52
|
+
DAEMON_SET = regscale_models.AssetCategory.Hardware
|
|
53
|
+
PRIVATE_ENDPOINT = regscale_models.AssetCategory.Hardware
|
|
54
|
+
ENDPOINT = regscale_models.AssetCategory.Hardware
|
|
55
|
+
DEPLOYMENT = regscale_models.AssetCategory.Hardware
|
|
56
|
+
POD = regscale_models.AssetCategory.Hardware
|
|
57
|
+
KUBERNETES_STORAGE_CLASS = regscale_models.AssetCategory.Hardware
|
|
58
|
+
ACCESS_ROLE_BINDING = regscale_models.AssetCategory.Hardware
|
|
59
|
+
KUBERNETES_INGRESS = regscale_models.AssetCategory.Hardware
|
|
60
|
+
CONTAINER = regscale_models.AssetCategory.Hardware
|
|
61
|
+
CONTAINER_IMAGE = regscale_models.AssetCategory.Hardware
|
|
62
|
+
CONTAINER_REGISTRY = regscale_models.AssetCategory.Hardware
|
|
63
|
+
GOVERNANCE_POLICY = regscale_models.AssetCategory.Hardware
|
|
64
|
+
REPLICA_SET = regscale_models.AssetCategory.Hardware
|
|
65
|
+
KUBERNETES_SERVICE = regscale_models.AssetCategory.Hardware
|
|
66
|
+
KUBERNETES_PERSISTENT_VOLUME_CLAIM = regscale_models.AssetCategory.Hardware
|
|
67
|
+
KUBERNETES_PERSISTENT_VOLUME = regscale_models.AssetCategory.Hardware
|
|
68
|
+
KUBERNETES_NETWORK_POLICY = regscale_models.AssetCategory.Hardware
|
|
69
|
+
KUBERNETES_NODE = regscale_models.AssetCategory.Hardware
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
class ComplianceCheckStatus(Enum):
|
|
73
|
+
PASS = "Pass"
|
|
74
|
+
FAIL = "Fail"
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
class ComplianceReport(BaseModel):
|
|
78
|
+
resource_name: str = Field(..., alias="Resource Name")
|
|
79
|
+
cloud_provider_id: str = Field(..., alias="Cloud Provider ID")
|
|
80
|
+
object_type: str = Field(..., alias="Object Type")
|
|
81
|
+
native_type: str = Field(..., alias="Native Type")
|
|
82
|
+
tags: Optional[str] = Field(None, alias="Tags")
|
|
83
|
+
subscription: str = Field(..., alias="Subscription")
|
|
84
|
+
projects: Optional[str] = Field(None, alias="Projects")
|
|
85
|
+
cloud_provider: str = Field(..., alias="Cloud Provider")
|
|
86
|
+
policy_id: str = Field(..., alias="Policy ID")
|
|
87
|
+
policy_short_name: str = Field(..., alias="Policy Short Name")
|
|
88
|
+
policy_description: Optional[str] = Field(None, alias="Policy Description")
|
|
89
|
+
policy_category: Optional[str] = Field(None, alias="Policy Category")
|
|
90
|
+
control_id: Optional[str] = Field(None, alias="Control ID")
|
|
91
|
+
compliance_check: Optional[str] = Field(None, alias="Compliance Check Name (Wiz Subcategory)")
|
|
92
|
+
control_description: Optional[str] = Field(None, alias="Control Description")
|
|
93
|
+
severity: Optional[str] = Field(None, alias="Severity")
|
|
94
|
+
result: str = Field(..., alias="Result")
|
|
95
|
+
framework: Optional[str] = Field(None, alias="Framework")
|
|
96
|
+
remediation_steps: Optional[str] = Field(None, alias="Remediation Steps")
|
|
97
|
+
assessed_at: Optional[datetime] = Field(None, alias="Assessed At")
|
|
98
|
+
created_at: Optional[datetime] = Field(None, alias="Created At")
|
|
99
|
+
updated_at: Optional[datetime] = Field(None, alias="Updated At")
|
|
100
|
+
subscription_name: Optional[str] = Field(None, alias="Subscription Name")
|
|
101
|
+
subscription_provider_id: Optional[str] = Field(None, alias="Subscription Provider ID")
|
|
102
|
+
resource_id: str = Field(..., alias="Resource ID")
|
|
103
|
+
resource_region: Optional[str] = Field(None, alias="Resource Region")
|
|
104
|
+
resource_cloud_platform: Optional[str] = Field(None, alias="Resource Cloud Platform")
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
# # Attempt to create an instance of the model again
|
|
108
|
+
# example_row = data.iloc[0].to_dict()
|
|
109
|
+
# example_compliance_report = ComplianceReport(**example_row)
|
|
110
|
+
#
|
|
111
|
+
# # Display the instance
|
|
112
|
+
# example_compliance_report.dict()
|