prowler-cloud 5.13.1__py3-none-any.whl → 5.14.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +85 -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/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.0.dist-info}/METADATA +17 -16
- {prowler_cloud-5.13.1.dist-info → prowler_cloud-5.14.0.dist-info}/RECORD +295 -246
- /prowler/compliance/{oci → oraclecloud}/__init__.py +0 -0
- {prowler_cloud-5.13.1.dist-info → prowler_cloud-5.14.0.dist-info}/LICENSE +0 -0
- {prowler_cloud-5.13.1.dist-info → prowler_cloud-5.14.0.dist-info}/WHEEL +0 -0
- {prowler_cloud-5.13.1.dist-info → prowler_cloud-5.14.0.dist-info}/entry_points.txt +0 -0
|
@@ -2,11 +2,8 @@ import os
|
|
|
2
2
|
|
|
3
3
|
from prowler.lib.logger import logger
|
|
4
4
|
from prowler.lib.powershell.powershell import PowerShellSession
|
|
5
|
-
from prowler.providers.m365.exceptions.exceptions import
|
|
6
|
-
|
|
7
|
-
M365GraphConnectionError,
|
|
8
|
-
)
|
|
9
|
-
from prowler.providers.m365.lib.jwt.jwt_decoder import decode_jwt, decode_msal_token
|
|
5
|
+
from prowler.providers.m365.exceptions.exceptions import M365CertificateCreationError
|
|
6
|
+
from prowler.providers.m365.lib.jwt.jwt_decoder import decode_msal_token
|
|
10
7
|
from prowler.providers.m365.models import M365Credentials, M365IdentityInfo
|
|
11
8
|
|
|
12
9
|
|
|
@@ -123,60 +120,20 @@ class M365PowerShell(PowerShellSession):
|
|
|
123
120
|
'$graphToken = Invoke-RestMethod -Uri "https://login.microsoftonline.com/$tenantID/oauth2/v2.0/token" -Method POST -Body $graphtokenBody | Select-Object -ExpandProperty Access_Token'
|
|
124
121
|
)
|
|
125
122
|
|
|
126
|
-
def
|
|
123
|
+
def execute_connect(self, command: str) -> str:
|
|
127
124
|
"""
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
Supports testing two authentication methods:
|
|
131
|
-
1. Application authentication (client_id/client_secret)
|
|
132
|
-
2. Certificate authentication (certificate_content in base64/client_id)
|
|
125
|
+
Execute a PowerShell connect command ensuring empty responses surface as timeouts.
|
|
133
126
|
|
|
134
127
|
Args:
|
|
135
|
-
|
|
136
|
-
|
|
128
|
+
command (str): PowerShell connect command to run.
|
|
129
|
+
timeout (Optional[int]): Timeout in seconds for the command execution.
|
|
137
130
|
|
|
138
131
|
Returns:
|
|
139
|
-
|
|
132
|
+
str: Command output or 'Timeout' if the command produced no output.
|
|
140
133
|
"""
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
self.test_teams_certificate_connection() or self.test_exchange_certificate_connection()
|
|
145
|
-
return True
|
|
146
|
-
except Exception as e:
|
|
147
|
-
logger.error(f"Exchange Online Certificate connection failed: {e}")
|
|
148
|
-
|
|
149
|
-
else:
|
|
150
|
-
# Test Microsoft Graph connection
|
|
151
|
-
try:
|
|
152
|
-
logger.info("Testing Microsoft Graph connection...")
|
|
153
|
-
self.test_graph_connection()
|
|
154
|
-
logger.info("Microsoft Graph connection successful")
|
|
155
|
-
return True
|
|
156
|
-
except Exception as e:
|
|
157
|
-
logger.error(f"Microsoft Graph connection failed: {e}")
|
|
158
|
-
raise M365GraphConnectionError(
|
|
159
|
-
file=os.path.basename(__file__),
|
|
160
|
-
original_exception=e,
|
|
161
|
-
message="Check your Microsoft Application credentials and ensure the app has proper permissions",
|
|
162
|
-
)
|
|
163
|
-
|
|
164
|
-
def test_graph_connection(self) -> bool:
|
|
165
|
-
"""Test Microsoft Graph API connection and raise exception if it fails."""
|
|
166
|
-
try:
|
|
167
|
-
if self.execute("Write-Output $graphToken") == "":
|
|
168
|
-
raise M365GraphConnectionError(
|
|
169
|
-
file=os.path.basename(__file__),
|
|
170
|
-
message="Microsoft Graph token is empty or invalid.",
|
|
171
|
-
)
|
|
172
|
-
return True
|
|
173
|
-
except Exception as e:
|
|
174
|
-
logger.error(f"Microsoft Graph connection failed: {e}")
|
|
175
|
-
raise M365GraphConnectionError(
|
|
176
|
-
file=os.path.basename(__file__),
|
|
177
|
-
original_exception=e,
|
|
178
|
-
message=f"Failed to connect to Microsoft Graph API: {str(e)}",
|
|
179
|
-
)
|
|
134
|
+
connect_timeout = 15
|
|
135
|
+
result = self.execute(command, timeout=connect_timeout)
|
|
136
|
+
return result or "'execute_connect' command timeout reached"
|
|
180
137
|
|
|
181
138
|
def test_teams_connection(self) -> bool:
|
|
182
139
|
"""Test Microsoft Teams API connection and raise exception if it fails."""
|
|
@@ -184,18 +141,13 @@ class M365PowerShell(PowerShellSession):
|
|
|
184
141
|
self.execute(
|
|
185
142
|
'$teamstokenBody = @{ Grant_Type = "client_credentials"; Scope = "48ac35b8-9aa8-4d74-927d-1f4a14a0b239/.default"; Client_Id = $clientID; Client_Secret = $clientSecret }'
|
|
186
143
|
)
|
|
187
|
-
self.execute(
|
|
144
|
+
result = self.execute(
|
|
188
145
|
'$teamsToken = Invoke-RestMethod -Uri "https://login.microsoftonline.com/$tenantID/oauth2/v2.0/token" -Method POST -Body $teamstokenBody | Select-Object -ExpandProperty Access_Token'
|
|
189
146
|
)
|
|
190
|
-
|
|
191
|
-
"
|
|
192
|
-
)
|
|
193
|
-
if "application_access" not in permissions:
|
|
194
|
-
logger.error(
|
|
195
|
-
"Microsoft Teams connection failed: Please check your permissions and try again."
|
|
196
|
-
)
|
|
147
|
+
if result != "":
|
|
148
|
+
logger.error(f"Microsoft Teams connection failed: {result}")
|
|
197
149
|
return False
|
|
198
|
-
self.
|
|
150
|
+
self.execute_connect(
|
|
199
151
|
'Connect-MicrosoftTeams -AccessTokens @("$graphToken","$teamsToken")'
|
|
200
152
|
)
|
|
201
153
|
return True
|
|
@@ -207,7 +159,7 @@ class M365PowerShell(PowerShellSession):
|
|
|
207
159
|
|
|
208
160
|
def test_teams_certificate_connection(self) -> bool:
|
|
209
161
|
"""Test Microsoft Teams API connection using certificate and raise exception if it fails."""
|
|
210
|
-
result = self.
|
|
162
|
+
result = self.execute_connect(
|
|
211
163
|
"Connect-MicrosoftTeams -Certificate $certificate -ApplicationId $clientID -TenantId $tenantID"
|
|
212
164
|
)
|
|
213
165
|
if self.tenant_identity.identity_id not in result:
|
|
@@ -231,7 +183,7 @@ class M365PowerShell(PowerShellSession):
|
|
|
231
183
|
"Exchange Online connection failed: Please check your permissions and try again."
|
|
232
184
|
)
|
|
233
185
|
return False
|
|
234
|
-
self.
|
|
186
|
+
self.execute_connect(
|
|
235
187
|
'Connect-ExchangeOnline -AccessToken $exchangeToken.AccessToken -Organization "$tenantID"'
|
|
236
188
|
)
|
|
237
189
|
return True
|
|
@@ -243,7 +195,7 @@ class M365PowerShell(PowerShellSession):
|
|
|
243
195
|
|
|
244
196
|
def test_exchange_certificate_connection(self) -> bool:
|
|
245
197
|
"""Test Exchange Online API connection using certificate and raise exception if it fails."""
|
|
246
|
-
result = self.
|
|
198
|
+
result = self.execute_connect(
|
|
247
199
|
"Connect-ExchangeOnline -Certificate $certificate -AppId $clientID -Organization $tenantDomain"
|
|
248
200
|
)
|
|
249
201
|
if "https://aka.ms/exov3-module" not in result:
|
|
@@ -290,7 +242,8 @@ class M365PowerShell(PowerShellSession):
|
|
|
290
242
|
}
|
|
291
243
|
"""
|
|
292
244
|
return self.execute(
|
|
293
|
-
"Get-CsTeamsClientConfiguration | ConvertTo-Json",
|
|
245
|
+
"Get-CsTeamsClientConfiguration | ConvertTo-Json -Depth 10",
|
|
246
|
+
json_parse=True,
|
|
294
247
|
)
|
|
295
248
|
|
|
296
249
|
def get_global_meeting_policy(self) -> dict:
|
|
@@ -309,7 +262,7 @@ class M365PowerShell(PowerShellSession):
|
|
|
309
262
|
}
|
|
310
263
|
"""
|
|
311
264
|
return self.execute(
|
|
312
|
-
"Get-CsTeamsMeetingPolicy -Identity Global | ConvertTo-Json",
|
|
265
|
+
"Get-CsTeamsMeetingPolicy -Identity Global | ConvertTo-Json -Depth 10",
|
|
313
266
|
json_parse=True,
|
|
314
267
|
)
|
|
315
268
|
|
|
@@ -329,7 +282,7 @@ class M365PowerShell(PowerShellSession):
|
|
|
329
282
|
}
|
|
330
283
|
"""
|
|
331
284
|
return self.execute(
|
|
332
|
-
"Get-CsTeamsMessagingPolicy -Identity Global | ConvertTo-Json",
|
|
285
|
+
"Get-CsTeamsMessagingPolicy -Identity Global | ConvertTo-Json -Depth 10",
|
|
333
286
|
json_parse=True,
|
|
334
287
|
)
|
|
335
288
|
|
|
@@ -349,7 +302,8 @@ class M365PowerShell(PowerShellSession):
|
|
|
349
302
|
}
|
|
350
303
|
"""
|
|
351
304
|
return self.execute(
|
|
352
|
-
"Get-CsTenantFederationConfiguration | ConvertTo-Json",
|
|
305
|
+
"Get-CsTenantFederationConfiguration | ConvertTo-Json -Depth 10",
|
|
306
|
+
json_parse=True,
|
|
353
307
|
)
|
|
354
308
|
|
|
355
309
|
def connect_exchange_online(self) -> dict:
|
|
@@ -389,7 +343,7 @@ class M365PowerShell(PowerShellSession):
|
|
|
389
343
|
}
|
|
390
344
|
"""
|
|
391
345
|
return self.execute(
|
|
392
|
-
"Get-AdminAuditLogConfig | Select-Object UnifiedAuditLogIngestionEnabled | ConvertTo-Json",
|
|
346
|
+
"Get-AdminAuditLogConfig | Select-Object UnifiedAuditLogIngestionEnabled | ConvertTo-Json -Depth 10",
|
|
393
347
|
json_parse=True,
|
|
394
348
|
)
|
|
395
349
|
|
|
@@ -409,7 +363,9 @@ class M365PowerShell(PowerShellSession):
|
|
|
409
363
|
"Identity": "Default"
|
|
410
364
|
}
|
|
411
365
|
"""
|
|
412
|
-
return self.execute(
|
|
366
|
+
return self.execute(
|
|
367
|
+
"Get-MalwareFilterPolicy | ConvertTo-Json -Depth 10", json_parse=True
|
|
368
|
+
)
|
|
413
369
|
|
|
414
370
|
def get_malware_filter_rule(self) -> dict:
|
|
415
371
|
"""
|
|
@@ -427,7 +383,9 @@ class M365PowerShell(PowerShellSession):
|
|
|
427
383
|
"State": "Enabled"
|
|
428
384
|
}
|
|
429
385
|
"""
|
|
430
|
-
return self.execute(
|
|
386
|
+
return self.execute(
|
|
387
|
+
"Get-MalwareFilterRule | ConvertTo-Json -Depth 10", json_parse=True
|
|
388
|
+
)
|
|
431
389
|
|
|
432
390
|
def get_outbound_spam_filter_policy(self) -> dict:
|
|
433
391
|
"""
|
|
@@ -448,7 +406,8 @@ class M365PowerShell(PowerShellSession):
|
|
|
448
406
|
}
|
|
449
407
|
"""
|
|
450
408
|
return self.execute(
|
|
451
|
-
"Get-HostedOutboundSpamFilterPolicy | ConvertTo-Json",
|
|
409
|
+
"Get-HostedOutboundSpamFilterPolicy | ConvertTo-Json -Depth 10",
|
|
410
|
+
json_parse=True,
|
|
452
411
|
)
|
|
453
412
|
|
|
454
413
|
def get_outbound_spam_filter_rule(self) -> dict:
|
|
@@ -467,7 +426,8 @@ class M365PowerShell(PowerShellSession):
|
|
|
467
426
|
}
|
|
468
427
|
"""
|
|
469
428
|
return self.execute(
|
|
470
|
-
"Get-HostedOutboundSpamFilterRule | ConvertTo-Json",
|
|
429
|
+
"Get-HostedOutboundSpamFilterRule | ConvertTo-Json -Depth 10",
|
|
430
|
+
json_parse=True,
|
|
471
431
|
)
|
|
472
432
|
|
|
473
433
|
def get_antiphishing_policy(self) -> dict:
|
|
@@ -493,7 +453,9 @@ class M365PowerShell(PowerShellSession):
|
|
|
493
453
|
"IsDefault": false
|
|
494
454
|
}
|
|
495
455
|
"""
|
|
496
|
-
return self.execute(
|
|
456
|
+
return self.execute(
|
|
457
|
+
"Get-AntiPhishPolicy | ConvertTo-Json -Depth 10", json_parse=True
|
|
458
|
+
)
|
|
497
459
|
|
|
498
460
|
def get_antiphishing_rules(self) -> dict:
|
|
499
461
|
"""
|
|
@@ -511,7 +473,9 @@ class M365PowerShell(PowerShellSession):
|
|
|
511
473
|
"State": Enabled,
|
|
512
474
|
}
|
|
513
475
|
"""
|
|
514
|
-
return self.execute(
|
|
476
|
+
return self.execute(
|
|
477
|
+
"Get-AntiPhishRule | ConvertTo-Json -Depth 10", json_parse=True
|
|
478
|
+
)
|
|
515
479
|
|
|
516
480
|
def get_organization_config(self) -> dict:
|
|
517
481
|
"""
|
|
@@ -530,7 +494,9 @@ class M365PowerShell(PowerShellSession):
|
|
|
530
494
|
"AuditDisabled": false
|
|
531
495
|
}
|
|
532
496
|
"""
|
|
533
|
-
return self.execute(
|
|
497
|
+
return self.execute(
|
|
498
|
+
"Get-OrganizationConfig | ConvertTo-Json -Depth 10", json_parse=True
|
|
499
|
+
)
|
|
534
500
|
|
|
535
501
|
def get_mailbox_audit_config(self) -> dict:
|
|
536
502
|
"""
|
|
@@ -550,7 +516,8 @@ class M365PowerShell(PowerShellSession):
|
|
|
550
516
|
}
|
|
551
517
|
"""
|
|
552
518
|
return self.execute(
|
|
553
|
-
"Get-MailboxAuditBypassAssociation | ConvertTo-Json",
|
|
519
|
+
"Get-MailboxAuditBypassAssociation | ConvertTo-Json -Depth 10",
|
|
520
|
+
json_parse=True,
|
|
554
521
|
)
|
|
555
522
|
|
|
556
523
|
def get_mailbox_policy(self) -> dict:
|
|
@@ -569,7 +536,9 @@ class M365PowerShell(PowerShellSession):
|
|
|
569
536
|
"AdditionalStorageProvidersAvailable": True
|
|
570
537
|
}
|
|
571
538
|
"""
|
|
572
|
-
return self.execute(
|
|
539
|
+
return self.execute(
|
|
540
|
+
"Get-OwaMailboxPolicy | ConvertTo-Json -Depth 10", json_parse=True
|
|
541
|
+
)
|
|
573
542
|
|
|
574
543
|
def get_external_mail_config(self) -> dict:
|
|
575
544
|
"""
|
|
@@ -587,7 +556,9 @@ class M365PowerShell(PowerShellSession):
|
|
|
587
556
|
"ExternalMailTagEnabled": true
|
|
588
557
|
}
|
|
589
558
|
"""
|
|
590
|
-
return self.execute(
|
|
559
|
+
return self.execute(
|
|
560
|
+
"Get-ExternalInOutlook | ConvertTo-Json -Depth 10", json_parse=True
|
|
561
|
+
)
|
|
591
562
|
|
|
592
563
|
def get_transport_rules(self) -> dict:
|
|
593
564
|
"""
|
|
@@ -606,7 +577,9 @@ class M365PowerShell(PowerShellSession):
|
|
|
606
577
|
"SenderDomainIs": ["example.com"]
|
|
607
578
|
}
|
|
608
579
|
"""
|
|
609
|
-
return self.execute(
|
|
580
|
+
return self.execute(
|
|
581
|
+
"Get-TransportRule | ConvertTo-Json -Depth 10", json_parse=True
|
|
582
|
+
)
|
|
610
583
|
|
|
611
584
|
def get_connection_filter_policy(self) -> dict:
|
|
612
585
|
"""
|
|
@@ -625,7 +598,7 @@ class M365PowerShell(PowerShellSession):
|
|
|
625
598
|
}
|
|
626
599
|
"""
|
|
627
600
|
return self.execute(
|
|
628
|
-
"Get-HostedConnectionFilterPolicy -Identity Default | ConvertTo-Json",
|
|
601
|
+
"Get-HostedConnectionFilterPolicy -Identity Default | ConvertTo-Json -Depth 10",
|
|
629
602
|
json_parse=True,
|
|
630
603
|
)
|
|
631
604
|
|
|
@@ -645,7 +618,9 @@ class M365PowerShell(PowerShellSession):
|
|
|
645
618
|
"Enabled": true
|
|
646
619
|
}
|
|
647
620
|
"""
|
|
648
|
-
return self.execute(
|
|
621
|
+
return self.execute(
|
|
622
|
+
"Get-DkimSigningConfig | ConvertTo-Json -Depth 10", json_parse=True
|
|
623
|
+
)
|
|
649
624
|
|
|
650
625
|
def get_inbound_spam_filter_policy(self) -> dict:
|
|
651
626
|
"""
|
|
@@ -664,7 +639,8 @@ class M365PowerShell(PowerShellSession):
|
|
|
664
639
|
}
|
|
665
640
|
"""
|
|
666
641
|
return self.execute(
|
|
667
|
-
"Get-HostedContentFilterPolicy | ConvertTo-Json",
|
|
642
|
+
"Get-HostedContentFilterPolicy | ConvertTo-Json -Depth 10",
|
|
643
|
+
json_parse=True,
|
|
668
644
|
)
|
|
669
645
|
|
|
670
646
|
def get_inbound_spam_filter_rule(self) -> dict:
|
|
@@ -684,7 +660,8 @@ class M365PowerShell(PowerShellSession):
|
|
|
684
660
|
}
|
|
685
661
|
"""
|
|
686
662
|
return self.execute(
|
|
687
|
-
"Get-HostedContentFilterRule | ConvertTo-Json",
|
|
663
|
+
"Get-HostedContentFilterRule | ConvertTo-Json -Depth 10",
|
|
664
|
+
json_parse=True,
|
|
688
665
|
)
|
|
689
666
|
|
|
690
667
|
def get_report_submission_policy(self) -> dict:
|
|
@@ -715,7 +692,8 @@ class M365PowerShell(PowerShellSession):
|
|
|
715
692
|
}
|
|
716
693
|
"""
|
|
717
694
|
return self.execute(
|
|
718
|
-
"Get-ReportSubmissionPolicy | ConvertTo-Json",
|
|
695
|
+
"Get-ReportSubmissionPolicy | ConvertTo-Json -Depth 10",
|
|
696
|
+
json_parse=True,
|
|
719
697
|
)
|
|
720
698
|
|
|
721
699
|
def get_role_assignment_policies(self) -> dict:
|
|
@@ -736,7 +714,8 @@ class M365PowerShell(PowerShellSession):
|
|
|
736
714
|
}
|
|
737
715
|
"""
|
|
738
716
|
return self.execute(
|
|
739
|
-
"Get-RoleAssignmentPolicy | ConvertTo-Json",
|
|
717
|
+
"Get-RoleAssignmentPolicy | ConvertTo-Json -Depth 10",
|
|
718
|
+
json_parse=True,
|
|
740
719
|
)
|
|
741
720
|
|
|
742
721
|
def get_mailbox_audit_properties(self) -> dict:
|
|
@@ -801,7 +780,7 @@ class M365PowerShell(PowerShellSession):
|
|
|
801
780
|
}
|
|
802
781
|
"""
|
|
803
782
|
return self.execute(
|
|
804
|
-
"Get-EXOMailbox -PropertySets Audit -ResultSize Unlimited | ConvertTo-Json",
|
|
783
|
+
"Get-EXOMailbox -PropertySets Audit -ResultSize Unlimited | ConvertTo-Json -Depth 10",
|
|
805
784
|
json_parse=True,
|
|
806
785
|
)
|
|
807
786
|
|
|
@@ -820,7 +799,9 @@ class M365PowerShell(PowerShellSession):
|
|
|
820
799
|
"SmtpClientAuthenticationDisabled": True,
|
|
821
800
|
}
|
|
822
801
|
"""
|
|
823
|
-
return self.execute(
|
|
802
|
+
return self.execute(
|
|
803
|
+
"Get-TransportConfig | ConvertTo-Json -Depth 10", json_parse=True
|
|
804
|
+
)
|
|
824
805
|
|
|
825
806
|
def get_sharing_policy(self) -> dict:
|
|
826
807
|
"""
|
|
@@ -838,7 +819,9 @@ class M365PowerShell(PowerShellSession):
|
|
|
838
819
|
"Enabled": true
|
|
839
820
|
}
|
|
840
821
|
"""
|
|
841
|
-
return self.execute(
|
|
822
|
+
return self.execute(
|
|
823
|
+
"Get-SharingPolicy | ConvertTo-Json -Depth 10", json_parse=True
|
|
824
|
+
)
|
|
842
825
|
|
|
843
826
|
def get_user_account_status(self) -> dict:
|
|
844
827
|
"""
|
|
@@ -850,7 +833,7 @@ class M365PowerShell(PowerShellSession):
|
|
|
850
833
|
dict: User account status settings in JSON format.
|
|
851
834
|
"""
|
|
852
835
|
return self.execute(
|
|
853
|
-
"$dict=@{}; Get-User -ResultSize Unlimited | ForEach-Object { $dict[$_.Id] = @{ AccountDisabled = $_.AccountDisabled } }; $dict | ConvertTo-Json",
|
|
836
|
+
"$dict=@{}; Get-User -ResultSize Unlimited | ForEach-Object { $dict[$_.Id] = @{ AccountDisabled = $_.AccountDisabled } }; $dict | ConvertTo-Json -Depth 10",
|
|
854
837
|
json_parse=True,
|
|
855
838
|
)
|
|
856
839
|
|
|
@@ -867,7 +850,11 @@ def initialize_m365_powershell_modules():
|
|
|
867
850
|
bool: True if all modules were successfully initialized, False otherwise
|
|
868
851
|
"""
|
|
869
852
|
|
|
870
|
-
REQUIRED_MODULES = [
|
|
853
|
+
REQUIRED_MODULES = [
|
|
854
|
+
"ExchangeOnlineManagement",
|
|
855
|
+
"MicrosoftTeams",
|
|
856
|
+
"MSAL.PS",
|
|
857
|
+
]
|
|
871
858
|
|
|
872
859
|
pwsh = PowerShellSession()
|
|
873
860
|
try:
|
|
@@ -879,7 +866,7 @@ def initialize_m365_powershell_modules():
|
|
|
879
866
|
# Install module if not installed
|
|
880
867
|
if not result:
|
|
881
868
|
install_result = pwsh.execute(
|
|
882
|
-
f
|
|
869
|
+
f"Install-Module {module} -Force -AllowClobber -Scope CurrentUser",
|
|
883
870
|
timeout=60,
|
|
884
871
|
)
|
|
885
872
|
if install_result:
|
|
@@ -444,12 +444,7 @@ class M365Provider(Provider):
|
|
|
444
444
|
try:
|
|
445
445
|
if init_modules:
|
|
446
446
|
initialize_m365_powershell_modules()
|
|
447
|
-
|
|
448
|
-
return credentials
|
|
449
|
-
raise M365ConfigCredentialsError(
|
|
450
|
-
file=os.path.basename(__file__),
|
|
451
|
-
message="The provided credentials are not valid.",
|
|
452
|
-
)
|
|
447
|
+
return credentials
|
|
453
448
|
finally:
|
|
454
449
|
test_session.close()
|
|
455
450
|
|
|
@@ -30,6 +30,10 @@ class MongoDBAtlasBaseException(ProwlerException):
|
|
|
30
30
|
"message": "MongoDB Atlas API rate limit exceeded",
|
|
31
31
|
"remediation": "Reduce the number of API requests or wait before making more requests.",
|
|
32
32
|
},
|
|
33
|
+
(8006, "MongoDBAtlasInvalidOrganizationIdError"): {
|
|
34
|
+
"message": "The provided credentials do not have access to the organization with the provided ID",
|
|
35
|
+
"remediation": "Check the organization ID and ensure it is a valid organization ID and that the credentials have access to it.",
|
|
36
|
+
},
|
|
33
37
|
}
|
|
34
38
|
|
|
35
39
|
def __init__(self, code, file=None, original_exception=None, message=None):
|
|
@@ -116,3 +120,15 @@ class MongoDBAtlasRateLimitError(MongoDBAtlasBaseException):
|
|
|
116
120
|
original_exception=original_exception,
|
|
117
121
|
message=message,
|
|
118
122
|
)
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
class MongoDBAtlasInvalidOrganizationIdError(MongoDBAtlasBaseException):
|
|
126
|
+
"""Exception for MongoDB Atlas invalid organization ID errors"""
|
|
127
|
+
|
|
128
|
+
def __init__(self, file=None, original_exception=None, message=None):
|
|
129
|
+
super().__init__(
|
|
130
|
+
code=8006,
|
|
131
|
+
file=file,
|
|
132
|
+
original_exception=original_exception,
|
|
133
|
+
message=message,
|
|
134
|
+
)
|
|
@@ -17,6 +17,7 @@ from prowler.providers.mongodbatlas.exceptions.exceptions import (
|
|
|
17
17
|
MongoDBAtlasAuthenticationError,
|
|
18
18
|
MongoDBAtlasCredentialsError,
|
|
19
19
|
MongoDBAtlasIdentityError,
|
|
20
|
+
MongoDBAtlasInvalidOrganizationIdError,
|
|
20
21
|
MongoDBAtlasSessionError,
|
|
21
22
|
)
|
|
22
23
|
from prowler.providers.mongodbatlas.lib.mutelist.mutelist import MongoDBAtlasMutelist
|
|
@@ -54,6 +55,7 @@ class MongodbatlasProvider(Provider):
|
|
|
54
55
|
mutelist_content: dict = None,
|
|
55
56
|
# Optional filters
|
|
56
57
|
atlas_project_id: str = None,
|
|
58
|
+
atlas_organization_id: str = None,
|
|
57
59
|
):
|
|
58
60
|
"""
|
|
59
61
|
MongoDB Atlas Provider constructor
|
|
@@ -67,6 +69,7 @@ class MongodbatlasProvider(Provider):
|
|
|
67
69
|
mutelist_path: Path to the mutelist file
|
|
68
70
|
mutelist_content: Mutelist content
|
|
69
71
|
atlas_project_id: Project ID to filter
|
|
72
|
+
atlas_organization_id: Organization ID
|
|
70
73
|
"""
|
|
71
74
|
logger.info("Instantiating MongoDB Atlas Provider...")
|
|
72
75
|
|
|
@@ -79,6 +82,7 @@ class MongodbatlasProvider(Provider):
|
|
|
79
82
|
|
|
80
83
|
# Store filter options
|
|
81
84
|
self._project_id = atlas_project_id
|
|
85
|
+
self._organization_id = atlas_organization_id
|
|
82
86
|
|
|
83
87
|
# Audit Config
|
|
84
88
|
if config_content:
|
|
@@ -292,6 +296,7 @@ class MongodbatlasProvider(Provider):
|
|
|
292
296
|
atlas_public_key: str = "",
|
|
293
297
|
atlas_private_key: str = "",
|
|
294
298
|
raise_on_exception: bool = True,
|
|
299
|
+
provider_id: str = None,
|
|
295
300
|
) -> Connection:
|
|
296
301
|
"""
|
|
297
302
|
Test connection to MongoDB Atlas
|
|
@@ -300,7 +305,7 @@ class MongodbatlasProvider(Provider):
|
|
|
300
305
|
atlas_public_key: MongoDB Atlas API public key
|
|
301
306
|
atlas_private_key: MongoDB Atlas API private key
|
|
302
307
|
raise_on_exception: Whether to raise exceptions
|
|
303
|
-
|
|
308
|
+
provider_id: MongoDB Atlas project ID to validate access (added for API compatibility)
|
|
304
309
|
Returns:
|
|
305
310
|
Connection: Connection status
|
|
306
311
|
"""
|
|
@@ -310,10 +315,17 @@ class MongodbatlasProvider(Provider):
|
|
|
310
315
|
atlas_private_key=atlas_private_key,
|
|
311
316
|
)
|
|
312
317
|
|
|
313
|
-
MongodbatlasProvider.setup_identity(session)
|
|
318
|
+
identity = MongodbatlasProvider.setup_identity(session)
|
|
314
319
|
|
|
315
|
-
|
|
320
|
+
if provider_id and identity.organization_id != provider_id:
|
|
321
|
+
raise MongoDBAtlasInvalidOrganizationIdError(
|
|
322
|
+
file=os.path.basename(__file__),
|
|
323
|
+
message=f"The provided credentials do not have access to the organization with the provided ID: {provider_id}",
|
|
324
|
+
)
|
|
316
325
|
|
|
326
|
+
return Connection(is_connected=True)
|
|
327
|
+
except MongoDBAtlasInvalidOrganizationIdError:
|
|
328
|
+
raise
|
|
317
329
|
except Exception as error:
|
|
318
330
|
logger.critical(
|
|
319
331
|
f"{error.__class__.__name__}[{error.__traceback__.tb_lineno}]: {error}"
|
|
@@ -1,29 +1,40 @@
|
|
|
1
1
|
{
|
|
2
2
|
"Provider": "mongodbatlas",
|
|
3
3
|
"CheckID": "projects_auditing_enabled",
|
|
4
|
-
"CheckTitle": "
|
|
4
|
+
"CheckTitle": "MongoDB Atlas project has database auditing enabled",
|
|
5
5
|
"CheckType": [],
|
|
6
6
|
"ServiceName": "projects",
|
|
7
7
|
"SubServiceName": "",
|
|
8
8
|
"ResourceIdTemplate": "",
|
|
9
9
|
"Severity": "medium",
|
|
10
10
|
"ResourceType": "MongoDBAtlasProject",
|
|
11
|
-
"Description": "
|
|
12
|
-
"Risk": "Without auditing
|
|
11
|
+
"Description": "**MongoDB Atlas projects** with **database auditing** capture database operations and administrative events. The evaluation looks for an active audit configuration and, *when present*, notes any configured `audit_filter` that scopes which events are recorded.",
|
|
12
|
+
"Risk": "Without auditing, critical actions lack traceability, reducing **detectability** and impeding **forensics**. Attackers can mask unauthorized reads/writes and privilege changes, threatening data **confidentiality** and **integrity**, and weakening non-repudiation and incident response.",
|
|
13
13
|
"RelatedUrl": "",
|
|
14
|
+
"AdditionalURLs": [
|
|
15
|
+
"https://www.mongodb.com/docs/manual/tutorial/configure-auditing/",
|
|
16
|
+
"https://www.mongodb.com/docs/atlas/architecture/current/auditing/",
|
|
17
|
+
"https://www.mongodb.com/docs/atlas/architecture/current/auditing-logging/?msockid=0878cc3dfa4e66a707beda0efb5a67b5",
|
|
18
|
+
"https://www.mongodb.com/docs/atlas/operator/current/ak8so-configure-audit-logs/",
|
|
19
|
+
"https://www.mongodb.com/docs/manual/core/auditing/",
|
|
20
|
+
"https://www.mongodb.com/docs/atlas/database-auditing/"
|
|
21
|
+
],
|
|
14
22
|
"Remediation": {
|
|
15
23
|
"Code": {
|
|
16
|
-
"CLI": "",
|
|
24
|
+
"CLI": "atlas auditing update --projectId <example_resource_id> --enabled",
|
|
17
25
|
"NativeIaC": "",
|
|
18
|
-
"Other": "",
|
|
19
|
-
"Terraform": ""
|
|
26
|
+
"Other": "1. Sign in to MongoDB Atlas and open the target project\n2. In the left sidebar, click Security > Database & Network Access, then click Advanced\n3. Toggle Database Auditing to On\n4. Click Save",
|
|
27
|
+
"Terraform": "```hcl\nresource \"mongodbatlas_auditing\" \"example\" {\n project_id = \"<example_resource_id>\"\n enabled = true # Critical: turns on project-level database auditing to pass the check\n}\n```"
|
|
20
28
|
},
|
|
21
29
|
"Recommendation": {
|
|
22
|
-
"Text": "Enable
|
|
23
|
-
"Url": "https://
|
|
30
|
+
"Text": "Enable **auditing** and apply least-privilege filters to capture high-risk events:\n- authentication and session activity\n- DDL/config changes\n- user/role modifications and privilege grants\n\nCentralize logs in a SIEM, enforce retention/immutability with separation of duties, restrict access, and tune `auditAuthorizationSuccess` to balance coverage vs performance.",
|
|
31
|
+
"Url": "https://hub.prowler.com/check/projects_auditing_enabled"
|
|
24
32
|
}
|
|
25
33
|
},
|
|
26
|
-
"Categories": [
|
|
34
|
+
"Categories": [
|
|
35
|
+
"logging",
|
|
36
|
+
"forensics-ready"
|
|
37
|
+
],
|
|
27
38
|
"DependsOn": [],
|
|
28
39
|
"RelatedTo": [],
|
|
29
40
|
"Notes": ""
|
|
@@ -1,29 +1,34 @@
|
|
|
1
1
|
{
|
|
2
2
|
"Provider": "mongodbatlas",
|
|
3
3
|
"CheckID": "projects_network_access_list_exposed_to_internet",
|
|
4
|
-
"CheckTitle": "
|
|
4
|
+
"CheckTitle": "MongoDB Atlas project network access list has entries and excludes 0.0.0.0/0, ::/0, 0.0.0.0, and ::",
|
|
5
5
|
"CheckType": [],
|
|
6
6
|
"ServiceName": "projects",
|
|
7
7
|
"SubServiceName": "",
|
|
8
8
|
"ResourceIdTemplate": "",
|
|
9
9
|
"Severity": "high",
|
|
10
10
|
"ResourceType": "MongoDBAtlasProject",
|
|
11
|
-
"Description": "
|
|
12
|
-
"Risk": "
|
|
13
|
-
"RelatedUrl": "
|
|
11
|
+
"Description": "**MongoDB Atlas project network access list** configuration is evaluated for entries that allow access from anywhere (`0.0.0.0/0`, `::/0`, `0.0.0.0`, `::`) or for missing access lists, instead of restricting connections to specific IPs or CIDRs.",
|
|
12
|
+
"Risk": "Internet-wide access enables scanning, brute force, and credential stuffing against database endpoints. A successful compromise can cause data exfiltration (**confidentiality**), unauthorized writes or drops (**integrity**), and service disruption or lockout (**availability**).",
|
|
13
|
+
"RelatedUrl": "",
|
|
14
|
+
"AdditionalURLs": [
|
|
15
|
+
"https://docs.atlas.mongodb.com/security/ip-access-list/"
|
|
16
|
+
],
|
|
14
17
|
"Remediation": {
|
|
15
18
|
"Code": {
|
|
16
19
|
"CLI": "",
|
|
17
20
|
"NativeIaC": "",
|
|
18
|
-
"Other": "",
|
|
19
|
-
"Terraform": ""
|
|
21
|
+
"Other": "1. In MongoDB Atlas, open your project and go to Security > Database & Network Access > IP Access List\n2. Delete any entries equal to 0.0.0.0/0, ::/0, 0.0.0.0, or ::\n3. If the list becomes empty, click Add IP Address and add a specific IP/CIDR or an AWS Security Group (for a peered VPC)\n4. Click Save",
|
|
22
|
+
"Terraform": "```hcl\nresource \"mongodbatlas_project_ip_access_list\" \"<example_resource_name>\" {\n project_id = \"<example_resource_id>\"\n cidr_block = \"<ALLOWED_CIDR>\" # Critical: add a restricted CIDR (not 0.0.0.0/0 or ::/0) to ensure the list isn't empty and not open to the world\n}\n```"
|
|
20
23
|
},
|
|
21
24
|
"Recommendation": {
|
|
22
|
-
"Text": "
|
|
23
|
-
"Url": "https://
|
|
25
|
+
"Text": "Apply **least privilege**: permit only required IPs/CIDRs or approved security groups; avoid `0.0.0.0/0` and `::/0`. Prefer **private connectivity** (VPC peering or private endpoints) over public access. Use temporary entries for short-lived admin needs and review lists regularly.",
|
|
26
|
+
"Url": "https://hub.prowler.com/check/projects_network_access_list_exposed_to_internet"
|
|
24
27
|
}
|
|
25
28
|
},
|
|
26
|
-
"Categories": [
|
|
29
|
+
"Categories": [
|
|
30
|
+
"internet-exposed"
|
|
31
|
+
],
|
|
27
32
|
"DependsOn": [],
|
|
28
33
|
"RelatedTo": [],
|
|
29
34
|
"Notes": ""
|
|
@@ -5,9 +5,11 @@ from prowler.providers.oraclecloud.config import OCI_DEFAULT_CONFIG_FILE, OCI_RE
|
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
def init_parser(self):
|
|
8
|
-
"""Init the
|
|
8
|
+
"""Init the Oracle Cloud Infrastructure Provider CLI parser"""
|
|
9
9
|
oci_parser = self.subparsers.add_parser(
|
|
10
|
-
"
|
|
10
|
+
"oraclecloud",
|
|
11
|
+
parents=[self.common_providers_parser],
|
|
12
|
+
help="Oracle Cloud Infrastructure Provider",
|
|
11
13
|
)
|
|
12
14
|
|
|
13
15
|
# Config File Authentication Options
|
|
@@ -109,15 +111,4 @@ def validate_arguments(arguments: Namespace) -> tuple[bool, str]:
|
|
|
109
111
|
"Cannot use --use-instance-principal with --oci-config-file or --profile options",
|
|
110
112
|
)
|
|
111
113
|
|
|
112
|
-
# # Validate compartment OCIDs if provided
|
|
113
|
-
# if arguments.compartment_id:
|
|
114
|
-
# for compartment_id in arguments.compartment_id:
|
|
115
|
-
# if not OciProvider.validate_ocid(compartment_id, "compartment"):
|
|
116
|
-
# # Check if it's a tenancy OCID (root compartment)
|
|
117
|
-
# if not OciProvider.validate_ocid(compartment_id, "tenancy"):
|
|
118
|
-
# return (
|
|
119
|
-
# False,
|
|
120
|
-
# f"Invalid compartment OCID: {compartment_id}",
|
|
121
|
-
# )
|
|
122
|
-
|
|
123
114
|
return (True, "")
|