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
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from dataclasses import dataclass
|
|
2
2
|
|
|
3
|
-
from azure.mgmt.
|
|
3
|
+
from azure.mgmt.postgresqlflexibleservers import PostgreSQLManagementClient
|
|
4
4
|
|
|
5
5
|
from prowler.lib.logger import logger
|
|
6
6
|
from prowler.providers.azure.azure_provider import AzureProvider
|
|
@@ -21,9 +21,19 @@ class PostgreSQL(AzureService):
|
|
|
21
21
|
flexible_servers_list = client.servers.list()
|
|
22
22
|
for postgresql_server in flexible_servers_list:
|
|
23
23
|
resource_group = self._get_resource_group(postgresql_server.id)
|
|
24
|
+
# Fetch full server object once to extract multiple properties
|
|
25
|
+
server_details = client.servers.get(
|
|
26
|
+
resource_group, postgresql_server.name
|
|
27
|
+
)
|
|
24
28
|
require_secure_transport = self._get_require_secure_transport(
|
|
25
29
|
subscription, resource_group, postgresql_server.name
|
|
26
30
|
)
|
|
31
|
+
active_directory_auth = self._extract_active_directory_auth(
|
|
32
|
+
server_details
|
|
33
|
+
)
|
|
34
|
+
entra_id_admins = self._get_entra_id_admins(
|
|
35
|
+
subscription, resource_group, postgresql_server.name
|
|
36
|
+
)
|
|
27
37
|
log_checkpoints = self._get_log_checkpoints(
|
|
28
38
|
subscription, resource_group, postgresql_server.name
|
|
29
39
|
)
|
|
@@ -42,22 +52,22 @@ class PostgreSQL(AzureService):
|
|
|
42
52
|
firewall = self._get_firewall(
|
|
43
53
|
subscription, resource_group, postgresql_server.name
|
|
44
54
|
)
|
|
45
|
-
location =
|
|
46
|
-
subscription, resource_group, postgresql_server.name
|
|
47
|
-
)
|
|
55
|
+
location = server_details.location
|
|
48
56
|
flexible_servers[subscription].append(
|
|
49
57
|
Server(
|
|
50
58
|
id=postgresql_server.id,
|
|
51
59
|
name=postgresql_server.name,
|
|
52
60
|
resource_group=resource_group,
|
|
61
|
+
location=location,
|
|
53
62
|
require_secure_transport=require_secure_transport,
|
|
63
|
+
active_directory_auth=active_directory_auth,
|
|
64
|
+
entra_id_admins=entra_id_admins,
|
|
54
65
|
log_checkpoints=log_checkpoints,
|
|
55
66
|
log_connections=log_connections,
|
|
56
67
|
log_disconnections=log_disconnections,
|
|
57
68
|
connection_throttling=connection_throttling,
|
|
58
69
|
log_retention_days=log_retention_days,
|
|
59
70
|
firewall=firewall,
|
|
60
|
-
location=location,
|
|
61
71
|
)
|
|
62
72
|
)
|
|
63
73
|
except Exception as error:
|
|
@@ -100,10 +110,47 @@ class PostgreSQL(AzureService):
|
|
|
100
110
|
)
|
|
101
111
|
return log_disconnections.value.upper()
|
|
102
112
|
|
|
103
|
-
def
|
|
113
|
+
def _extract_active_directory_auth(self, server):
|
|
114
|
+
"""Extract active directory auth from a server object (no API call)."""
|
|
115
|
+
try:
|
|
116
|
+
auth_config = getattr(server, "auth_config", None)
|
|
117
|
+
active_directory_auth = (
|
|
118
|
+
getattr(auth_config, "active_directory_auth", None)
|
|
119
|
+
if auth_config is not None
|
|
120
|
+
else None
|
|
121
|
+
)
|
|
122
|
+
# Normalize enum/string to upper string
|
|
123
|
+
if hasattr(active_directory_auth, "value"):
|
|
124
|
+
return str(active_directory_auth.value).upper()
|
|
125
|
+
return (
|
|
126
|
+
str(active_directory_auth).upper()
|
|
127
|
+
if active_directory_auth is not None
|
|
128
|
+
else None
|
|
129
|
+
)
|
|
130
|
+
except Exception as e:
|
|
131
|
+
logger.error(f"Error extracting active directory auth: {e}")
|
|
132
|
+
return None
|
|
133
|
+
|
|
134
|
+
def _get_entra_id_admins(self, subscription, resource_group_name, server_name):
|
|
104
135
|
client = self.clients[subscription]
|
|
105
|
-
|
|
106
|
-
|
|
136
|
+
try:
|
|
137
|
+
admins = client.administrators.list_by_server(
|
|
138
|
+
resource_group_name, server_name
|
|
139
|
+
)
|
|
140
|
+
admin_list = []
|
|
141
|
+
for admin in admins:
|
|
142
|
+
admin_list.append(
|
|
143
|
+
EntraIdAdmin(
|
|
144
|
+
object_id=admin.object_id,
|
|
145
|
+
principal_name=admin.principal_name,
|
|
146
|
+
principal_type=admin.principal_type,
|
|
147
|
+
tenant_id=admin.tenant_id,
|
|
148
|
+
)
|
|
149
|
+
)
|
|
150
|
+
return admin_list
|
|
151
|
+
except Exception as e:
|
|
152
|
+
logger.error(f"Error getting Entra ID admins for {server_name}: {e}")
|
|
153
|
+
return []
|
|
107
154
|
|
|
108
155
|
def _get_connection_throttling(self, subscription, resouce_group_name, server_name):
|
|
109
156
|
client = self.clients[subscription]
|
|
@@ -147,16 +194,26 @@ class Firewall:
|
|
|
147
194
|
end_ip: str
|
|
148
195
|
|
|
149
196
|
|
|
197
|
+
@dataclass
|
|
198
|
+
class EntraIdAdmin:
|
|
199
|
+
object_id: str
|
|
200
|
+
principal_name: str
|
|
201
|
+
principal_type: str
|
|
202
|
+
tenant_id: str
|
|
203
|
+
|
|
204
|
+
|
|
150
205
|
@dataclass
|
|
151
206
|
class Server:
|
|
152
207
|
id: str
|
|
153
208
|
name: str
|
|
154
209
|
resource_group: str
|
|
210
|
+
location: str
|
|
155
211
|
require_secure_transport: str
|
|
212
|
+
active_directory_auth: str
|
|
213
|
+
entra_id_admins: list[EntraIdAdmin]
|
|
156
214
|
log_checkpoints: str
|
|
157
215
|
log_connections: str
|
|
158
216
|
log_disconnections: str
|
|
159
217
|
connection_throttling: str
|
|
160
218
|
log_retention_days: str
|
|
161
219
|
firewall: list[Firewall]
|
|
162
|
-
location: str
|
|
@@ -141,10 +141,12 @@ class Storage(AzureService):
|
|
|
141
141
|
container_delete_retention_policy,
|
|
142
142
|
"enabled",
|
|
143
143
|
False,
|
|
144
|
-
)
|
|
144
|
+
)
|
|
145
|
+
or False,
|
|
145
146
|
days=getattr(
|
|
146
147
|
container_delete_retention_policy, "days", 0
|
|
147
|
-
)
|
|
148
|
+
)
|
|
149
|
+
or 0,
|
|
148
150
|
),
|
|
149
151
|
versioning_enabled=versioning_enabled,
|
|
150
152
|
)
|
|
@@ -220,12 +222,14 @@ class Storage(AzureService):
|
|
|
220
222
|
share_delete_retention_policy,
|
|
221
223
|
"enabled",
|
|
222
224
|
False,
|
|
223
|
-
)
|
|
225
|
+
)
|
|
226
|
+
or False,
|
|
224
227
|
days=getattr(
|
|
225
228
|
share_delete_retention_policy,
|
|
226
229
|
"days",
|
|
227
230
|
0,
|
|
228
|
-
)
|
|
231
|
+
)
|
|
232
|
+
or 0,
|
|
229
233
|
),
|
|
230
234
|
smb_protocol_settings=SMBProtocolSettings(
|
|
231
235
|
channel_encryption=(
|
|
@@ -241,6 +245,11 @@ class Storage(AzureService):
|
|
|
241
245
|
),
|
|
242
246
|
)
|
|
243
247
|
except Exception as error:
|
|
248
|
+
if "File is not supported for the account." in str(error).strip():
|
|
249
|
+
logger.warning(
|
|
250
|
+
f"Subscription name: {subscription} -- {error.__class__.__name__}[{error.__traceback__.tb_lineno}]: {error}"
|
|
251
|
+
)
|
|
252
|
+
continue
|
|
244
253
|
logger.error(
|
|
245
254
|
f"Subscription name: {subscription} -- {error.__class__.__name__}[{error.__traceback__.tb_lineno}]: {error}"
|
|
246
255
|
)
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
from dataclasses import dataclass
|
|
2
1
|
from enum import Enum
|
|
3
2
|
from typing import List, Optional
|
|
4
3
|
|
|
@@ -294,16 +293,14 @@ class VirtualMachines(AzureService):
|
|
|
294
293
|
return vm_instance_ids
|
|
295
294
|
|
|
296
295
|
|
|
297
|
-
|
|
298
|
-
class UefiSettings:
|
|
296
|
+
class UefiSettings(BaseModel):
|
|
299
297
|
secure_boot_enabled: bool
|
|
300
298
|
v_tpm_enabled: bool
|
|
301
299
|
|
|
302
300
|
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
uefi_settings: Optional[UefiSettings]
|
|
301
|
+
class SecurityProfile(BaseModel):
|
|
302
|
+
security_type: Optional[str] = None
|
|
303
|
+
uefi_settings: Optional[UefiSettings] = None
|
|
307
304
|
|
|
308
305
|
|
|
309
306
|
class OperatingSystemType(Enum):
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import sys
|
|
2
2
|
from argparse import Namespace
|
|
3
3
|
from importlib import import_module
|
|
4
|
+
from typing import Optional, Sequence
|
|
4
5
|
|
|
5
6
|
from prowler.lib.logger import logger
|
|
6
7
|
from prowler.providers.common.provider import Provider, providers_path
|
|
@@ -16,15 +17,9 @@ def init_providers_parser(self):
|
|
|
16
17
|
providers = Provider.get_available_providers()
|
|
17
18
|
for provider in providers:
|
|
18
19
|
try:
|
|
19
|
-
# Map CLI provider names to directory names (for cases where they differ)
|
|
20
|
-
provider_directory_map = {
|
|
21
|
-
"oci": "oraclecloud", # OCI SDK conflict avoidance
|
|
22
|
-
}
|
|
23
|
-
provider_directory = provider_directory_map.get(provider, provider)
|
|
24
|
-
|
|
25
20
|
getattr(
|
|
26
21
|
import_module(
|
|
27
|
-
f"{providers_path}.{
|
|
22
|
+
f"{providers_path}.{provider}.{provider_arguments_lib_path}"
|
|
28
23
|
),
|
|
29
24
|
init_provider_arguments_function,
|
|
30
25
|
)(self)
|
|
@@ -38,18 +33,10 @@ def init_providers_parser(self):
|
|
|
38
33
|
def validate_provider_arguments(arguments: Namespace) -> tuple[bool, str]:
|
|
39
34
|
"""validate_provider_arguments returns {True, "} if the provider arguments passed are valid and can be used together"""
|
|
40
35
|
try:
|
|
41
|
-
# Map CLI provider names to directory names (for cases where they differ)
|
|
42
|
-
provider_directory_map = {
|
|
43
|
-
"oci": "oraclecloud", # OCI SDK conflict avoidance
|
|
44
|
-
}
|
|
45
|
-
provider_directory = provider_directory_map.get(
|
|
46
|
-
arguments.provider, arguments.provider
|
|
47
|
-
)
|
|
48
|
-
|
|
49
36
|
# Provider function must be located at prowler.providers.<provider>.lib.arguments.arguments.validate_arguments
|
|
50
37
|
return getattr(
|
|
51
38
|
import_module(
|
|
52
|
-
f"{providers_path}.{
|
|
39
|
+
f"{providers_path}.{arguments.provider}.{provider_arguments_lib_path}"
|
|
53
40
|
),
|
|
54
41
|
validate_provider_arguments_function,
|
|
55
42
|
)(arguments)
|
|
@@ -67,3 +54,19 @@ def validate_provider_arguments(arguments: Namespace) -> tuple[bool, str]:
|
|
|
67
54
|
f"{error.__class__.__name__}[{error.__traceback__.tb_lineno}]: {error}"
|
|
68
55
|
)
|
|
69
56
|
sys.exit(1)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def validate_asff_usage(
|
|
60
|
+
provider: Optional[str], output_formats: Optional[Sequence[str]]
|
|
61
|
+
) -> tuple[bool, str]:
|
|
62
|
+
"""Ensure json-asff output is only requested for the AWS provider."""
|
|
63
|
+
if not output_formats or "json-asff" not in output_formats:
|
|
64
|
+
return (True, "")
|
|
65
|
+
|
|
66
|
+
if provider == "aws":
|
|
67
|
+
return (True, "")
|
|
68
|
+
|
|
69
|
+
return (
|
|
70
|
+
False,
|
|
71
|
+
f"json-asff output format is only available for the aws provider, but {provider} was selected",
|
|
72
|
+
)
|
|
@@ -146,24 +146,8 @@ class Provider(ABC):
|
|
|
146
146
|
@staticmethod
|
|
147
147
|
def init_global_provider(arguments: Namespace) -> None:
|
|
148
148
|
try:
|
|
149
|
-
# Map CLI provider names to directory names (for cases where they differ)
|
|
150
|
-
provider_directory_map = {
|
|
151
|
-
"oci": "oraclecloud", # oci SDK conflict avoidance
|
|
152
|
-
}
|
|
153
|
-
# Map CLI provider names to provider file names (for cases where they differ)
|
|
154
|
-
provider_file_map = {
|
|
155
|
-
"oci": "oci", # oraclecloud directory but oci_provider.py file
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
provider_directory = provider_directory_map.get(
|
|
159
|
-
arguments.provider, arguments.provider
|
|
160
|
-
)
|
|
161
|
-
provider_file = provider_file_map.get(
|
|
162
|
-
arguments.provider, arguments.provider
|
|
163
|
-
)
|
|
164
|
-
|
|
165
149
|
provider_class_path = (
|
|
166
|
-
f"{providers_path}.{
|
|
150
|
+
f"{providers_path}.{arguments.provider}.{arguments.provider}_provider"
|
|
167
151
|
)
|
|
168
152
|
provider_class_name = f"{arguments.provider.capitalize()}Provider"
|
|
169
153
|
provider_class = getattr(
|
|
@@ -291,7 +275,7 @@ class Provider(ABC):
|
|
|
291
275
|
mutelist_path=arguments.mutelist_file,
|
|
292
276
|
fixer_config=fixer_config,
|
|
293
277
|
)
|
|
294
|
-
elif "
|
|
278
|
+
elif "oraclecloud" in provider_class_name.lower():
|
|
295
279
|
provider_class(
|
|
296
280
|
oci_config_file=arguments.oci_config_file,
|
|
297
281
|
profile=arguments.profile,
|
|
@@ -1,29 +1,30 @@
|
|
|
1
1
|
{
|
|
2
2
|
"Provider": "gcp",
|
|
3
3
|
"CheckID": "artifacts_container_analysis_enabled",
|
|
4
|
-
"CheckTitle": "
|
|
5
|
-
"CheckType": [
|
|
6
|
-
"Security",
|
|
7
|
-
"Configuration"
|
|
8
|
-
],
|
|
4
|
+
"CheckTitle": "GCP project has Artifact Registry Container Analysis API enabled",
|
|
5
|
+
"CheckType": [],
|
|
9
6
|
"ServiceName": "artifacts",
|
|
10
|
-
"SubServiceName": "
|
|
7
|
+
"SubServiceName": "",
|
|
11
8
|
"ResourceIdTemplate": "",
|
|
12
9
|
"Severity": "medium",
|
|
13
|
-
"ResourceType": "Service",
|
|
14
|
-
"Description": "
|
|
15
|
-
"Risk": "
|
|
16
|
-
"RelatedUrl": "
|
|
10
|
+
"ResourceType": "serviceusage.googleapis.com/Service",
|
|
11
|
+
"Description": "Evaluates whether **Artifact Analysis** (`containeranalysis.googleapis.com`) is enabled at the project level to support **vulnerability scanning** and metadata for container images in Artifact Registry or Container Registry.",
|
|
12
|
+
"Risk": "Absent this service, images aren't continuously scanned, leaving known CVEs unnoticed. Attackers can run vulnerable containers, gain code execution, move laterally, and exfiltrate data, eroding the **integrity** and **confidentiality** of workloads and the software supply chain.",
|
|
13
|
+
"RelatedUrl": "",
|
|
14
|
+
"AdditionalURLs": [
|
|
15
|
+
"https://cloud.google.com/artifact-analysis/docs",
|
|
16
|
+
"https://cloud.google.com/artifact-analysis/docs/container-scanning-overview"
|
|
17
|
+
],
|
|
17
18
|
"Remediation": {
|
|
18
19
|
"Code": {
|
|
19
|
-
"CLI": "gcloud services enable containeranalysis.googleapis.com",
|
|
20
|
+
"CLI": "gcloud services enable containeranalysis.googleapis.com --project <PROJECT_ID>",
|
|
20
21
|
"NativeIaC": "",
|
|
21
|
-
"Other": "",
|
|
22
|
-
"Terraform": ""
|
|
22
|
+
"Other": "1. In Google Cloud Console, ensure the correct project is selected\n2. Go to APIs & Services > Library\n3. Search for \"Container Analysis API\"\n4. Click the API, then click \"Enable\"",
|
|
23
|
+
"Terraform": "```hcl\nresource \"google_project_service\" \"<example_resource_name>\" {\n project = \"<example_project_id>\"\n service = \"containeranalysis.googleapis.com\" # Enables Artifact Analysis (Container Analysis) API to pass the check\n}\n```"
|
|
23
24
|
},
|
|
24
25
|
"Recommendation": {
|
|
25
|
-
"Text": "Enable
|
|
26
|
-
"Url": "https://
|
|
26
|
+
"Text": "Enable **Artifact Analysis** (`containeranalysis.googleapis.com`) for projects hosting container images. Integrate scan results into CI/CD policy gates, apply **least privilege** to findings access, and rebuild images promptly to maintain **defense in depth**.",
|
|
27
|
+
"Url": "https://hub.prowler.com/check/artifacts_container_analysis_enabled"
|
|
27
28
|
}
|
|
28
29
|
},
|
|
29
30
|
"Categories": [],
|
|
@@ -25,10 +25,25 @@ class CloudResourceManager(GCPService):
|
|
|
25
25
|
.execute(num_retries=DEFAULT_RETRY_ATTEMPTS)
|
|
26
26
|
)
|
|
27
27
|
audit_logging = False
|
|
28
|
+
audit_configs = []
|
|
28
29
|
if policy.get("auditConfigs"):
|
|
29
30
|
audit_logging = True
|
|
31
|
+
for config in policy.get("auditConfigs", []):
|
|
32
|
+
log_types = []
|
|
33
|
+
for log_config in config.get("auditLogConfigs", []):
|
|
34
|
+
log_types.append(log_config.get("logType", ""))
|
|
35
|
+
audit_configs.append(
|
|
36
|
+
AuditConfig(
|
|
37
|
+
service=config.get("service", ""),
|
|
38
|
+
log_types=log_types,
|
|
39
|
+
)
|
|
40
|
+
)
|
|
30
41
|
self.cloud_resource_manager_projects.append(
|
|
31
|
-
Project(
|
|
42
|
+
Project(
|
|
43
|
+
id=project_id,
|
|
44
|
+
audit_logging=audit_logging,
|
|
45
|
+
audit_configs=audit_configs,
|
|
46
|
+
)
|
|
32
47
|
)
|
|
33
48
|
for binding in policy["bindings"]:
|
|
34
49
|
self.bindings.append(
|
|
@@ -40,7 +55,9 @@ class CloudResourceManager(GCPService):
|
|
|
40
55
|
)
|
|
41
56
|
except Exception as error:
|
|
42
57
|
logger.error(
|
|
43
|
-
f"{self.region} --
|
|
58
|
+
f"{self.region} -- "
|
|
59
|
+
f"{error.__class__.__name__}"
|
|
60
|
+
f"[{error.__traceback__.tb_lineno}]: {error}"
|
|
44
61
|
)
|
|
45
62
|
|
|
46
63
|
def _get_organizations(self):
|
|
@@ -54,15 +71,23 @@ class CloudResourceManager(GCPService):
|
|
|
54
71
|
for org in response.get("organizations", []):
|
|
55
72
|
self.organizations.append(
|
|
56
73
|
Organization(
|
|
57
|
-
id=org["name"].split("/")[-1],
|
|
74
|
+
id=org["name"].split("/")[-1],
|
|
75
|
+
name=org["displayName"],
|
|
58
76
|
)
|
|
59
77
|
)
|
|
60
78
|
except Exception as error:
|
|
61
79
|
logger.error(
|
|
62
|
-
f"{self.region} --
|
|
80
|
+
f"{self.region} -- "
|
|
81
|
+
f"{error.__class__.__name__}"
|
|
82
|
+
f"[{error.__traceback__.tb_lineno}]: {error}"
|
|
63
83
|
)
|
|
64
84
|
|
|
65
85
|
|
|
86
|
+
class AuditConfig(BaseModel):
|
|
87
|
+
service: str
|
|
88
|
+
log_types: list[str]
|
|
89
|
+
|
|
90
|
+
|
|
66
91
|
class Binding(BaseModel):
|
|
67
92
|
role: str
|
|
68
93
|
members: list
|
|
@@ -72,6 +97,7 @@ class Binding(BaseModel):
|
|
|
72
97
|
class Project(BaseModel):
|
|
73
98
|
id: str
|
|
74
99
|
audit_logging: bool
|
|
100
|
+
audit_configs: list[AuditConfig] = []
|
|
75
101
|
|
|
76
102
|
|
|
77
103
|
class Organization(BaseModel):
|
|
File without changes
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"Provider": "gcp",
|
|
3
|
+
"CheckID": "cloudstorage_audit_logs_enabled",
|
|
4
|
+
"CheckTitle": "Data Access audit logs are enabled for Cloud Storage",
|
|
5
|
+
"CheckType": [],
|
|
6
|
+
"ServiceName": "cloudstorage",
|
|
7
|
+
"SubServiceName": "",
|
|
8
|
+
"ResourceIdTemplate": "",
|
|
9
|
+
"Severity": "medium",
|
|
10
|
+
"ResourceType": "cloudresourcemanager.googleapis.com/Project",
|
|
11
|
+
"Description": "Data Access audit logs (DATA_READ and DATA_WRITE) are enabled for Cloud Storage at the project level. Unlike Admin Activity logs (enabled by default), Data Access logs must be explicitly configured to track read and write operations on Cloud Storage objects.",
|
|
12
|
+
"Risk": "Without Data Access audit logs, you cannot track who accessed or modified objects in your Cloud Storage buckets, making it difficult to detect unauthorized access, data exfiltration, or compliance violations.",
|
|
13
|
+
"RelatedUrl": "",
|
|
14
|
+
"AdditionalURLs": [
|
|
15
|
+
"https://www.trendmicro.com/cloudoneconformity/knowledge-base/gcp/CloudStorage/enable-data-access-audit-logs.html",
|
|
16
|
+
"https://cloud.google.com/storage/docs/audit-logging"
|
|
17
|
+
],
|
|
18
|
+
"Remediation": {
|
|
19
|
+
"Code": {
|
|
20
|
+
"CLI": "",
|
|
21
|
+
"NativeIaC": "",
|
|
22
|
+
"Other": "1) Console → IAM & Admin → Audit Logs\n2) Find 'Google Cloud Storage' in the list of services\n3) Check the boxes for 'Data Read' and 'Data Write'\n4) Click 'Save' to apply the configuration\n\nNote: This is a project-level setting that applies to all Cloud Storage buckets in the project.",
|
|
23
|
+
"Terraform": "```hcl\nresource \"google_project_iam_audit_config\" \"storage_audit\" {\n project = var.project_id\n service = \"storage.googleapis.com\"\n\n audit_log_config {\n log_type = \"DATA_READ\"\n }\n\n audit_log_config {\n log_type = \"DATA_WRITE\"\n }\n}\n```"
|
|
24
|
+
},
|
|
25
|
+
"Recommendation": {
|
|
26
|
+
"Text": "Enable Data Access audit logs (DATA_READ and DATA_WRITE) for Cloud Storage at the project level to track all read and write operations on storage objects for security monitoring and compliance.",
|
|
27
|
+
"Url": "https://hub.prowler.com/check/cloudstorage_audit_logs_enabled"
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"Categories": [
|
|
31
|
+
"logging"
|
|
32
|
+
],
|
|
33
|
+
"DependsOn": [],
|
|
34
|
+
"RelatedTo": [],
|
|
35
|
+
"Notes": ""
|
|
36
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
from prowler.lib.check.models import Check, Check_Report_GCP
|
|
2
|
+
from prowler.providers.gcp.services.cloudresourcemanager.cloudresourcemanager_client import (
|
|
3
|
+
cloudresourcemanager_client,
|
|
4
|
+
)
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class cloudstorage_audit_logs_enabled(Check):
|
|
8
|
+
"""
|
|
9
|
+
Ensure GCP Cloud Storage data access audit logs are enabled.
|
|
10
|
+
|
|
11
|
+
- PASS: Project has audit config for storage.googleapis.com or allServices with
|
|
12
|
+
DATA_READ and DATA_WRITE log types enabled.
|
|
13
|
+
- FAIL: Project is missing audit config for Cloud Storage,
|
|
14
|
+
or missing DATA_READ or DATA_WRITE log types.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
def execute(self) -> list[Check_Report_GCP]:
|
|
18
|
+
findings = []
|
|
19
|
+
|
|
20
|
+
for project in cloudresourcemanager_client.cloud_resource_manager_projects:
|
|
21
|
+
report = Check_Report_GCP(
|
|
22
|
+
metadata=self.metadata(),
|
|
23
|
+
resource=cloudresourcemanager_client.projects[project.id],
|
|
24
|
+
project_id=project.id,
|
|
25
|
+
location=cloudresourcemanager_client.region,
|
|
26
|
+
resource_name=(
|
|
27
|
+
cloudresourcemanager_client.projects[project.id].name
|
|
28
|
+
if cloudresourcemanager_client.projects[project.id].name
|
|
29
|
+
else "GCP Project"
|
|
30
|
+
),
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
log_types_set = set()
|
|
34
|
+
for config in project.audit_configs:
|
|
35
|
+
if config.service in ["storage.googleapis.com", "allServices"]:
|
|
36
|
+
log_types_set.update(config.log_types)
|
|
37
|
+
|
|
38
|
+
required_logs = {"DATA_READ", "DATA_WRITE"}
|
|
39
|
+
|
|
40
|
+
if project.audit_logging:
|
|
41
|
+
if required_logs.issubset(log_types_set):
|
|
42
|
+
report.status = "PASS"
|
|
43
|
+
report.status_extended = f"Project {project.id} has Data Access audit logs (DATA_READ and DATA_WRITE) enabled for Cloud Storage."
|
|
44
|
+
else:
|
|
45
|
+
report.status = "FAIL"
|
|
46
|
+
if not log_types_set:
|
|
47
|
+
report.status_extended = f"Project {project.id} has Audit Logs enabled for other services but not for Cloud Storage."
|
|
48
|
+
else:
|
|
49
|
+
report.status_extended = (
|
|
50
|
+
f"Project {project.id} has Audit Logs enabled for Cloud Storage but is missing some required log types"
|
|
51
|
+
f"(missing: {', '.join(sorted(required_logs - log_types_set))})."
|
|
52
|
+
)
|
|
53
|
+
else:
|
|
54
|
+
report.status = "FAIL"
|
|
55
|
+
report.status_extended = (
|
|
56
|
+
f"Project {project.id} does not have Audit Logs enabled."
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
findings.append(report)
|
|
60
|
+
|
|
61
|
+
return findings
|
|
@@ -1,26 +1,29 @@
|
|
|
1
1
|
{
|
|
2
2
|
"Provider": "gcp",
|
|
3
3
|
"CheckID": "cloudstorage_bucket_log_retention_policy_lock",
|
|
4
|
-
"CheckTitle": "
|
|
4
|
+
"CheckTitle": "Cloud Storage log bucket has a Retention Policy with Bucket Lock enabled",
|
|
5
5
|
"CheckType": [],
|
|
6
6
|
"ServiceName": "cloudstorage",
|
|
7
7
|
"SubServiceName": "",
|
|
8
8
|
"ResourceIdTemplate": "",
|
|
9
9
|
"Severity": "medium",
|
|
10
|
-
"ResourceType": "Bucket",
|
|
11
|
-
"Description": "
|
|
12
|
-
"Risk": "
|
|
10
|
+
"ResourceType": "storage.googleapis.com/Bucket",
|
|
11
|
+
"Description": "**Google Cloud Storage buckets** used as **log sinks** are evaluated to ensure that a **Retention Policy** is configured and **Bucket Lock** is enabled. Enabling Bucket Lock permanently prevents the retention policy from being reduced or removed, protecting logs from modification or deletion.",
|
|
12
|
+
"Risk": "Log sink buckets without a locked retention policy are at risk of log tampering or accidental deletion. Without Bucket Lock, an attacker or user could remove or shorten the retention policy, compromising the integrity of audit logs required for forensics and compliance investigations.",
|
|
13
13
|
"RelatedUrl": "",
|
|
14
|
+
"AdditionalURLs": [
|
|
15
|
+
"https://www.trendmicro.com/cloudoneconformity/knowledge-base/gcp/CloudStorage/retention-policies-with-bucket-lock.html"
|
|
16
|
+
],
|
|
14
17
|
"Remediation": {
|
|
15
18
|
"Code": {
|
|
16
|
-
"CLI": "",
|
|
19
|
+
"CLI": "gcloud storage buckets lock-retention-policy gs://<LOG_BUCKET_NAME>",
|
|
17
20
|
"NativeIaC": "",
|
|
18
|
-
"Other": "
|
|
19
|
-
"Terraform": "
|
|
21
|
+
"Other": "1) Open Google Cloud Console → Storage → Buckets → <LOG_BUCKET_NAME>\n2) Go to the **Configuration** tab\n3) Under **Retention policy**, ensure a retention duration is set\n4) Click **Lock** to enable Bucket Lock and confirm the operation",
|
|
22
|
+
"Terraform": "```hcl\nresource \"google_storage_bucket\" \"log_bucket\" {\n name = var.log_bucket_name\n location = var.location\n\n retention_policy {\n retention_period = 31536000 # 365 days in seconds\n is_locked = true\n }\n}\n```"
|
|
20
23
|
},
|
|
21
24
|
"Recommendation": {
|
|
22
|
-
"Text": "
|
|
23
|
-
"Url": "https://
|
|
25
|
+
"Text": "Configure a retention policy and enable Bucket Lock on all Cloud Storage buckets used as log sinks to ensure log integrity and immutability.",
|
|
26
|
+
"Url": "https://hub.prowler.com/check/cloudstorage_bucket_log_retention_policy_lock"
|
|
24
27
|
}
|
|
25
28
|
},
|
|
26
29
|
"Categories": [],
|
|
@@ -6,7 +6,14 @@ from prowler.providers.gcp.services.logging.logging_client import logging_client
|
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
class cloudstorage_bucket_log_retention_policy_lock(Check):
|
|
9
|
-
|
|
9
|
+
"""
|
|
10
|
+
Ensure Log Sink buckets have a Retention Policy with Bucket Lock enabled.
|
|
11
|
+
|
|
12
|
+
- PASS: Log sink bucket has a retention policy and is locked.
|
|
13
|
+
- FAIL: Log sink bucket has no retention policy, or it has one but is not locked.
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
def execute(self) -> list[Check_Report_GCP]:
|
|
10
17
|
findings = []
|
|
11
18
|
# Get Log Sink Buckets
|
|
12
19
|
log_buckets = []
|
|
@@ -22,8 +29,8 @@ class cloudstorage_bucket_log_retention_policy_lock(Check):
|
|
|
22
29
|
)
|
|
23
30
|
if bucket.retention_policy:
|
|
24
31
|
report.status = "FAIL"
|
|
25
|
-
report.status_extended = f"Log Sink Bucket {bucket.name} has
|
|
26
|
-
if bucket.retention_policy.
|
|
32
|
+
report.status_extended = f"Log Sink Bucket {bucket.name} has a Retention Policy but without Bucket Lock."
|
|
33
|
+
if bucket.retention_policy.is_locked:
|
|
27
34
|
report.status = "PASS"
|
|
28
35
|
report.status_extended = f"Log Sink Bucket {bucket.name} has a Retention Policy with Bucket Lock."
|
|
29
36
|
findings.append(report)
|
|
File without changes
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"Provider": "gcp",
|
|
3
|
+
"CheckID": "cloudstorage_bucket_logging_enabled",
|
|
4
|
+
"CheckTitle": "Cloud Storage buckets have Usage and Storage Logs enabled",
|
|
5
|
+
"CheckType": [],
|
|
6
|
+
"ServiceName": "cloudstorage",
|
|
7
|
+
"SubServiceName": "",
|
|
8
|
+
"ResourceIdTemplate": "",
|
|
9
|
+
"Severity": "medium",
|
|
10
|
+
"ResourceType": "storage.googleapis.com/Bucket",
|
|
11
|
+
"Description": "**Google Cloud Storage buckets** are evaluated to ensure that **Usage and Storage Logs** are enabled. Enabling these logs provides detailed visibility into access requests, usage patterns, and storage activity within each bucket.",
|
|
12
|
+
"Risk": "Buckets without Usage and Storage Logs enabled lack visibility into access and storage activity, which increases the risk of undetected data exfiltration, misuse, or configuration errors.",
|
|
13
|
+
"RelatedUrl": "",
|
|
14
|
+
"AdditionalURLs": [
|
|
15
|
+
"https://www.trendmicro.com/cloudoneconformity/knowledge-base/gcp/CloudStorage/enable-usage-and-storage-logs.html",
|
|
16
|
+
"https://cloud.google.com/storage/docs/access-logs"
|
|
17
|
+
],
|
|
18
|
+
"Remediation": {
|
|
19
|
+
"Code": {
|
|
20
|
+
"CLI": "gsutil logging set on -b gs://<LOGGING_BUCKET> -o <LOG_OBJECT_PREFIX> gs://<BUCKET_NAME>",
|
|
21
|
+
"NativeIaC": "",
|
|
22
|
+
"Other": "",
|
|
23
|
+
"Terraform": "```hcl\n# Example: enable Usage and Storage Logs on a Cloud Storage bucket\nresource \"google_storage_bucket\" \"example\" {\n name = var.bucket_name\n location = var.location\n\n logging {\n log_bucket = var.log_bucket_name\n log_object_prefix = \"${var.bucket_name}/\"\n }\n}\n```"
|
|
24
|
+
},
|
|
25
|
+
"Recommendation": {
|
|
26
|
+
"Text": "Enable Usage and Storage Logs for all Cloud Storage buckets to track access, detect anomalies, and maintain audit visibility of data operations.",
|
|
27
|
+
"Url": "https://hub.prowler.com/check/cloudstorage_bucket_logging_enabled"
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"Categories": [
|
|
31
|
+
"logging"
|
|
32
|
+
],
|
|
33
|
+
"DependsOn": [],
|
|
34
|
+
"RelatedTo": [],
|
|
35
|
+
"Notes": "Buckets missing the 'logging.logBucket' configuration are treated as having Usage and Storage Logs disabled. The 'logObjectPrefix' field is optional and defaults to the bucket name."
|
|
36
|
+
}
|