prowler-cloud 5.13.1__py3-none-any.whl → 5.14.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.
- dashboard/__main__.py +2 -1
- dashboard/compliance/c5_azure.py +43 -0
- dashboard/compliance/fedramp_20x_ksi_low_aws.py +46 -0
- dashboard/compliance/fedramp_20x_ksi_low_azure.py +46 -0
- dashboard/compliance/fedramp_20x_ksi_low_gcp.py +46 -0
- dashboard/compliance/hipaa_gcp.py +25 -0
- dashboard/compliance/nist_csf_2_0_aws.py +24 -0
- dashboard/compliance/prowler_threatscore_kubernetes.py +28 -0
- prowler/AGENTS.md +366 -0
- prowler/CHANGELOG.md +93 -2
- prowler/__main__.py +54 -7
- prowler/compliance/aws/ens_rd2022_aws.json +1 -1
- prowler/compliance/aws/fedramp_20x_ksi_low_aws.json +347 -0
- prowler/compliance/aws/nis2_aws.json +1 -1
- prowler/compliance/aws/nist_csf_2.0_aws.json +1781 -0
- prowler/compliance/azure/c5_azure.json +9471 -0
- prowler/compliance/azure/ens_rd2022_azure.json +1 -1
- prowler/compliance/azure/fedramp_20x_ksi_low_azure.json +358 -0
- prowler/compliance/azure/nis2_azure.json +1 -1
- prowler/compliance/gcp/c5_gcp.json +9401 -0
- prowler/compliance/gcp/ens_rd2022_gcp.json +1 -1
- prowler/compliance/gcp/fedramp_20x_ksi_low_gcp.json +293 -0
- prowler/compliance/gcp/hipaa_gcp.json +415 -0
- prowler/compliance/gcp/nis2_gcp.json +1 -1
- prowler/compliance/github/cis_1.0_github.json +6 -2
- prowler/compliance/kubernetes/prowler_threatscore_kubernetes.json +1269 -0
- prowler/compliance/m365/prowler_threatscore_m365.json +6 -6
- prowler/compliance/{oci/cis_3.0_oci.json → oraclecloud/cis_3.0_oraclecloud.json} +1 -1
- prowler/config/config.py +59 -5
- prowler/config/config.yaml +3 -0
- prowler/lib/check/check.py +1 -9
- prowler/lib/check/checks_loader.py +65 -1
- prowler/lib/check/models.py +12 -2
- prowler/lib/check/utils.py +1 -7
- prowler/lib/cli/parser.py +17 -7
- prowler/lib/mutelist/mutelist.py +15 -7
- prowler/lib/outputs/compliance/c5/c5_azure.py +92 -0
- prowler/lib/outputs/compliance/c5/c5_gcp.py +92 -0
- prowler/lib/outputs/compliance/c5/models.py +54 -0
- prowler/lib/outputs/compliance/cis/{cis_oci.py → cis_oraclecloud.py} +7 -7
- prowler/lib/outputs/compliance/cis/models.py +3 -3
- prowler/lib/outputs/compliance/prowler_threatscore/models.py +29 -0
- prowler/lib/outputs/compliance/prowler_threatscore/prowler_threatscore_kubernetes.py +98 -0
- prowler/lib/outputs/finding.py +16 -5
- prowler/lib/outputs/html/html.py +10 -8
- prowler/lib/outputs/outputs.py +1 -1
- prowler/lib/outputs/summary_table.py +1 -1
- prowler/lib/powershell/powershell.py +12 -11
- prowler/lib/scan/scan.py +105 -24
- prowler/lib/utils/utils.py +1 -1
- prowler/providers/aws/aws_regions_by_service.json +73 -15
- prowler/providers/aws/lib/quick_inventory/quick_inventory.py +1 -1
- prowler/providers/aws/lib/security_hub/security_hub.py +1 -1
- prowler/providers/aws/services/account/account_service.py +1 -1
- prowler/providers/aws/services/awslambda/awslambda_function_using_supported_runtimes/awslambda_function_using_supported_runtimes.metadata.json +1 -3
- prowler/providers/aws/services/cloudwatch/cloudwatch_alarm_actions_alarm_state_configured/cloudwatch_alarm_actions_alarm_state_configured.metadata.json +23 -12
- prowler/providers/aws/services/cloudwatch/cloudwatch_alarm_actions_enabled/cloudwatch_alarm_actions_enabled.metadata.json +21 -12
- prowler/providers/aws/services/cloudwatch/cloudwatch_changes_to_network_acls_alarm_configured/cloudwatch_changes_to_network_acls_alarm_configured.metadata.json +23 -12
- prowler/providers/aws/services/cloudwatch/cloudwatch_changes_to_network_gateways_alarm_configured/cloudwatch_changes_to_network_gateways_alarm_configured.metadata.json +24 -12
- prowler/providers/aws/services/cloudwatch/cloudwatch_changes_to_network_route_tables_alarm_configured/cloudwatch_changes_to_network_route_tables_alarm_configured.metadata.json +21 -12
- prowler/providers/aws/services/cloudwatch/cloudwatch_changes_to_vpcs_alarm_configured/cloudwatch_changes_to_vpcs_alarm_configured.metadata.json +17 -11
- prowler/providers/aws/services/cloudwatch/cloudwatch_cross_account_sharing_disabled/cloudwatch_cross_account_sharing_disabled.metadata.json +20 -12
- prowler/providers/aws/services/cloudwatch/cloudwatch_log_group_kms_encryption_enabled/cloudwatch_log_group_kms_encryption_enabled.metadata.json +22 -13
- prowler/providers/aws/services/cloudwatch/cloudwatch_log_group_no_secrets_in_logs/cloudwatch_log_group_no_secrets_in_logs.metadata.json +22 -17
- prowler/providers/aws/services/cloudwatch/cloudwatch_log_group_not_publicly_accessible/cloudwatch_log_group_not_publicly_accessible.metadata.json +18 -12
- prowler/providers/aws/services/cloudwatch/cloudwatch_log_group_retention_policy_specific_days_enabled/cloudwatch_log_group_retention_policy_specific_days_enabled.metadata.json +27 -13
- prowler/providers/aws/services/cloudwatch/cloudwatch_log_metric_filter_and_alarm_for_aws_config_configuration_changes_enabled/cloudwatch_log_metric_filter_and_alarm_for_aws_config_configuration_changes_enabled.metadata.json +20 -12
- prowler/providers/aws/services/cloudwatch/cloudwatch_log_metric_filter_and_alarm_for_cloudtrail_configuration_changes_enabled/cloudwatch_log_metric_filter_and_alarm_for_cloudtrail_configuration_changes_enabled.metadata.json +22 -12
- prowler/providers/aws/services/cloudwatch/cloudwatch_log_metric_filter_authentication_failures/cloudwatch_log_metric_filter_authentication_failures.metadata.json +25 -12
- prowler/providers/aws/services/cloudwatch/cloudwatch_log_metric_filter_aws_organizations_changes/cloudwatch_log_metric_filter_aws_organizations_changes.metadata.json +23 -12
- prowler/providers/aws/services/cloudwatch/cloudwatch_log_metric_filter_disable_or_scheduled_deletion_of_kms_cmk/cloudwatch_log_metric_filter_disable_or_scheduled_deletion_of_kms_cmk.metadata.json +17 -12
- prowler/providers/aws/services/cloudwatch/cloudwatch_log_metric_filter_for_s3_bucket_policy_changes/cloudwatch_log_metric_filter_for_s3_bucket_policy_changes.metadata.json +21 -12
- prowler/providers/aws/services/cloudwatch/cloudwatch_log_metric_filter_policy_changes/cloudwatch_log_metric_filter_policy_changes.metadata.json +21 -12
- prowler/providers/aws/services/cloudwatch/cloudwatch_log_metric_filter_root_usage/cloudwatch_log_metric_filter_root_usage.metadata.json +27 -12
- prowler/providers/aws/services/cloudwatch/cloudwatch_log_metric_filter_security_group_changes/cloudwatch_log_metric_filter_security_group_changes.metadata.json +22 -12
- prowler/providers/aws/services/cloudwatch/cloudwatch_log_metric_filter_sign_in_without_mfa/cloudwatch_log_metric_filter_sign_in_without_mfa.metadata.json +26 -12
- prowler/providers/aws/services/cloudwatch/cloudwatch_log_metric_filter_unauthorized_api_calls/cloudwatch_log_metric_filter_unauthorized_api_calls.metadata.json +25 -12
- prowler/providers/aws/services/codeartifact/codeartifact_packages_external_public_publishing_disabled/codeartifact_packages_external_public_publishing_disabled.metadata.json +20 -11
- prowler/providers/aws/services/codebuild/codebuild_project_logging_enabled/codebuild_project_logging_enabled.metadata.json +22 -12
- prowler/providers/aws/services/codebuild/codebuild_project_no_secrets_in_variables/codebuild_project_no_secrets_in_variables.metadata.json +28 -12
- prowler/providers/aws/services/codebuild/codebuild_project_not_publicly_accessible/codebuild_project_not_publicly_accessible.metadata.json +22 -12
- prowler/providers/aws/services/codebuild/codebuild_project_older_90_days/codebuild_project_older_90_days.metadata.json +15 -10
- prowler/providers/aws/services/codebuild/codebuild_project_s3_logs_encrypted/codebuild_project_s3_logs_encrypted.metadata.json +19 -11
- prowler/providers/aws/services/codebuild/codebuild_project_source_repo_url_no_sensitive_credentials/codebuild_project_source_repo_url_no_sensitive_credentials.metadata.json +21 -12
- prowler/providers/aws/services/codebuild/codebuild_project_user_controlled_buildspec/codebuild_project_user_controlled_buildspec.metadata.json +19 -12
- prowler/providers/aws/services/codebuild/codebuild_project_uses_allowed_github_organizations/codebuild_project_uses_allowed_github_organizations.metadata.json +24 -13
- prowler/providers/aws/services/codebuild/codebuild_report_group_export_encrypted/codebuild_report_group_export_encrypted.metadata.json +35 -13
- prowler/providers/aws/services/codepipeline/__init__.py +0 -0
- prowler/providers/aws/services/codepipeline/codepipeline_client.py +6 -0
- prowler/providers/aws/services/codepipeline/codepipeline_project_repo_private/__init__.py +0 -0
- prowler/providers/aws/services/codepipeline/codepipeline_project_repo_private/codepipeline_project_repo_private.metadata.json +30 -0
- prowler/providers/aws/services/codepipeline/codepipeline_project_repo_private/codepipeline_project_repo_private.py +95 -0
- prowler/providers/aws/services/codepipeline/codepipeline_service.py +164 -0
- prowler/providers/aws/services/directconnect/directconnect_connection_redundancy/directconnect_connection_redundancy.metadata.json +18 -12
- prowler/providers/aws/services/directconnect/directconnect_virtual_interface_redundancy/directconnect_virtual_interface_redundancy.metadata.json +18 -12
- prowler/providers/aws/services/documentdb/documentdb_cluster_backup_enabled/documentdb_cluster_backup_enabled.metadata.json +24 -13
- prowler/providers/aws/services/documentdb/documentdb_cluster_cloudwatch_log_export/documentdb_cluster_cloudwatch_log_export.metadata.json +23 -13
- prowler/providers/aws/services/documentdb/documentdb_cluster_deletion_protection/documentdb_cluster_deletion_protection.metadata.json +24 -13
- prowler/providers/aws/services/documentdb/documentdb_cluster_multi_az_enabled/documentdb_cluster_multi_az_enabled.metadata.json +19 -13
- prowler/providers/aws/services/documentdb/documentdb_cluster_public_snapshot/documentdb_cluster_public_snapshot.metadata.json +20 -10
- prowler/providers/aws/services/documentdb/documentdb_cluster_storage_encrypted/documentdb_cluster_storage_encrypted.metadata.json +26 -13
- prowler/providers/aws/services/drs/drs_job_exist/drs_job_exist.metadata.json +20 -10
- prowler/providers/aws/services/dynamodb/dynamodb_accelerator_cluster_encryption_enabled/dynamodb_accelerator_cluster_encryption_enabled.metadata.json +18 -11
- prowler/providers/aws/services/dynamodb/dynamodb_accelerator_cluster_in_transit_encryption_enabled/dynamodb_accelerator_cluster_in_transit_encryption_enabled.metadata.json +16 -11
- prowler/providers/aws/services/dynamodb/dynamodb_accelerator_cluster_multi_az/dynamodb_accelerator_cluster_multi_az.metadata.json +21 -13
- prowler/providers/aws/services/dynamodb/dynamodb_table_autoscaling_enabled/dynamodb_table_autoscaling_enabled.metadata.json +20 -12
- prowler/providers/aws/services/dynamodb/dynamodb_table_cross_account_access/dynamodb_table_cross_account_access.metadata.json +17 -10
- prowler/providers/aws/services/dynamodb/dynamodb_table_deletion_protection_enabled/dynamodb_table_deletion_protection_enabled.metadata.json +21 -13
- prowler/providers/aws/services/dynamodb/dynamodb_table_protected_by_backup_plan/dynamodb_table_protected_by_backup_plan.metadata.json +18 -12
- prowler/providers/aws/services/dynamodb/dynamodb_tables_kms_cmk_encryption_enabled/dynamodb_tables_kms_cmk_encryption_enabled.metadata.json +18 -12
- prowler/providers/aws/services/dynamodb/dynamodb_tables_pitr_enabled/dynamodb_tables_pitr_enabled.metadata.json +19 -12
- prowler/providers/aws/services/ecr/ecr_registry_scan_images_on_push_enabled/ecr_registry_scan_images_on_push_enabled.metadata.json +16 -11
- prowler/providers/aws/services/ecr/ecr_repositories_lifecycle_policy_enabled/ecr_repositories_lifecycle_policy_enabled.metadata.json +22 -13
- prowler/providers/aws/services/ecr/ecr_repositories_not_publicly_accessible/ecr_repositories_not_publicly_accessible.metadata.json +19 -13
- prowler/providers/aws/services/ecr/ecr_repositories_scan_images_on_push_enabled/ecr_repositories_scan_images_on_push_enabled.metadata.json +21 -13
- prowler/providers/aws/services/ecr/ecr_repositories_scan_vulnerabilities_in_latest_image/ecr_repositories_scan_vulnerabilities_in_latest_image.metadata.json +22 -12
- prowler/providers/aws/services/ecr/ecr_repositories_tag_immutability/ecr_repositories_tag_immutability.metadata.json +20 -12
- prowler/providers/aws/services/ecs/ecs_cluster_container_insights_enabled/ecs_cluster_container_insights_enabled.metadata.json +21 -11
- prowler/providers/aws/services/ecs/ecs_service_fargate_latest_platform_version/ecs_service_fargate_latest_platform_version.metadata.json +20 -11
- prowler/providers/aws/services/ecs/ecs_service_no_assign_public_ip/ecs_service_no_assign_public_ip.metadata.json +18 -12
- prowler/providers/aws/services/ecs/ecs_task_definitions_containers_readonly_access/ecs_task_definitions_containers_readonly_access.metadata.json +20 -13
- prowler/providers/aws/services/ecs/ecs_task_definitions_host_namespace_not_shared/ecs_task_definitions_host_namespace_not_shared.metadata.json +21 -13
- prowler/providers/aws/services/ecs/ecs_task_definitions_host_networking_mode_users/ecs_task_definitions_host_networking_mode_users.metadata.json +26 -13
- prowler/providers/aws/services/ecs/ecs_task_definitions_logging_block_mode/ecs_task_definitions_logging_block_mode.metadata.json +19 -12
- prowler/providers/aws/services/ecs/ecs_task_definitions_logging_enabled/ecs_task_definitions_logging_enabled.metadata.json +18 -12
- prowler/providers/aws/services/ecs/ecs_task_definitions_no_environment_secrets/ecs_task_definitions_no_environment_secrets.metadata.json +16 -12
- prowler/providers/aws/services/ecs/ecs_task_definitions_no_privileged_containers/ecs_task_definitions_no_privileged_containers.metadata.json +21 -14
- prowler/providers/aws/services/ecs/ecs_task_set_no_assign_public_ip/ecs_task_set_no_assign_public_ip.metadata.json +19 -13
- prowler/providers/aws/services/eks/eks_cluster_deletion_protection_enabled/eks_cluster_deletion_protection_enabled.metadata.json +20 -13
- prowler/providers/aws/services/eks/eks_cluster_kms_cmk_encryption_in_secrets_enabled/eks_cluster_kms_cmk_encryption_in_secrets_enabled.metadata.json +20 -13
- prowler/providers/aws/services/eks/eks_cluster_network_policy_enabled/eks_cluster_network_policy_enabled.metadata.json +20 -14
- prowler/providers/aws/services/eks/eks_cluster_not_publicly_accessible/eks_cluster_not_publicly_accessible.metadata.json +22 -13
- prowler/providers/aws/services/eks/eks_cluster_private_nodes_enabled/eks_cluster_private_nodes_enabled.metadata.json +19 -13
- prowler/providers/aws/services/eks/eks_cluster_uses_a_supported_version/eks_cluster_uses_a_supported_version.metadata.json +21 -12
- prowler/providers/aws/services/eks/eks_control_plane_logging_all_types_enabled/eks_control_plane_logging_all_types_enabled.metadata.json +20 -13
- prowler/providers/aws/services/elasticache/elasticache_cluster_uses_public_subnet/elasticache_cluster_uses_public_subnet.metadata.json +20 -12
- prowler/providers/aws/services/elasticache/elasticache_redis_cluster_auto_minor_version_upgrades/elasticache_redis_cluster_auto_minor_version_upgrades.metadata.json +21 -12
- prowler/providers/aws/services/elasticache/elasticache_redis_cluster_automatic_failover_enabled/elasticache_redis_cluster_automatic_failover_enabled.metadata.json +20 -13
- prowler/providers/aws/services/elasticache/elasticache_redis_cluster_backup_enabled/elasticache_redis_cluster_backup_enabled.metadata.json +23 -13
- prowler/providers/aws/services/elasticache/elasticache_redis_cluster_in_transit_encryption_enabled/elasticache_redis_cluster_in_transit_encryption_enabled.metadata.json +21 -12
- prowler/providers/aws/services/elasticache/elasticache_redis_cluster_multi_az_enabled/elasticache_redis_cluster_multi_az_enabled.metadata.json +22 -14
- prowler/providers/aws/services/elasticache/elasticache_redis_cluster_rest_encryption_enabled/elasticache_redis_cluster_rest_encryption_enabled.metadata.json +20 -11
- prowler/providers/aws/services/elasticache/elasticache_redis_replication_group_auth_enabled/elasticache_redis_replication_group_auth_enabled.metadata.json +23 -13
- prowler/providers/aws/services/elasticbeanstalk/elasticbeanstalk_environment_cloudwatch_logging_enabled/elasticbeanstalk_environment_cloudwatch_logging_enabled.metadata.json +18 -12
- prowler/providers/aws/services/elasticbeanstalk/elasticbeanstalk_environment_enhanced_health_reporting/elasticbeanstalk_environment_enhanced_health_reporting.metadata.json +17 -12
- prowler/providers/aws/services/elasticbeanstalk/elasticbeanstalk_environment_managed_updates_enabled/elasticbeanstalk_environment_managed_updates_enabled.metadata.json +17 -11
- prowler/providers/aws/services/elb/elb_connection_draining_enabled/elb_connection_draining_enabled.metadata.json +22 -13
- prowler/providers/aws/services/elb/elb_cross_zone_load_balancing_enabled/elb_cross_zone_load_balancing_enabled.metadata.json +24 -13
- prowler/providers/aws/services/elb/elb_desync_mitigation_mode/elb_desync_mitigation_mode.metadata.json +20 -11
- prowler/providers/aws/services/elb/elb_insecure_ssl_ciphers/elb_insecure_ssl_ciphers.metadata.json +20 -10
- prowler/providers/aws/services/elb/elb_internet_facing/elb_internet_facing.metadata.json +20 -11
- prowler/providers/aws/services/elb/elb_is_in_multiple_az/elb_is_in_multiple_az.metadata.json +20 -12
- prowler/providers/aws/services/elb/elb_logging_enabled/elb_logging_enabled.metadata.json +19 -12
- prowler/providers/aws/services/elb/elb_ssl_listeners/elb_ssl_listeners.metadata.json +19 -11
- prowler/providers/aws/services/elb/elb_ssl_listeners_use_acm_certificate/elb_ssl_listeners_use_acm_certificate.metadata.json +17 -12
- prowler/providers/aws/services/elbv2/elbv2_cross_zone_load_balancing_enabled/elbv2_cross_zone_load_balancing_enabled.metadata.json +21 -13
- prowler/providers/aws/services/elbv2/elbv2_deletion_protection/elbv2_deletion_protection.metadata.json +19 -11
- prowler/providers/aws/services/elbv2/elbv2_desync_mitigation_mode/elbv2_desync_mitigation_mode.metadata.json +21 -12
- prowler/providers/aws/services/elbv2/elbv2_insecure_ssl_ciphers/elbv2_insecure_ssl_ciphers.metadata.json +18 -11
- prowler/providers/aws/services/elbv2/elbv2_internet_facing/elbv2_internet_facing.metadata.json +17 -10
- prowler/providers/aws/services/elbv2/elbv2_is_in_multiple_az/elbv2_is_in_multiple_az.metadata.json +22 -13
- prowler/providers/aws/services/elbv2/elbv2_listeners_underneath/elbv2_listeners_underneath.metadata.json +18 -12
- prowler/providers/aws/services/elbv2/elbv2_logging_enabled/elbv2_logging_enabled.metadata.json +17 -12
- prowler/providers/aws/services/elbv2/elbv2_nlb_tls_termination_enabled/elbv2_nlb_tls_termination_enabled.metadata.json +18 -11
- prowler/providers/aws/services/elbv2/elbv2_ssl_listeners/elbv2_ssl_listeners.metadata.json +18 -12
- prowler/providers/aws/services/elbv2/elbv2_waf_acl_attached/elbv2_waf_acl_attached.metadata.json +16 -11
- prowler/providers/aws/services/emr/emr_cluster_account_public_block_enabled/emr_cluster_account_public_block_enabled.metadata.json +21 -13
- prowler/providers/aws/services/emr/emr_cluster_master_nodes_no_public_ip/emr_cluster_master_nodes_no_public_ip.metadata.json +24 -11
- prowler/providers/aws/services/emr/emr_cluster_publicly_accesible/emr_cluster_publicly_accesible.metadata.json +18 -11
- prowler/providers/aws/services/eventbridge/eventbridge_bus_cross_account_access/eventbridge_bus_cross_account_access.metadata.json +26 -13
- prowler/providers/aws/services/eventbridge/eventbridge_bus_exposed/eventbridge_bus_exposed.metadata.json +21 -11
- prowler/providers/aws/services/eventbridge/eventbridge_global_endpoint_event_replication_enabled/eventbridge_global_endpoint_event_replication_enabled.metadata.json +24 -13
- prowler/providers/aws/services/eventbridge/eventbridge_schema_registry_cross_account_access/eventbridge_schema_registry_cross_account_access.metadata.json +26 -14
- prowler/providers/aws/services/firehose/firehose_stream_encrypted_at_rest/firehose_stream_encrypted_at_rest.metadata.json +26 -15
- prowler/providers/aws/services/firehose/firehose_stream_encrypted_at_rest/firehose_stream_encrypted_at_rest.py +15 -16
- prowler/providers/aws/services/fms/fms_policy_compliant/fms_policy_compliant.metadata.json +23 -11
- prowler/providers/aws/services/fsx/fsx_file_system_copy_tags_to_backups_enabled/fsx_file_system_copy_tags_to_backups_enabled.metadata.json +19 -12
- prowler/providers/aws/services/fsx/fsx_file_system_copy_tags_to_volumes_enabled/fsx_file_system_copy_tags_to_volumes_enabled.metadata.json +17 -12
- prowler/providers/aws/services/fsx/fsx_windows_file_system_multi_az_enabled/fsx_windows_file_system_multi_az_enabled.metadata.json +22 -13
- prowler/providers/aws/services/glacier/glacier_vaults_policy_public_access/glacier_vaults_policy_public_access.metadata.json +21 -12
- prowler/providers/aws/services/iam/lib/policy.py +24 -16
- prowler/providers/aws/services/kinesis/kinesis_stream_data_retention_period/kinesis_stream_data_retention_period.metadata.json +21 -13
- prowler/providers/aws/services/kinesis/kinesis_stream_encrypted_at_rest/kinesis_stream_encrypted_at_rest.metadata.json +22 -13
- prowler/providers/azure/services/cosmosdb/cosmosdb_service.py +7 -2
- prowler/providers/azure/services/defender/defender_service.py +4 -2
- prowler/providers/azure/services/postgresql/postgresql_flexible_server_entra_id_authentication_enabled/__init__.py +0 -0
- prowler/providers/azure/services/postgresql/postgresql_flexible_server_entra_id_authentication_enabled/postgresql_flexible_server_entra_id_authentication_enabled.metadata.json +36 -0
- prowler/providers/azure/services/postgresql/postgresql_flexible_server_entra_id_authentication_enabled/postgresql_flexible_server_entra_id_authentication_enabled.py +43 -0
- prowler/providers/azure/services/postgresql/postgresql_service.py +66 -9
- prowler/providers/azure/services/storage/storage_service.py +13 -4
- prowler/providers/azure/services/vm/vm_service.py +4 -7
- prowler/providers/common/arguments.py +19 -16
- prowler/providers/common/provider.py +2 -18
- prowler/providers/gcp/services/artifacts/artifacts_container_analysis_enabled/artifacts_container_analysis_enabled.metadata.json +16 -15
- prowler/providers/gcp/services/cloudresourcemanager/cloudresourcemanager_service.py +30 -4
- prowler/providers/gcp/services/cloudstorage/cloudstorage_audit_logs_enabled/__init__.py +0 -0
- prowler/providers/gcp/services/cloudstorage/cloudstorage_audit_logs_enabled/cloudstorage_audit_logs_enabled.metadata.json +36 -0
- prowler/providers/gcp/services/cloudstorage/cloudstorage_audit_logs_enabled/cloudstorage_audit_logs_enabled.py +61 -0
- prowler/providers/gcp/services/cloudstorage/cloudstorage_bucket_log_retention_policy_lock/cloudstorage_bucket_log_retention_policy_lock.metadata.json +12 -9
- prowler/providers/gcp/services/cloudstorage/cloudstorage_bucket_log_retention_policy_lock/cloudstorage_bucket_log_retention_policy_lock.py +10 -3
- prowler/providers/gcp/services/cloudstorage/cloudstorage_bucket_logging_enabled/__init__.py +0 -0
- prowler/providers/gcp/services/cloudstorage/cloudstorage_bucket_logging_enabled/cloudstorage_bucket_logging_enabled.metadata.json +36 -0
- prowler/providers/gcp/services/cloudstorage/cloudstorage_bucket_logging_enabled/cloudstorage_bucket_logging_enabled.py +40 -0
- prowler/providers/gcp/services/cloudstorage/cloudstorage_bucket_soft_delete_enabled/__init__.py +0 -0
- prowler/providers/gcp/services/cloudstorage/cloudstorage_bucket_soft_delete_enabled/cloudstorage_bucket_soft_delete_enabled.metadata.json +36 -0
- prowler/providers/gcp/services/cloudstorage/cloudstorage_bucket_soft_delete_enabled/cloudstorage_bucket_soft_delete_enabled.py +31 -0
- prowler/providers/gcp/services/cloudstorage/cloudstorage_bucket_sufficient_retention_period/__init__.py +0 -0
- prowler/providers/gcp/services/cloudstorage/cloudstorage_bucket_sufficient_retention_period/cloudstorage_bucket_sufficient_retention_period.metadata.json +35 -0
- prowler/providers/gcp/services/cloudstorage/cloudstorage_bucket_sufficient_retention_period/cloudstorage_bucket_sufficient_retention_period.py +55 -0
- prowler/providers/gcp/services/cloudstorage/cloudstorage_bucket_versioning_enabled/__init__.py +0 -0
- prowler/providers/gcp/services/cloudstorage/cloudstorage_bucket_versioning_enabled/cloudstorage_bucket_versioning_enabled.metadata.json +36 -0
- prowler/providers/gcp/services/cloudstorage/cloudstorage_bucket_versioning_enabled/cloudstorage_bucket_versioning_enabled.py +30 -0
- prowler/providers/gcp/services/cloudstorage/cloudstorage_service.py +48 -2
- prowler/providers/github/services/organization/organization_default_repository_permission_strict/__init__.py +0 -0
- prowler/providers/github/services/organization/organization_default_repository_permission_strict/organization_default_repository_permission_strict.metadata.json +35 -0
- prowler/providers/github/services/organization/organization_default_repository_permission_strict/organization_default_repository_permission_strict.py +36 -0
- prowler/providers/github/services/organization/organization_members_mfa_required/organization_members_mfa_required.metadata.json +14 -8
- prowler/providers/github/services/organization/organization_repository_creation_limited/__init__.py +0 -0
- prowler/providers/github/services/organization/organization_repository_creation_limited/organization_repository_creation_limited.metadata.json +30 -0
- prowler/providers/github/services/organization/organization_repository_creation_limited/organization_repository_creation_limited.py +106 -0
- prowler/providers/github/services/organization/organization_service.py +84 -10
- prowler/providers/iac/iac_provider.py +279 -55
- prowler/providers/kubernetes/services/etcd/etcd_client_cert_auth/etcd_client_cert_auth.metadata.json +18 -13
- prowler/providers/kubernetes/services/etcd/etcd_no_auto_tls/etcd_no_auto_tls.metadata.json +16 -11
- prowler/providers/kubernetes/services/etcd/etcd_no_peer_auto_tls/etcd_no_peer_auto_tls.metadata.json +16 -11
- prowler/providers/kubernetes/services/etcd/etcd_peer_client_cert_auth/etcd_peer_client_cert_auth.metadata.json +18 -13
- prowler/providers/kubernetes/services/etcd/etcd_peer_tls_config/etcd_peer_tls_config.metadata.json +16 -12
- prowler/providers/kubernetes/services/etcd/etcd_tls_encryption/etcd_tls_encryption.metadata.json +16 -11
- prowler/providers/kubernetes/services/etcd/etcd_unique_ca/etcd_unique_ca.metadata.json +16 -10
- prowler/providers/m365/lib/powershell/m365_powershell.py +80 -93
- prowler/providers/m365/m365_provider.py +1 -6
- prowler/providers/m365/services/exchange/exchange_mailbox_policy_additional_storage_restricted/exchange_mailbox_policy_additional_storage_restricted.py +17 -21
- prowler/providers/m365/services/exchange/exchange_service.py +18 -12
- prowler/providers/m365/services/sharepoint/sharepoint_external_sharing_managed/sharepoint_external_sharing_managed.py +9 -7
- prowler/providers/mongodbatlas/exceptions/exceptions.py +16 -0
- prowler/providers/mongodbatlas/mongodbatlas_provider.py +15 -3
- prowler/providers/mongodbatlas/services/projects/projects_auditing_enabled/projects_auditing_enabled.metadata.json +20 -9
- prowler/providers/mongodbatlas/services/projects/projects_network_access_list_exposed_to_internet/projects_network_access_list_exposed_to_internet.metadata.json +14 -9
- prowler/providers/oraclecloud/lib/arguments/arguments.py +4 -13
- prowler/providers/oraclecloud/lib/service/service.py +3 -3
- prowler/providers/oraclecloud/{oci_provider.py → oraclecloud_provider.py} +15 -15
- prowler/providers/oraclecloud/services/analytics/analytics_instance_access_restricted/analytics_instance_access_restricted.metadata.json +20 -16
- prowler/providers/oraclecloud/services/audit/audit_log_retention_period_365_days/audit_log_retention_period_365_days.metadata.json +17 -17
- prowler/providers/oraclecloud/services/blockstorage/blockstorage_block_volume_encrypted_with_cmk/blockstorage_block_volume_encrypted_with_cmk.metadata.json +17 -19
- prowler/providers/oraclecloud/services/blockstorage/blockstorage_boot_volume_encrypted_with_cmk/blockstorage_boot_volume_encrypted_with_cmk.metadata.json +18 -18
- prowler/providers/oraclecloud/services/cloudguard/cloudguard_enabled/cloudguard_enabled.metadata.json +17 -18
- prowler/providers/oraclecloud/services/compute/compute_instance_in_transit_encryption_enabled/compute_instance_in_transit_encryption_enabled.metadata.json +1 -1
- prowler/providers/oraclecloud/services/compute/compute_instance_legacy_metadata_endpoint_disabled/compute_instance_legacy_metadata_endpoint_disabled.metadata.json +1 -1
- prowler/providers/oraclecloud/services/compute/compute_instance_secure_boot_enabled/compute_instance_secure_boot_enabled.metadata.json +1 -1
- prowler/providers/oraclecloud/services/database/database_autonomous_database_access_restricted/database_autonomous_database_access_restricted.metadata.json +1 -1
- prowler/providers/oraclecloud/services/events/events_notification_topic_and_subscription_exists/events_notification_topic_and_subscription_exists.metadata.json +1 -1
- prowler/providers/oraclecloud/services/events/events_rule_cloudguard_problems/events_rule_cloudguard_problems.metadata.json +1 -1
- prowler/providers/oraclecloud/services/events/events_rule_iam_group_changes/events_rule_iam_group_changes.metadata.json +1 -1
- prowler/providers/oraclecloud/services/events/events_rule_iam_policy_changes/events_rule_iam_policy_changes.metadata.json +1 -1
- prowler/providers/oraclecloud/services/events/events_rule_identity_provider_changes/events_rule_identity_provider_changes.metadata.json +1 -1
- prowler/providers/oraclecloud/services/events/events_rule_idp_group_mapping_changes/events_rule_idp_group_mapping_changes.metadata.json +1 -1
- prowler/providers/oraclecloud/services/events/events_rule_local_user_authentication/events_rule_local_user_authentication.metadata.json +1 -1
- prowler/providers/oraclecloud/services/events/events_rule_network_gateway_changes/events_rule_network_gateway_changes.metadata.json +1 -1
- prowler/providers/oraclecloud/services/events/events_rule_network_security_group_changes/events_rule_network_security_group_changes.metadata.json +1 -1
- prowler/providers/oraclecloud/services/events/events_rule_route_table_changes/events_rule_route_table_changes.metadata.json +1 -1
- prowler/providers/oraclecloud/services/events/events_rule_security_list_changes/events_rule_security_list_changes.metadata.json +1 -1
- prowler/providers/oraclecloud/services/events/events_rule_user_changes/events_rule_user_changes.metadata.json +1 -1
- prowler/providers/oraclecloud/services/events/events_rule_vcn_changes/events_rule_vcn_changes.metadata.json +1 -1
- prowler/providers/oraclecloud/services/filestorage/filestorage_file_system_encrypted_with_cmk/filestorage_file_system_encrypted_with_cmk.metadata.json +1 -1
- prowler/providers/oraclecloud/services/identity/identity_iam_admins_cannot_update_tenancy_admins/identity_iam_admins_cannot_update_tenancy_admins.metadata.json +1 -1
- prowler/providers/oraclecloud/services/identity/identity_instance_principal_used/identity_instance_principal_used.metadata.json +1 -1
- prowler/providers/oraclecloud/services/identity/identity_no_resources_in_root_compartment/identity_no_resources_in_root_compartment.metadata.json +1 -1
- prowler/providers/oraclecloud/services/identity/identity_non_root_compartment_exists/identity_non_root_compartment_exists.metadata.json +1 -1
- prowler/providers/oraclecloud/services/identity/identity_password_policy_expires_within_365_days/identity_password_policy_expires_within_365_days.metadata.json +1 -1
- prowler/providers/oraclecloud/services/identity/identity_password_policy_minimum_length_14/identity_password_policy_minimum_length_14.metadata.json +1 -1
- prowler/providers/oraclecloud/services/identity/identity_password_policy_prevents_reuse/identity_password_policy_prevents_reuse.metadata.json +1 -1
- prowler/providers/oraclecloud/services/identity/identity_service_level_admins_exist/identity_service_level_admins_exist.metadata.json +1 -1
- prowler/providers/oraclecloud/services/identity/identity_tenancy_admin_permissions_limited/identity_tenancy_admin_permissions_limited.metadata.json +1 -1
- prowler/providers/oraclecloud/services/identity/identity_tenancy_admin_users_no_api_keys/identity_tenancy_admin_users_no_api_keys.metadata.json +1 -1
- prowler/providers/oraclecloud/services/identity/identity_user_api_keys_rotated_90_days/identity_user_api_keys_rotated_90_days.metadata.json +1 -1
- prowler/providers/oraclecloud/services/identity/identity_user_auth_tokens_rotated_90_days/identity_user_auth_tokens_rotated_90_days.metadata.json +1 -1
- prowler/providers/oraclecloud/services/identity/identity_user_customer_secret_keys_rotated_90_days/identity_user_customer_secret_keys_rotated_90_days.metadata.json +1 -1
- prowler/providers/oraclecloud/services/identity/identity_user_db_passwords_rotated_90_days/identity_user_db_passwords_rotated_90_days.metadata.json +1 -1
- prowler/providers/oraclecloud/services/identity/identity_user_mfa_enabled_console_access/identity_user_mfa_enabled_console_access.metadata.json +1 -1
- prowler/providers/oraclecloud/services/identity/identity_user_valid_email_address/identity_user_valid_email_address.metadata.json +1 -1
- prowler/providers/oraclecloud/services/integration/integration_instance_access_restricted/integration_instance_access_restricted.metadata.json +1 -1
- prowler/providers/oraclecloud/services/kms/kms_key_rotation_enabled/kms_key_rotation_enabled.metadata.json +1 -1
- prowler/providers/oraclecloud/services/network/network_default_security_list_restricts_traffic/network_default_security_list_restricts_traffic.metadata.json +1 -1
- prowler/providers/oraclecloud/services/network/network_security_group_ingress_from_internet_to_rdp_port/network_security_group_ingress_from_internet_to_rdp_port.metadata.json +1 -1
- prowler/providers/oraclecloud/services/network/network_security_group_ingress_from_internet_to_ssh_port/network_security_group_ingress_from_internet_to_ssh_port.metadata.json +1 -1
- prowler/providers/oraclecloud/services/network/network_security_list_ingress_from_internet_to_rdp_port/network_security_list_ingress_from_internet_to_rdp_port.metadata.json +1 -1
- prowler/providers/oraclecloud/services/network/network_security_list_ingress_from_internet_to_ssh_port/network_security_list_ingress_from_internet_to_ssh_port.metadata.json +1 -1
- prowler/providers/oraclecloud/services/network/network_vcn_subnet_flow_logs_enabled/network_vcn_subnet_flow_logs_enabled.metadata.json +1 -1
- prowler/providers/oraclecloud/services/objectstorage/objectstorage_bucket_encrypted_with_cmk/objectstorage_bucket_encrypted_with_cmk.metadata.json +1 -1
- prowler/providers/oraclecloud/services/objectstorage/objectstorage_bucket_logging_enabled/objectstorage_bucket_logging_enabled.metadata.json +1 -1
- prowler/providers/oraclecloud/services/objectstorage/objectstorage_bucket_not_publicly_accessible/objectstorage_bucket_not_publicly_accessible.metadata.json +1 -1
- prowler/providers/oraclecloud/services/objectstorage/objectstorage_bucket_versioning_enabled/objectstorage_bucket_versioning_enabled.metadata.json +1 -1
- {prowler_cloud-5.13.1.dist-info → prowler_cloud-5.14.1.dist-info}/METADATA +17 -16
- {prowler_cloud-5.13.1.dist-info → prowler_cloud-5.14.1.dist-info}/RECORD +298 -249
- /prowler/compliance/{oci → oraclecloud}/__init__.py +0 -0
- {prowler_cloud-5.13.1.dist-info → prowler_cloud-5.14.1.dist-info}/LICENSE +0 -0
- {prowler_cloud-5.13.1.dist-info → prowler_cloud-5.14.1.dist-info}/WHEEL +0 -0
- {prowler_cloud-5.13.1.dist-info → prowler_cloud-5.14.1.dist-info}/entry_points.txt +0 -0
prowler/lib/scan/scan.py
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import datetime
|
|
2
|
+
from datetime import timezone
|
|
2
3
|
from types import SimpleNamespace
|
|
3
4
|
from typing import Generator
|
|
4
5
|
|
|
@@ -25,6 +26,7 @@ from prowler.lib.scan.exceptions.exceptions import (
|
|
|
25
26
|
)
|
|
26
27
|
from prowler.providers.common.models import Audit_Metadata, ProviderOutputOptions
|
|
27
28
|
from prowler.providers.common.provider import Provider
|
|
29
|
+
from prowler.providers.iac.iac_provider import IacProvider
|
|
28
30
|
|
|
29
31
|
|
|
30
32
|
class Scan:
|
|
@@ -90,15 +92,25 @@ class Scan:
|
|
|
90
92
|
except ValueError:
|
|
91
93
|
raise ScanInvalidStatusError(f"Invalid status provided: {s}.")
|
|
92
94
|
|
|
93
|
-
#
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
95
|
+
# Special setup for IaC provider - override inputs to work with traditional flow
|
|
96
|
+
if provider.type == "iac":
|
|
97
|
+
# IaC doesn't use traditional Prowler checks, so clear all input parameters
|
|
98
|
+
# to avoid validation errors and let it flow through the normal logic
|
|
99
|
+
checks = None
|
|
100
|
+
services = None
|
|
101
|
+
excluded_checks = None
|
|
102
|
+
excluded_services = None
|
|
103
|
+
self._bulk_checks_metadata = {}
|
|
104
|
+
self._bulk_compliance_frameworks = {}
|
|
105
|
+
else:
|
|
106
|
+
# Load bulk compliance frameworks
|
|
107
|
+
self._bulk_compliance_frameworks = Compliance.get_bulk(provider.type)
|
|
108
|
+
# Get bulk checks metadata for the provider
|
|
109
|
+
self._bulk_checks_metadata = CheckMetadata.get_bulk(provider.type)
|
|
110
|
+
# Complete checks metadata with the compliance framework specification
|
|
111
|
+
self._bulk_checks_metadata = update_checks_metadata_with_compliance(
|
|
112
|
+
self._bulk_compliance_frameworks, self._bulk_checks_metadata
|
|
113
|
+
)
|
|
102
114
|
|
|
103
115
|
# Create a list of valid categories
|
|
104
116
|
valid_categories = set()
|
|
@@ -148,19 +160,22 @@ class Scan:
|
|
|
148
160
|
)
|
|
149
161
|
|
|
150
162
|
# Load checks to execute
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
163
|
+
if provider.type == "iac":
|
|
164
|
+
self._checks_to_execute = ["iac_scan"] # Dummy check name for IaC
|
|
165
|
+
else:
|
|
166
|
+
self._checks_to_execute = sorted(
|
|
167
|
+
load_checks_to_execute(
|
|
168
|
+
bulk_checks_metadata=self._bulk_checks_metadata,
|
|
169
|
+
bulk_compliance_frameworks=self._bulk_compliance_frameworks,
|
|
170
|
+
check_list=checks,
|
|
171
|
+
service_list=services,
|
|
172
|
+
compliance_frameworks=compliances,
|
|
173
|
+
categories=categories,
|
|
174
|
+
severities=severities,
|
|
175
|
+
provider=provider.type,
|
|
176
|
+
checks_file=None,
|
|
177
|
+
)
|
|
162
178
|
)
|
|
163
|
-
)
|
|
164
179
|
|
|
165
180
|
# Exclude checks
|
|
166
181
|
if excluded_checks:
|
|
@@ -184,9 +199,13 @@ class Scan:
|
|
|
184
199
|
|
|
185
200
|
self._number_of_checks_to_execute = len(self._checks_to_execute)
|
|
186
201
|
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
202
|
+
# Set up service-based checks tracking
|
|
203
|
+
if provider.type == "iac":
|
|
204
|
+
service_checks_to_execute = {"iac": set(["iac_scan"])}
|
|
205
|
+
else:
|
|
206
|
+
service_checks_to_execute = get_service_checks_to_execute(
|
|
207
|
+
self._checks_to_execute
|
|
208
|
+
)
|
|
190
209
|
service_checks_completed = dict()
|
|
191
210
|
|
|
192
211
|
self._service_checks_to_execute = service_checks_to_execute
|
|
@@ -245,6 +264,9 @@ class Scan:
|
|
|
245
264
|
Exception: If any other error occurs during the execution of a check.
|
|
246
265
|
"""
|
|
247
266
|
try:
|
|
267
|
+
# Initialize check_name for error handling
|
|
268
|
+
check_name = None
|
|
269
|
+
|
|
248
270
|
# Using SimpleNamespace to create a mocked object
|
|
249
271
|
arguments = SimpleNamespace()
|
|
250
272
|
|
|
@@ -266,6 +288,64 @@ class Scan:
|
|
|
266
288
|
|
|
267
289
|
start_time = datetime.datetime.now()
|
|
268
290
|
|
|
291
|
+
# Special handling for IaC provider
|
|
292
|
+
if self._provider.type == "iac":
|
|
293
|
+
# IaC provider doesn't use regular checks, it runs Trivy directly
|
|
294
|
+
if isinstance(self._provider, IacProvider):
|
|
295
|
+
logger.info("Running IaC scan with Trivy...")
|
|
296
|
+
# Run the IaC scan
|
|
297
|
+
iac_reports = self._provider.run()
|
|
298
|
+
|
|
299
|
+
# Convert IaC reports to Finding objects
|
|
300
|
+
findings = []
|
|
301
|
+
|
|
302
|
+
for report in iac_reports:
|
|
303
|
+
# Generate unique UID for the finding
|
|
304
|
+
finding_uid = f"{report.check_metadata.CheckID}-{report.resource_name}-{report.resource_line_range}"
|
|
305
|
+
|
|
306
|
+
# Convert status string to Status enum
|
|
307
|
+
status_enum = (
|
|
308
|
+
Status.FAIL if report.status == "FAIL" else Status.PASS
|
|
309
|
+
)
|
|
310
|
+
if report.muted:
|
|
311
|
+
status_enum = Status.MUTED
|
|
312
|
+
|
|
313
|
+
finding = Finding(
|
|
314
|
+
auth_method="Repository", # IaC uses repository as auth method
|
|
315
|
+
timestamp=datetime.datetime.now(timezone.utc),
|
|
316
|
+
account_uid=self._provider.scan_repository_url or "local",
|
|
317
|
+
account_name="IaC Repository",
|
|
318
|
+
metadata=report.check_metadata, # Pass the CheckMetadata object directly
|
|
319
|
+
uid=finding_uid,
|
|
320
|
+
status=status_enum,
|
|
321
|
+
status_extended=report.status_extended,
|
|
322
|
+
muted=report.muted,
|
|
323
|
+
resource_uid=report.resource_name, # For IaC, the file path is the UID
|
|
324
|
+
resource_metadata=report.resource, # The raw finding dict
|
|
325
|
+
resource_name=report.resource_name,
|
|
326
|
+
resource_details=report.resource_details,
|
|
327
|
+
resource_tags={}, # IaC doesn't have resource tags
|
|
328
|
+
region=report.region, # IaC region is the branch name
|
|
329
|
+
compliance={}, # IaC doesn't have compliance mappings yet
|
|
330
|
+
raw=report.resource, # The raw finding dict
|
|
331
|
+
)
|
|
332
|
+
findings.append(finding)
|
|
333
|
+
|
|
334
|
+
# Filter the findings by the status
|
|
335
|
+
if self._status:
|
|
336
|
+
findings = [f for f in findings if f.status in self._status]
|
|
337
|
+
|
|
338
|
+
# Update progress and yield findings
|
|
339
|
+
self._number_of_checks_completed = 1
|
|
340
|
+
self._number_of_checks_to_execute = 1
|
|
341
|
+
|
|
342
|
+
yield (100.0, findings)
|
|
343
|
+
|
|
344
|
+
# Calculate duration
|
|
345
|
+
end_time = datetime.datetime.now()
|
|
346
|
+
self._duration = int((end_time - start_time).total_seconds())
|
|
347
|
+
return
|
|
348
|
+
|
|
269
349
|
for check_name in checks_to_execute:
|
|
270
350
|
try:
|
|
271
351
|
# Recover service from check name
|
|
@@ -341,6 +421,7 @@ class Scan:
|
|
|
341
421
|
# Update the scan duration when all checks are completed
|
|
342
422
|
self._duration = int((datetime.datetime.now() - start_time).total_seconds())
|
|
343
423
|
except Exception as error:
|
|
424
|
+
check_name = check_name or "Scan error"
|
|
344
425
|
logger.error(
|
|
345
426
|
f"{check_name} - {error.__class__.__name__}[{error.__traceback__.tb_lineno}]: {error}"
|
|
346
427
|
)
|
prowler/lib/utils/utils.py
CHANGED
|
@@ -64,7 +64,7 @@ def open_file(input_file: str, mode: str = "r") -> TextIOWrapper:
|
|
|
64
64
|
except OSError as os_error:
|
|
65
65
|
if os_error.strerror == "Too many open files":
|
|
66
66
|
logger.critical(
|
|
67
|
-
"Ooops! You reached your user session maximum open files. To solve this issue, increase the shell session limit by running this command `ulimit -n 4096`. For more info visit https://docs.prowler.
|
|
67
|
+
"Ooops! You reached your user session maximum open files. To solve this issue, increase the shell session limit by running this command `ulimit -n 4096`. For more info visit https://docs.prowler.com/troubleshooting/"
|
|
68
68
|
)
|
|
69
69
|
else:
|
|
70
70
|
logger.critical(
|
|
@@ -199,6 +199,7 @@
|
|
|
199
199
|
"aws": [
|
|
200
200
|
"ap-south-1",
|
|
201
201
|
"ap-southeast-2",
|
|
202
|
+
"ca-central-1",
|
|
202
203
|
"eu-west-1",
|
|
203
204
|
"eu-west-2",
|
|
204
205
|
"us-east-1",
|
|
@@ -1211,6 +1212,7 @@
|
|
|
1211
1212
|
"b2bi": {
|
|
1212
1213
|
"regions": {
|
|
1213
1214
|
"aws": [
|
|
1215
|
+
"eu-west-1",
|
|
1214
1216
|
"us-east-1",
|
|
1215
1217
|
"us-east-2",
|
|
1216
1218
|
"us-west-2"
|
|
@@ -1452,6 +1454,23 @@
|
|
|
1452
1454
|
]
|
|
1453
1455
|
}
|
|
1454
1456
|
},
|
|
1457
|
+
"bedrock-agentcore": {
|
|
1458
|
+
"regions": {
|
|
1459
|
+
"aws": [
|
|
1460
|
+
"ap-northeast-1",
|
|
1461
|
+
"ap-south-1",
|
|
1462
|
+
"ap-southeast-1",
|
|
1463
|
+
"ap-southeast-2",
|
|
1464
|
+
"eu-central-1",
|
|
1465
|
+
"eu-west-1",
|
|
1466
|
+
"us-east-1",
|
|
1467
|
+
"us-east-2",
|
|
1468
|
+
"us-west-2"
|
|
1469
|
+
],
|
|
1470
|
+
"aws-cn": [],
|
|
1471
|
+
"aws-us-gov": []
|
|
1472
|
+
}
|
|
1473
|
+
},
|
|
1455
1474
|
"bedrock-data-automation": {
|
|
1456
1475
|
"regions": {
|
|
1457
1476
|
"aws": [
|
|
@@ -1553,6 +1572,7 @@
|
|
|
1553
1572
|
"aws": [
|
|
1554
1573
|
"af-south-1",
|
|
1555
1574
|
"ap-east-1",
|
|
1575
|
+
"ap-east-2",
|
|
1556
1576
|
"ap-northeast-1",
|
|
1557
1577
|
"ap-northeast-2",
|
|
1558
1578
|
"ap-northeast-3",
|
|
@@ -1562,6 +1582,9 @@
|
|
|
1562
1582
|
"ap-southeast-2",
|
|
1563
1583
|
"ap-southeast-3",
|
|
1564
1584
|
"ap-southeast-4",
|
|
1585
|
+
"ap-southeast-5",
|
|
1586
|
+
"ap-southeast-6",
|
|
1587
|
+
"ap-southeast-7",
|
|
1565
1588
|
"ca-central-1",
|
|
1566
1589
|
"ca-west-1",
|
|
1567
1590
|
"eu-central-1",
|
|
@@ -1575,6 +1598,7 @@
|
|
|
1575
1598
|
"il-central-1",
|
|
1576
1599
|
"me-central-1",
|
|
1577
1600
|
"me-south-1",
|
|
1601
|
+
"mx-central-1",
|
|
1578
1602
|
"sa-east-1",
|
|
1579
1603
|
"us-east-1",
|
|
1580
1604
|
"us-east-2",
|
|
@@ -2940,6 +2964,7 @@
|
|
|
2940
2964
|
"ap-southeast-3",
|
|
2941
2965
|
"ap-southeast-4",
|
|
2942
2966
|
"ap-southeast-5",
|
|
2967
|
+
"ap-southeast-6",
|
|
2943
2968
|
"ap-southeast-7",
|
|
2944
2969
|
"ca-central-1",
|
|
2945
2970
|
"ca-west-1",
|
|
@@ -2984,6 +3009,7 @@
|
|
|
2984
3009
|
"ap-southeast-3",
|
|
2985
3010
|
"ap-southeast-4",
|
|
2986
3011
|
"ap-southeast-5",
|
|
3012
|
+
"ap-southeast-6",
|
|
2987
3013
|
"ap-southeast-7",
|
|
2988
3014
|
"ca-central-1",
|
|
2989
3015
|
"ca-west-1",
|
|
@@ -3606,6 +3632,7 @@
|
|
|
3606
3632
|
"ap-northeast-1",
|
|
3607
3633
|
"ap-northeast-2",
|
|
3608
3634
|
"ap-northeast-3",
|
|
3635
|
+
"eu-central-1",
|
|
3609
3636
|
"eu-west-1",
|
|
3610
3637
|
"eu-west-2",
|
|
3611
3638
|
"eu-west-3",
|
|
@@ -4569,6 +4596,27 @@
|
|
|
4569
4596
|
"aws-us-gov": []
|
|
4570
4597
|
}
|
|
4571
4598
|
},
|
|
4599
|
+
"evs": {
|
|
4600
|
+
"regions": {
|
|
4601
|
+
"aws": [
|
|
4602
|
+
"ap-northeast-1",
|
|
4603
|
+
"ap-south-1",
|
|
4604
|
+
"ap-southeast-1",
|
|
4605
|
+
"ap-southeast-2",
|
|
4606
|
+
"ca-central-1",
|
|
4607
|
+
"eu-central-1",
|
|
4608
|
+
"eu-south-1",
|
|
4609
|
+
"eu-west-1",
|
|
4610
|
+
"eu-west-2",
|
|
4611
|
+
"eu-west-3",
|
|
4612
|
+
"us-east-1",
|
|
4613
|
+
"us-east-2",
|
|
4614
|
+
"us-west-2"
|
|
4615
|
+
],
|
|
4616
|
+
"aws-cn": [],
|
|
4617
|
+
"aws-us-gov": []
|
|
4618
|
+
}
|
|
4619
|
+
},
|
|
4572
4620
|
"fargate": {
|
|
4573
4621
|
"regions": {
|
|
4574
4622
|
"aws": [
|
|
@@ -5182,6 +5230,7 @@
|
|
|
5182
5230
|
"aws": [
|
|
5183
5231
|
"af-south-1",
|
|
5184
5232
|
"ap-east-1",
|
|
5233
|
+
"ap-east-2",
|
|
5185
5234
|
"ap-northeast-1",
|
|
5186
5235
|
"ap-northeast-2",
|
|
5187
5236
|
"ap-northeast-3",
|
|
@@ -5192,6 +5241,7 @@
|
|
|
5192
5241
|
"ap-southeast-3",
|
|
5193
5242
|
"ap-southeast-4",
|
|
5194
5243
|
"ap-southeast-5",
|
|
5244
|
+
"ap-southeast-7",
|
|
5195
5245
|
"ca-central-1",
|
|
5196
5246
|
"ca-west-1",
|
|
5197
5247
|
"eu-central-1",
|
|
@@ -6940,21 +6990,6 @@
|
|
|
6940
6990
|
"aws-us-gov": []
|
|
6941
6991
|
}
|
|
6942
6992
|
},
|
|
6943
|
-
"lookoutvision": {
|
|
6944
|
-
"regions": {
|
|
6945
|
-
"aws": [
|
|
6946
|
-
"ap-northeast-1",
|
|
6947
|
-
"ap-northeast-2",
|
|
6948
|
-
"eu-central-1",
|
|
6949
|
-
"eu-west-1",
|
|
6950
|
-
"us-east-1",
|
|
6951
|
-
"us-east-2",
|
|
6952
|
-
"us-west-2"
|
|
6953
|
-
],
|
|
6954
|
-
"aws-cn": [],
|
|
6955
|
-
"aws-us-gov": []
|
|
6956
|
-
}
|
|
6957
|
-
},
|
|
6958
6993
|
"lumberyard": {
|
|
6959
6994
|
"regions": {
|
|
6960
6995
|
"aws": [
|
|
@@ -7119,6 +7154,7 @@
|
|
|
7119
7154
|
"ap-southeast-1",
|
|
7120
7155
|
"ap-southeast-2",
|
|
7121
7156
|
"ap-southeast-3",
|
|
7157
|
+
"ap-southeast-5",
|
|
7122
7158
|
"ca-central-1",
|
|
7123
7159
|
"eu-central-1",
|
|
7124
7160
|
"eu-north-1",
|
|
@@ -7233,6 +7269,7 @@
|
|
|
7233
7269
|
"eu-west-1",
|
|
7234
7270
|
"eu-west-2",
|
|
7235
7271
|
"eu-west-3",
|
|
7272
|
+
"me-central-1",
|
|
7236
7273
|
"me-south-1",
|
|
7237
7274
|
"sa-east-1",
|
|
7238
7275
|
"us-east-1",
|
|
@@ -7706,6 +7743,7 @@
|
|
|
7706
7743
|
"ap-southeast-3",
|
|
7707
7744
|
"ap-southeast-4",
|
|
7708
7745
|
"ap-southeast-5",
|
|
7746
|
+
"ap-southeast-6",
|
|
7709
7747
|
"ap-southeast-7",
|
|
7710
7748
|
"ca-central-1",
|
|
7711
7749
|
"ca-west-1",
|
|
@@ -7863,6 +7901,7 @@
|
|
|
7863
7901
|
"ap-southeast-3",
|
|
7864
7902
|
"ap-southeast-4",
|
|
7865
7903
|
"ap-southeast-5",
|
|
7904
|
+
"ap-southeast-6",
|
|
7866
7905
|
"ap-southeast-7",
|
|
7867
7906
|
"ca-central-1",
|
|
7868
7907
|
"ca-west-1",
|
|
@@ -7924,6 +7963,7 @@
|
|
|
7924
7963
|
"aws": [
|
|
7925
7964
|
"af-south-1",
|
|
7926
7965
|
"ap-east-1",
|
|
7966
|
+
"ap-east-2",
|
|
7927
7967
|
"ap-northeast-1",
|
|
7928
7968
|
"ap-northeast-2",
|
|
7929
7969
|
"ap-northeast-3",
|
|
@@ -7934,6 +7974,8 @@
|
|
|
7934
7974
|
"ap-southeast-3",
|
|
7935
7975
|
"ap-southeast-4",
|
|
7936
7976
|
"ap-southeast-5",
|
|
7977
|
+
"ap-southeast-6",
|
|
7978
|
+
"ap-southeast-7",
|
|
7937
7979
|
"ca-central-1",
|
|
7938
7980
|
"ca-west-1",
|
|
7939
7981
|
"eu-central-1",
|
|
@@ -7947,6 +7989,7 @@
|
|
|
7947
7989
|
"il-central-1",
|
|
7948
7990
|
"me-central-1",
|
|
7949
7991
|
"me-south-1",
|
|
7992
|
+
"mx-central-1",
|
|
7950
7993
|
"sa-east-1",
|
|
7951
7994
|
"us-east-1",
|
|
7952
7995
|
"us-east-2",
|
|
@@ -8383,6 +8426,7 @@
|
|
|
8383
8426
|
"payment-cryptography": {
|
|
8384
8427
|
"regions": {
|
|
8385
8428
|
"aws": [
|
|
8429
|
+
"af-south-1",
|
|
8386
8430
|
"ap-northeast-1",
|
|
8387
8431
|
"ap-northeast-3",
|
|
8388
8432
|
"ap-south-1",
|
|
@@ -9769,6 +9813,20 @@
|
|
|
9769
9813
|
]
|
|
9770
9814
|
}
|
|
9771
9815
|
},
|
|
9816
|
+
"rtbfabric": {
|
|
9817
|
+
"regions": {
|
|
9818
|
+
"aws": [
|
|
9819
|
+
"ap-northeast-1",
|
|
9820
|
+
"ap-southeast-1",
|
|
9821
|
+
"eu-central-1",
|
|
9822
|
+
"eu-west-1",
|
|
9823
|
+
"us-east-1",
|
|
9824
|
+
"us-west-2"
|
|
9825
|
+
],
|
|
9826
|
+
"aws-cn": [],
|
|
9827
|
+
"aws-us-gov": []
|
|
9828
|
+
}
|
|
9829
|
+
},
|
|
9772
9830
|
"rum": {
|
|
9773
9831
|
"regions": {
|
|
9774
9832
|
"aws": [
|
|
@@ -297,7 +297,7 @@ def create_output(resources: list, provider: AwsProvider, args):
|
|
|
297
297
|
|
|
298
298
|
csv_file.close()
|
|
299
299
|
print(
|
|
300
|
-
f"\n{Fore.YELLOW}WARNING: Only resources that have or have had tags will appear (except for IAM and S3).\nSee more in https://docs.prowler.
|
|
300
|
+
f"\n{Fore.YELLOW}WARNING: Only resources that have or have had tags will appear (except for IAM and S3).\nSee more in https://docs.prowler.com/user-guide/cli/tutorials/quick-inventory/#objections{Style.RESET_ALL}"
|
|
301
301
|
)
|
|
302
302
|
print("\nMore details in files:")
|
|
303
303
|
print(f" - CSV: {args.output_directory}/{output_file + csv_file_suffix}")
|
|
@@ -256,7 +256,7 @@ class SecurityHub:
|
|
|
256
256
|
security_hub_client.list_enabled_products_for_import()
|
|
257
257
|
):
|
|
258
258
|
logger.warning(
|
|
259
|
-
f"Security Hub is enabled in {region} but Prowler integration does not accept findings. More info: https://docs.prowler.
|
|
259
|
+
f"Security Hub is enabled in {region} but Prowler integration does not accept findings. More info: https://docs.prowler.com/user-guide/providers/aws/securityhub#aws-security-hub-integration-with-prowler"
|
|
260
260
|
)
|
|
261
261
|
return region, None
|
|
262
262
|
else:
|
|
@@ -1,31 +1,42 @@
|
|
|
1
1
|
{
|
|
2
2
|
"Provider": "aws",
|
|
3
3
|
"CheckID": "cloudwatch_alarm_actions_alarm_state_configured",
|
|
4
|
-
"CheckTitle": "
|
|
4
|
+
"CheckTitle": "CloudWatch metric alarm has actions configured for the ALARM state",
|
|
5
5
|
"CheckType": [
|
|
6
6
|
"Software and Configuration Checks/AWS Security Best Practices"
|
|
7
7
|
],
|
|
8
8
|
"ServiceName": "cloudwatch",
|
|
9
9
|
"SubServiceName": "",
|
|
10
|
-
"ResourceIdTemplate": "
|
|
10
|
+
"ResourceIdTemplate": "",
|
|
11
11
|
"Severity": "high",
|
|
12
12
|
"ResourceType": "AwsCloudWatchAlarm",
|
|
13
|
-
"Description": "
|
|
14
|
-
"Risk": "Without an action
|
|
15
|
-
"RelatedUrl": "
|
|
13
|
+
"Description": "Amazon CloudWatch metric alarms are evaluated for **actions** configured for the `ALARM` state. The finding flags alarms that have no action to execute when their monitored metric crosses its threshold.",
|
|
14
|
+
"Risk": "Without an **ALARM action**, threshold breaches trigger no **notification** or **automated response**. This delays detection and containment, risking:\n- Availability: prolonged outages or missed scale-out\n- Integrity/confidentiality: unchecked anomalies enabling tampering or data loss",
|
|
15
|
+
"RelatedUrl": "",
|
|
16
|
+
"AdditionalURLs": [
|
|
17
|
+
"https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html#alarms-and-actions",
|
|
18
|
+
"https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/cloudwatch/client/put_metric_alarm.html",
|
|
19
|
+
"https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/cloudwatch_metric_alarm",
|
|
20
|
+
"https://docs.aws.amazon.com/securityhub/latest/userguide/cloudwatch-controls.html#cloudwatch-15",
|
|
21
|
+
"https://support.icompaas.com/support/solutions/articles/62000233431-ensure-cloudwatch-alarms-have-specified-actions-configured-for-the-alarm-state",
|
|
22
|
+
"https://www.trendmicro.com/cloudoneconformity/knowledge-base/aws/CloudWatch/cloudwatch-alarm-action.html",
|
|
23
|
+
"https://awscli.amazonaws.com/v2/documentation/api/2.0.34/reference/cloudwatch/put-metric-alarm.html"
|
|
24
|
+
],
|
|
16
25
|
"Remediation": {
|
|
17
26
|
"Code": {
|
|
18
|
-
"CLI": "aws cloudwatch put-metric-alarm --alarm-name <alarm-name> --alarm-actions <action-arn>",
|
|
19
|
-
"NativeIaC": "",
|
|
20
|
-
"Other": "
|
|
21
|
-
"Terraform": ""
|
|
27
|
+
"CLI": "aws cloudwatch put-metric-alarm --alarm-name <alarm-name> --metric-name <metric-name> --namespace <namespace> --statistic <statistic> --period <period-seconds> --evaluation-periods <evaluation-periods> --threshold <threshold> --comparison-operator <comparison-operator> --alarm-actions <action-arn>",
|
|
28
|
+
"NativeIaC": "```yaml\n# CloudFormation: add an ALARM action to a metric alarm\nResources:\n <example_resource_name>:\n Type: AWS::CloudWatch::Alarm\n Properties:\n AlarmName: <example_resource_name>\n MetricName: <metric-name>\n Namespace: <namespace>\n Statistic: Average\n Period: 60\n EvaluationPeriods: 1\n Threshold: 1\n ComparisonOperator: GreaterThanThreshold\n AlarmActions:\n - <action-arn> # CRITICAL: adds an action for ALARM state so the check passes\n```",
|
|
29
|
+
"Other": "1. Open the AWS Console and go to CloudWatch > Alarms\n2. Select the target alarm and choose Edit (or Modify alarm)\n3. In Actions, under When alarm state is ALARM, add an action (e.g., select an SNS topic or other supported action)\n4. Click Save changes",
|
|
30
|
+
"Terraform": "```hcl\n# Terraform: add an ALARM action to a metric alarm\nresource \"aws_cloudwatch_metric_alarm\" \"<example_resource_name>\" {\n alarm_name = \"<example_resource_name>\"\n metric_name = \"<metric-name>\"\n namespace = \"<namespace>\"\n statistic = \"Average\"\n period = 60\n evaluation_periods = 1\n threshold = 1\n comparison_operator = \"GreaterThanThreshold\"\n alarm_actions = [\"<action-arn>\"] # CRITICAL: ensures an action is configured for ALARM state\n}\n```"
|
|
22
31
|
},
|
|
23
32
|
"Recommendation": {
|
|
24
|
-
"Text": "
|
|
25
|
-
"Url": "https://
|
|
33
|
+
"Text": "Assign at least one **ALARM-state action** per alarm (e.g., notify via SNS or run automated remediation with Lambda/SSM). Keep actions enabled, apply **least privilege** to targets, and regularly test. *For critical metrics*, add redundant paths (EventBridge) for **defense in depth**.",
|
|
34
|
+
"Url": "https://hub.prowler.com/check/cloudwatch_alarm_actions_alarm_state_configured"
|
|
26
35
|
}
|
|
27
36
|
},
|
|
28
|
-
"Categories": [
|
|
37
|
+
"Categories": [
|
|
38
|
+
"resilience"
|
|
39
|
+
],
|
|
29
40
|
"DependsOn": [],
|
|
30
41
|
"RelatedTo": [],
|
|
31
42
|
"Notes": ""
|
|
@@ -1,31 +1,40 @@
|
|
|
1
1
|
{
|
|
2
2
|
"Provider": "aws",
|
|
3
3
|
"CheckID": "cloudwatch_alarm_actions_enabled",
|
|
4
|
-
"CheckTitle": "
|
|
4
|
+
"CheckTitle": "CloudWatch metric alarm has actions enabled",
|
|
5
5
|
"CheckType": [
|
|
6
|
-
"Software and Configuration Checks/AWS Security Best Practices"
|
|
6
|
+
"Software and Configuration Checks/AWS Security Best Practices",
|
|
7
|
+
"Industry and Regulatory Standards/AWS Foundational Security Best Practices",
|
|
8
|
+
"TTPs/Defense Evasion"
|
|
7
9
|
],
|
|
8
10
|
"ServiceName": "cloudwatch",
|
|
9
11
|
"SubServiceName": "",
|
|
10
|
-
"ResourceIdTemplate": "
|
|
12
|
+
"ResourceIdTemplate": "",
|
|
11
13
|
"Severity": "high",
|
|
12
14
|
"ResourceType": "AwsCloudWatchAlarm",
|
|
13
|
-
"Description": "
|
|
14
|
-
"Risk": "
|
|
15
|
-
"RelatedUrl": "
|
|
15
|
+
"Description": "**CloudWatch metric alarms** are evaluated for **alarm actions** activation (`actions_enabled: true`), enabling state changes to invoke configured notifications or automated responses.",
|
|
16
|
+
"Risk": "With alarm actions disabled, state changes neither notify nor remediate. Incidents can persist unnoticed, enabling unauthorized activity, configuration drift, or capacity exhaustion. Visibility drops, MTTR rises, and confidentiality, integrity, and availability are all at greater risk.",
|
|
17
|
+
"RelatedUrl": "",
|
|
18
|
+
"AdditionalURLs": [
|
|
19
|
+
"https://www.trendmicro.com/cloudoneconformity/knowledge-base/aws/CloudWatch/cloudwatch-alarm-action-activated.html",
|
|
20
|
+
"https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html#alarms-and-actions",
|
|
21
|
+
"https://docs.aws.amazon.com/securityhub/latest/userguide/cloudwatch-controls.html#cloudwatch-17"
|
|
22
|
+
],
|
|
16
23
|
"Remediation": {
|
|
17
24
|
"Code": {
|
|
18
25
|
"CLI": "aws cloudwatch enable-alarm-actions --alarm-names <alarm-name>",
|
|
19
|
-
"NativeIaC": "",
|
|
20
|
-
"Other": "
|
|
21
|
-
"Terraform": ""
|
|
26
|
+
"NativeIaC": "```yaml\nResources:\n <example_resource_name>:\n Type: AWS::CloudWatch::Alarm\n Properties:\n ActionsEnabled: true # FIX: activates alarm actions so the check passes\n ComparisonOperator: GreaterThanThreshold\n EvaluationPeriods: 1\n MetricName: <example_metric_name>\n Namespace: <example_metric_namespace>\n Period: 60\n Statistic: Average\n Threshold: 1\n```",
|
|
27
|
+
"Other": "1. Open the CloudWatch console\n2. Go to Alarms > All alarms and select the alarm\n3. Choose Actions > Alarm actions - new > Enable\n4. Confirm to activate actions",
|
|
28
|
+
"Terraform": "```hcl\nresource \"aws_cloudwatch_metric_alarm\" \"<example_resource_name>\" {\n alarm_name = \"<example_resource_name>\"\n comparison_operator = \"GreaterThanThreshold\"\n evaluation_periods = 1\n metric_name = \"<example_metric_name>\"\n namespace = \"<example_metric_namespace>\"\n period = 60\n statistic = \"Average\"\n threshold = 1\n\n actions_enabled = true # FIX: activates alarm actions so the check passes\n}\n```"
|
|
22
29
|
},
|
|
23
30
|
"Recommendation": {
|
|
24
|
-
"Text": "
|
|
25
|
-
"Url": "https://
|
|
31
|
+
"Text": "Enable `actions_enabled` on critical alarms and attach least-privilege actions (SNS, automation) for ALARM and recovery states. Use redundant targets, regularly test notifications, and integrate with incident response. Apply **defense in depth** with complementary detections to ensure timely, reliable alerting.",
|
|
32
|
+
"Url": "https://hub.prowler.com/check/cloudwatch_alarm_actions_enabled"
|
|
26
33
|
}
|
|
27
34
|
},
|
|
28
|
-
"Categories": [
|
|
35
|
+
"Categories": [
|
|
36
|
+
"resilience"
|
|
37
|
+
],
|
|
29
38
|
"DependsOn": [],
|
|
30
39
|
"RelatedTo": [],
|
|
31
40
|
"Notes": ""
|