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
|
File without changes
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"""
|
|
2
|
+
This module contains the Click command group for SAP.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import logging
|
|
6
|
+
|
|
7
|
+
import click
|
|
8
|
+
|
|
9
|
+
logger = logging.getLogger("regscale")
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@click.group()
|
|
13
|
+
def sap():
|
|
14
|
+
"""
|
|
15
|
+
SAP Integration
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@sap.group(help="SAP Concur")
|
|
20
|
+
def concur():
|
|
21
|
+
"""Performs actions on the SAP Concur API."""
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@concur.group(help="SAP Sysdig")
|
|
25
|
+
def sysdig():
|
|
26
|
+
"""Performs actions on the SysDig Concur export."""
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@concur.group(help="Synchronize data from Tenable.")
|
|
30
|
+
def tenable():
|
|
31
|
+
"""Performs actions on a Tenable Concur export."""
|
|
File without changes
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"""
|
|
2
|
+
This module contains the Click command group for SAP.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import logging
|
|
6
|
+
|
|
7
|
+
import click
|
|
8
|
+
|
|
9
|
+
from regscale.integrations.commercial.sap.click import sysdig
|
|
10
|
+
from regscale.models.app_models.click import regscale_ssp_id
|
|
11
|
+
|
|
12
|
+
logger = logging.getLogger("regscale")
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@sysdig.command(name="sync_vulns")
|
|
16
|
+
@regscale_ssp_id()
|
|
17
|
+
@click.option(
|
|
18
|
+
"--path",
|
|
19
|
+
type=click.STRING,
|
|
20
|
+
help="Path to the CSV file containing the SAP Concur data.",
|
|
21
|
+
required=True,
|
|
22
|
+
)
|
|
23
|
+
@click.option(
|
|
24
|
+
"--scan_date",
|
|
25
|
+
type=click.DateTime(formats=["%Y-%m-%d"]),
|
|
26
|
+
help="The scan date of the file.",
|
|
27
|
+
required=False,
|
|
28
|
+
)
|
|
29
|
+
def sync_vulns(regscale_ssp_id: int, path: str, scan_date: click.DateTime = None):
|
|
30
|
+
"""
|
|
31
|
+
Synchronize vulnerabilities from SAP Concur data.
|
|
32
|
+
"""
|
|
33
|
+
from regscale.integrations.commercial.sap.sysdig.sysdig_scanner import SAPConcurSysDigScanner
|
|
34
|
+
|
|
35
|
+
SAPConcurSysDigScanner(plan_id=regscale_ssp_id).sync_findings(
|
|
36
|
+
plan_id=regscale_ssp_id, path=path, scan_date=scan_date
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
@sysdig.command(name="sync_assets")
|
|
41
|
+
@regscale_ssp_id()
|
|
42
|
+
@click.option(
|
|
43
|
+
"--path",
|
|
44
|
+
type=click.Path(exists=True, file_okay=True, dir_okay=False, readable=True),
|
|
45
|
+
help="Path to the CSV file containing the SAP Concur data.",
|
|
46
|
+
required=True,
|
|
47
|
+
)
|
|
48
|
+
def sync_assets(regscale_ssp_id: int, path: str):
|
|
49
|
+
"""
|
|
50
|
+
Synchronize assets from SAP Concur data.
|
|
51
|
+
|
|
52
|
+
:param int regscale_ssp_id: RegScale System Security Plan ID
|
|
53
|
+
:param str path: Path to the CSV file containing the SAP Concur data
|
|
54
|
+
"""
|
|
55
|
+
from regscale.integrations.commercial.sap.sysdig.sysdig_scanner import SAPConcurSysDigScanner
|
|
56
|
+
|
|
57
|
+
SAPConcurSysDigScanner(plan_id=regscale_ssp_id).sync_assets(plan_id=regscale_ssp_id, path=path)
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import csv
|
|
2
|
+
import logging
|
|
3
|
+
from typing import Any, Dict, Iterator, Tuple
|
|
4
|
+
|
|
5
|
+
from regscale.core.app.utils.app_utils import get_current_datetime
|
|
6
|
+
from regscale.core.app.utils.parser_utils import safe_datetime_str, safe_float
|
|
7
|
+
from regscale.integrations.scanner_integration import (
|
|
8
|
+
IntegrationAsset,
|
|
9
|
+
IntegrationFinding,
|
|
10
|
+
ScannerIntegration,
|
|
11
|
+
issue_due_date,
|
|
12
|
+
)
|
|
13
|
+
from regscale.integrations.variables import ScannerVariables
|
|
14
|
+
from regscale.models import regscale_models
|
|
15
|
+
|
|
16
|
+
logger = logging.getLogger("regscale")
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class SAPConcurSysDigScanner(ScannerIntegration):
|
|
20
|
+
title = "SAP Concur - SysDig"
|
|
21
|
+
asset_identifier_field = "name"
|
|
22
|
+
finding_severity_map = {
|
|
23
|
+
"critical": regscale_models.IssueSeverity.Critical,
|
|
24
|
+
"high": regscale_models.IssueSeverity.High,
|
|
25
|
+
"medium": regscale_models.IssueSeverity.Moderate,
|
|
26
|
+
"low": regscale_models.IssueSeverity.Low,
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
def parse_assets(self, asset: Dict[str, Any]) -> IntegrationAsset:
|
|
30
|
+
"""
|
|
31
|
+
Parse a single asset from the vulnerability data.
|
|
32
|
+
|
|
33
|
+
:param Dict[str, Any] asset: A dictionary containing the asset data
|
|
34
|
+
:return: An IntegrationAsset object with parsed data
|
|
35
|
+
:rtype: IntegrationAsset
|
|
36
|
+
"""
|
|
37
|
+
name = (
|
|
38
|
+
asset.get("Image name", None) + ":" + asset.get("Image tag", None)
|
|
39
|
+
if (asset.get("Image name") and asset.get("Image tag"))
|
|
40
|
+
else None
|
|
41
|
+
)
|
|
42
|
+
return IntegrationAsset(
|
|
43
|
+
name=name,
|
|
44
|
+
identifier=name
|
|
45
|
+
or asset.get("Container name")
|
|
46
|
+
or asset.get("Cluster name")
|
|
47
|
+
or asset.get("Pod")
|
|
48
|
+
or asset.get("Namespace"),
|
|
49
|
+
asset_type="Other", # Sysdig primarily concerns itself with containers
|
|
50
|
+
asset_category=regscale_models.AssetCategory.Hardware,
|
|
51
|
+
asset_owner_id=ScannerVariables.userId,
|
|
52
|
+
status="Active (On Network)",
|
|
53
|
+
mac_address="",
|
|
54
|
+
fqdn="",
|
|
55
|
+
ip_address="",
|
|
56
|
+
operating_system="",
|
|
57
|
+
aws_identifier="",
|
|
58
|
+
vlan_id="",
|
|
59
|
+
location="",
|
|
60
|
+
software_inventory=[],
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
def fetch_assets(self, *args: Tuple, **kwargs: dict) -> Iterator[IntegrationAsset]:
|
|
64
|
+
"""
|
|
65
|
+
Fetch assets from a CSV file and yield IntegrationAsset objects.
|
|
66
|
+
|
|
67
|
+
:param Tuple args: Variable length argument list
|
|
68
|
+
:param dict kwargs: Arbitrary keyword arguments
|
|
69
|
+
:return: An iterator of IntegrationAsset objects
|
|
70
|
+
:rtype: Iterator[IntegrationAsset]
|
|
71
|
+
"""
|
|
72
|
+
path: str = kwargs.get("path", "")
|
|
73
|
+
if not path:
|
|
74
|
+
raise ValueError("Path is required")
|
|
75
|
+
|
|
76
|
+
logger.info(f"Fetching assets from {path}")
|
|
77
|
+
with open(path, "r", newline="") as csvfile:
|
|
78
|
+
reader = csv.DictReader(csvfile)
|
|
79
|
+
for row in reader:
|
|
80
|
+
yield self.parse_assets(row)
|
|
81
|
+
|
|
82
|
+
def fetch_findings(self, *args: Tuple, **kwargs: dict) -> Iterator[IntegrationFinding]:
|
|
83
|
+
"""
|
|
84
|
+
Fetch findings from a CSV file and yield IntegrationFinding objects.
|
|
85
|
+
|
|
86
|
+
:param Tuple args: Variable length argument list
|
|
87
|
+
:param dict kwargs: Arbitrary keyword arguments
|
|
88
|
+
:return: An iterator of IntegrationFinding objects
|
|
89
|
+
:rtype: Iterator[IntegrationFinding]
|
|
90
|
+
"""
|
|
91
|
+
path: str = kwargs.get("path", "")
|
|
92
|
+
if not path:
|
|
93
|
+
raise ValueError("Path is required")
|
|
94
|
+
|
|
95
|
+
logger.info(f"Fetching findings from {path}")
|
|
96
|
+
|
|
97
|
+
with open(path, "r", newline="") as csvfile:
|
|
98
|
+
reader = csv.DictReader(csvfile)
|
|
99
|
+
for row in reader:
|
|
100
|
+
yield from self.parse_findings(finding=row, kwargs=kwargs)
|
|
101
|
+
|
|
102
|
+
def parse_findings(self, finding: Dict[str, Any], **kwargs: dict) -> Iterator[IntegrationFinding]:
|
|
103
|
+
"""
|
|
104
|
+
Parse a single finding from the vulnerability data.
|
|
105
|
+
|
|
106
|
+
:param Dict[str, Any] finding: A dictionary containing the finding data
|
|
107
|
+
:param dict kwargs: Arbitrary keyword arguments
|
|
108
|
+
:return: An iterator of IntegrationFinding objects
|
|
109
|
+
:rtype: Iterator[IntegrationFinding]
|
|
110
|
+
"""
|
|
111
|
+
severity = self.finding_severity_map.get(finding["Severity"].lower(), regscale_models.IssueSeverity.Low)
|
|
112
|
+
cves = finding.get("Vulnerability ID", "").split(",") if finding.get("Vulnerability ID") else []
|
|
113
|
+
|
|
114
|
+
if not cves:
|
|
115
|
+
# If there are no CVEs, yield a single finding without CVE information
|
|
116
|
+
yield self._create_finding(finding=finding, severity=severity, kwargs=kwargs)
|
|
117
|
+
else:
|
|
118
|
+
# If there are CVEs, yield a finding for each CVE
|
|
119
|
+
for cve in cves:
|
|
120
|
+
yield self._create_finding(finding=finding, severity=severity, cve=cve.strip(), kwargs=kwargs)
|
|
121
|
+
|
|
122
|
+
def _create_finding(
|
|
123
|
+
self, finding: Dict[str, Any], severity: regscale_models.IssueSeverity, cve: str = "", **kwargs: dict
|
|
124
|
+
) -> IntegrationFinding:
|
|
125
|
+
"""
|
|
126
|
+
Create an IntegrationFinding object from the given data.
|
|
127
|
+
|
|
128
|
+
:param Dict[str, Any] finding: A dictionary containing the finding data
|
|
129
|
+
:param regscale_models.IssueSeverity severity: The severity of the finding
|
|
130
|
+
:param str cve: The CVE number (optional)
|
|
131
|
+
:return: An IntegrationFinding object
|
|
132
|
+
:rtype: IntegrationFinding
|
|
133
|
+
"""
|
|
134
|
+
asset_name = (
|
|
135
|
+
finding.get("Image name", None) + ":" + finding.get("Image tag", None)
|
|
136
|
+
if (finding.get("Image name") and finding.get("Image tag"))
|
|
137
|
+
else None
|
|
138
|
+
)
|
|
139
|
+
asset_id = (
|
|
140
|
+
asset_name
|
|
141
|
+
or finding.get("Container name")
|
|
142
|
+
or finding.get("Cluster name")
|
|
143
|
+
or finding.get("Pod")
|
|
144
|
+
or finding.get("Namespace")
|
|
145
|
+
)
|
|
146
|
+
cve_description = finding.get("Cve description")
|
|
147
|
+
category = "Sysdig Vulnerability: General"
|
|
148
|
+
issue_type = "Vulnerability"
|
|
149
|
+
scan_date = kwargs.get("scan_date", get_current_datetime())
|
|
150
|
+
return IntegrationFinding(
|
|
151
|
+
cvss_v3_base_score=safe_float(finding.get("CVSS v3 base score")),
|
|
152
|
+
cvss_score=safe_float(finding.get("CVSS v2 base score")),
|
|
153
|
+
control_labels=[],
|
|
154
|
+
category=category,
|
|
155
|
+
title=cve or cve_description,
|
|
156
|
+
issue_title=cve or cve_description,
|
|
157
|
+
description=cve_description or cve,
|
|
158
|
+
severity=severity,
|
|
159
|
+
status=regscale_models.IssueStatus.Open,
|
|
160
|
+
asset_identifier=asset_id,
|
|
161
|
+
external_id=finding.get("pluginID", "Unknown"),
|
|
162
|
+
scan_date=scan_date,
|
|
163
|
+
first_seen=scan_date,
|
|
164
|
+
last_seen=scan_date,
|
|
165
|
+
remediation=finding.get("Vuln link", ""),
|
|
166
|
+
cve=cve,
|
|
167
|
+
vulnerability_type=self.title,
|
|
168
|
+
plugin_id="0",
|
|
169
|
+
plugin_name=cve or "",
|
|
170
|
+
ip_address="",
|
|
171
|
+
dns=cve,
|
|
172
|
+
issue_type=issue_type,
|
|
173
|
+
date_created=get_current_datetime(),
|
|
174
|
+
date_last_updated=get_current_datetime(),
|
|
175
|
+
gaps="",
|
|
176
|
+
observations=finding.get("plugin_output", ""),
|
|
177
|
+
evidence=finding.get("plugin_output", ""),
|
|
178
|
+
identified_risk=finding.get("risk_factor", ""),
|
|
179
|
+
impact="",
|
|
180
|
+
recommendation_for_mitigation=finding.get("Vuln link", ""),
|
|
181
|
+
rule_id=finding.get("pluginID"),
|
|
182
|
+
rule_version=finding.get("script_version"),
|
|
183
|
+
results=finding.get("plugin_output", ""),
|
|
184
|
+
comments=None,
|
|
185
|
+
baseline="",
|
|
186
|
+
poam_comments=None,
|
|
187
|
+
vulnerable_asset=asset_id,
|
|
188
|
+
source_rule_id=finding.get("fname"),
|
|
189
|
+
basis_for_adjustment=None,
|
|
190
|
+
)
|
|
File without changes
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"""
|
|
2
|
+
This module contains the Click command group for SAP.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import logging
|
|
6
|
+
|
|
7
|
+
import click
|
|
8
|
+
|
|
9
|
+
from regscale.integrations.commercial.sap.click import tenable
|
|
10
|
+
from regscale.models.app_models.click import regscale_ssp_id
|
|
11
|
+
|
|
12
|
+
logger = logging.getLogger("regscale")
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@tenable.command(name="sync_vulns")
|
|
16
|
+
@regscale_ssp_id()
|
|
17
|
+
@click.option(
|
|
18
|
+
"--path",
|
|
19
|
+
type=click.STRING,
|
|
20
|
+
help="Path to the CSV file containing the SAP Concur data.",
|
|
21
|
+
required=True,
|
|
22
|
+
)
|
|
23
|
+
def sync_vulns(regscale_ssp_id: int, path: str):
|
|
24
|
+
"""
|
|
25
|
+
Synchronize vulnerabilities from SAP Concur Tenable data.
|
|
26
|
+
"""
|
|
27
|
+
from .scanner import SAPConcurScanner
|
|
28
|
+
|
|
29
|
+
SAPConcurScanner(plan_id=regscale_ssp_id).sync_findings(plan_id=regscale_ssp_id, path=path)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
@tenable.command(name="sync_assets")
|
|
33
|
+
@regscale_ssp_id()
|
|
34
|
+
@click.option(
|
|
35
|
+
"--path",
|
|
36
|
+
type=click.Path(exists=True, file_okay=True, dir_okay=False, readable=True),
|
|
37
|
+
help="Path to the CSV file containing the SAP Concur data.",
|
|
38
|
+
required=True,
|
|
39
|
+
)
|
|
40
|
+
def sync_assets(regscale_ssp_id: int, path: str):
|
|
41
|
+
"""
|
|
42
|
+
Synchronize assets from SAP Concur Tenable data.
|
|
43
|
+
|
|
44
|
+
:param int regscale_ssp_id: RegScale System Security Plan ID
|
|
45
|
+
:param str path: Path to the CSV file containing the SAP Concur data
|
|
46
|
+
"""
|
|
47
|
+
from .scanner import SAPConcurScanner
|
|
48
|
+
|
|
49
|
+
SAPConcurScanner(plan_id=regscale_ssp_id).sync_assets(plan_id=regscale_ssp_id, path=path)
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import csv
|
|
2
|
+
import logging
|
|
3
|
+
from typing import Any, Dict, Iterator, Tuple
|
|
4
|
+
|
|
5
|
+
from regscale.core.app.utils.parser_utils import safe_datetime_str, safe_float, safe_int
|
|
6
|
+
from regscale.integrations.scanner_integration import (
|
|
7
|
+
IntegrationAsset,
|
|
8
|
+
IntegrationFinding,
|
|
9
|
+
ScannerIntegration,
|
|
10
|
+
issue_due_date,
|
|
11
|
+
)
|
|
12
|
+
from regscale.models import regscale_models
|
|
13
|
+
|
|
14
|
+
logger = logging.getLogger("regscale")
|
|
15
|
+
|
|
16
|
+
# Constants for repeated literals
|
|
17
|
+
IP_ADDRESS_ANONYMIZED = "IP Address (Anonymized)"
|
|
18
|
+
DNS_NAME = "DNS Name"
|
|
19
|
+
LAST_OBSERVED = "Last Observed"
|
|
20
|
+
CVSS_V3_BASE_SCORE = "CVSS V3 Base Score"
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class SAPConcurScanner(ScannerIntegration):
|
|
24
|
+
title = "SAP Concur"
|
|
25
|
+
asset_identifier_field = "tenableId"
|
|
26
|
+
finding_severity_map = {
|
|
27
|
+
"critical": regscale_models.IssueSeverity.Critical,
|
|
28
|
+
"high": regscale_models.IssueSeverity.High,
|
|
29
|
+
"medium": regscale_models.IssueSeverity.Moderate,
|
|
30
|
+
"low": regscale_models.IssueSeverity.Low,
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
def parse_assets(self, asset: Dict[str, Any]) -> IntegrationAsset:
|
|
34
|
+
"""
|
|
35
|
+
Parse a single asset from the vulnerability data.
|
|
36
|
+
|
|
37
|
+
:param Dict[str, Any] asset: A dictionary containing the asset data
|
|
38
|
+
:return: An IntegrationAsset object with parsed data
|
|
39
|
+
:rtype: IntegrationAsset
|
|
40
|
+
"""
|
|
41
|
+
ip_address = asset.get(IP_ADDRESS_ANONYMIZED, "")
|
|
42
|
+
external_id = asset.get("Host ID") or ip_address # Use Host ID if available, otherwise use IP address
|
|
43
|
+
|
|
44
|
+
return IntegrationAsset(
|
|
45
|
+
name=asset.get(DNS_NAME) or ip_address,
|
|
46
|
+
identifier=external_id,
|
|
47
|
+
asset_type="Server",
|
|
48
|
+
asset_category="Infrastructure",
|
|
49
|
+
status="Active (On Network)",
|
|
50
|
+
date_last_updated=safe_datetime_str(asset.get(LAST_OBSERVED)),
|
|
51
|
+
ip_address=ip_address,
|
|
52
|
+
mac_address=asset.get("MAC Address"),
|
|
53
|
+
fqdn=asset.get(DNS_NAME),
|
|
54
|
+
component_names=[],
|
|
55
|
+
external_id=external_id,
|
|
56
|
+
software_name=asset.get("Plugin Name"),
|
|
57
|
+
software_version=asset.get("Version"),
|
|
58
|
+
operating_system=None,
|
|
59
|
+
os_version=None,
|
|
60
|
+
source_data=asset,
|
|
61
|
+
url=None,
|
|
62
|
+
ports_and_protocols=(
|
|
63
|
+
[
|
|
64
|
+
{
|
|
65
|
+
"start_port": safe_int(asset.get("Port")),
|
|
66
|
+
"end_port": safe_int(asset.get("Port")),
|
|
67
|
+
"protocol": asset.get("Protocol"),
|
|
68
|
+
}
|
|
69
|
+
]
|
|
70
|
+
if safe_int(asset.get("Port"))
|
|
71
|
+
else []
|
|
72
|
+
),
|
|
73
|
+
software_inventory=[],
|
|
74
|
+
notes=f"NetBIOS Name: {asset.get('NetBIOS Name', '')}, Repository: {asset.get('Repository', '')}",
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
def fetch_assets(self, *args: Tuple, **kwargs: dict) -> Iterator[IntegrationAsset]:
|
|
78
|
+
"""
|
|
79
|
+
Fetch assets from a CSV file and yield IntegrationAsset objects.
|
|
80
|
+
|
|
81
|
+
:param Tuple args: Variable length argument list
|
|
82
|
+
:param dict kwargs: Arbitrary keyword arguments
|
|
83
|
+
:return: An iterator of IntegrationAsset objects
|
|
84
|
+
:rtype: Iterator[IntegrationAsset]
|
|
85
|
+
"""
|
|
86
|
+
path: str = kwargs.get("path", "")
|
|
87
|
+
if not path:
|
|
88
|
+
raise ValueError("Path is required")
|
|
89
|
+
|
|
90
|
+
logger.info(f"Fetching assets from {path}")
|
|
91
|
+
with open(path, "r", newline="") as csvfile:
|
|
92
|
+
reader = csv.DictReader(csvfile)
|
|
93
|
+
for row in reader:
|
|
94
|
+
yield self.parse_assets(row)
|
|
95
|
+
|
|
96
|
+
def fetch_findings(self, *args: Tuple, **kwargs: dict) -> Iterator[IntegrationFinding]:
|
|
97
|
+
"""
|
|
98
|
+
Fetch findings from a CSV file and yield IntegrationFinding objects.
|
|
99
|
+
|
|
100
|
+
:param Tuple args: Variable length argument list
|
|
101
|
+
:param dict kwargs: Arbitrary keyword arguments
|
|
102
|
+
:return: An iterator of IntegrationFinding objects
|
|
103
|
+
:rtype: Iterator[IntegrationFinding]
|
|
104
|
+
"""
|
|
105
|
+
path: str = kwargs.get("path", "")
|
|
106
|
+
if not path:
|
|
107
|
+
raise ValueError("Path is required")
|
|
108
|
+
|
|
109
|
+
logger.info(f"Fetching findings from {path}")
|
|
110
|
+
|
|
111
|
+
with open(path, "r", newline="") as csvfile:
|
|
112
|
+
reader = csv.DictReader(csvfile)
|
|
113
|
+
for row in reader:
|
|
114
|
+
yield from self.parse_findings(row)
|
|
115
|
+
|
|
116
|
+
def parse_findings(self, finding: Dict[str, Any]) -> Iterator[IntegrationFinding]:
|
|
117
|
+
"""
|
|
118
|
+
Parse a single finding from the vulnerability data.
|
|
119
|
+
|
|
120
|
+
:param Dict[str, Any] finding: A dictionary containing the finding data
|
|
121
|
+
:return: An iterator of IntegrationFinding objects
|
|
122
|
+
:rtype: Iterator[IntegrationFinding]
|
|
123
|
+
"""
|
|
124
|
+
severity = self.finding_severity_map.get(finding["Severity"].lower(), regscale_models.IssueSeverity.Low)
|
|
125
|
+
cves = finding.get("CVE", "").split(",") if finding.get("CVE") else []
|
|
126
|
+
|
|
127
|
+
if not cves:
|
|
128
|
+
# If there are no CVEs, yield a single finding without CVE information
|
|
129
|
+
yield self._create_finding(finding, severity)
|
|
130
|
+
else:
|
|
131
|
+
# If there are CVEs, yield a finding for each CVE
|
|
132
|
+
for cve in cves:
|
|
133
|
+
yield self._create_finding(finding, severity, cve.strip())
|
|
134
|
+
|
|
135
|
+
def _create_finding(
|
|
136
|
+
self, finding: Dict[str, Any], severity: regscale_models.IssueSeverity, cve: str = ""
|
|
137
|
+
) -> IntegrationFinding:
|
|
138
|
+
"""
|
|
139
|
+
Create an IntegrationFinding object from the given data.
|
|
140
|
+
|
|
141
|
+
:param Dict[str, Any] finding: A dictionary containing the finding data
|
|
142
|
+
:param regscale_models.IssueSeverity severity: The severity of the finding
|
|
143
|
+
:param str cve: The CVE number (optional)
|
|
144
|
+
:return: An IntegrationFinding object
|
|
145
|
+
:rtype: IntegrationFinding
|
|
146
|
+
"""
|
|
147
|
+
return IntegrationFinding(
|
|
148
|
+
control_labels=[],
|
|
149
|
+
title=finding.get("Plugin Name"),
|
|
150
|
+
category=finding.get("Family", "Unknown"),
|
|
151
|
+
plugin_name=finding.get("Plugin", ""),
|
|
152
|
+
severity=severity,
|
|
153
|
+
description=finding.get("Description", ""),
|
|
154
|
+
status=regscale_models.IssueStatus.Open,
|
|
155
|
+
priority=finding.get("Vulnerability Priority Rating", "Medium"),
|
|
156
|
+
first_seen=safe_datetime_str(finding.get("First Discovered")),
|
|
157
|
+
last_seen=safe_datetime_str(finding.get(LAST_OBSERVED)),
|
|
158
|
+
cve=cve,
|
|
159
|
+
cvss_v3_score=safe_float(finding.get(CVSS_V3_BASE_SCORE)),
|
|
160
|
+
cvss_v2_score=safe_float(finding.get("CVSS V2 Base Score")),
|
|
161
|
+
ip_address=finding.get(IP_ADDRESS_ANONYMIZED),
|
|
162
|
+
plugin_id=finding.get("Plugin"),
|
|
163
|
+
dns=finding.get(DNS_NAME),
|
|
164
|
+
issue_title=f"Vulnerability {finding.get('Plugin Name')} found",
|
|
165
|
+
issue_type="Risk",
|
|
166
|
+
date_created=safe_datetime_str(finding.get("First Discovered")),
|
|
167
|
+
date_last_updated=safe_datetime_str(finding.get(LAST_OBSERVED)),
|
|
168
|
+
due_date=issue_due_date(severity=severity, created_date=safe_datetime_str(finding.get("First Discovered"))),
|
|
169
|
+
external_id=finding.get("Plugin"),
|
|
170
|
+
gaps="",
|
|
171
|
+
observations="",
|
|
172
|
+
evidence=finding.get("Plugin Output", ""),
|
|
173
|
+
identified_risk=finding.get("Risk Factor", ""),
|
|
174
|
+
impact="",
|
|
175
|
+
recommendation_for_mitigation=finding.get("Steps to Remediate", ""),
|
|
176
|
+
asset_identifier=finding.get(IP_ADDRESS_ANONYMIZED, ""),
|
|
177
|
+
comments=None,
|
|
178
|
+
poam_comments=None,
|
|
179
|
+
cci_ref=None,
|
|
180
|
+
rule_id=finding.get("Plugin", ""),
|
|
181
|
+
rule_version=finding.get("Version", ""),
|
|
182
|
+
results="",
|
|
183
|
+
baseline="",
|
|
184
|
+
vulnerability_number=cve,
|
|
185
|
+
oval_def="",
|
|
186
|
+
scan_date=safe_datetime_str(finding.get(LAST_OBSERVED)),
|
|
187
|
+
rule_id_full="",
|
|
188
|
+
group_id="",
|
|
189
|
+
vulnerable_asset=finding.get(IP_ADDRESS_ANONYMIZED, ""),
|
|
190
|
+
remediation=finding.get("Steps to Remediate", ""),
|
|
191
|
+
cvss_score=safe_float(finding.get(CVSS_V3_BASE_SCORE) or finding.get("CVSS V2 Base Score")),
|
|
192
|
+
cvss_v3_base_score=safe_float(finding.get(CVSS_V3_BASE_SCORE)),
|
|
193
|
+
source_rule_id=finding.get("Plugin", ""),
|
|
194
|
+
vulnerability_type=finding.get("Family", ""),
|
|
195
|
+
basis_for_adjustment=None,
|
|
196
|
+
)
|