prowler-cloud 5.13.1__py3-none-any.whl → 5.14.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (298) hide show
  1. dashboard/__main__.py +2 -1
  2. dashboard/compliance/c5_azure.py +43 -0
  3. dashboard/compliance/fedramp_20x_ksi_low_aws.py +46 -0
  4. dashboard/compliance/fedramp_20x_ksi_low_azure.py +46 -0
  5. dashboard/compliance/fedramp_20x_ksi_low_gcp.py +46 -0
  6. dashboard/compliance/hipaa_gcp.py +25 -0
  7. dashboard/compliance/nist_csf_2_0_aws.py +24 -0
  8. dashboard/compliance/prowler_threatscore_kubernetes.py +28 -0
  9. prowler/AGENTS.md +366 -0
  10. prowler/CHANGELOG.md +93 -2
  11. prowler/__main__.py +54 -7
  12. prowler/compliance/aws/ens_rd2022_aws.json +1 -1
  13. prowler/compliance/aws/fedramp_20x_ksi_low_aws.json +347 -0
  14. prowler/compliance/aws/nis2_aws.json +1 -1
  15. prowler/compliance/aws/nist_csf_2.0_aws.json +1781 -0
  16. prowler/compliance/azure/c5_azure.json +9471 -0
  17. prowler/compliance/azure/ens_rd2022_azure.json +1 -1
  18. prowler/compliance/azure/fedramp_20x_ksi_low_azure.json +358 -0
  19. prowler/compliance/azure/nis2_azure.json +1 -1
  20. prowler/compliance/gcp/c5_gcp.json +9401 -0
  21. prowler/compliance/gcp/ens_rd2022_gcp.json +1 -1
  22. prowler/compliance/gcp/fedramp_20x_ksi_low_gcp.json +293 -0
  23. prowler/compliance/gcp/hipaa_gcp.json +415 -0
  24. prowler/compliance/gcp/nis2_gcp.json +1 -1
  25. prowler/compliance/github/cis_1.0_github.json +6 -2
  26. prowler/compliance/kubernetes/prowler_threatscore_kubernetes.json +1269 -0
  27. prowler/compliance/m365/prowler_threatscore_m365.json +6 -6
  28. prowler/compliance/{oci/cis_3.0_oci.json → oraclecloud/cis_3.0_oraclecloud.json} +1 -1
  29. prowler/config/config.py +59 -5
  30. prowler/config/config.yaml +3 -0
  31. prowler/lib/check/check.py +1 -9
  32. prowler/lib/check/checks_loader.py +65 -1
  33. prowler/lib/check/models.py +12 -2
  34. prowler/lib/check/utils.py +1 -7
  35. prowler/lib/cli/parser.py +17 -7
  36. prowler/lib/mutelist/mutelist.py +15 -7
  37. prowler/lib/outputs/compliance/c5/c5_azure.py +92 -0
  38. prowler/lib/outputs/compliance/c5/c5_gcp.py +92 -0
  39. prowler/lib/outputs/compliance/c5/models.py +54 -0
  40. prowler/lib/outputs/compliance/cis/{cis_oci.py → cis_oraclecloud.py} +7 -7
  41. prowler/lib/outputs/compliance/cis/models.py +3 -3
  42. prowler/lib/outputs/compliance/prowler_threatscore/models.py +29 -0
  43. prowler/lib/outputs/compliance/prowler_threatscore/prowler_threatscore_kubernetes.py +98 -0
  44. prowler/lib/outputs/finding.py +16 -5
  45. prowler/lib/outputs/html/html.py +10 -8
  46. prowler/lib/outputs/outputs.py +1 -1
  47. prowler/lib/outputs/summary_table.py +1 -1
  48. prowler/lib/powershell/powershell.py +12 -11
  49. prowler/lib/scan/scan.py +105 -24
  50. prowler/lib/utils/utils.py +1 -1
  51. prowler/providers/aws/aws_regions_by_service.json +73 -15
  52. prowler/providers/aws/lib/quick_inventory/quick_inventory.py +1 -1
  53. prowler/providers/aws/lib/security_hub/security_hub.py +1 -1
  54. prowler/providers/aws/services/account/account_service.py +1 -1
  55. prowler/providers/aws/services/awslambda/awslambda_function_using_supported_runtimes/awslambda_function_using_supported_runtimes.metadata.json +1 -3
  56. prowler/providers/aws/services/cloudwatch/cloudwatch_alarm_actions_alarm_state_configured/cloudwatch_alarm_actions_alarm_state_configured.metadata.json +23 -12
  57. prowler/providers/aws/services/cloudwatch/cloudwatch_alarm_actions_enabled/cloudwatch_alarm_actions_enabled.metadata.json +21 -12
  58. prowler/providers/aws/services/cloudwatch/cloudwatch_changes_to_network_acls_alarm_configured/cloudwatch_changes_to_network_acls_alarm_configured.metadata.json +23 -12
  59. prowler/providers/aws/services/cloudwatch/cloudwatch_changes_to_network_gateways_alarm_configured/cloudwatch_changes_to_network_gateways_alarm_configured.metadata.json +24 -12
  60. 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
  61. prowler/providers/aws/services/cloudwatch/cloudwatch_changes_to_vpcs_alarm_configured/cloudwatch_changes_to_vpcs_alarm_configured.metadata.json +17 -11
  62. prowler/providers/aws/services/cloudwatch/cloudwatch_cross_account_sharing_disabled/cloudwatch_cross_account_sharing_disabled.metadata.json +20 -12
  63. prowler/providers/aws/services/cloudwatch/cloudwatch_log_group_kms_encryption_enabled/cloudwatch_log_group_kms_encryption_enabled.metadata.json +22 -13
  64. prowler/providers/aws/services/cloudwatch/cloudwatch_log_group_no_secrets_in_logs/cloudwatch_log_group_no_secrets_in_logs.metadata.json +22 -17
  65. prowler/providers/aws/services/cloudwatch/cloudwatch_log_group_not_publicly_accessible/cloudwatch_log_group_not_publicly_accessible.metadata.json +18 -12
  66. 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
  67. 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
  68. 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
  69. prowler/providers/aws/services/cloudwatch/cloudwatch_log_metric_filter_authentication_failures/cloudwatch_log_metric_filter_authentication_failures.metadata.json +25 -12
  70. prowler/providers/aws/services/cloudwatch/cloudwatch_log_metric_filter_aws_organizations_changes/cloudwatch_log_metric_filter_aws_organizations_changes.metadata.json +23 -12
  71. 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
  72. 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
  73. prowler/providers/aws/services/cloudwatch/cloudwatch_log_metric_filter_policy_changes/cloudwatch_log_metric_filter_policy_changes.metadata.json +21 -12
  74. prowler/providers/aws/services/cloudwatch/cloudwatch_log_metric_filter_root_usage/cloudwatch_log_metric_filter_root_usage.metadata.json +27 -12
  75. prowler/providers/aws/services/cloudwatch/cloudwatch_log_metric_filter_security_group_changes/cloudwatch_log_metric_filter_security_group_changes.metadata.json +22 -12
  76. 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
  77. prowler/providers/aws/services/cloudwatch/cloudwatch_log_metric_filter_unauthorized_api_calls/cloudwatch_log_metric_filter_unauthorized_api_calls.metadata.json +25 -12
  78. prowler/providers/aws/services/codeartifact/codeartifact_packages_external_public_publishing_disabled/codeartifact_packages_external_public_publishing_disabled.metadata.json +20 -11
  79. prowler/providers/aws/services/codebuild/codebuild_project_logging_enabled/codebuild_project_logging_enabled.metadata.json +22 -12
  80. prowler/providers/aws/services/codebuild/codebuild_project_no_secrets_in_variables/codebuild_project_no_secrets_in_variables.metadata.json +28 -12
  81. prowler/providers/aws/services/codebuild/codebuild_project_not_publicly_accessible/codebuild_project_not_publicly_accessible.metadata.json +22 -12
  82. prowler/providers/aws/services/codebuild/codebuild_project_older_90_days/codebuild_project_older_90_days.metadata.json +15 -10
  83. prowler/providers/aws/services/codebuild/codebuild_project_s3_logs_encrypted/codebuild_project_s3_logs_encrypted.metadata.json +19 -11
  84. 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
  85. prowler/providers/aws/services/codebuild/codebuild_project_user_controlled_buildspec/codebuild_project_user_controlled_buildspec.metadata.json +19 -12
  86. prowler/providers/aws/services/codebuild/codebuild_project_uses_allowed_github_organizations/codebuild_project_uses_allowed_github_organizations.metadata.json +24 -13
  87. prowler/providers/aws/services/codebuild/codebuild_report_group_export_encrypted/codebuild_report_group_export_encrypted.metadata.json +35 -13
  88. prowler/providers/aws/services/codepipeline/__init__.py +0 -0
  89. prowler/providers/aws/services/codepipeline/codepipeline_client.py +6 -0
  90. prowler/providers/aws/services/codepipeline/codepipeline_project_repo_private/__init__.py +0 -0
  91. prowler/providers/aws/services/codepipeline/codepipeline_project_repo_private/codepipeline_project_repo_private.metadata.json +30 -0
  92. prowler/providers/aws/services/codepipeline/codepipeline_project_repo_private/codepipeline_project_repo_private.py +95 -0
  93. prowler/providers/aws/services/codepipeline/codepipeline_service.py +164 -0
  94. prowler/providers/aws/services/directconnect/directconnect_connection_redundancy/directconnect_connection_redundancy.metadata.json +18 -12
  95. prowler/providers/aws/services/directconnect/directconnect_virtual_interface_redundancy/directconnect_virtual_interface_redundancy.metadata.json +18 -12
  96. prowler/providers/aws/services/documentdb/documentdb_cluster_backup_enabled/documentdb_cluster_backup_enabled.metadata.json +24 -13
  97. prowler/providers/aws/services/documentdb/documentdb_cluster_cloudwatch_log_export/documentdb_cluster_cloudwatch_log_export.metadata.json +23 -13
  98. prowler/providers/aws/services/documentdb/documentdb_cluster_deletion_protection/documentdb_cluster_deletion_protection.metadata.json +24 -13
  99. prowler/providers/aws/services/documentdb/documentdb_cluster_multi_az_enabled/documentdb_cluster_multi_az_enabled.metadata.json +19 -13
  100. prowler/providers/aws/services/documentdb/documentdb_cluster_public_snapshot/documentdb_cluster_public_snapshot.metadata.json +20 -10
  101. prowler/providers/aws/services/documentdb/documentdb_cluster_storage_encrypted/documentdb_cluster_storage_encrypted.metadata.json +26 -13
  102. prowler/providers/aws/services/drs/drs_job_exist/drs_job_exist.metadata.json +20 -10
  103. prowler/providers/aws/services/dynamodb/dynamodb_accelerator_cluster_encryption_enabled/dynamodb_accelerator_cluster_encryption_enabled.metadata.json +18 -11
  104. prowler/providers/aws/services/dynamodb/dynamodb_accelerator_cluster_in_transit_encryption_enabled/dynamodb_accelerator_cluster_in_transit_encryption_enabled.metadata.json +16 -11
  105. prowler/providers/aws/services/dynamodb/dynamodb_accelerator_cluster_multi_az/dynamodb_accelerator_cluster_multi_az.metadata.json +21 -13
  106. prowler/providers/aws/services/dynamodb/dynamodb_table_autoscaling_enabled/dynamodb_table_autoscaling_enabled.metadata.json +20 -12
  107. prowler/providers/aws/services/dynamodb/dynamodb_table_cross_account_access/dynamodb_table_cross_account_access.metadata.json +17 -10
  108. prowler/providers/aws/services/dynamodb/dynamodb_table_deletion_protection_enabled/dynamodb_table_deletion_protection_enabled.metadata.json +21 -13
  109. prowler/providers/aws/services/dynamodb/dynamodb_table_protected_by_backup_plan/dynamodb_table_protected_by_backup_plan.metadata.json +18 -12
  110. prowler/providers/aws/services/dynamodb/dynamodb_tables_kms_cmk_encryption_enabled/dynamodb_tables_kms_cmk_encryption_enabled.metadata.json +18 -12
  111. prowler/providers/aws/services/dynamodb/dynamodb_tables_pitr_enabled/dynamodb_tables_pitr_enabled.metadata.json +19 -12
  112. prowler/providers/aws/services/ecr/ecr_registry_scan_images_on_push_enabled/ecr_registry_scan_images_on_push_enabled.metadata.json +16 -11
  113. prowler/providers/aws/services/ecr/ecr_repositories_lifecycle_policy_enabled/ecr_repositories_lifecycle_policy_enabled.metadata.json +22 -13
  114. prowler/providers/aws/services/ecr/ecr_repositories_not_publicly_accessible/ecr_repositories_not_publicly_accessible.metadata.json +19 -13
  115. prowler/providers/aws/services/ecr/ecr_repositories_scan_images_on_push_enabled/ecr_repositories_scan_images_on_push_enabled.metadata.json +21 -13
  116. prowler/providers/aws/services/ecr/ecr_repositories_scan_vulnerabilities_in_latest_image/ecr_repositories_scan_vulnerabilities_in_latest_image.metadata.json +22 -12
  117. prowler/providers/aws/services/ecr/ecr_repositories_tag_immutability/ecr_repositories_tag_immutability.metadata.json +20 -12
  118. prowler/providers/aws/services/ecs/ecs_cluster_container_insights_enabled/ecs_cluster_container_insights_enabled.metadata.json +21 -11
  119. prowler/providers/aws/services/ecs/ecs_service_fargate_latest_platform_version/ecs_service_fargate_latest_platform_version.metadata.json +20 -11
  120. prowler/providers/aws/services/ecs/ecs_service_no_assign_public_ip/ecs_service_no_assign_public_ip.metadata.json +18 -12
  121. prowler/providers/aws/services/ecs/ecs_task_definitions_containers_readonly_access/ecs_task_definitions_containers_readonly_access.metadata.json +20 -13
  122. prowler/providers/aws/services/ecs/ecs_task_definitions_host_namespace_not_shared/ecs_task_definitions_host_namespace_not_shared.metadata.json +21 -13
  123. prowler/providers/aws/services/ecs/ecs_task_definitions_host_networking_mode_users/ecs_task_definitions_host_networking_mode_users.metadata.json +26 -13
  124. prowler/providers/aws/services/ecs/ecs_task_definitions_logging_block_mode/ecs_task_definitions_logging_block_mode.metadata.json +19 -12
  125. prowler/providers/aws/services/ecs/ecs_task_definitions_logging_enabled/ecs_task_definitions_logging_enabled.metadata.json +18 -12
  126. prowler/providers/aws/services/ecs/ecs_task_definitions_no_environment_secrets/ecs_task_definitions_no_environment_secrets.metadata.json +16 -12
  127. prowler/providers/aws/services/ecs/ecs_task_definitions_no_privileged_containers/ecs_task_definitions_no_privileged_containers.metadata.json +21 -14
  128. prowler/providers/aws/services/ecs/ecs_task_set_no_assign_public_ip/ecs_task_set_no_assign_public_ip.metadata.json +19 -13
  129. prowler/providers/aws/services/eks/eks_cluster_deletion_protection_enabled/eks_cluster_deletion_protection_enabled.metadata.json +20 -13
  130. 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
  131. prowler/providers/aws/services/eks/eks_cluster_network_policy_enabled/eks_cluster_network_policy_enabled.metadata.json +20 -14
  132. prowler/providers/aws/services/eks/eks_cluster_not_publicly_accessible/eks_cluster_not_publicly_accessible.metadata.json +22 -13
  133. prowler/providers/aws/services/eks/eks_cluster_private_nodes_enabled/eks_cluster_private_nodes_enabled.metadata.json +19 -13
  134. prowler/providers/aws/services/eks/eks_cluster_uses_a_supported_version/eks_cluster_uses_a_supported_version.metadata.json +21 -12
  135. prowler/providers/aws/services/eks/eks_control_plane_logging_all_types_enabled/eks_control_plane_logging_all_types_enabled.metadata.json +20 -13
  136. prowler/providers/aws/services/elasticache/elasticache_cluster_uses_public_subnet/elasticache_cluster_uses_public_subnet.metadata.json +20 -12
  137. prowler/providers/aws/services/elasticache/elasticache_redis_cluster_auto_minor_version_upgrades/elasticache_redis_cluster_auto_minor_version_upgrades.metadata.json +21 -12
  138. prowler/providers/aws/services/elasticache/elasticache_redis_cluster_automatic_failover_enabled/elasticache_redis_cluster_automatic_failover_enabled.metadata.json +20 -13
  139. prowler/providers/aws/services/elasticache/elasticache_redis_cluster_backup_enabled/elasticache_redis_cluster_backup_enabled.metadata.json +23 -13
  140. prowler/providers/aws/services/elasticache/elasticache_redis_cluster_in_transit_encryption_enabled/elasticache_redis_cluster_in_transit_encryption_enabled.metadata.json +21 -12
  141. prowler/providers/aws/services/elasticache/elasticache_redis_cluster_multi_az_enabled/elasticache_redis_cluster_multi_az_enabled.metadata.json +22 -14
  142. prowler/providers/aws/services/elasticache/elasticache_redis_cluster_rest_encryption_enabled/elasticache_redis_cluster_rest_encryption_enabled.metadata.json +20 -11
  143. prowler/providers/aws/services/elasticache/elasticache_redis_replication_group_auth_enabled/elasticache_redis_replication_group_auth_enabled.metadata.json +23 -13
  144. prowler/providers/aws/services/elasticbeanstalk/elasticbeanstalk_environment_cloudwatch_logging_enabled/elasticbeanstalk_environment_cloudwatch_logging_enabled.metadata.json +18 -12
  145. prowler/providers/aws/services/elasticbeanstalk/elasticbeanstalk_environment_enhanced_health_reporting/elasticbeanstalk_environment_enhanced_health_reporting.metadata.json +17 -12
  146. prowler/providers/aws/services/elasticbeanstalk/elasticbeanstalk_environment_managed_updates_enabled/elasticbeanstalk_environment_managed_updates_enabled.metadata.json +17 -11
  147. prowler/providers/aws/services/elb/elb_connection_draining_enabled/elb_connection_draining_enabled.metadata.json +22 -13
  148. prowler/providers/aws/services/elb/elb_cross_zone_load_balancing_enabled/elb_cross_zone_load_balancing_enabled.metadata.json +24 -13
  149. prowler/providers/aws/services/elb/elb_desync_mitigation_mode/elb_desync_mitigation_mode.metadata.json +20 -11
  150. prowler/providers/aws/services/elb/elb_insecure_ssl_ciphers/elb_insecure_ssl_ciphers.metadata.json +20 -10
  151. prowler/providers/aws/services/elb/elb_internet_facing/elb_internet_facing.metadata.json +20 -11
  152. prowler/providers/aws/services/elb/elb_is_in_multiple_az/elb_is_in_multiple_az.metadata.json +20 -12
  153. prowler/providers/aws/services/elb/elb_logging_enabled/elb_logging_enabled.metadata.json +19 -12
  154. prowler/providers/aws/services/elb/elb_ssl_listeners/elb_ssl_listeners.metadata.json +19 -11
  155. prowler/providers/aws/services/elb/elb_ssl_listeners_use_acm_certificate/elb_ssl_listeners_use_acm_certificate.metadata.json +17 -12
  156. prowler/providers/aws/services/elbv2/elbv2_cross_zone_load_balancing_enabled/elbv2_cross_zone_load_balancing_enabled.metadata.json +21 -13
  157. prowler/providers/aws/services/elbv2/elbv2_deletion_protection/elbv2_deletion_protection.metadata.json +19 -11
  158. prowler/providers/aws/services/elbv2/elbv2_desync_mitigation_mode/elbv2_desync_mitigation_mode.metadata.json +21 -12
  159. prowler/providers/aws/services/elbv2/elbv2_insecure_ssl_ciphers/elbv2_insecure_ssl_ciphers.metadata.json +18 -11
  160. prowler/providers/aws/services/elbv2/elbv2_internet_facing/elbv2_internet_facing.metadata.json +17 -10
  161. prowler/providers/aws/services/elbv2/elbv2_is_in_multiple_az/elbv2_is_in_multiple_az.metadata.json +22 -13
  162. prowler/providers/aws/services/elbv2/elbv2_listeners_underneath/elbv2_listeners_underneath.metadata.json +18 -12
  163. prowler/providers/aws/services/elbv2/elbv2_logging_enabled/elbv2_logging_enabled.metadata.json +17 -12
  164. prowler/providers/aws/services/elbv2/elbv2_nlb_tls_termination_enabled/elbv2_nlb_tls_termination_enabled.metadata.json +18 -11
  165. prowler/providers/aws/services/elbv2/elbv2_ssl_listeners/elbv2_ssl_listeners.metadata.json +18 -12
  166. prowler/providers/aws/services/elbv2/elbv2_waf_acl_attached/elbv2_waf_acl_attached.metadata.json +16 -11
  167. prowler/providers/aws/services/emr/emr_cluster_account_public_block_enabled/emr_cluster_account_public_block_enabled.metadata.json +21 -13
  168. prowler/providers/aws/services/emr/emr_cluster_master_nodes_no_public_ip/emr_cluster_master_nodes_no_public_ip.metadata.json +24 -11
  169. prowler/providers/aws/services/emr/emr_cluster_publicly_accesible/emr_cluster_publicly_accesible.metadata.json +18 -11
  170. prowler/providers/aws/services/eventbridge/eventbridge_bus_cross_account_access/eventbridge_bus_cross_account_access.metadata.json +26 -13
  171. prowler/providers/aws/services/eventbridge/eventbridge_bus_exposed/eventbridge_bus_exposed.metadata.json +21 -11
  172. prowler/providers/aws/services/eventbridge/eventbridge_global_endpoint_event_replication_enabled/eventbridge_global_endpoint_event_replication_enabled.metadata.json +24 -13
  173. prowler/providers/aws/services/eventbridge/eventbridge_schema_registry_cross_account_access/eventbridge_schema_registry_cross_account_access.metadata.json +26 -14
  174. prowler/providers/aws/services/firehose/firehose_stream_encrypted_at_rest/firehose_stream_encrypted_at_rest.metadata.json +26 -15
  175. prowler/providers/aws/services/firehose/firehose_stream_encrypted_at_rest/firehose_stream_encrypted_at_rest.py +15 -16
  176. prowler/providers/aws/services/fms/fms_policy_compliant/fms_policy_compliant.metadata.json +23 -11
  177. 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
  178. 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
  179. prowler/providers/aws/services/fsx/fsx_windows_file_system_multi_az_enabled/fsx_windows_file_system_multi_az_enabled.metadata.json +22 -13
  180. prowler/providers/aws/services/glacier/glacier_vaults_policy_public_access/glacier_vaults_policy_public_access.metadata.json +21 -12
  181. prowler/providers/aws/services/iam/lib/policy.py +24 -16
  182. prowler/providers/aws/services/kinesis/kinesis_stream_data_retention_period/kinesis_stream_data_retention_period.metadata.json +21 -13
  183. prowler/providers/aws/services/kinesis/kinesis_stream_encrypted_at_rest/kinesis_stream_encrypted_at_rest.metadata.json +22 -13
  184. prowler/providers/azure/services/cosmosdb/cosmosdb_service.py +7 -2
  185. prowler/providers/azure/services/defender/defender_service.py +4 -2
  186. prowler/providers/azure/services/postgresql/postgresql_flexible_server_entra_id_authentication_enabled/__init__.py +0 -0
  187. prowler/providers/azure/services/postgresql/postgresql_flexible_server_entra_id_authentication_enabled/postgresql_flexible_server_entra_id_authentication_enabled.metadata.json +36 -0
  188. prowler/providers/azure/services/postgresql/postgresql_flexible_server_entra_id_authentication_enabled/postgresql_flexible_server_entra_id_authentication_enabled.py +43 -0
  189. prowler/providers/azure/services/postgresql/postgresql_service.py +66 -9
  190. prowler/providers/azure/services/storage/storage_service.py +13 -4
  191. prowler/providers/azure/services/vm/vm_service.py +4 -7
  192. prowler/providers/common/arguments.py +19 -16
  193. prowler/providers/common/provider.py +2 -18
  194. prowler/providers/gcp/services/artifacts/artifacts_container_analysis_enabled/artifacts_container_analysis_enabled.metadata.json +16 -15
  195. prowler/providers/gcp/services/cloudresourcemanager/cloudresourcemanager_service.py +30 -4
  196. prowler/providers/gcp/services/cloudstorage/cloudstorage_audit_logs_enabled/__init__.py +0 -0
  197. prowler/providers/gcp/services/cloudstorage/cloudstorage_audit_logs_enabled/cloudstorage_audit_logs_enabled.metadata.json +36 -0
  198. prowler/providers/gcp/services/cloudstorage/cloudstorage_audit_logs_enabled/cloudstorage_audit_logs_enabled.py +61 -0
  199. prowler/providers/gcp/services/cloudstorage/cloudstorage_bucket_log_retention_policy_lock/cloudstorage_bucket_log_retention_policy_lock.metadata.json +12 -9
  200. prowler/providers/gcp/services/cloudstorage/cloudstorage_bucket_log_retention_policy_lock/cloudstorage_bucket_log_retention_policy_lock.py +10 -3
  201. prowler/providers/gcp/services/cloudstorage/cloudstorage_bucket_logging_enabled/__init__.py +0 -0
  202. prowler/providers/gcp/services/cloudstorage/cloudstorage_bucket_logging_enabled/cloudstorage_bucket_logging_enabled.metadata.json +36 -0
  203. prowler/providers/gcp/services/cloudstorage/cloudstorage_bucket_logging_enabled/cloudstorage_bucket_logging_enabled.py +40 -0
  204. prowler/providers/gcp/services/cloudstorage/cloudstorage_bucket_soft_delete_enabled/__init__.py +0 -0
  205. prowler/providers/gcp/services/cloudstorage/cloudstorage_bucket_soft_delete_enabled/cloudstorage_bucket_soft_delete_enabled.metadata.json +36 -0
  206. prowler/providers/gcp/services/cloudstorage/cloudstorage_bucket_soft_delete_enabled/cloudstorage_bucket_soft_delete_enabled.py +31 -0
  207. prowler/providers/gcp/services/cloudstorage/cloudstorage_bucket_sufficient_retention_period/__init__.py +0 -0
  208. prowler/providers/gcp/services/cloudstorage/cloudstorage_bucket_sufficient_retention_period/cloudstorage_bucket_sufficient_retention_period.metadata.json +35 -0
  209. prowler/providers/gcp/services/cloudstorage/cloudstorage_bucket_sufficient_retention_period/cloudstorage_bucket_sufficient_retention_period.py +55 -0
  210. prowler/providers/gcp/services/cloudstorage/cloudstorage_bucket_versioning_enabled/__init__.py +0 -0
  211. prowler/providers/gcp/services/cloudstorage/cloudstorage_bucket_versioning_enabled/cloudstorage_bucket_versioning_enabled.metadata.json +36 -0
  212. prowler/providers/gcp/services/cloudstorage/cloudstorage_bucket_versioning_enabled/cloudstorage_bucket_versioning_enabled.py +30 -0
  213. prowler/providers/gcp/services/cloudstorage/cloudstorage_service.py +48 -2
  214. prowler/providers/github/services/organization/organization_default_repository_permission_strict/__init__.py +0 -0
  215. prowler/providers/github/services/organization/organization_default_repository_permission_strict/organization_default_repository_permission_strict.metadata.json +35 -0
  216. prowler/providers/github/services/organization/organization_default_repository_permission_strict/organization_default_repository_permission_strict.py +36 -0
  217. prowler/providers/github/services/organization/organization_members_mfa_required/organization_members_mfa_required.metadata.json +14 -8
  218. prowler/providers/github/services/organization/organization_repository_creation_limited/__init__.py +0 -0
  219. prowler/providers/github/services/organization/organization_repository_creation_limited/organization_repository_creation_limited.metadata.json +30 -0
  220. prowler/providers/github/services/organization/organization_repository_creation_limited/organization_repository_creation_limited.py +106 -0
  221. prowler/providers/github/services/organization/organization_service.py +84 -10
  222. prowler/providers/iac/iac_provider.py +279 -55
  223. prowler/providers/kubernetes/services/etcd/etcd_client_cert_auth/etcd_client_cert_auth.metadata.json +18 -13
  224. prowler/providers/kubernetes/services/etcd/etcd_no_auto_tls/etcd_no_auto_tls.metadata.json +16 -11
  225. prowler/providers/kubernetes/services/etcd/etcd_no_peer_auto_tls/etcd_no_peer_auto_tls.metadata.json +16 -11
  226. prowler/providers/kubernetes/services/etcd/etcd_peer_client_cert_auth/etcd_peer_client_cert_auth.metadata.json +18 -13
  227. prowler/providers/kubernetes/services/etcd/etcd_peer_tls_config/etcd_peer_tls_config.metadata.json +16 -12
  228. prowler/providers/kubernetes/services/etcd/etcd_tls_encryption/etcd_tls_encryption.metadata.json +16 -11
  229. prowler/providers/kubernetes/services/etcd/etcd_unique_ca/etcd_unique_ca.metadata.json +16 -10
  230. prowler/providers/m365/lib/powershell/m365_powershell.py +80 -93
  231. prowler/providers/m365/m365_provider.py +1 -6
  232. prowler/providers/m365/services/exchange/exchange_mailbox_policy_additional_storage_restricted/exchange_mailbox_policy_additional_storage_restricted.py +17 -21
  233. prowler/providers/m365/services/exchange/exchange_service.py +18 -12
  234. prowler/providers/m365/services/sharepoint/sharepoint_external_sharing_managed/sharepoint_external_sharing_managed.py +9 -7
  235. prowler/providers/mongodbatlas/exceptions/exceptions.py +16 -0
  236. prowler/providers/mongodbatlas/mongodbatlas_provider.py +15 -3
  237. prowler/providers/mongodbatlas/services/projects/projects_auditing_enabled/projects_auditing_enabled.metadata.json +20 -9
  238. prowler/providers/mongodbatlas/services/projects/projects_network_access_list_exposed_to_internet/projects_network_access_list_exposed_to_internet.metadata.json +14 -9
  239. prowler/providers/oraclecloud/lib/arguments/arguments.py +4 -13
  240. prowler/providers/oraclecloud/lib/service/service.py +3 -3
  241. prowler/providers/oraclecloud/{oci_provider.py → oraclecloud_provider.py} +15 -15
  242. prowler/providers/oraclecloud/services/analytics/analytics_instance_access_restricted/analytics_instance_access_restricted.metadata.json +20 -16
  243. prowler/providers/oraclecloud/services/audit/audit_log_retention_period_365_days/audit_log_retention_period_365_days.metadata.json +17 -17
  244. prowler/providers/oraclecloud/services/blockstorage/blockstorage_block_volume_encrypted_with_cmk/blockstorage_block_volume_encrypted_with_cmk.metadata.json +17 -19
  245. prowler/providers/oraclecloud/services/blockstorage/blockstorage_boot_volume_encrypted_with_cmk/blockstorage_boot_volume_encrypted_with_cmk.metadata.json +18 -18
  246. prowler/providers/oraclecloud/services/cloudguard/cloudguard_enabled/cloudguard_enabled.metadata.json +17 -18
  247. prowler/providers/oraclecloud/services/compute/compute_instance_in_transit_encryption_enabled/compute_instance_in_transit_encryption_enabled.metadata.json +1 -1
  248. prowler/providers/oraclecloud/services/compute/compute_instance_legacy_metadata_endpoint_disabled/compute_instance_legacy_metadata_endpoint_disabled.metadata.json +1 -1
  249. prowler/providers/oraclecloud/services/compute/compute_instance_secure_boot_enabled/compute_instance_secure_boot_enabled.metadata.json +1 -1
  250. prowler/providers/oraclecloud/services/database/database_autonomous_database_access_restricted/database_autonomous_database_access_restricted.metadata.json +1 -1
  251. prowler/providers/oraclecloud/services/events/events_notification_topic_and_subscription_exists/events_notification_topic_and_subscription_exists.metadata.json +1 -1
  252. prowler/providers/oraclecloud/services/events/events_rule_cloudguard_problems/events_rule_cloudguard_problems.metadata.json +1 -1
  253. prowler/providers/oraclecloud/services/events/events_rule_iam_group_changes/events_rule_iam_group_changes.metadata.json +1 -1
  254. prowler/providers/oraclecloud/services/events/events_rule_iam_policy_changes/events_rule_iam_policy_changes.metadata.json +1 -1
  255. prowler/providers/oraclecloud/services/events/events_rule_identity_provider_changes/events_rule_identity_provider_changes.metadata.json +1 -1
  256. prowler/providers/oraclecloud/services/events/events_rule_idp_group_mapping_changes/events_rule_idp_group_mapping_changes.metadata.json +1 -1
  257. prowler/providers/oraclecloud/services/events/events_rule_local_user_authentication/events_rule_local_user_authentication.metadata.json +1 -1
  258. prowler/providers/oraclecloud/services/events/events_rule_network_gateway_changes/events_rule_network_gateway_changes.metadata.json +1 -1
  259. prowler/providers/oraclecloud/services/events/events_rule_network_security_group_changes/events_rule_network_security_group_changes.metadata.json +1 -1
  260. prowler/providers/oraclecloud/services/events/events_rule_route_table_changes/events_rule_route_table_changes.metadata.json +1 -1
  261. prowler/providers/oraclecloud/services/events/events_rule_security_list_changes/events_rule_security_list_changes.metadata.json +1 -1
  262. prowler/providers/oraclecloud/services/events/events_rule_user_changes/events_rule_user_changes.metadata.json +1 -1
  263. prowler/providers/oraclecloud/services/events/events_rule_vcn_changes/events_rule_vcn_changes.metadata.json +1 -1
  264. prowler/providers/oraclecloud/services/filestorage/filestorage_file_system_encrypted_with_cmk/filestorage_file_system_encrypted_with_cmk.metadata.json +1 -1
  265. prowler/providers/oraclecloud/services/identity/identity_iam_admins_cannot_update_tenancy_admins/identity_iam_admins_cannot_update_tenancy_admins.metadata.json +1 -1
  266. prowler/providers/oraclecloud/services/identity/identity_instance_principal_used/identity_instance_principal_used.metadata.json +1 -1
  267. prowler/providers/oraclecloud/services/identity/identity_no_resources_in_root_compartment/identity_no_resources_in_root_compartment.metadata.json +1 -1
  268. prowler/providers/oraclecloud/services/identity/identity_non_root_compartment_exists/identity_non_root_compartment_exists.metadata.json +1 -1
  269. prowler/providers/oraclecloud/services/identity/identity_password_policy_expires_within_365_days/identity_password_policy_expires_within_365_days.metadata.json +1 -1
  270. prowler/providers/oraclecloud/services/identity/identity_password_policy_minimum_length_14/identity_password_policy_minimum_length_14.metadata.json +1 -1
  271. prowler/providers/oraclecloud/services/identity/identity_password_policy_prevents_reuse/identity_password_policy_prevents_reuse.metadata.json +1 -1
  272. prowler/providers/oraclecloud/services/identity/identity_service_level_admins_exist/identity_service_level_admins_exist.metadata.json +1 -1
  273. prowler/providers/oraclecloud/services/identity/identity_tenancy_admin_permissions_limited/identity_tenancy_admin_permissions_limited.metadata.json +1 -1
  274. prowler/providers/oraclecloud/services/identity/identity_tenancy_admin_users_no_api_keys/identity_tenancy_admin_users_no_api_keys.metadata.json +1 -1
  275. prowler/providers/oraclecloud/services/identity/identity_user_api_keys_rotated_90_days/identity_user_api_keys_rotated_90_days.metadata.json +1 -1
  276. prowler/providers/oraclecloud/services/identity/identity_user_auth_tokens_rotated_90_days/identity_user_auth_tokens_rotated_90_days.metadata.json +1 -1
  277. 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
  278. prowler/providers/oraclecloud/services/identity/identity_user_db_passwords_rotated_90_days/identity_user_db_passwords_rotated_90_days.metadata.json +1 -1
  279. prowler/providers/oraclecloud/services/identity/identity_user_mfa_enabled_console_access/identity_user_mfa_enabled_console_access.metadata.json +1 -1
  280. prowler/providers/oraclecloud/services/identity/identity_user_valid_email_address/identity_user_valid_email_address.metadata.json +1 -1
  281. prowler/providers/oraclecloud/services/integration/integration_instance_access_restricted/integration_instance_access_restricted.metadata.json +1 -1
  282. prowler/providers/oraclecloud/services/kms/kms_key_rotation_enabled/kms_key_rotation_enabled.metadata.json +1 -1
  283. prowler/providers/oraclecloud/services/network/network_default_security_list_restricts_traffic/network_default_security_list_restricts_traffic.metadata.json +1 -1
  284. 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
  285. 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
  286. 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
  287. 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
  288. prowler/providers/oraclecloud/services/network/network_vcn_subnet_flow_logs_enabled/network_vcn_subnet_flow_logs_enabled.metadata.json +1 -1
  289. prowler/providers/oraclecloud/services/objectstorage/objectstorage_bucket_encrypted_with_cmk/objectstorage_bucket_encrypted_with_cmk.metadata.json +1 -1
  290. prowler/providers/oraclecloud/services/objectstorage/objectstorage_bucket_logging_enabled/objectstorage_bucket_logging_enabled.metadata.json +1 -1
  291. prowler/providers/oraclecloud/services/objectstorage/objectstorage_bucket_not_publicly_accessible/objectstorage_bucket_not_publicly_accessible.metadata.json +1 -1
  292. prowler/providers/oraclecloud/services/objectstorage/objectstorage_bucket_versioning_enabled/objectstorage_bucket_versioning_enabled.metadata.json +1 -1
  293. {prowler_cloud-5.13.1.dist-info → prowler_cloud-5.14.1.dist-info}/METADATA +17 -16
  294. {prowler_cloud-5.13.1.dist-info → prowler_cloud-5.14.1.dist-info}/RECORD +298 -249
  295. /prowler/compliance/{oci → oraclecloud}/__init__.py +0 -0
  296. {prowler_cloud-5.13.1.dist-info → prowler_cloud-5.14.1.dist-info}/LICENSE +0 -0
  297. {prowler_cloud-5.13.1.dist-info → prowler_cloud-5.14.1.dist-info}/WHEEL +0 -0
  298. {prowler_cloud-5.13.1.dist-info → prowler_cloud-5.14.1.dist-info}/entry_points.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  from dataclasses import dataclass
