regscale-cli 6.21.2.0__py3-none-any.whl → 6.28.2.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- regscale/_version.py +1 -1
- regscale/airflow/hierarchy.py +2 -2
- regscale/core/app/api.py +5 -2
- regscale/core/app/application.py +36 -6
- regscale/core/app/internal/control_editor.py +73 -21
- regscale/core/app/internal/evidence.py +727 -204
- regscale/core/app/internal/login.py +4 -2
- regscale/core/app/internal/model_editor.py +219 -64
- regscale/core/app/utils/app_utils.py +86 -12
- regscale/core/app/utils/catalog_utils/common.py +1 -1
- regscale/core/login.py +21 -4
- regscale/core/utils/async_graphql_client.py +363 -0
- regscale/core/utils/date.py +77 -1
- regscale/dev/cli.py +26 -0
- regscale/dev/code_gen.py +109 -24
- regscale/dev/version.py +72 -0
- regscale/integrations/commercial/__init__.py +30 -2
- regscale/integrations/commercial/aws/audit_manager_compliance.py +3908 -0
- regscale/integrations/commercial/aws/cli.py +3107 -54
- regscale/integrations/commercial/aws/cloudtrail_control_mappings.py +333 -0
- regscale/integrations/commercial/aws/cloudtrail_evidence.py +501 -0
- regscale/integrations/commercial/aws/cloudwatch_control_mappings.py +357 -0
- regscale/integrations/commercial/aws/cloudwatch_evidence.py +490 -0
- regscale/integrations/commercial/{amazon → aws}/common.py +71 -19
- regscale/integrations/commercial/aws/config_compliance.py +914 -0
- regscale/integrations/commercial/aws/conformance_pack_mappings.py +198 -0
- regscale/integrations/commercial/aws/control_compliance_analyzer.py +439 -0
- regscale/integrations/commercial/aws/evidence_generator.py +283 -0
- regscale/integrations/commercial/aws/guardduty_control_mappings.py +340 -0
- regscale/integrations/commercial/aws/guardduty_evidence.py +1053 -0
- regscale/integrations/commercial/aws/iam_control_mappings.py +368 -0
- regscale/integrations/commercial/aws/iam_evidence.py +574 -0
- regscale/integrations/commercial/aws/inventory/__init__.py +338 -22
- regscale/integrations/commercial/aws/inventory/base.py +107 -5
- regscale/integrations/commercial/aws/inventory/resources/analytics.py +390 -0
- regscale/integrations/commercial/aws/inventory/resources/applications.py +234 -0
- regscale/integrations/commercial/aws/inventory/resources/audit_manager.py +513 -0
- regscale/integrations/commercial/aws/inventory/resources/cloudtrail.py +315 -0
- regscale/integrations/commercial/aws/inventory/resources/cloudtrail_logs_metadata.py +476 -0
- regscale/integrations/commercial/aws/inventory/resources/cloudwatch.py +191 -0
- regscale/integrations/commercial/aws/inventory/resources/compute.py +328 -9
- regscale/integrations/commercial/aws/inventory/resources/config.py +464 -0
- regscale/integrations/commercial/aws/inventory/resources/containers.py +74 -9
- regscale/integrations/commercial/aws/inventory/resources/database.py +481 -31
- regscale/integrations/commercial/aws/inventory/resources/developer_tools.py +253 -0
- regscale/integrations/commercial/aws/inventory/resources/guardduty.py +286 -0
- regscale/integrations/commercial/aws/inventory/resources/iam.py +470 -0
- regscale/integrations/commercial/aws/inventory/resources/inspector.py +476 -0
- regscale/integrations/commercial/aws/inventory/resources/integration.py +175 -61
- regscale/integrations/commercial/aws/inventory/resources/kms.py +447 -0
- regscale/integrations/commercial/aws/inventory/resources/machine_learning.py +358 -0
- regscale/integrations/commercial/aws/inventory/resources/networking.py +390 -67
- regscale/integrations/commercial/aws/inventory/resources/s3.py +394 -0
- regscale/integrations/commercial/aws/inventory/resources/security.py +268 -72
- regscale/integrations/commercial/aws/inventory/resources/securityhub.py +473 -0
- regscale/integrations/commercial/aws/inventory/resources/storage.py +288 -29
- regscale/integrations/commercial/aws/inventory/resources/systems_manager.py +657 -0
- regscale/integrations/commercial/aws/inventory/resources/vpc.py +655 -0
- regscale/integrations/commercial/aws/kms_control_mappings.py +288 -0
- regscale/integrations/commercial/aws/kms_evidence.py +879 -0
- regscale/integrations/commercial/aws/ocsf/__init__.py +7 -0
- regscale/integrations/commercial/aws/ocsf/constants.py +115 -0
- regscale/integrations/commercial/aws/ocsf/mapper.py +435 -0
- regscale/integrations/commercial/aws/org_control_mappings.py +286 -0
- regscale/integrations/commercial/aws/org_evidence.py +666 -0
- regscale/integrations/commercial/aws/s3_control_mappings.py +356 -0
- regscale/integrations/commercial/aws/s3_evidence.py +632 -0
- regscale/integrations/commercial/aws/scanner.py +1072 -205
- regscale/integrations/commercial/aws/security_hub.py +319 -0
- regscale/integrations/commercial/aws/session_manager.py +282 -0
- regscale/integrations/commercial/aws/ssm_control_mappings.py +291 -0
- regscale/integrations/commercial/aws/ssm_evidence.py +492 -0
- regscale/integrations/commercial/jira.py +489 -153
- regscale/integrations/commercial/microsoft_defender/defender.py +326 -5
- regscale/integrations/commercial/microsoft_defender/defender_api.py +348 -14
- regscale/integrations/commercial/microsoft_defender/defender_constants.py +157 -0
- regscale/integrations/commercial/qualys/__init__.py +167 -68
- regscale/integrations/commercial/qualys/scanner.py +305 -39
- regscale/integrations/commercial/sarif/sairf_importer.py +432 -0
- regscale/integrations/commercial/sarif/sarif_converter.py +67 -0
- regscale/integrations/commercial/sicura/api.py +79 -42
- regscale/integrations/commercial/sicura/commands.py +8 -2
- regscale/integrations/commercial/sicura/scanner.py +83 -44
- regscale/integrations/commercial/stigv2/ckl_parser.py +5 -5
- regscale/integrations/commercial/synqly/assets.py +133 -16
- regscale/integrations/commercial/synqly/edr.py +2 -8
- regscale/integrations/commercial/synqly/query_builder.py +536 -0
- regscale/integrations/commercial/synqly/ticketing.py +27 -0
- regscale/integrations/commercial/synqly/vulnerabilities.py +165 -28
- regscale/integrations/commercial/tenablev2/cis_parsers.py +453 -0
- regscale/integrations/commercial/tenablev2/cis_scanner.py +447 -0
- regscale/integrations/commercial/tenablev2/commands.py +146 -5
- regscale/integrations/commercial/tenablev2/scanner.py +1 -3
- regscale/integrations/commercial/tenablev2/stig_parsers.py +113 -57
- regscale/integrations/commercial/wizv2/WizDataMixin.py +1 -1
- regscale/integrations/commercial/wizv2/click.py +191 -76
- regscale/integrations/commercial/wizv2/compliance/__init__.py +15 -0
- regscale/integrations/commercial/wizv2/{policy_compliance_helpers.py → compliance/helpers.py} +78 -60
- regscale/integrations/commercial/wizv2/compliance_report.py +1592 -0
- regscale/integrations/commercial/wizv2/core/__init__.py +133 -0
- regscale/integrations/commercial/wizv2/{async_client.py → core/client.py} +7 -3
- regscale/integrations/commercial/wizv2/{constants.py → core/constants.py} +92 -89
- regscale/integrations/commercial/wizv2/core/file_operations.py +237 -0
- regscale/integrations/commercial/wizv2/fetchers/__init__.py +11 -0
- regscale/integrations/commercial/wizv2/{data_fetcher.py → fetchers/policy_assessment.py} +66 -9
- regscale/integrations/commercial/wizv2/file_cleanup.py +104 -0
- regscale/integrations/commercial/wizv2/issue.py +776 -28
- regscale/integrations/commercial/wizv2/models/__init__.py +0 -0
- regscale/integrations/commercial/wizv2/parsers/__init__.py +34 -0
- regscale/integrations/commercial/wizv2/{parsers.py → parsers/main.py} +1 -1
- regscale/integrations/commercial/wizv2/processors/__init__.py +11 -0
- regscale/integrations/commercial/wizv2/{finding_processor.py → processors/finding.py} +1 -1
- regscale/integrations/commercial/wizv2/reports.py +243 -0
- regscale/integrations/commercial/wizv2/sbom.py +1 -1
- regscale/integrations/commercial/wizv2/scanner.py +1031 -441
- regscale/integrations/commercial/wizv2/utils/__init__.py +48 -0
- regscale/integrations/commercial/wizv2/{utils.py → utils/main.py} +116 -61
- regscale/integrations/commercial/wizv2/variables.py +89 -3
- regscale/integrations/compliance_integration.py +1036 -151
- regscale/integrations/control_matcher.py +432 -0
- regscale/integrations/due_date_handler.py +333 -0
- regscale/integrations/milestone_manager.py +291 -0
- regscale/integrations/public/__init__.py +14 -0
- regscale/integrations/public/cci_importer.py +834 -0
- regscale/integrations/public/csam/__init__.py +0 -0
- regscale/integrations/public/csam/csam.py +938 -0
- regscale/integrations/public/csam/csam_agency_defined.py +179 -0
- regscale/integrations/public/csam/csam_common.py +154 -0
- regscale/integrations/public/csam/csam_controls.py +432 -0
- regscale/integrations/public/csam/csam_poam.py +124 -0
- regscale/integrations/public/fedramp/click.py +77 -6
- regscale/integrations/public/fedramp/docx_parser.py +10 -1
- regscale/integrations/public/fedramp/fedramp_cis_crm.py +675 -289
- regscale/integrations/public/fedramp/fedramp_five.py +1 -1
- regscale/integrations/public/fedramp/poam/scanner.py +75 -7
- regscale/integrations/public/fedramp/poam_export_v5.py +888 -0
- regscale/integrations/scanner_integration.py +1961 -430
- regscale/models/integration_models/CCI_List.xml +1 -0
- regscale/models/integration_models/aqua.py +2 -2
- regscale/models/integration_models/cisa_kev_data.json +805 -11
- regscale/models/integration_models/flat_file_importer/__init__.py +5 -8
- regscale/models/integration_models/nexpose.py +36 -10
- regscale/models/integration_models/qualys.py +3 -4
- regscale/models/integration_models/synqly_models/capabilities.json +1 -1
- regscale/models/integration_models/synqly_models/connectors/vulnerabilities.py +87 -18
- regscale/models/integration_models/synqly_models/filter_parser.py +332 -0
- regscale/models/integration_models/synqly_models/ocsf_mapper.py +124 -25
- regscale/models/integration_models/synqly_models/synqly_model.py +89 -16
- regscale/models/locking.py +12 -8
- regscale/models/platform.py +4 -2
- regscale/models/regscale_models/__init__.py +7 -0
- regscale/models/regscale_models/assessment.py +2 -1
- regscale/models/regscale_models/catalog.py +1 -1
- regscale/models/regscale_models/compliance_settings.py +251 -1
- regscale/models/regscale_models/component.py +1 -0
- regscale/models/regscale_models/control_implementation.py +236 -41
- regscale/models/regscale_models/control_objective.py +74 -5
- regscale/models/regscale_models/file.py +2 -0
- regscale/models/regscale_models/form_field_value.py +5 -3
- regscale/models/regscale_models/inheritance.py +44 -0
- regscale/models/regscale_models/issue.py +301 -102
- regscale/models/regscale_models/milestone.py +33 -14
- regscale/models/regscale_models/organization.py +3 -0
- regscale/models/regscale_models/regscale_model.py +310 -73
- regscale/models/regscale_models/security_plan.py +4 -2
- regscale/models/regscale_models/vulnerability.py +3 -3
- regscale/regscale.py +25 -4
- regscale/templates/__init__.py +0 -0
- regscale/utils/threading/threadhandler.py +20 -15
- regscale/validation/record.py +23 -1
- {regscale_cli-6.21.2.0.dist-info → regscale_cli-6.28.2.1.dist-info}/METADATA +17 -33
- {regscale_cli-6.21.2.0.dist-info → regscale_cli-6.28.2.1.dist-info}/RECORD +310 -111
- tests/core/__init__.py +0 -0
- tests/core/utils/__init__.py +0 -0
- tests/core/utils/test_async_graphql_client.py +472 -0
- tests/fixtures/test_fixture.py +13 -8
- tests/regscale/core/test_login.py +171 -4
- tests/regscale/integrations/commercial/__init__.py +0 -0
- tests/regscale/integrations/commercial/aws/__init__.py +0 -0
- tests/regscale/integrations/commercial/aws/test_audit_manager_compliance.py +1304 -0
- tests/regscale/integrations/commercial/aws/test_audit_manager_evidence_aggregation.py +341 -0
- tests/regscale/integrations/commercial/aws/test_aws_analytics_collector.py +260 -0
- tests/regscale/integrations/commercial/aws/test_aws_applications_collector.py +242 -0
- tests/regscale/integrations/commercial/aws/test_aws_audit_manager_collector.py +1155 -0
- tests/regscale/integrations/commercial/aws/test_aws_cloudtrail_collector.py +534 -0
- tests/regscale/integrations/commercial/aws/test_aws_config_collector.py +400 -0
- tests/regscale/integrations/commercial/aws/test_aws_developer_tools_collector.py +203 -0
- tests/regscale/integrations/commercial/aws/test_aws_guardduty_collector.py +315 -0
- tests/regscale/integrations/commercial/aws/test_aws_iam_collector.py +458 -0
- tests/regscale/integrations/commercial/aws/test_aws_inspector_collector.py +353 -0
- tests/regscale/integrations/commercial/aws/test_aws_inventory_integration.py +530 -0
- tests/regscale/integrations/commercial/aws/test_aws_kms_collector.py +919 -0
- tests/regscale/integrations/commercial/aws/test_aws_machine_learning_collector.py +237 -0
- tests/regscale/integrations/commercial/aws/test_aws_s3_collector.py +722 -0
- tests/regscale/integrations/commercial/aws/test_aws_scanner_integration.py +722 -0
- tests/regscale/integrations/commercial/aws/test_aws_securityhub_collector.py +792 -0
- tests/regscale/integrations/commercial/aws/test_aws_systems_manager_collector.py +918 -0
- tests/regscale/integrations/commercial/aws/test_aws_vpc_collector.py +996 -0
- tests/regscale/integrations/commercial/aws/test_cli_evidence.py +431 -0
- tests/regscale/integrations/commercial/aws/test_cloudtrail_control_mappings.py +452 -0
- tests/regscale/integrations/commercial/aws/test_cloudtrail_evidence.py +788 -0
- tests/regscale/integrations/commercial/aws/test_config_compliance.py +298 -0
- tests/regscale/integrations/commercial/aws/test_conformance_pack_mappings.py +200 -0
- tests/regscale/integrations/commercial/aws/test_control_compliance_analyzer.py +375 -0
- tests/regscale/integrations/commercial/aws/test_datetime_parsing.py +223 -0
- tests/regscale/integrations/commercial/aws/test_evidence_generator.py +386 -0
- tests/regscale/integrations/commercial/aws/test_guardduty_control_mappings.py +564 -0
- tests/regscale/integrations/commercial/aws/test_guardduty_evidence.py +1041 -0
- tests/regscale/integrations/commercial/aws/test_iam_control_mappings.py +718 -0
- tests/regscale/integrations/commercial/aws/test_iam_evidence.py +1375 -0
- tests/regscale/integrations/commercial/aws/test_kms_control_mappings.py +656 -0
- tests/regscale/integrations/commercial/aws/test_kms_evidence.py +1163 -0
- tests/regscale/integrations/commercial/aws/test_ocsf_mapper.py +370 -0
- tests/regscale/integrations/commercial/aws/test_org_control_mappings.py +546 -0
- tests/regscale/integrations/commercial/aws/test_org_evidence.py +1240 -0
- tests/regscale/integrations/commercial/aws/test_s3_control_mappings.py +672 -0
- tests/regscale/integrations/commercial/aws/test_s3_evidence.py +987 -0
- tests/regscale/integrations/commercial/aws/test_scanner_evidence.py +373 -0
- tests/regscale/integrations/commercial/aws/test_security_hub_config_filtering.py +539 -0
- tests/regscale/integrations/commercial/aws/test_session_manager.py +516 -0
- tests/regscale/integrations/commercial/aws/test_ssm_control_mappings.py +588 -0
- tests/regscale/integrations/commercial/aws/test_ssm_evidence.py +735 -0
- tests/regscale/integrations/commercial/conftest.py +28 -0
- tests/regscale/integrations/commercial/microsoft_defender/__init__.py +1 -0
- tests/regscale/integrations/commercial/microsoft_defender/test_defender.py +1517 -0
- tests/regscale/integrations/commercial/microsoft_defender/test_defender_api.py +1748 -0
- tests/regscale/integrations/commercial/microsoft_defender/test_defender_constants.py +327 -0
- tests/regscale/integrations/commercial/microsoft_defender/test_defender_scanner.py +487 -0
- tests/regscale/integrations/commercial/test_aws.py +3742 -0
- tests/regscale/integrations/commercial/test_burp.py +48 -0
- tests/regscale/integrations/commercial/test_crowdstrike.py +49 -0
- tests/regscale/integrations/commercial/test_dependabot.py +341 -0
- tests/regscale/integrations/commercial/test_gcp.py +1543 -0
- tests/regscale/integrations/commercial/test_gitlab.py +549 -0
- tests/regscale/integrations/commercial/test_ip_mac_address_length.py +84 -0
- tests/regscale/integrations/commercial/test_jira.py +2204 -0
- tests/regscale/integrations/commercial/test_npm_audit.py +42 -0
- tests/regscale/integrations/commercial/test_okta.py +1228 -0
- tests/regscale/integrations/commercial/test_sarif_converter.py +251 -0
- tests/regscale/integrations/commercial/test_sicura.py +349 -0
- tests/regscale/integrations/commercial/test_snow.py +423 -0
- tests/regscale/integrations/commercial/test_sonarcloud.py +394 -0
- tests/regscale/integrations/commercial/test_sqlserver.py +186 -0
- tests/regscale/integrations/commercial/test_stig.py +33 -0
- tests/regscale/integrations/commercial/test_stig_mapper.py +153 -0
- tests/regscale/integrations/commercial/test_stigv2.py +406 -0
- tests/regscale/integrations/commercial/test_wiz.py +1365 -0
- tests/regscale/integrations/commercial/test_wiz_inventory.py +256 -0
- tests/regscale/integrations/commercial/wizv2/__init__.py +339 -0
- tests/regscale/integrations/commercial/wizv2/compliance/__init__.py +1 -0
- tests/regscale/integrations/commercial/wizv2/compliance/test_helpers.py +903 -0
- tests/regscale/integrations/commercial/wizv2/core/__init__.py +1 -0
- tests/regscale/integrations/commercial/wizv2/core/test_auth.py +701 -0
- tests/regscale/integrations/commercial/wizv2/core/test_client.py +1037 -0
- tests/regscale/integrations/commercial/wizv2/core/test_file_operations.py +989 -0
- tests/regscale/integrations/commercial/wizv2/fetchers/__init__.py +1 -0
- tests/regscale/integrations/commercial/wizv2/fetchers/test_policy_assessment.py +805 -0
- tests/regscale/integrations/commercial/wizv2/parsers/__init__.py +1 -0
- tests/regscale/integrations/commercial/wizv2/parsers/test_main.py +1153 -0
- tests/regscale/integrations/commercial/wizv2/processors/__init__.py +1 -0
- tests/regscale/integrations/commercial/wizv2/processors/test_finding.py +671 -0
- tests/regscale/integrations/commercial/wizv2/test_WizDataMixin.py +537 -0
- tests/regscale/integrations/commercial/wizv2/test_click_comprehensive.py +851 -0
- tests/regscale/integrations/commercial/wizv2/test_compliance_report_comprehensive.py +910 -0
- tests/regscale/integrations/commercial/wizv2/test_compliance_report_normalization.py +138 -0
- tests/regscale/integrations/commercial/wizv2/test_file_cleanup.py +283 -0
- tests/regscale/integrations/commercial/wizv2/test_file_operations.py +260 -0
- tests/regscale/integrations/commercial/wizv2/test_issue.py +343 -0
- tests/regscale/integrations/commercial/wizv2/test_issue_comprehensive.py +1203 -0
- tests/regscale/integrations/commercial/wizv2/test_reports.py +497 -0
- tests/regscale/integrations/commercial/wizv2/test_sbom.py +643 -0
- tests/regscale/integrations/commercial/wizv2/test_scanner_comprehensive.py +805 -0
- tests/regscale/integrations/commercial/wizv2/test_wiz_click_client_id.py +165 -0
- tests/regscale/integrations/commercial/wizv2/test_wiz_compliance_report.py +1394 -0
- tests/regscale/integrations/commercial/wizv2/test_wiz_compliance_unit.py +341 -0
- tests/regscale/integrations/commercial/wizv2/test_wiz_control_normalization.py +138 -0
- tests/regscale/integrations/commercial/wizv2/test_wiz_findings_comprehensive.py +364 -0
- tests/regscale/integrations/commercial/wizv2/test_wiz_inventory_comprehensive.py +644 -0
- tests/regscale/integrations/commercial/wizv2/test_wiz_status_mapping.py +149 -0
- tests/regscale/integrations/commercial/wizv2/test_wizv2.py +1218 -0
- tests/regscale/integrations/commercial/wizv2/test_wizv2_utils.py +519 -0
- tests/regscale/integrations/commercial/wizv2/utils/__init__.py +1 -0
- tests/regscale/integrations/commercial/wizv2/utils/test_main.py +1523 -0
- tests/regscale/integrations/public/__init__.py +0 -0
- tests/regscale/integrations/public/fedramp/__init__.py +1 -0
- tests/regscale/integrations/public/fedramp/test_gen_asset_list.py +150 -0
- tests/regscale/integrations/public/fedramp/test_poam_export_v5.py +1293 -0
- tests/regscale/integrations/public/test_alienvault.py +220 -0
- tests/regscale/integrations/public/test_cci.py +1053 -0
- tests/regscale/integrations/public/test_cisa.py +1021 -0
- tests/regscale/integrations/public/test_emass.py +518 -0
- tests/regscale/integrations/public/test_fedramp.py +1152 -0
- tests/regscale/integrations/public/test_fedramp_cis_crm.py +3661 -0
- tests/regscale/integrations/public/test_file_uploads.py +506 -0
- tests/regscale/integrations/public/test_oscal.py +453 -0
- tests/regscale/integrations/test_compliance_status_mapping.py +406 -0
- tests/regscale/integrations/test_control_matcher.py +1421 -0
- tests/regscale/integrations/test_control_matching.py +155 -0
- tests/regscale/integrations/test_milestone_manager.py +408 -0
- tests/regscale/models/test_control_implementation.py +118 -3
- tests/regscale/models/test_form_field_value_integration.py +304 -0
- tests/regscale/models/test_issue.py +378 -1
- tests/regscale/models/test_module_integration.py +582 -0
- tests/regscale/models/test_tenable_integrations.py +811 -105
- regscale/integrations/commercial/wizv2/policy_compliance.py +0 -3057
- regscale/integrations/public/fedramp/mappings/fedramp_r4_parts.json +0 -7388
- regscale/integrations/public/fedramp/mappings/fedramp_r5_parts.json +0 -9605
- regscale/integrations/public/fedramp/parts_mapper.py +0 -107
- /regscale/integrations/commercial/{amazon → sarif}/__init__.py +0 -0
- /regscale/integrations/commercial/wizv2/{wiz_auth.py → core/auth.py} +0 -0
- {regscale_cli-6.21.2.0.dist-info → regscale_cli-6.28.2.1.dist-info}/LICENSE +0 -0
- {regscale_cli-6.21.2.0.dist-info → regscale_cli-6.28.2.1.dist-info}/WHEEL +0 -0
- {regscale_cli-6.21.2.0.dist-info → regscale_cli-6.28.2.1.dist-info}/entry_points.txt +0 -0
- {regscale_cli-6.21.2.0.dist-info → regscale_cli-6.28.2.1.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
"""AWS Systems Manager Control Mappings for RegScale Compliance Integration."""
|
|
4
|
+
|
|
5
|
+
import logging
|
|
6
|
+
from typing import Dict, List, Optional
|
|
7
|
+
|
|
8
|
+
logger = logging.getLogger("regscale")
|
|
9
|
+
|
|
10
|
+
# NIST 800-53 R5 Control Mappings for AWS Systems Manager
|
|
11
|
+
SSM_CONTROL_MAPPINGS = {
|
|
12
|
+
"CM-2": {
|
|
13
|
+
"name": "Baseline Configuration",
|
|
14
|
+
"description": "Develop, document, and maintain baseline configurations for systems",
|
|
15
|
+
"checks": {
|
|
16
|
+
"managed_instances": {
|
|
17
|
+
"weight": 100,
|
|
18
|
+
"pass_criteria": "Managed instances are registered and reporting to Systems Manager",
|
|
19
|
+
"fail_criteria": "No managed instances or instances not reporting",
|
|
20
|
+
},
|
|
21
|
+
"inventory_collection": {
|
|
22
|
+
"weight": 90,
|
|
23
|
+
"pass_criteria": "SSM Inventory configured to collect system configuration data",
|
|
24
|
+
"fail_criteria": "SSM Inventory not configured",
|
|
25
|
+
},
|
|
26
|
+
"state_manager": {
|
|
27
|
+
"weight": 85,
|
|
28
|
+
"pass_criteria": "State Manager associations configured for baseline enforcement",
|
|
29
|
+
"fail_criteria": "No State Manager associations",
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
"CM-6": {
|
|
34
|
+
"name": "Configuration Settings",
|
|
35
|
+
"description": "Establish and document configuration settings for systems using configuration management",
|
|
36
|
+
"checks": {
|
|
37
|
+
"ssm_documents": {
|
|
38
|
+
"weight": 100,
|
|
39
|
+
"pass_criteria": "SSM Documents configured for configuration enforcement",
|
|
40
|
+
"fail_criteria": "No SSM Documents configured",
|
|
41
|
+
},
|
|
42
|
+
"parameters": {
|
|
43
|
+
"weight": 95,
|
|
44
|
+
"pass_criteria": "SSM Parameter Store used for configuration management",
|
|
45
|
+
"fail_criteria": "No parameters configured",
|
|
46
|
+
},
|
|
47
|
+
"associations": {
|
|
48
|
+
"weight": 90,
|
|
49
|
+
"pass_criteria": "Associations configured to enforce configuration settings",
|
|
50
|
+
"fail_criteria": "No associations configured",
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
"SI-2": {
|
|
55
|
+
"name": "Flaw Remediation",
|
|
56
|
+
"description": "Identify, report, and correct system flaws including patch management",
|
|
57
|
+
"checks": {
|
|
58
|
+
"patch_baselines": {
|
|
59
|
+
"weight": 100,
|
|
60
|
+
"pass_criteria": "Patch baselines configured for all operating systems",
|
|
61
|
+
"fail_criteria": "No patch baselines configured",
|
|
62
|
+
},
|
|
63
|
+
"patch_compliance": {
|
|
64
|
+
"weight": 100,
|
|
65
|
+
"pass_criteria": "Instances compliant with patch baselines",
|
|
66
|
+
"fail_criteria": "Instances missing critical patches",
|
|
67
|
+
},
|
|
68
|
+
"maintenance_windows": {
|
|
69
|
+
"weight": 85,
|
|
70
|
+
"pass_criteria": "Maintenance windows configured for patching",
|
|
71
|
+
"fail_criteria": "No maintenance windows configured",
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
"CM-3": {
|
|
76
|
+
"name": "Configuration Change Control",
|
|
77
|
+
"description": "Determine types of changes that are configuration controlled",
|
|
78
|
+
"checks": {
|
|
79
|
+
"automation_documents": {
|
|
80
|
+
"weight": 100,
|
|
81
|
+
"pass_criteria": "Automation documents for change control processes",
|
|
82
|
+
"fail_criteria": "No automation documents for change control",
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
"CM-8": {
|
|
87
|
+
"name": "System Component Inventory",
|
|
88
|
+
"description": "Develop and document an inventory of system components",
|
|
89
|
+
"checks": {
|
|
90
|
+
"inventory_data": {
|
|
91
|
+
"weight": 100,
|
|
92
|
+
"pass_criteria": "SSM Inventory collecting component data",
|
|
93
|
+
"fail_criteria": "No inventory data being collected",
|
|
94
|
+
},
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
class SSMControlMapper:
|
|
101
|
+
"""Map AWS Systems Manager configurations to compliance control status."""
|
|
102
|
+
|
|
103
|
+
def __init__(self, framework: str = "NIST800-53R5"):
|
|
104
|
+
"""
|
|
105
|
+
Initialize SSM control mapper.
|
|
106
|
+
|
|
107
|
+
:param str framework: Compliance framework
|
|
108
|
+
"""
|
|
109
|
+
self.framework = framework
|
|
110
|
+
self.mappings = SSM_CONTROL_MAPPINGS
|
|
111
|
+
|
|
112
|
+
def assess_ssm_compliance(self, ssm_data: Dict) -> Dict[str, str]:
|
|
113
|
+
"""
|
|
114
|
+
Assess Systems Manager compliance against all mapped controls.
|
|
115
|
+
|
|
116
|
+
:param Dict ssm_data: Systems Manager configuration data
|
|
117
|
+
:return: Dictionary mapping control IDs to compliance results (PASS/FAIL)
|
|
118
|
+
:rtype: Dict[str, str]
|
|
119
|
+
"""
|
|
120
|
+
results = {}
|
|
121
|
+
|
|
122
|
+
if self.framework == "NIST800-53R5":
|
|
123
|
+
results["CM-2"] = self._assess_cm2(ssm_data)
|
|
124
|
+
results["CM-6"] = self._assess_cm6(ssm_data)
|
|
125
|
+
results["SI-2"] = self._assess_si2(ssm_data)
|
|
126
|
+
results["CM-3"] = self._assess_cm3(ssm_data)
|
|
127
|
+
results["CM-8"] = self._assess_cm8(ssm_data)
|
|
128
|
+
|
|
129
|
+
return results
|
|
130
|
+
|
|
131
|
+
def _assess_cm2(self, ssm_data: Dict) -> str:
|
|
132
|
+
"""
|
|
133
|
+
Assess CM-2 (Baseline Configuration) compliance.
|
|
134
|
+
|
|
135
|
+
:param Dict ssm_data: SSM configuration data
|
|
136
|
+
:return: Compliance result (PASS/FAIL)
|
|
137
|
+
:rtype: str
|
|
138
|
+
"""
|
|
139
|
+
managed_instances = ssm_data.get("ManagedInstances", [])
|
|
140
|
+
associations = ssm_data.get("Associations", [])
|
|
141
|
+
|
|
142
|
+
# Check if managed instances exist and are reporting
|
|
143
|
+
if not managed_instances:
|
|
144
|
+
logger.debug("SSM FAILS CM-2: No managed instances registered")
|
|
145
|
+
return "FAIL"
|
|
146
|
+
|
|
147
|
+
# Check for online instances
|
|
148
|
+
online_instances = [i for i in managed_instances if i.get("PingStatus") == "Online"]
|
|
149
|
+
if not online_instances:
|
|
150
|
+
logger.debug("SSM FAILS CM-2: No online managed instances")
|
|
151
|
+
return "FAIL"
|
|
152
|
+
|
|
153
|
+
# Check for State Manager associations for baseline enforcement
|
|
154
|
+
if not associations:
|
|
155
|
+
logger.debug("SSM FAILS CM-2: No State Manager associations configured")
|
|
156
|
+
return "FAIL"
|
|
157
|
+
|
|
158
|
+
logger.debug(f"SSM PASSES CM-2: {len(online_instances)} online instances with {len(associations)} associations")
|
|
159
|
+
return "PASS"
|
|
160
|
+
|
|
161
|
+
def _assess_cm6(self, ssm_data: Dict) -> str:
|
|
162
|
+
"""
|
|
163
|
+
Assess CM-6 (Configuration Settings) compliance.
|
|
164
|
+
|
|
165
|
+
:param Dict ssm_data: SSM configuration data
|
|
166
|
+
:return: Compliance result (PASS/FAIL)
|
|
167
|
+
:rtype: str
|
|
168
|
+
"""
|
|
169
|
+
documents = ssm_data.get("Documents", [])
|
|
170
|
+
parameters = ssm_data.get("Parameters", [])
|
|
171
|
+
associations = ssm_data.get("Associations", [])
|
|
172
|
+
|
|
173
|
+
# Check for SSM Documents for configuration enforcement
|
|
174
|
+
if not documents:
|
|
175
|
+
logger.debug("SSM FAILS CM-6: No SSM Documents configured")
|
|
176
|
+
return "FAIL"
|
|
177
|
+
|
|
178
|
+
# Check for Parameter Store usage
|
|
179
|
+
if not parameters:
|
|
180
|
+
logger.debug("SSM FAILS CM-6: No SSM parameters configured")
|
|
181
|
+
return "FAIL"
|
|
182
|
+
|
|
183
|
+
# Check for associations to enforce configuration
|
|
184
|
+
if not associations:
|
|
185
|
+
logger.debug("SSM FAILS CM-6: No associations configured for configuration enforcement")
|
|
186
|
+
return "FAIL"
|
|
187
|
+
|
|
188
|
+
logger.debug(f"SSM PASSES CM-6: {len(documents)} documents, {len(parameters)} parameters configured")
|
|
189
|
+
return "PASS"
|
|
190
|
+
|
|
191
|
+
def _assess_si2(self, ssm_data: Dict) -> str:
|
|
192
|
+
"""
|
|
193
|
+
Assess SI-2 (Flaw Remediation / Patch Management) compliance.
|
|
194
|
+
|
|
195
|
+
:param Dict ssm_data: SSM configuration data
|
|
196
|
+
:return: Compliance result (PASS/FAIL)
|
|
197
|
+
:rtype: str
|
|
198
|
+
"""
|
|
199
|
+
patch_baselines = ssm_data.get("PatchBaselines", [])
|
|
200
|
+
managed_instances = ssm_data.get("ManagedInstances", [])
|
|
201
|
+
maintenance_windows = ssm_data.get("MaintenanceWindows", [])
|
|
202
|
+
|
|
203
|
+
# Check for patch baselines
|
|
204
|
+
if not patch_baselines:
|
|
205
|
+
logger.debug("SSM FAILS SI-2: No patch baselines configured")
|
|
206
|
+
return "FAIL"
|
|
207
|
+
|
|
208
|
+
# Check patch compliance on instances
|
|
209
|
+
if managed_instances:
|
|
210
|
+
instances_with_patches = [i for i in managed_instances if i.get("PatchSummary")]
|
|
211
|
+
if not instances_with_patches:
|
|
212
|
+
logger.debug("SSM FAILS SI-2: No patch data available for managed instances")
|
|
213
|
+
return "FAIL"
|
|
214
|
+
|
|
215
|
+
# Check for missing patches
|
|
216
|
+
total_missing = sum(i.get("PatchSummary", {}).get("Missing", 0) for i in instances_with_patches)
|
|
217
|
+
if total_missing > 0:
|
|
218
|
+
logger.debug(f"SSM FAILS SI-2: {total_missing} missing patches across managed instances")
|
|
219
|
+
return "FAIL"
|
|
220
|
+
|
|
221
|
+
# Check for maintenance windows (recommended but not required)
|
|
222
|
+
if not maintenance_windows:
|
|
223
|
+
logger.debug("SSM PASSES SI-2: Patch baselines configured (maintenance windows recommended)")
|
|
224
|
+
else:
|
|
225
|
+
logger.debug(
|
|
226
|
+
f"SSM PASSES SI-2: {len(patch_baselines)} baselines, {len(maintenance_windows)} maintenance windows"
|
|
227
|
+
)
|
|
228
|
+
|
|
229
|
+
return "PASS"
|
|
230
|
+
|
|
231
|
+
def _assess_cm3(self, ssm_data: Dict) -> str:
|
|
232
|
+
"""
|
|
233
|
+
Assess CM-3 (Configuration Change Control) compliance.
|
|
234
|
+
|
|
235
|
+
:param Dict ssm_data: SSM configuration data
|
|
236
|
+
:return: Compliance result (PASS/FAIL)
|
|
237
|
+
:rtype: str
|
|
238
|
+
"""
|
|
239
|
+
documents = ssm_data.get("Documents", [])
|
|
240
|
+
|
|
241
|
+
# Check for Automation documents for change control
|
|
242
|
+
automation_docs = [d for d in documents if d.get("DocumentType") == "Automation"]
|
|
243
|
+
|
|
244
|
+
if not automation_docs:
|
|
245
|
+
logger.debug("SSM FAILS CM-3: No Automation documents configured for change control")
|
|
246
|
+
return "FAIL"
|
|
247
|
+
|
|
248
|
+
logger.debug(f"SSM PASSES CM-3: {len(automation_docs)} Automation documents configured")
|
|
249
|
+
return "PASS"
|
|
250
|
+
|
|
251
|
+
def _assess_cm8(self, ssm_data: Dict) -> str:
|
|
252
|
+
"""
|
|
253
|
+
Assess CM-8 (System Component Inventory) compliance.
|
|
254
|
+
|
|
255
|
+
:param Dict ssm_data: SSM configuration data
|
|
256
|
+
:return: Compliance result (PASS/FAIL)
|
|
257
|
+
:rtype: str
|
|
258
|
+
"""
|
|
259
|
+
managed_instances = ssm_data.get("ManagedInstances", [])
|
|
260
|
+
|
|
261
|
+
# Check if SSM Inventory is collecting data
|
|
262
|
+
if not managed_instances:
|
|
263
|
+
logger.debug("SSM FAILS CM-8: No managed instances for inventory collection")
|
|
264
|
+
return "FAIL"
|
|
265
|
+
|
|
266
|
+
# Check if instances are reporting
|
|
267
|
+
online_instances = [i for i in managed_instances if i.get("PingStatus") == "Online"]
|
|
268
|
+
if not online_instances:
|
|
269
|
+
logger.debug("SSM FAILS CM-8: No online instances reporting inventory data")
|
|
270
|
+
return "FAIL"
|
|
271
|
+
|
|
272
|
+
logger.debug(f"SSM PASSES CM-8: {len(online_instances)} instances reporting inventory data")
|
|
273
|
+
return "PASS"
|
|
274
|
+
|
|
275
|
+
def get_control_description(self, control_id: str) -> Optional[str]:
|
|
276
|
+
"""Get human-readable description for a control."""
|
|
277
|
+
control_data = self.mappings.get(control_id)
|
|
278
|
+
if control_data:
|
|
279
|
+
return f"{control_data.get('name')}: {control_data.get('description', '')}"
|
|
280
|
+
return None
|
|
281
|
+
|
|
282
|
+
def get_mapped_controls(self) -> List[str]:
|
|
283
|
+
"""Get list of all control IDs mapped for this framework."""
|
|
284
|
+
return list(self.mappings.keys())
|
|
285
|
+
|
|
286
|
+
def get_check_details(self, control_id: str) -> Optional[Dict]:
|
|
287
|
+
"""Get detailed check criteria for a control."""
|
|
288
|
+
control_data = self.mappings.get(control_id)
|
|
289
|
+
if control_data:
|
|
290
|
+
return control_data.get("checks", {})
|
|
291
|
+
return None
|