prowler-cloud 5.13.1__py3-none-any.whl → 5.14.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- dashboard/__main__.py +2 -1
- dashboard/compliance/c5_azure.py +43 -0
- dashboard/compliance/fedramp_20x_ksi_low_aws.py +46 -0
- dashboard/compliance/fedramp_20x_ksi_low_azure.py +46 -0
- dashboard/compliance/fedramp_20x_ksi_low_gcp.py +46 -0
- dashboard/compliance/hipaa_gcp.py +25 -0
- dashboard/compliance/nist_csf_2_0_aws.py +24 -0
- dashboard/compliance/prowler_threatscore_kubernetes.py +28 -0
- prowler/AGENTS.md +366 -0
- prowler/CHANGELOG.md +93 -2
- prowler/__main__.py +54 -7
- prowler/compliance/aws/ens_rd2022_aws.json +1 -1
- prowler/compliance/aws/fedramp_20x_ksi_low_aws.json +347 -0
- prowler/compliance/aws/nis2_aws.json +1 -1
- prowler/compliance/aws/nist_csf_2.0_aws.json +1781 -0
- prowler/compliance/azure/c5_azure.json +9471 -0
- prowler/compliance/azure/ens_rd2022_azure.json +1 -1
- prowler/compliance/azure/fedramp_20x_ksi_low_azure.json +358 -0
- prowler/compliance/azure/nis2_azure.json +1 -1
- prowler/compliance/gcp/c5_gcp.json +9401 -0
- prowler/compliance/gcp/ens_rd2022_gcp.json +1 -1
- prowler/compliance/gcp/fedramp_20x_ksi_low_gcp.json +293 -0
- prowler/compliance/gcp/hipaa_gcp.json +415 -0
- prowler/compliance/gcp/nis2_gcp.json +1 -1
- prowler/compliance/github/cis_1.0_github.json +6 -2
- prowler/compliance/kubernetes/prowler_threatscore_kubernetes.json +1269 -0
- prowler/compliance/m365/prowler_threatscore_m365.json +6 -6
- prowler/compliance/{oci/cis_3.0_oci.json → oraclecloud/cis_3.0_oraclecloud.json} +1 -1
- prowler/config/config.py +59 -5
- prowler/config/config.yaml +3 -0
- prowler/lib/check/check.py +1 -9
- prowler/lib/check/checks_loader.py +65 -1
- prowler/lib/check/models.py +12 -2
- prowler/lib/check/utils.py +1 -7
- prowler/lib/cli/parser.py +17 -7
- prowler/lib/mutelist/mutelist.py +15 -7
- prowler/lib/outputs/compliance/c5/c5_azure.py +92 -0
- prowler/lib/outputs/compliance/c5/c5_gcp.py +92 -0
- prowler/lib/outputs/compliance/c5/models.py +54 -0
- prowler/lib/outputs/compliance/cis/{cis_oci.py → cis_oraclecloud.py} +7 -7
- prowler/lib/outputs/compliance/cis/models.py +3 -3
- prowler/lib/outputs/compliance/prowler_threatscore/models.py +29 -0
- prowler/lib/outputs/compliance/prowler_threatscore/prowler_threatscore_kubernetes.py +98 -0
- prowler/lib/outputs/finding.py +16 -5
- prowler/lib/outputs/html/html.py +10 -8
- prowler/lib/outputs/outputs.py +1 -1
- prowler/lib/outputs/summary_table.py +1 -1
- prowler/lib/powershell/powershell.py +12 -11
- prowler/lib/scan/scan.py +105 -24
- prowler/lib/utils/utils.py +1 -1
- prowler/providers/aws/aws_regions_by_service.json +73 -15
- prowler/providers/aws/lib/quick_inventory/quick_inventory.py +1 -1
- prowler/providers/aws/lib/security_hub/security_hub.py +1 -1
- prowler/providers/aws/services/account/account_service.py +1 -1
- prowler/providers/aws/services/awslambda/awslambda_function_using_supported_runtimes/awslambda_function_using_supported_runtimes.metadata.json +1 -3
- prowler/providers/aws/services/cloudwatch/cloudwatch_alarm_actions_alarm_state_configured/cloudwatch_alarm_actions_alarm_state_configured.metadata.json +23 -12
- prowler/providers/aws/services/cloudwatch/cloudwatch_alarm_actions_enabled/cloudwatch_alarm_actions_enabled.metadata.json +21 -12
- prowler/providers/aws/services/cloudwatch/cloudwatch_changes_to_network_acls_alarm_configured/cloudwatch_changes_to_network_acls_alarm_configured.metadata.json +23 -12
- prowler/providers/aws/services/cloudwatch/cloudwatch_changes_to_network_gateways_alarm_configured/cloudwatch_changes_to_network_gateways_alarm_configured.metadata.json +24 -12
- prowler/providers/aws/services/cloudwatch/cloudwatch_changes_to_network_route_tables_alarm_configured/cloudwatch_changes_to_network_route_tables_alarm_configured.metadata.json +21 -12
- prowler/providers/aws/services/cloudwatch/cloudwatch_changes_to_vpcs_alarm_configured/cloudwatch_changes_to_vpcs_alarm_configured.metadata.json +17 -11
- prowler/providers/aws/services/cloudwatch/cloudwatch_cross_account_sharing_disabled/cloudwatch_cross_account_sharing_disabled.metadata.json +20 -12
- prowler/providers/aws/services/cloudwatch/cloudwatch_log_group_kms_encryption_enabled/cloudwatch_log_group_kms_encryption_enabled.metadata.json +22 -13
- prowler/providers/aws/services/cloudwatch/cloudwatch_log_group_no_secrets_in_logs/cloudwatch_log_group_no_secrets_in_logs.metadata.json +22 -17
- prowler/providers/aws/services/cloudwatch/cloudwatch_log_group_not_publicly_accessible/cloudwatch_log_group_not_publicly_accessible.metadata.json +18 -12
- prowler/providers/aws/services/cloudwatch/cloudwatch_log_group_retention_policy_specific_days_enabled/cloudwatch_log_group_retention_policy_specific_days_enabled.metadata.json +27 -13
- prowler/providers/aws/services/cloudwatch/cloudwatch_log_metric_filter_and_alarm_for_aws_config_configuration_changes_enabled/cloudwatch_log_metric_filter_and_alarm_for_aws_config_configuration_changes_enabled.metadata.json +20 -12
- prowler/providers/aws/services/cloudwatch/cloudwatch_log_metric_filter_and_alarm_for_cloudtrail_configuration_changes_enabled/cloudwatch_log_metric_filter_and_alarm_for_cloudtrail_configuration_changes_enabled.metadata.json +22 -12
- prowler/providers/aws/services/cloudwatch/cloudwatch_log_metric_filter_authentication_failures/cloudwatch_log_metric_filter_authentication_failures.metadata.json +25 -12
- prowler/providers/aws/services/cloudwatch/cloudwatch_log_metric_filter_aws_organizations_changes/cloudwatch_log_metric_filter_aws_organizations_changes.metadata.json +23 -12
- prowler/providers/aws/services/cloudwatch/cloudwatch_log_metric_filter_disable_or_scheduled_deletion_of_kms_cmk/cloudwatch_log_metric_filter_disable_or_scheduled_deletion_of_kms_cmk.metadata.json +17 -12
- prowler/providers/aws/services/cloudwatch/cloudwatch_log_metric_filter_for_s3_bucket_policy_changes/cloudwatch_log_metric_filter_for_s3_bucket_policy_changes.metadata.json +21 -12
- prowler/providers/aws/services/cloudwatch/cloudwatch_log_metric_filter_policy_changes/cloudwatch_log_metric_filter_policy_changes.metadata.json +21 -12
- prowler/providers/aws/services/cloudwatch/cloudwatch_log_metric_filter_root_usage/cloudwatch_log_metric_filter_root_usage.metadata.json +27 -12
- prowler/providers/aws/services/cloudwatch/cloudwatch_log_metric_filter_security_group_changes/cloudwatch_log_metric_filter_security_group_changes.metadata.json +22 -12
- prowler/providers/aws/services/cloudwatch/cloudwatch_log_metric_filter_sign_in_without_mfa/cloudwatch_log_metric_filter_sign_in_without_mfa.metadata.json +26 -12
- prowler/providers/aws/services/cloudwatch/cloudwatch_log_metric_filter_unauthorized_api_calls/cloudwatch_log_metric_filter_unauthorized_api_calls.metadata.json +25 -12
- prowler/providers/aws/services/codeartifact/codeartifact_packages_external_public_publishing_disabled/codeartifact_packages_external_public_publishing_disabled.metadata.json +20 -11
- prowler/providers/aws/services/codebuild/codebuild_project_logging_enabled/codebuild_project_logging_enabled.metadata.json +22 -12
- prowler/providers/aws/services/codebuild/codebuild_project_no_secrets_in_variables/codebuild_project_no_secrets_in_variables.metadata.json +28 -12
- prowler/providers/aws/services/codebuild/codebuild_project_not_publicly_accessible/codebuild_project_not_publicly_accessible.metadata.json +22 -12
- prowler/providers/aws/services/codebuild/codebuild_project_older_90_days/codebuild_project_older_90_days.metadata.json +15 -10
- prowler/providers/aws/services/codebuild/codebuild_project_s3_logs_encrypted/codebuild_project_s3_logs_encrypted.metadata.json +19 -11
- prowler/providers/aws/services/codebuild/codebuild_project_source_repo_url_no_sensitive_credentials/codebuild_project_source_repo_url_no_sensitive_credentials.metadata.json +21 -12
- prowler/providers/aws/services/codebuild/codebuild_project_user_controlled_buildspec/codebuild_project_user_controlled_buildspec.metadata.json +19 -12
- prowler/providers/aws/services/codebuild/codebuild_project_uses_allowed_github_organizations/codebuild_project_uses_allowed_github_organizations.metadata.json +24 -13
- prowler/providers/aws/services/codebuild/codebuild_report_group_export_encrypted/codebuild_report_group_export_encrypted.metadata.json +35 -13
- prowler/providers/aws/services/codepipeline/__init__.py +0 -0
- prowler/providers/aws/services/codepipeline/codepipeline_client.py +6 -0
- prowler/providers/aws/services/codepipeline/codepipeline_project_repo_private/__init__.py +0 -0
- prowler/providers/aws/services/codepipeline/codepipeline_project_repo_private/codepipeline_project_repo_private.metadata.json +30 -0
- prowler/providers/aws/services/codepipeline/codepipeline_project_repo_private/codepipeline_project_repo_private.py +95 -0
- prowler/providers/aws/services/codepipeline/codepipeline_service.py +164 -0
- prowler/providers/aws/services/directconnect/directconnect_connection_redundancy/directconnect_connection_redundancy.metadata.json +18 -12
- prowler/providers/aws/services/directconnect/directconnect_virtual_interface_redundancy/directconnect_virtual_interface_redundancy.metadata.json +18 -12
- prowler/providers/aws/services/documentdb/documentdb_cluster_backup_enabled/documentdb_cluster_backup_enabled.metadata.json +24 -13
- prowler/providers/aws/services/documentdb/documentdb_cluster_cloudwatch_log_export/documentdb_cluster_cloudwatch_log_export.metadata.json +23 -13
- prowler/providers/aws/services/documentdb/documentdb_cluster_deletion_protection/documentdb_cluster_deletion_protection.metadata.json +24 -13
- prowler/providers/aws/services/documentdb/documentdb_cluster_multi_az_enabled/documentdb_cluster_multi_az_enabled.metadata.json +19 -13
- prowler/providers/aws/services/documentdb/documentdb_cluster_public_snapshot/documentdb_cluster_public_snapshot.metadata.json +20 -10
- prowler/providers/aws/services/documentdb/documentdb_cluster_storage_encrypted/documentdb_cluster_storage_encrypted.metadata.json +26 -13
- prowler/providers/aws/services/drs/drs_job_exist/drs_job_exist.metadata.json +20 -10
- prowler/providers/aws/services/dynamodb/dynamodb_accelerator_cluster_encryption_enabled/dynamodb_accelerator_cluster_encryption_enabled.metadata.json +18 -11
- prowler/providers/aws/services/dynamodb/dynamodb_accelerator_cluster_in_transit_encryption_enabled/dynamodb_accelerator_cluster_in_transit_encryption_enabled.metadata.json +16 -11
- prowler/providers/aws/services/dynamodb/dynamodb_accelerator_cluster_multi_az/dynamodb_accelerator_cluster_multi_az.metadata.json +21 -13
- prowler/providers/aws/services/dynamodb/dynamodb_table_autoscaling_enabled/dynamodb_table_autoscaling_enabled.metadata.json +20 -12
- prowler/providers/aws/services/dynamodb/dynamodb_table_cross_account_access/dynamodb_table_cross_account_access.metadata.json +17 -10
- prowler/providers/aws/services/dynamodb/dynamodb_table_deletion_protection_enabled/dynamodb_table_deletion_protection_enabled.metadata.json +21 -13
- prowler/providers/aws/services/dynamodb/dynamodb_table_protected_by_backup_plan/dynamodb_table_protected_by_backup_plan.metadata.json +18 -12
- prowler/providers/aws/services/dynamodb/dynamodb_tables_kms_cmk_encryption_enabled/dynamodb_tables_kms_cmk_encryption_enabled.metadata.json +18 -12
- prowler/providers/aws/services/dynamodb/dynamodb_tables_pitr_enabled/dynamodb_tables_pitr_enabled.metadata.json +19 -12
- prowler/providers/aws/services/ecr/ecr_registry_scan_images_on_push_enabled/ecr_registry_scan_images_on_push_enabled.metadata.json +16 -11
- prowler/providers/aws/services/ecr/ecr_repositories_lifecycle_policy_enabled/ecr_repositories_lifecycle_policy_enabled.metadata.json +22 -13
- prowler/providers/aws/services/ecr/ecr_repositories_not_publicly_accessible/ecr_repositories_not_publicly_accessible.metadata.json +19 -13
- prowler/providers/aws/services/ecr/ecr_repositories_scan_images_on_push_enabled/ecr_repositories_scan_images_on_push_enabled.metadata.json +21 -13
- prowler/providers/aws/services/ecr/ecr_repositories_scan_vulnerabilities_in_latest_image/ecr_repositories_scan_vulnerabilities_in_latest_image.metadata.json +22 -12
- prowler/providers/aws/services/ecr/ecr_repositories_tag_immutability/ecr_repositories_tag_immutability.metadata.json +20 -12
- prowler/providers/aws/services/ecs/ecs_cluster_container_insights_enabled/ecs_cluster_container_insights_enabled.metadata.json +21 -11
- prowler/providers/aws/services/ecs/ecs_service_fargate_latest_platform_version/ecs_service_fargate_latest_platform_version.metadata.json +20 -11
- prowler/providers/aws/services/ecs/ecs_service_no_assign_public_ip/ecs_service_no_assign_public_ip.metadata.json +18 -12
- prowler/providers/aws/services/ecs/ecs_task_definitions_containers_readonly_access/ecs_task_definitions_containers_readonly_access.metadata.json +20 -13
- prowler/providers/aws/services/ecs/ecs_task_definitions_host_namespace_not_shared/ecs_task_definitions_host_namespace_not_shared.metadata.json +21 -13
- prowler/providers/aws/services/ecs/ecs_task_definitions_host_networking_mode_users/ecs_task_definitions_host_networking_mode_users.metadata.json +26 -13
- prowler/providers/aws/services/ecs/ecs_task_definitions_logging_block_mode/ecs_task_definitions_logging_block_mode.metadata.json +19 -12
- prowler/providers/aws/services/ecs/ecs_task_definitions_logging_enabled/ecs_task_definitions_logging_enabled.metadata.json +18 -12
- prowler/providers/aws/services/ecs/ecs_task_definitions_no_environment_secrets/ecs_task_definitions_no_environment_secrets.metadata.json +16 -12
- prowler/providers/aws/services/ecs/ecs_task_definitions_no_privileged_containers/ecs_task_definitions_no_privileged_containers.metadata.json +21 -14
- prowler/providers/aws/services/ecs/ecs_task_set_no_assign_public_ip/ecs_task_set_no_assign_public_ip.metadata.json +19 -13
- prowler/providers/aws/services/eks/eks_cluster_deletion_protection_enabled/eks_cluster_deletion_protection_enabled.metadata.json +20 -13
- prowler/providers/aws/services/eks/eks_cluster_kms_cmk_encryption_in_secrets_enabled/eks_cluster_kms_cmk_encryption_in_secrets_enabled.metadata.json +20 -13
- prowler/providers/aws/services/eks/eks_cluster_network_policy_enabled/eks_cluster_network_policy_enabled.metadata.json +20 -14
- prowler/providers/aws/services/eks/eks_cluster_not_publicly_accessible/eks_cluster_not_publicly_accessible.metadata.json +22 -13
- prowler/providers/aws/services/eks/eks_cluster_private_nodes_enabled/eks_cluster_private_nodes_enabled.metadata.json +19 -13
- prowler/providers/aws/services/eks/eks_cluster_uses_a_supported_version/eks_cluster_uses_a_supported_version.metadata.json +21 -12
- prowler/providers/aws/services/eks/eks_control_plane_logging_all_types_enabled/eks_control_plane_logging_all_types_enabled.metadata.json +20 -13
- prowler/providers/aws/services/elasticache/elasticache_cluster_uses_public_subnet/elasticache_cluster_uses_public_subnet.metadata.json +20 -12
- prowler/providers/aws/services/elasticache/elasticache_redis_cluster_auto_minor_version_upgrades/elasticache_redis_cluster_auto_minor_version_upgrades.metadata.json +21 -12
- prowler/providers/aws/services/elasticache/elasticache_redis_cluster_automatic_failover_enabled/elasticache_redis_cluster_automatic_failover_enabled.metadata.json +20 -13
- prowler/providers/aws/services/elasticache/elasticache_redis_cluster_backup_enabled/elasticache_redis_cluster_backup_enabled.metadata.json +23 -13
- prowler/providers/aws/services/elasticache/elasticache_redis_cluster_in_transit_encryption_enabled/elasticache_redis_cluster_in_transit_encryption_enabled.metadata.json +21 -12
- prowler/providers/aws/services/elasticache/elasticache_redis_cluster_multi_az_enabled/elasticache_redis_cluster_multi_az_enabled.metadata.json +22 -14
- prowler/providers/aws/services/elasticache/elasticache_redis_cluster_rest_encryption_enabled/elasticache_redis_cluster_rest_encryption_enabled.metadata.json +20 -11
- prowler/providers/aws/services/elasticache/elasticache_redis_replication_group_auth_enabled/elasticache_redis_replication_group_auth_enabled.metadata.json +23 -13
- prowler/providers/aws/services/elasticbeanstalk/elasticbeanstalk_environment_cloudwatch_logging_enabled/elasticbeanstalk_environment_cloudwatch_logging_enabled.metadata.json +18 -12
- prowler/providers/aws/services/elasticbeanstalk/elasticbeanstalk_environment_enhanced_health_reporting/elasticbeanstalk_environment_enhanced_health_reporting.metadata.json +17 -12
- prowler/providers/aws/services/elasticbeanstalk/elasticbeanstalk_environment_managed_updates_enabled/elasticbeanstalk_environment_managed_updates_enabled.metadata.json +17 -11
- prowler/providers/aws/services/elb/elb_connection_draining_enabled/elb_connection_draining_enabled.metadata.json +22 -13
- prowler/providers/aws/services/elb/elb_cross_zone_load_balancing_enabled/elb_cross_zone_load_balancing_enabled.metadata.json +24 -13
- prowler/providers/aws/services/elb/elb_desync_mitigation_mode/elb_desync_mitigation_mode.metadata.json +20 -11
- prowler/providers/aws/services/elb/elb_insecure_ssl_ciphers/elb_insecure_ssl_ciphers.metadata.json +20 -10
- prowler/providers/aws/services/elb/elb_internet_facing/elb_internet_facing.metadata.json +20 -11
- prowler/providers/aws/services/elb/elb_is_in_multiple_az/elb_is_in_multiple_az.metadata.json +20 -12
- prowler/providers/aws/services/elb/elb_logging_enabled/elb_logging_enabled.metadata.json +19 -12
- prowler/providers/aws/services/elb/elb_ssl_listeners/elb_ssl_listeners.metadata.json +19 -11
- prowler/providers/aws/services/elb/elb_ssl_listeners_use_acm_certificate/elb_ssl_listeners_use_acm_certificate.metadata.json +17 -12
- prowler/providers/aws/services/elbv2/elbv2_cross_zone_load_balancing_enabled/elbv2_cross_zone_load_balancing_enabled.metadata.json +21 -13
- prowler/providers/aws/services/elbv2/elbv2_deletion_protection/elbv2_deletion_protection.metadata.json +19 -11
- prowler/providers/aws/services/elbv2/elbv2_desync_mitigation_mode/elbv2_desync_mitigation_mode.metadata.json +21 -12
- prowler/providers/aws/services/elbv2/elbv2_insecure_ssl_ciphers/elbv2_insecure_ssl_ciphers.metadata.json +18 -11
- prowler/providers/aws/services/elbv2/elbv2_internet_facing/elbv2_internet_facing.metadata.json +17 -10
- prowler/providers/aws/services/elbv2/elbv2_is_in_multiple_az/elbv2_is_in_multiple_az.metadata.json +22 -13
- prowler/providers/aws/services/elbv2/elbv2_listeners_underneath/elbv2_listeners_underneath.metadata.json +18 -12
- prowler/providers/aws/services/elbv2/elbv2_logging_enabled/elbv2_logging_enabled.metadata.json +17 -12
- prowler/providers/aws/services/elbv2/elbv2_nlb_tls_termination_enabled/elbv2_nlb_tls_termination_enabled.metadata.json +18 -11
- prowler/providers/aws/services/elbv2/elbv2_ssl_listeners/elbv2_ssl_listeners.metadata.json +18 -12
- prowler/providers/aws/services/elbv2/elbv2_waf_acl_attached/elbv2_waf_acl_attached.metadata.json +16 -11
- prowler/providers/aws/services/emr/emr_cluster_account_public_block_enabled/emr_cluster_account_public_block_enabled.metadata.json +21 -13
- prowler/providers/aws/services/emr/emr_cluster_master_nodes_no_public_ip/emr_cluster_master_nodes_no_public_ip.metadata.json +24 -11
- prowler/providers/aws/services/emr/emr_cluster_publicly_accesible/emr_cluster_publicly_accesible.metadata.json +18 -11
- prowler/providers/aws/services/eventbridge/eventbridge_bus_cross_account_access/eventbridge_bus_cross_account_access.metadata.json +26 -13
- prowler/providers/aws/services/eventbridge/eventbridge_bus_exposed/eventbridge_bus_exposed.metadata.json +21 -11
- prowler/providers/aws/services/eventbridge/eventbridge_global_endpoint_event_replication_enabled/eventbridge_global_endpoint_event_replication_enabled.metadata.json +24 -13
- prowler/providers/aws/services/eventbridge/eventbridge_schema_registry_cross_account_access/eventbridge_schema_registry_cross_account_access.metadata.json +26 -14
- prowler/providers/aws/services/firehose/firehose_stream_encrypted_at_rest/firehose_stream_encrypted_at_rest.metadata.json +26 -15
- prowler/providers/aws/services/firehose/firehose_stream_encrypted_at_rest/firehose_stream_encrypted_at_rest.py +15 -16
- prowler/providers/aws/services/fms/fms_policy_compliant/fms_policy_compliant.metadata.json +23 -11
- prowler/providers/aws/services/fsx/fsx_file_system_copy_tags_to_backups_enabled/fsx_file_system_copy_tags_to_backups_enabled.metadata.json +19 -12
- prowler/providers/aws/services/fsx/fsx_file_system_copy_tags_to_volumes_enabled/fsx_file_system_copy_tags_to_volumes_enabled.metadata.json +17 -12
- prowler/providers/aws/services/fsx/fsx_windows_file_system_multi_az_enabled/fsx_windows_file_system_multi_az_enabled.metadata.json +22 -13
- prowler/providers/aws/services/glacier/glacier_vaults_policy_public_access/glacier_vaults_policy_public_access.metadata.json +21 -12
- prowler/providers/aws/services/iam/lib/policy.py +24 -16
- prowler/providers/aws/services/kinesis/kinesis_stream_data_retention_period/kinesis_stream_data_retention_period.metadata.json +21 -13
- prowler/providers/aws/services/kinesis/kinesis_stream_encrypted_at_rest/kinesis_stream_encrypted_at_rest.metadata.json +22 -13
- prowler/providers/azure/services/cosmosdb/cosmosdb_service.py +7 -2
- prowler/providers/azure/services/defender/defender_service.py +4 -2
- prowler/providers/azure/services/postgresql/postgresql_flexible_server_entra_id_authentication_enabled/__init__.py +0 -0
- prowler/providers/azure/services/postgresql/postgresql_flexible_server_entra_id_authentication_enabled/postgresql_flexible_server_entra_id_authentication_enabled.metadata.json +36 -0
- prowler/providers/azure/services/postgresql/postgresql_flexible_server_entra_id_authentication_enabled/postgresql_flexible_server_entra_id_authentication_enabled.py +43 -0
- prowler/providers/azure/services/postgresql/postgresql_service.py +66 -9
- prowler/providers/azure/services/storage/storage_service.py +13 -4
- prowler/providers/azure/services/vm/vm_service.py +4 -7
- prowler/providers/common/arguments.py +19 -16
- prowler/providers/common/provider.py +2 -18
- prowler/providers/gcp/services/artifacts/artifacts_container_analysis_enabled/artifacts_container_analysis_enabled.metadata.json +16 -15
- prowler/providers/gcp/services/cloudresourcemanager/cloudresourcemanager_service.py +30 -4
- prowler/providers/gcp/services/cloudstorage/cloudstorage_audit_logs_enabled/__init__.py +0 -0
- prowler/providers/gcp/services/cloudstorage/cloudstorage_audit_logs_enabled/cloudstorage_audit_logs_enabled.metadata.json +36 -0
- prowler/providers/gcp/services/cloudstorage/cloudstorage_audit_logs_enabled/cloudstorage_audit_logs_enabled.py +61 -0
- prowler/providers/gcp/services/cloudstorage/cloudstorage_bucket_log_retention_policy_lock/cloudstorage_bucket_log_retention_policy_lock.metadata.json +12 -9
- prowler/providers/gcp/services/cloudstorage/cloudstorage_bucket_log_retention_policy_lock/cloudstorage_bucket_log_retention_policy_lock.py +10 -3
- prowler/providers/gcp/services/cloudstorage/cloudstorage_bucket_logging_enabled/__init__.py +0 -0
- prowler/providers/gcp/services/cloudstorage/cloudstorage_bucket_logging_enabled/cloudstorage_bucket_logging_enabled.metadata.json +36 -0
- prowler/providers/gcp/services/cloudstorage/cloudstorage_bucket_logging_enabled/cloudstorage_bucket_logging_enabled.py +40 -0
- prowler/providers/gcp/services/cloudstorage/cloudstorage_bucket_soft_delete_enabled/__init__.py +0 -0
- prowler/providers/gcp/services/cloudstorage/cloudstorage_bucket_soft_delete_enabled/cloudstorage_bucket_soft_delete_enabled.metadata.json +36 -0
- prowler/providers/gcp/services/cloudstorage/cloudstorage_bucket_soft_delete_enabled/cloudstorage_bucket_soft_delete_enabled.py +31 -0
- prowler/providers/gcp/services/cloudstorage/cloudstorage_bucket_sufficient_retention_period/__init__.py +0 -0
- prowler/providers/gcp/services/cloudstorage/cloudstorage_bucket_sufficient_retention_period/cloudstorage_bucket_sufficient_retention_period.metadata.json +35 -0
- prowler/providers/gcp/services/cloudstorage/cloudstorage_bucket_sufficient_retention_period/cloudstorage_bucket_sufficient_retention_period.py +55 -0
- prowler/providers/gcp/services/cloudstorage/cloudstorage_bucket_versioning_enabled/__init__.py +0 -0
- prowler/providers/gcp/services/cloudstorage/cloudstorage_bucket_versioning_enabled/cloudstorage_bucket_versioning_enabled.metadata.json +36 -0
- prowler/providers/gcp/services/cloudstorage/cloudstorage_bucket_versioning_enabled/cloudstorage_bucket_versioning_enabled.py +30 -0
- prowler/providers/gcp/services/cloudstorage/cloudstorage_service.py +48 -2
- prowler/providers/github/services/organization/organization_default_repository_permission_strict/__init__.py +0 -0
- prowler/providers/github/services/organization/organization_default_repository_permission_strict/organization_default_repository_permission_strict.metadata.json +35 -0
- prowler/providers/github/services/organization/organization_default_repository_permission_strict/organization_default_repository_permission_strict.py +36 -0
- prowler/providers/github/services/organization/organization_members_mfa_required/organization_members_mfa_required.metadata.json +14 -8
- prowler/providers/github/services/organization/organization_repository_creation_limited/__init__.py +0 -0
- prowler/providers/github/services/organization/organization_repository_creation_limited/organization_repository_creation_limited.metadata.json +30 -0
- prowler/providers/github/services/organization/organization_repository_creation_limited/organization_repository_creation_limited.py +106 -0
- prowler/providers/github/services/organization/organization_service.py +84 -10
- prowler/providers/iac/iac_provider.py +279 -55
- prowler/providers/kubernetes/services/etcd/etcd_client_cert_auth/etcd_client_cert_auth.metadata.json +18 -13
- prowler/providers/kubernetes/services/etcd/etcd_no_auto_tls/etcd_no_auto_tls.metadata.json +16 -11
- prowler/providers/kubernetes/services/etcd/etcd_no_peer_auto_tls/etcd_no_peer_auto_tls.metadata.json +16 -11
- prowler/providers/kubernetes/services/etcd/etcd_peer_client_cert_auth/etcd_peer_client_cert_auth.metadata.json +18 -13
- prowler/providers/kubernetes/services/etcd/etcd_peer_tls_config/etcd_peer_tls_config.metadata.json +16 -12
- prowler/providers/kubernetes/services/etcd/etcd_tls_encryption/etcd_tls_encryption.metadata.json +16 -11
- prowler/providers/kubernetes/services/etcd/etcd_unique_ca/etcd_unique_ca.metadata.json +16 -10
- prowler/providers/m365/lib/powershell/m365_powershell.py +80 -93
- prowler/providers/m365/m365_provider.py +1 -6
- prowler/providers/m365/services/exchange/exchange_mailbox_policy_additional_storage_restricted/exchange_mailbox_policy_additional_storage_restricted.py +17 -21
- prowler/providers/m365/services/exchange/exchange_service.py +18 -12
- prowler/providers/m365/services/sharepoint/sharepoint_external_sharing_managed/sharepoint_external_sharing_managed.py +9 -7
- prowler/providers/mongodbatlas/exceptions/exceptions.py +16 -0
- prowler/providers/mongodbatlas/mongodbatlas_provider.py +15 -3
- prowler/providers/mongodbatlas/services/projects/projects_auditing_enabled/projects_auditing_enabled.metadata.json +20 -9
- prowler/providers/mongodbatlas/services/projects/projects_network_access_list_exposed_to_internet/projects_network_access_list_exposed_to_internet.metadata.json +14 -9
- prowler/providers/oraclecloud/lib/arguments/arguments.py +4 -13
- prowler/providers/oraclecloud/lib/service/service.py +3 -3
- prowler/providers/oraclecloud/{oci_provider.py → oraclecloud_provider.py} +15 -15
- prowler/providers/oraclecloud/services/analytics/analytics_instance_access_restricted/analytics_instance_access_restricted.metadata.json +20 -16
- prowler/providers/oraclecloud/services/audit/audit_log_retention_period_365_days/audit_log_retention_period_365_days.metadata.json +17 -17
- prowler/providers/oraclecloud/services/blockstorage/blockstorage_block_volume_encrypted_with_cmk/blockstorage_block_volume_encrypted_with_cmk.metadata.json +17 -19
- prowler/providers/oraclecloud/services/blockstorage/blockstorage_boot_volume_encrypted_with_cmk/blockstorage_boot_volume_encrypted_with_cmk.metadata.json +18 -18
- prowler/providers/oraclecloud/services/cloudguard/cloudguard_enabled/cloudguard_enabled.metadata.json +17 -18
- prowler/providers/oraclecloud/services/compute/compute_instance_in_transit_encryption_enabled/compute_instance_in_transit_encryption_enabled.metadata.json +1 -1
- prowler/providers/oraclecloud/services/compute/compute_instance_legacy_metadata_endpoint_disabled/compute_instance_legacy_metadata_endpoint_disabled.metadata.json +1 -1
- prowler/providers/oraclecloud/services/compute/compute_instance_secure_boot_enabled/compute_instance_secure_boot_enabled.metadata.json +1 -1
- prowler/providers/oraclecloud/services/database/database_autonomous_database_access_restricted/database_autonomous_database_access_restricted.metadata.json +1 -1
- prowler/providers/oraclecloud/services/events/events_notification_topic_and_subscription_exists/events_notification_topic_and_subscription_exists.metadata.json +1 -1
- prowler/providers/oraclecloud/services/events/events_rule_cloudguard_problems/events_rule_cloudguard_problems.metadata.json +1 -1
- prowler/providers/oraclecloud/services/events/events_rule_iam_group_changes/events_rule_iam_group_changes.metadata.json +1 -1
- prowler/providers/oraclecloud/services/events/events_rule_iam_policy_changes/events_rule_iam_policy_changes.metadata.json +1 -1
- prowler/providers/oraclecloud/services/events/events_rule_identity_provider_changes/events_rule_identity_provider_changes.metadata.json +1 -1
- prowler/providers/oraclecloud/services/events/events_rule_idp_group_mapping_changes/events_rule_idp_group_mapping_changes.metadata.json +1 -1
- prowler/providers/oraclecloud/services/events/events_rule_local_user_authentication/events_rule_local_user_authentication.metadata.json +1 -1
- prowler/providers/oraclecloud/services/events/events_rule_network_gateway_changes/events_rule_network_gateway_changes.metadata.json +1 -1
- prowler/providers/oraclecloud/services/events/events_rule_network_security_group_changes/events_rule_network_security_group_changes.metadata.json +1 -1
- prowler/providers/oraclecloud/services/events/events_rule_route_table_changes/events_rule_route_table_changes.metadata.json +1 -1
- prowler/providers/oraclecloud/services/events/events_rule_security_list_changes/events_rule_security_list_changes.metadata.json +1 -1
- prowler/providers/oraclecloud/services/events/events_rule_user_changes/events_rule_user_changes.metadata.json +1 -1
- prowler/providers/oraclecloud/services/events/events_rule_vcn_changes/events_rule_vcn_changes.metadata.json +1 -1
- prowler/providers/oraclecloud/services/filestorage/filestorage_file_system_encrypted_with_cmk/filestorage_file_system_encrypted_with_cmk.metadata.json +1 -1
- prowler/providers/oraclecloud/services/identity/identity_iam_admins_cannot_update_tenancy_admins/identity_iam_admins_cannot_update_tenancy_admins.metadata.json +1 -1
- prowler/providers/oraclecloud/services/identity/identity_instance_principal_used/identity_instance_principal_used.metadata.json +1 -1
- prowler/providers/oraclecloud/services/identity/identity_no_resources_in_root_compartment/identity_no_resources_in_root_compartment.metadata.json +1 -1
- prowler/providers/oraclecloud/services/identity/identity_non_root_compartment_exists/identity_non_root_compartment_exists.metadata.json +1 -1
- prowler/providers/oraclecloud/services/identity/identity_password_policy_expires_within_365_days/identity_password_policy_expires_within_365_days.metadata.json +1 -1
- prowler/providers/oraclecloud/services/identity/identity_password_policy_minimum_length_14/identity_password_policy_minimum_length_14.metadata.json +1 -1
- prowler/providers/oraclecloud/services/identity/identity_password_policy_prevents_reuse/identity_password_policy_prevents_reuse.metadata.json +1 -1
- prowler/providers/oraclecloud/services/identity/identity_service_level_admins_exist/identity_service_level_admins_exist.metadata.json +1 -1
- prowler/providers/oraclecloud/services/identity/identity_tenancy_admin_permissions_limited/identity_tenancy_admin_permissions_limited.metadata.json +1 -1
- prowler/providers/oraclecloud/services/identity/identity_tenancy_admin_users_no_api_keys/identity_tenancy_admin_users_no_api_keys.metadata.json +1 -1
- prowler/providers/oraclecloud/services/identity/identity_user_api_keys_rotated_90_days/identity_user_api_keys_rotated_90_days.metadata.json +1 -1
- prowler/providers/oraclecloud/services/identity/identity_user_auth_tokens_rotated_90_days/identity_user_auth_tokens_rotated_90_days.metadata.json +1 -1
- prowler/providers/oraclecloud/services/identity/identity_user_customer_secret_keys_rotated_90_days/identity_user_customer_secret_keys_rotated_90_days.metadata.json +1 -1
- prowler/providers/oraclecloud/services/identity/identity_user_db_passwords_rotated_90_days/identity_user_db_passwords_rotated_90_days.metadata.json +1 -1
- prowler/providers/oraclecloud/services/identity/identity_user_mfa_enabled_console_access/identity_user_mfa_enabled_console_access.metadata.json +1 -1
- prowler/providers/oraclecloud/services/identity/identity_user_valid_email_address/identity_user_valid_email_address.metadata.json +1 -1
- prowler/providers/oraclecloud/services/integration/integration_instance_access_restricted/integration_instance_access_restricted.metadata.json +1 -1
- prowler/providers/oraclecloud/services/kms/kms_key_rotation_enabled/kms_key_rotation_enabled.metadata.json +1 -1
- prowler/providers/oraclecloud/services/network/network_default_security_list_restricts_traffic/network_default_security_list_restricts_traffic.metadata.json +1 -1
- prowler/providers/oraclecloud/services/network/network_security_group_ingress_from_internet_to_rdp_port/network_security_group_ingress_from_internet_to_rdp_port.metadata.json +1 -1
- prowler/providers/oraclecloud/services/network/network_security_group_ingress_from_internet_to_ssh_port/network_security_group_ingress_from_internet_to_ssh_port.metadata.json +1 -1
- prowler/providers/oraclecloud/services/network/network_security_list_ingress_from_internet_to_rdp_port/network_security_list_ingress_from_internet_to_rdp_port.metadata.json +1 -1
- prowler/providers/oraclecloud/services/network/network_security_list_ingress_from_internet_to_ssh_port/network_security_list_ingress_from_internet_to_ssh_port.metadata.json +1 -1
- prowler/providers/oraclecloud/services/network/network_vcn_subnet_flow_logs_enabled/network_vcn_subnet_flow_logs_enabled.metadata.json +1 -1
- prowler/providers/oraclecloud/services/objectstorage/objectstorage_bucket_encrypted_with_cmk/objectstorage_bucket_encrypted_with_cmk.metadata.json +1 -1
- prowler/providers/oraclecloud/services/objectstorage/objectstorage_bucket_logging_enabled/objectstorage_bucket_logging_enabled.metadata.json +1 -1
- prowler/providers/oraclecloud/services/objectstorage/objectstorage_bucket_not_publicly_accessible/objectstorage_bucket_not_publicly_accessible.metadata.json +1 -1
- prowler/providers/oraclecloud/services/objectstorage/objectstorage_bucket_versioning_enabled/objectstorage_bucket_versioning_enabled.metadata.json +1 -1
- {prowler_cloud-5.13.1.dist-info → prowler_cloud-5.14.1.dist-info}/METADATA +17 -16
- {prowler_cloud-5.13.1.dist-info → prowler_cloud-5.14.1.dist-info}/RECORD +298 -249
- /prowler/compliance/{oci → oraclecloud}/__init__.py +0 -0
- {prowler_cloud-5.13.1.dist-info → prowler_cloud-5.14.1.dist-info}/LICENSE +0 -0
- {prowler_cloud-5.13.1.dist-info → prowler_cloud-5.14.1.dist-info}/WHEEL +0 -0
- {prowler_cloud-5.13.1.dist-info → prowler_cloud-5.14.1.dist-info}/entry_points.txt +0 -0
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
from prowler.lib.check.models import Check, Check_Report_GCP
|
|
2
|
+
from prowler.providers.gcp.services.cloudstorage.cloudstorage_client import (
|
|
3
|
+
cloudstorage_client,
|
|
4
|
+
)
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class cloudstorage_bucket_logging_enabled(Check):
|
|
8
|
+
"""
|
|
9
|
+
Ensure Cloud Storage buckets have Usage and Storage Logs enabled.
|
|
10
|
+
|
|
11
|
+
Reports PASS if a bucket has logging configured (logBucket defined),
|
|
12
|
+
otherwise FAIL.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
def execute(self) -> list[Check_Report_GCP]:
|
|
16
|
+
findings = []
|
|
17
|
+
|
|
18
|
+
for bucket in cloudstorage_client.buckets:
|
|
19
|
+
report = Check_Report_GCP(metadata=self.metadata(), resource=bucket)
|
|
20
|
+
report.status = "FAIL"
|
|
21
|
+
report.status_extended = (
|
|
22
|
+
f"Bucket {bucket.name} does not have Usage and Storage Logs enabled."
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
if bucket.logging_bucket:
|
|
26
|
+
report.status = "PASS"
|
|
27
|
+
if bucket.logging_prefix:
|
|
28
|
+
report.status_extended = (
|
|
29
|
+
f"Bucket {bucket.name} has Usage and Storage Logs enabled. "
|
|
30
|
+
f"Logs are stored in bucket '{bucket.logging_bucket}' with prefix '{bucket.logging_prefix}'."
|
|
31
|
+
)
|
|
32
|
+
else:
|
|
33
|
+
report.status_extended = (
|
|
34
|
+
f"Bucket {bucket.name} has Usage and Storage Logs enabled. "
|
|
35
|
+
f"Logs are stored in bucket '{bucket.logging_bucket}' with default prefix."
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
findings.append(report)
|
|
39
|
+
|
|
40
|
+
return findings
|
prowler/providers/gcp/services/cloudstorage/cloudstorage_bucket_soft_delete_enabled/__init__.py
ADDED
|
File without changes
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"Provider": "gcp",
|
|
3
|
+
"CheckID": "cloudstorage_bucket_soft_delete_enabled",
|
|
4
|
+
"CheckTitle": "Cloud Storage buckets have Soft Delete 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 **Soft Delete** is enabled. Soft Delete helps protect data from accidental or malicious deletion by retaining deleted objects for a specified duration, allowing recovery within that retention window.",
|
|
12
|
+
"Risk": "Buckets without Soft Delete enabled are at higher risk of irreversible data loss caused by accidental or unauthorized deletions, since deleted objects cannot be recovered once removed.",
|
|
13
|
+
"RelatedUrl": "",
|
|
14
|
+
"AdditionalURLs": [
|
|
15
|
+
"https://cloud.google.com/storage/docs/soft-delete",
|
|
16
|
+
"https://cloud.google.com/blog/products/storage-data-transfer/understanding-cloud-storages-new-soft-delete-feature"
|
|
17
|
+
],
|
|
18
|
+
"Remediation": {
|
|
19
|
+
"Code": {
|
|
20
|
+
"CLI": "gcloud storage buckets update gs://<BUCKET_NAME> --soft-delete-retention-duration=<SECONDS>",
|
|
21
|
+
"NativeIaC": "",
|
|
22
|
+
"Other": "1) Open Google Cloud Console → Storage → Buckets → <BUCKET_NAME>\n2) Tab 'Configuration'\n3) Under 'Soft Delete', click 'Enable Soft Delete'\n4) Set the desired retention duration and save changes",
|
|
23
|
+
"Terraform": "```hcl\n# Example: enable Soft Delete on a Cloud Storage bucket\nresource \"google_storage_bucket\" \"example\" {\n name = var.bucket_name\n location = var.location\n\n soft_delete_policy {\n retention_duration_seconds = 604800 # 7 days\n }\n}\n```"
|
|
24
|
+
},
|
|
25
|
+
"Recommendation": {
|
|
26
|
+
"Text": "Enable Soft Delete on Cloud Storage buckets to retain deleted objects for a defined period, improving data recoverability and resilience against accidental or malicious deletions.",
|
|
27
|
+
"Url": "https://hub.prowler.com/check/cloudstorage_bucket_soft_delete_enabled"
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"Categories": [
|
|
31
|
+
"resilience"
|
|
32
|
+
],
|
|
33
|
+
"DependsOn": [],
|
|
34
|
+
"RelatedTo": [],
|
|
35
|
+
"Notes": ""
|
|
36
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
from prowler.lib.check.models import Check, Check_Report_GCP
|
|
2
|
+
from prowler.providers.gcp.services.cloudstorage.cloudstorage_client import (
|
|
3
|
+
cloudstorage_client,
|
|
4
|
+
)
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class cloudstorage_bucket_soft_delete_enabled(Check):
|
|
8
|
+
"""
|
|
9
|
+
Ensure Cloud Storage buckets have Soft Delete enabled.
|
|
10
|
+
|
|
11
|
+
Reports PASS if a bucket has Soft Delete enabled (retentionDurationSeconds > 0),
|
|
12
|
+
otherwise FAIL.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
def execute(self) -> list[Check_Report_GCP]:
|
|
16
|
+
findings = []
|
|
17
|
+
for bucket in cloudstorage_client.buckets:
|
|
18
|
+
report = Check_Report_GCP(metadata=self.metadata(), resource=bucket)
|
|
19
|
+
report.status = "FAIL"
|
|
20
|
+
report.status_extended = (
|
|
21
|
+
f"Bucket {bucket.name} does not have Soft Delete enabled."
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
if bucket.soft_delete_enabled:
|
|
25
|
+
report.status = "PASS"
|
|
26
|
+
report.status_extended = (
|
|
27
|
+
f"Bucket {bucket.name} has Soft Delete enabled."
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
findings.append(report)
|
|
31
|
+
return findings
|
|
File without changes
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"Provider": "gcp",
|
|
3
|
+
"CheckID": "cloudstorage_bucket_sufficient_retention_period",
|
|
4
|
+
"CheckTitle": "Cloud Storage bucket has a sufficient Retention Policy period",
|
|
5
|
+
"CheckType": [],
|
|
6
|
+
"ServiceName": "cloudstorage",
|
|
7
|
+
"SubServiceName": "",
|
|
8
|
+
"ResourceIdTemplate": "",
|
|
9
|
+
"Severity": "medium",
|
|
10
|
+
"ResourceType": "storage.googleapis.com/Bucket",
|
|
11
|
+
"Description": "Cloud Storage bucket has a bucket-level Retention Policy with a retentionPeriod that meets or exceeds the organization-defined minimum, preventing deletion or modification of objects before the required time.",
|
|
12
|
+
"Risk": "Insufficient or missing retention allows premature deletion or modification of objects, weakening data recovery and compliance with retention requirements.",
|
|
13
|
+
"RelatedUrl": "",
|
|
14
|
+
"AdditionalURLs": [
|
|
15
|
+
"https://www.trendmicro.com/cloudoneconformity/knowledge-base/gcp/CloudStorage/sufficient-retention-period.html"
|
|
16
|
+
],
|
|
17
|
+
"Remediation": {
|
|
18
|
+
"Code": {
|
|
19
|
+
"CLI": "gcloud storage buckets update gs://<BUCKET_NAME> --retention-period=<SECONDS>",
|
|
20
|
+
"NativeIaC": "",
|
|
21
|
+
"Other": "1) Console → Storage → Buckets → <BUCKET_NAME>\n2) Tab 'Configuration' → 'Retention policy'\n3) Set the required retention period (e.g., 90 or 365 days) and save\n4) (Optional) Lock the policy if required by compliance",
|
|
22
|
+
"Terraform": "```hcl\nresource \"google_storage_bucket\" \"example\" {\n name = var.bucket_name\n location = var.location\n\n retention_policy {\n retention_period = 7776000 # 90 days in seconds\n }\n}\n```"
|
|
23
|
+
},
|
|
24
|
+
"Recommendation": {
|
|
25
|
+
"Text": "Define and apply a bucket-level Retention Policy that meets your minimum retention requirement (e.g., 90 or 365 days) to enforce data recoverability and compliance.",
|
|
26
|
+
"Url": "https://hub.prowler.com/check/cloudstorage_bucket_sufficient_retention_period"
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
"Categories": [
|
|
30
|
+
"resilience"
|
|
31
|
+
],
|
|
32
|
+
"DependsOn": [],
|
|
33
|
+
"RelatedTo": [],
|
|
34
|
+
"Notes": ""
|
|
35
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
from prowler.lib.check.models import Check, Check_Report_GCP
|
|
2
|
+
from prowler.providers.gcp.services.cloudstorage.cloudstorage_client import (
|
|
3
|
+
cloudstorage_client,
|
|
4
|
+
)
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class cloudstorage_bucket_sufficient_retention_period(Check):
|
|
8
|
+
"""
|
|
9
|
+
Ensure there is a sufficient bucket-level retention period configured for GCS buckets.
|
|
10
|
+
|
|
11
|
+
PASS: retentionPolicy.retentionPeriod >= min threshold (days)
|
|
12
|
+
FAIL: no retention policy or period < threshold
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
def execute(self) -> list[Check_Report_GCP]:
|
|
16
|
+
findings = []
|
|
17
|
+
|
|
18
|
+
min_retention_days = int(
|
|
19
|
+
getattr(cloudstorage_client, "audit_config", {}).get(
|
|
20
|
+
"storage_min_retention_days", 90
|
|
21
|
+
)
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
for bucket in cloudstorage_client.buckets:
|
|
25
|
+
report = Check_Report_GCP(metadata=self.metadata(), resource=bucket)
|
|
26
|
+
|
|
27
|
+
retention_policy = bucket.retention_policy
|
|
28
|
+
|
|
29
|
+
if retention_policy is None:
|
|
30
|
+
report.status = "FAIL"
|
|
31
|
+
report.status_extended = (
|
|
32
|
+
f"Bucket {bucket.name} does not have a retention policy "
|
|
33
|
+
f"(minimum required: {min_retention_days} days)."
|
|
34
|
+
)
|
|
35
|
+
findings.append(report)
|
|
36
|
+
continue
|
|
37
|
+
|
|
38
|
+
days = retention_policy.retention_period // 86400 # seconds to days
|
|
39
|
+
|
|
40
|
+
if days >= min_retention_days:
|
|
41
|
+
report.status = "PASS"
|
|
42
|
+
report.status_extended = (
|
|
43
|
+
f"Bucket {bucket.name} has a sufficient retention policy of {days} days "
|
|
44
|
+
f"(minimum required: {min_retention_days})."
|
|
45
|
+
)
|
|
46
|
+
else:
|
|
47
|
+
report.status = "FAIL"
|
|
48
|
+
report.status_extended = (
|
|
49
|
+
f"Bucket {bucket.name} has an insufficient retention policy of {days} days "
|
|
50
|
+
f"(minimum required: {min_retention_days})."
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
findings.append(report)
|
|
54
|
+
|
|
55
|
+
return findings
|
prowler/providers/gcp/services/cloudstorage/cloudstorage_bucket_versioning_enabled/__init__.py
ADDED
|
File without changes
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"Provider": "gcp",
|
|
3
|
+
"CheckID": "cloudstorage_bucket_versioning_enabled",
|
|
4
|
+
"CheckTitle": "Cloud Storage buckets have Object Versioning 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 **Object Versioning** is enabled. Object Versioning preserves older versions of objects, allowing data recovery, maintaining audit trails, and protecting against accidental deletions or overwrites.",
|
|
12
|
+
"Risk": "Buckets without Object Versioning enabled cannot recover previous object versions, which increases the risk of permanent data loss from accidental deletion or modification.",
|
|
13
|
+
"RelatedUrl": "",
|
|
14
|
+
"AdditionalURLs": [
|
|
15
|
+
"https://www.trendmicro.com/cloudoneconformity/knowledge-base/gcp/CloudStorage/enable-versioning.html",
|
|
16
|
+
"https://cloud.google.com/storage/docs/object-versioning"
|
|
17
|
+
],
|
|
18
|
+
"Remediation": {
|
|
19
|
+
"Code": {
|
|
20
|
+
"CLI": "gcloud storage buckets update gs://<BUCKET_NAME> --versioning",
|
|
21
|
+
"NativeIaC": "",
|
|
22
|
+
"Other": "1) Open Google Cloud Console → Storage → Buckets → <BUCKET_NAME>\n2) Tab 'Configuration'\n3) Under 'Object versioning', click 'Enable Object Versioning'\n4) Save changes",
|
|
23
|
+
"Terraform": "```hcl\n# Example: enable Object Versioning on a Cloud Storage bucket\nresource \"google_storage_bucket\" \"example\" {\n name = var.bucket_name\n location = var.location\n\n versioning {\n enabled = true\n }\n}\n```"
|
|
24
|
+
},
|
|
25
|
+
"Recommendation": {
|
|
26
|
+
"Text": "Enable Object Versioning on Cloud Storage buckets to preserve previous object versions and improve data recoverability and auditability.",
|
|
27
|
+
"Url": "https://hub.prowler.com/check/cloudstorage_bucket_versioning_enabled"
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"Categories": [
|
|
31
|
+
"resilience"
|
|
32
|
+
],
|
|
33
|
+
"DependsOn": [],
|
|
34
|
+
"RelatedTo": [],
|
|
35
|
+
"Notes": "Buckets missing the 'versioning' block are treated as having Object Versioning disabled."
|
|
36
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
from prowler.lib.check.models import Check, Check_Report_GCP
|
|
2
|
+
from prowler.providers.gcp.services.cloudstorage.cloudstorage_client import (
|
|
3
|
+
cloudstorage_client,
|
|
4
|
+
)
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class cloudstorage_bucket_versioning_enabled(Check):
|
|
8
|
+
"""
|
|
9
|
+
Ensure Cloud Storage buckets have Object Versioning enabled.
|
|
10
|
+
|
|
11
|
+
Reports PASS if a bucket has versioning enabled, otherwise FAIL.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
def execute(self) -> list[Check_Report_GCP]:
|
|
15
|
+
findings = []
|
|
16
|
+
for bucket in cloudstorage_client.buckets:
|
|
17
|
+
report = Check_Report_GCP(metadata=self.metadata(), resource=bucket)
|
|
18
|
+
report.status = "FAIL"
|
|
19
|
+
report.status_extended = (
|
|
20
|
+
f"Bucket {bucket.name} does not have Object Versioning enabled."
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
if bucket.versioning_enabled:
|
|
24
|
+
report.status = "PASS"
|
|
25
|
+
report.status_extended = (
|
|
26
|
+
f"Bucket {bucket.name} has Object Versioning enabled."
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
findings.append(report)
|
|
30
|
+
return findings
|
|
@@ -39,6 +39,38 @@ class CloudStorage(GCPService):
|
|
|
39
39
|
if isinstance(rules, list):
|
|
40
40
|
lifecycle_rules = rules
|
|
41
41
|
|
|
42
|
+
versioning_enabled = bucket.get("versioning", {}).get(
|
|
43
|
+
"enabled", False
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
soft_delete_enabled = False
|
|
47
|
+
soft_delete_policy = bucket.get("softDeletePolicy")
|
|
48
|
+
if isinstance(soft_delete_policy, dict):
|
|
49
|
+
retention = soft_delete_policy.get(
|
|
50
|
+
"retentionDurationSeconds"
|
|
51
|
+
)
|
|
52
|
+
if retention and int(retention) > 0:
|
|
53
|
+
soft_delete_enabled = True
|
|
54
|
+
|
|
55
|
+
logging_info = bucket.get("logging", {})
|
|
56
|
+
logging_bucket = logging_info.get("logBucket")
|
|
57
|
+
logging_prefix = logging_info.get("logObjectPrefix")
|
|
58
|
+
|
|
59
|
+
retention_policy_raw = bucket.get("retentionPolicy")
|
|
60
|
+
retention_policy = None
|
|
61
|
+
if isinstance(retention_policy_raw, dict):
|
|
62
|
+
rp_seconds = retention_policy_raw.get("retentionPeriod")
|
|
63
|
+
if rp_seconds:
|
|
64
|
+
retention_policy = RetentionPolicy(
|
|
65
|
+
retention_period=int(rp_seconds),
|
|
66
|
+
is_locked=bool(
|
|
67
|
+
retention_policy_raw.get("isLocked", False)
|
|
68
|
+
),
|
|
69
|
+
effective_time=retention_policy_raw.get(
|
|
70
|
+
"effectiveTime"
|
|
71
|
+
),
|
|
72
|
+
)
|
|
73
|
+
|
|
42
74
|
self.buckets.append(
|
|
43
75
|
Bucket(
|
|
44
76
|
name=bucket["name"],
|
|
@@ -48,9 +80,13 @@ class CloudStorage(GCPService):
|
|
|
48
80
|
"uniformBucketLevelAccess"
|
|
49
81
|
]["enabled"],
|
|
50
82
|
public=public,
|
|
51
|
-
retention_policy=
|
|
83
|
+
retention_policy=retention_policy,
|
|
52
84
|
project_id=project_id,
|
|
53
85
|
lifecycle_rules=lifecycle_rules,
|
|
86
|
+
versioning_enabled=versioning_enabled,
|
|
87
|
+
soft_delete_enabled=soft_delete_enabled,
|
|
88
|
+
logging_bucket=logging_bucket,
|
|
89
|
+
logging_prefix=logging_prefix,
|
|
54
90
|
)
|
|
55
91
|
)
|
|
56
92
|
|
|
@@ -63,6 +99,12 @@ class CloudStorage(GCPService):
|
|
|
63
99
|
)
|
|
64
100
|
|
|
65
101
|
|
|
102
|
+
class RetentionPolicy(BaseModel):
|
|
103
|
+
retention_period: int
|
|
104
|
+
is_locked: bool
|
|
105
|
+
effective_time: Optional[str] = None
|
|
106
|
+
|
|
107
|
+
|
|
66
108
|
class Bucket(BaseModel):
|
|
67
109
|
name: str
|
|
68
110
|
id: str
|
|
@@ -70,5 +112,9 @@ class Bucket(BaseModel):
|
|
|
70
112
|
uniform_bucket_level_access: bool
|
|
71
113
|
public: bool
|
|
72
114
|
project_id: str
|
|
73
|
-
retention_policy: Optional[
|
|
115
|
+
retention_policy: Optional[RetentionPolicy] = None
|
|
74
116
|
lifecycle_rules: Optional[list[dict]] = None
|
|
117
|
+
versioning_enabled: Optional[bool] = False
|
|
118
|
+
soft_delete_enabled: Optional[bool] = False
|
|
119
|
+
logging_bucket: Optional[str] = None
|
|
120
|
+
logging_prefix: Optional[str] = None
|
|
File without changes
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"Provider": "github",
|
|
3
|
+
"CheckID": "organization_default_repository_permission_strict",
|
|
4
|
+
"CheckTitle": "Organization base repository permission is read or none",
|
|
5
|
+
"CheckType": [],
|
|
6
|
+
"ServiceName": "organization",
|
|
7
|
+
"SubServiceName": "",
|
|
8
|
+
"ResourceIdTemplate": "",
|
|
9
|
+
"Severity": "high",
|
|
10
|
+
"ResourceType": "GitHubOrganization",
|
|
11
|
+
"Description": "**GitHub organization** base repository permission for members uses a **strict setting** such as `read` or `none` rather than permissive options like `write` or `admin`. *Applies to members, not outside collaborators.*",
|
|
12
|
+
"Risk": "**Excessive default permissions** (`write`/`admin`) erode code **integrity** and **availability**.\n\nAny member-or a compromised account-can alter many repos, inject malicious commits, change tags/releases, or delete branches, enabling supply-chain compromise and large-scale disruptions.",
|
|
13
|
+
"RelatedUrl": "",
|
|
14
|
+
"AdditionalURLs": [
|
|
15
|
+
"https://docs.github.com/en/organizations/managing-user-access-to-your-organizations-repositories/managing-repository-roles/setting-base-permissions-for-an-organization"
|
|
16
|
+
],
|
|
17
|
+
"Remediation": {
|
|
18
|
+
"Code": {
|
|
19
|
+
"CLI": "",
|
|
20
|
+
"NativeIaC": "",
|
|
21
|
+
"Other": "1. Sign in to GitHub as an organization owner\n2. Go to the organization > Settings\n3. Under \"Access\" in the sidebar, click \"Member privileges\"\n4. Under \"Base permissions\", select \"Read\" (or \"None\")\n5. Click \"Change default permission\" to confirm",
|
|
22
|
+
"Terraform": "```hcl\nresource \"github_organization_settings\" \"<example_resource_name>\" {\n default_repository_permission = \"read\" # Critical: sets the org's base repository permission to a strict level (read/none passes)\n}\n```"
|
|
23
|
+
},
|
|
24
|
+
"Recommendation": {
|
|
25
|
+
"Text": "Apply **least privilege**: set base permission to `none` or `read`.\n\nGrant higher access explicitly via teams per repo and enforce **separation of duties** with required reviews and **branch protection**. Regularly audit memberships and access to limit blast radius and maintain **defense in depth**.",
|
|
26
|
+
"Url": "https://hub.prowler.com/check/organization_default_repository_permission_strict"
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
"Categories": [
|
|
30
|
+
"identity-access"
|
|
31
|
+
],
|
|
32
|
+
"DependsOn": [],
|
|
33
|
+
"RelatedTo": [],
|
|
34
|
+
"Notes": ""
|
|
35
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
from typing import List
|
|
2
|
+
|
|
3
|
+
from prowler.lib.check.models import Check, CheckReportGithub
|
|
4
|
+
from prowler.providers.github.services.organization.organization_client import (
|
|
5
|
+
organization_client,
|
|
6
|
+
)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class organization_default_repository_permission_strict(Check):
|
|
10
|
+
"""Check if an organization's base repository permission is set to a strict level.
|
|
11
|
+
|
|
12
|
+
PASS: base permission is "read" or "none"
|
|
13
|
+
FAIL: base permission is "write" or "admin" (or any other non-strict value)
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
def execute(self) -> List[CheckReportGithub]:
|
|
17
|
+
findings = []
|
|
18
|
+
for org in organization_client.organizations.values():
|
|
19
|
+
base_perm = getattr(org, "base_permission", None)
|
|
20
|
+
if base_perm is None:
|
|
21
|
+
# Unknown / no permission to read → skip producing a finding
|
|
22
|
+
continue
|
|
23
|
+
|
|
24
|
+
p = str(base_perm).lower()
|
|
25
|
+
report = CheckReportGithub(metadata=self.metadata(), resource=org)
|
|
26
|
+
|
|
27
|
+
if p in ("read", "none"):
|
|
28
|
+
report.status = "PASS"
|
|
29
|
+
report.status_extended = f"Organization {org.name} base repository permission is '{p}', which is strict."
|
|
30
|
+
else:
|
|
31
|
+
report.status = "FAIL"
|
|
32
|
+
report.status_extended = f"Organization {org.name} base repository permission is '{p}', which is not strict."
|
|
33
|
+
|
|
34
|
+
findings.append(report)
|
|
35
|
+
|
|
36
|
+
return findings
|
|
@@ -1,29 +1,35 @@
|
|
|
1
1
|
{
|
|
2
2
|
"Provider": "github",
|
|
3
3
|
"CheckID": "organization_members_mfa_required",
|
|
4
|
-
"CheckTitle": "
|
|
4
|
+
"CheckTitle": "Organization requires members to have two-factor authentication enabled",
|
|
5
5
|
"CheckType": [],
|
|
6
6
|
"ServiceName": "organization",
|
|
7
7
|
"SubServiceName": "",
|
|
8
8
|
"ResourceIdTemplate": "",
|
|
9
9
|
"Severity": "critical",
|
|
10
10
|
"ResourceType": "GitHubOrganization",
|
|
11
|
-
"Description": "
|
|
12
|
-
"Risk": "Without
|
|
13
|
-
"RelatedUrl": "
|
|
11
|
+
"Description": "GitHub organization settings require all members to use **two-factor authentication** (2FA).\n\nThe evaluation determines whether access to organization resources is conditioned on members having 2FA enabled.",
|
|
12
|
+
"Risk": "Without enforced **2FA**, stolen or reused passwords enable account takeover, leading to:\n- Loss of code integrity via unauthorized commits\n- Confidential data exposure from repos and secrets\n- Availability impact from settings changes, token revocation, or deletions",
|
|
13
|
+
"RelatedUrl": "",
|
|
14
|
+
"AdditionalURLs": [
|
|
15
|
+
"https://docs.github.com/en/organizations/keeping-your-organization-secure/managing-two-factor-authentication-for-your-organization/preparing-to-require-two-factor-authentication-in-your-organization",
|
|
16
|
+
"https://docs.github.com/en/organizations/keeping-your-organization-secure/managing-two-factor-authentication-for-your-organization/requiring-two-factor-authentication-in-your-organization"
|
|
17
|
+
],
|
|
14
18
|
"Remediation": {
|
|
15
19
|
"Code": {
|
|
16
20
|
"CLI": "",
|
|
17
21
|
"NativeIaC": "",
|
|
18
|
-
"Other": "",
|
|
22
|
+
"Other": "1. Sign in to GitHub as an organization owner with 2FA enabled\n2. Go to your organization > Settings\n3. In the left sidebar, click Security > Authentication security\n4. Under Two-factor authentication, select Require two-factor authentication for everyone in your organization\n5. Click Save, then Confirm",
|
|
19
23
|
"Terraform": ""
|
|
20
24
|
},
|
|
21
25
|
"Recommendation": {
|
|
22
|
-
"Text": "
|
|
23
|
-
"Url": "https://
|
|
26
|
+
"Text": "Enforce org-wide **2FA** for all members and collaborators, preferring **secure methods** (passkeys, security keys, authenticator apps, GitHub Mobile) over SMS.\n\nApply **least privilege**, integrate with **SSO**, restrict token scopes, and use **branch protection** for defense-in-depth. Include bots/service accounts and define recovery options.",
|
|
27
|
+
"Url": "https://hub.prowler.com/check/organization_members_mfa_required"
|
|
24
28
|
}
|
|
25
29
|
},
|
|
26
|
-
"Categories": [
|
|
30
|
+
"Categories": [
|
|
31
|
+
"identity-access"
|
|
32
|
+
],
|
|
27
33
|
"DependsOn": [],
|
|
28
34
|
"RelatedTo": [],
|
|
29
35
|
"Notes": ""
|
prowler/providers/github/services/organization/organization_repository_creation_limited/__init__.py
ADDED
|
File without changes
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"Provider": "github",
|
|
3
|
+
"CheckID": "organization_repository_creation_limited",
|
|
4
|
+
"CheckTitle": "Ensure repository creation is limited to trusted organization members.",
|
|
5
|
+
"CheckType": [],
|
|
6
|
+
"ServiceName": "organization",
|
|
7
|
+
"SubServiceName": "",
|
|
8
|
+
"ResourceIdTemplate": "",
|
|
9
|
+
"Severity": "high",
|
|
10
|
+
"ResourceType": "GitHubOrganization",
|
|
11
|
+
"Description": "Ensure that repository creation is restricted so that only trusted owners or specific teams can create new repositories within the organization.",
|
|
12
|
+
"Risk": "Allowing all members to create repositories increases the likelihood of shadow repositories, data leakage, or malicious projects being introduced without oversight.",
|
|
13
|
+
"RelatedUrl": "https://docs.github.com/en/organizations/managing-organization-settings/restricting-repository-creation-in-your-organization",
|
|
14
|
+
"Remediation": {
|
|
15
|
+
"Code": {
|
|
16
|
+
"CLI": "",
|
|
17
|
+
"NativeIaC": "",
|
|
18
|
+
"Other": "",
|
|
19
|
+
"Terraform": ""
|
|
20
|
+
},
|
|
21
|
+
"Recommendation": {
|
|
22
|
+
"Text": "Disable repository creation for members or limit it to specific trusted teams by adjusting Member privileges in the organization's settings.",
|
|
23
|
+
"Url": "https://docs.github.com/en/organizations/managing-organization-settings/restricting-repository-creation-in-your-organization"
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
"Categories": [],
|
|
27
|
+
"DependsOn": [],
|
|
28
|
+
"RelatedTo": [],
|
|
29
|
+
"Notes": ""
|
|
30
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
from typing import List
|
|
2
|
+
|
|
3
|
+
from prowler.lib.check.models import Check, CheckReportGithub
|
|
4
|
+
from prowler.providers.github.services.organization.organization_client import (
|
|
5
|
+
organization_client,
|
|
6
|
+
)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def _join_human_readable(items: List[str]) -> str:
|
|
10
|
+
"""Return a simple human readable comma-separated list."""
|
|
11
|
+
if not items:
|
|
12
|
+
return ""
|
|
13
|
+
if len(items) == 1:
|
|
14
|
+
return items[0]
|
|
15
|
+
return ", ".join(items[:-1]) + f" and {items[-1]}"
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class organization_repository_creation_limited(Check):
|
|
19
|
+
"""Check if repository creation is limited to trusted organization members."""
|
|
20
|
+
|
|
21
|
+
def execute(self) -> List[CheckReportGithub]:
|
|
22
|
+
findings = []
|
|
23
|
+
for org in organization_client.organizations.values():
|
|
24
|
+
repo_data = [
|
|
25
|
+
getattr(org, "members_can_create_repositories", None),
|
|
26
|
+
getattr(org, "members_can_create_public_repositories", None),
|
|
27
|
+
getattr(org, "members_can_create_private_repositories", None),
|
|
28
|
+
getattr(org, "members_can_create_internal_repositories", None),
|
|
29
|
+
getattr(org, "members_allowed_repository_creation_type", None),
|
|
30
|
+
]
|
|
31
|
+
|
|
32
|
+
if all(value is None for value in repo_data):
|
|
33
|
+
continue
|
|
34
|
+
|
|
35
|
+
report = CheckReportGithub(metadata=self.metadata(), resource=org)
|
|
36
|
+
|
|
37
|
+
global_creation = getattr(org, "members_can_create_repositories", None)
|
|
38
|
+
public_creation = getattr(
|
|
39
|
+
org, "members_can_create_public_repositories", None
|
|
40
|
+
)
|
|
41
|
+
private_creation = getattr(
|
|
42
|
+
org, "members_can_create_private_repositories", None
|
|
43
|
+
)
|
|
44
|
+
internal_creation = getattr(
|
|
45
|
+
org, "members_can_create_internal_repositories", None
|
|
46
|
+
)
|
|
47
|
+
creation_type = getattr(
|
|
48
|
+
org, "members_allowed_repository_creation_type", None
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
type_flags = []
|
|
52
|
+
enabled_types = []
|
|
53
|
+
|
|
54
|
+
if global_creation is not None:
|
|
55
|
+
if global_creation:
|
|
56
|
+
enabled_types.append("repositories of any type")
|
|
57
|
+
else:
|
|
58
|
+
type_flags.append(False)
|
|
59
|
+
|
|
60
|
+
visibility_flags = [
|
|
61
|
+
(public_creation, "public repositories"),
|
|
62
|
+
(private_creation, "private repositories"),
|
|
63
|
+
(internal_creation, "internal repositories"),
|
|
64
|
+
]
|
|
65
|
+
|
|
66
|
+
for flag, label in visibility_flags:
|
|
67
|
+
if flag is not None:
|
|
68
|
+
type_flags.append(flag)
|
|
69
|
+
if flag:
|
|
70
|
+
enabled_types.append(label)
|
|
71
|
+
|
|
72
|
+
if creation_type:
|
|
73
|
+
normalized_type = creation_type.lower()
|
|
74
|
+
if normalized_type == "none":
|
|
75
|
+
type_flags.append(False)
|
|
76
|
+
else:
|
|
77
|
+
creation_messages = {
|
|
78
|
+
"all": "repositories of any type",
|
|
79
|
+
"public": "public repositories",
|
|
80
|
+
"private": "private repositories",
|
|
81
|
+
"internal": "internal repositories",
|
|
82
|
+
"selected": "repositories for selected members or teams",
|
|
83
|
+
}
|
|
84
|
+
enabled_types.append(
|
|
85
|
+
creation_messages.get(
|
|
86
|
+
normalized_type, f"{creation_type} repositories"
|
|
87
|
+
)
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
restricted = bool(type_flags) and all(flag is False for flag in type_flags)
|
|
91
|
+
|
|
92
|
+
if restricted:
|
|
93
|
+
report.status = "PASS"
|
|
94
|
+
report.status_extended = f"Organization {org.name} has disabled repository creation for members."
|
|
95
|
+
else:
|
|
96
|
+
report.status = "FAIL"
|
|
97
|
+
unique_enabled = list(dict.fromkeys(enabled_types))
|
|
98
|
+
allowed_desc = _join_human_readable(unique_enabled)
|
|
99
|
+
if allowed_desc:
|
|
100
|
+
report.status_extended = f"Organization {org.name} allows members to create {allowed_desc}."
|
|
101
|
+
else:
|
|
102
|
+
report.status_extended = f"Organization {org.name} does not have enough data to confirm repository creation restrictions."
|
|
103
|
+
|
|
104
|
+
findings.append(report)
|
|
105
|
+
|
|
106
|
+
return findings
|