2
2
 
3
- from azure.mgmt.rdbms.postgresql_flexibleservers import PostgreSQLManagementClient
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 = self._get_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 _get_location(self, subscription, resouce_group_name, server_name):
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
- location = client.servers.get(resouce_group_name, server_name).location
106
- return location
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
- @dataclass
298
- class UefiSettings:
296
+ class UefiSettings(BaseModel):
299
297
  secure_boot_enabled: bool
300
298
  v_tpm_enabled: bool
301
299
 
302
300
 
303
- @dataclass
304
- class SecurityProfile:
305
- security_type: str
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}.{provider_directory}.{provider_arguments_lib_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}.{provider_directory}.{provider_arguments_lib_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}.{provider_directory}.{provider_file}_provider"
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 "oci" in provider_class_name.lower():
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": "Ensure Image Vulnerability Analysis using AR Container Analysis or a third-party provider",
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": "Container Analysis",
7
+ "SubServiceName": "",
11
8
  "ResourceIdTemplate": "",
12
9
  "Severity": "medium",
13
- "ResourceType": "Service",
14
- "Description": "Scan images stored in Google Container Registry (GCR) for vulnerabilities using AR Container Analysis or a third-party provider. This helps identify and mitigate security risks associated with known vulnerabilities in container images.",
15
- "Risk": "Without image vulnerability scanning, container images stored in Artifact Registry may contain known vulnerabilities, increasing the risk of exploitation by malicious actors.",
16
- "RelatedUrl": "https://cloud.google.com/artifact-analysis/docs",
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 vulnerability scanning for images stored in Artifact Registry using AR Container Analysis or a third-party provider.",
26
- "Url": "https://cloud.google.com/artifact-analysis/docs/container-scanning-overview"
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(id=project_id, audit_logging=audit_logging)
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} -- {error.__class__.__name__}[{error.__traceback__.tb_lineno}]: {error}"
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], name=org["displayName"]
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} -- {error.__class__.__name__}[{error.__traceback__.tb_lineno}]: {error}"
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):
@@ -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": "Ensure That Retention Policies on Cloud Storage Buckets Used for Exporting Logs Are Configured Using Bucket Lock",
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": "Enabling retention policies on log buckets will protect logs stored in cloud storage buckets from being overwritten or accidentally deleted.",
12
- "Risk": "Sinks can be configured to export logs in storage buckets. It is recommended to configure a data retention policy for these cloud storage buckets and to lock the data retention policy, thus permanently preventing the policy from being reduced or removed. This way, if the system is ever compromised by an attacker or a malicious insider who wants to cover their tracks, the activity logs are definitely preserved for forensics and security investigations.",
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": "https://www.trendmicro.com/cloudoneconformity/knowledge-base/gcp/CloudStorage/retention-policies-with-bucket-lock.html",
19
- "Terraform": "https://docs.prowler.com/checks/gcp/logging-policies-1/ensure-that-retention-policies-on-log-buckets-are-configured-using-bucket-lock#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": "It is recommended to set up retention policies and configure Bucket Lock on all storage buckets that are used as log sinks.",
23
- "Url": "https://cloud.google.com/storage/docs/using-uniform-bucket-level-access"
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
- def execute(self) -> Check_Report_GCP:
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 no Retention Policy but without Bucket Lock."
26
- if bucket.retention_policy.get("isLocked", False):
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)
@@ -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
+ }