prowler-cloud 5.14.1__py3-none-any.whl → 5.15.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- dashboard/assets/images/providers/alibabacloud_provider.png +0 -0
- dashboard/compliance/cis_2_0_alibabacloud.py +24 -0
- dashboard/lib/layouts.py +1 -0
- dashboard/pages/compliance.py +8 -2
- dashboard/pages/overview.py +52 -1
- prowler/CHANGELOG.md +59 -20
- prowler/__main__.py +40 -0
- prowler/compliance/alibabacloud/__init__.py +0 -0
- prowler/compliance/alibabacloud/cis_2.0_alibabacloud.json +1833 -0
- prowler/compliance/aws/iso27001_2013_aws.json +158 -158
- prowler/compliance/aws/soc2_aws.json +100 -0
- prowler/compliance/azure/rbi_cyber_security_framework_azure.json +248 -0
- prowler/compliance/azure/soc2_azure.json +87 -1
- prowler/compliance/gcp/soc2_gcp.json +82 -1
- prowler/config/config.py +2 -1
- prowler/lib/check/check.py +47 -1
- prowler/lib/check/models.py +23 -0
- prowler/lib/check/utils.py +1 -1
- prowler/lib/cli/parser.py +3 -2
- prowler/lib/outputs/compliance/cis/cis_alibabacloud.py +106 -0
- prowler/lib/outputs/compliance/cis/models.py +35 -0
- prowler/lib/outputs/finding.py +16 -0
- prowler/lib/outputs/html/html.py +67 -0
- prowler/lib/outputs/outputs.py +2 -0
- prowler/lib/outputs/summary_table.py +3 -0
- prowler/providers/alibabacloud/__init__.py +0 -0
- prowler/providers/alibabacloud/alibabacloud_provider.py +872 -0
- prowler/providers/alibabacloud/config.py +41 -0
- prowler/providers/alibabacloud/exceptions/__init__.py +0 -0
- prowler/providers/alibabacloud/exceptions/exceptions.py +116 -0
- prowler/providers/alibabacloud/lib/__init__.py +0 -0
- prowler/providers/alibabacloud/lib/arguments/__init__.py +0 -0
- prowler/providers/alibabacloud/lib/arguments/arguments.py +58 -0
- prowler/providers/alibabacloud/lib/mutelist/__init__.py +0 -0
- prowler/providers/alibabacloud/lib/mutelist/mutelist.py +175 -0
- prowler/providers/alibabacloud/lib/service/__init__.py +0 -0
- prowler/providers/alibabacloud/lib/service/service.py +113 -0
- prowler/providers/alibabacloud/models.py +266 -0
- prowler/providers/alibabacloud/services/__init__.py +0 -0
- prowler/providers/alibabacloud/services/actiontrail/__init__.py +0 -0
- prowler/providers/alibabacloud/services/actiontrail/actiontrail_client.py +6 -0
- prowler/providers/alibabacloud/services/actiontrail/actiontrail_multi_region_enabled/__init__.py +0 -0
- prowler/providers/alibabacloud/services/actiontrail/actiontrail_multi_region_enabled/actiontrail_multi_region_enabled.metadata.json +39 -0
- prowler/providers/alibabacloud/services/actiontrail/actiontrail_multi_region_enabled/actiontrail_multi_region_enabled.py +81 -0
- prowler/providers/alibabacloud/services/actiontrail/actiontrail_oss_bucket_not_publicly_accessible/__init__.py +0 -0
- prowler/providers/alibabacloud/services/actiontrail/actiontrail_oss_bucket_not_publicly_accessible/actiontrail_oss_bucket_not_publicly_accessible.metadata.json +40 -0
- prowler/providers/alibabacloud/services/actiontrail/actiontrail_oss_bucket_not_publicly_accessible/actiontrail_oss_bucket_not_publicly_accessible.py +119 -0
- prowler/providers/alibabacloud/services/actiontrail/actiontrail_service.py +110 -0
- prowler/providers/alibabacloud/services/cs/__init__.py +0 -0
- prowler/providers/alibabacloud/services/cs/cs_client.py +4 -0
- prowler/providers/alibabacloud/services/cs/cs_kubernetes_cloudmonitor_enabled/__init__.py +0 -0
- prowler/providers/alibabacloud/services/cs/cs_kubernetes_cloudmonitor_enabled/cs_kubernetes_cloudmonitor_enabled.metadata.json +38 -0
- prowler/providers/alibabacloud/services/cs/cs_kubernetes_cloudmonitor_enabled/cs_kubernetes_cloudmonitor_enabled.py +26 -0
- prowler/providers/alibabacloud/services/cs/cs_kubernetes_cluster_check_recent/__init__.py +0 -0
- prowler/providers/alibabacloud/services/cs/cs_kubernetes_cluster_check_recent/cs_kubernetes_cluster_check_recent.metadata.json +38 -0
- prowler/providers/alibabacloud/services/cs/cs_kubernetes_cluster_check_recent/cs_kubernetes_cluster_check_recent.py +62 -0
- prowler/providers/alibabacloud/services/cs/cs_kubernetes_cluster_check_weekly/cs_kubernetes_cluster_check_weekly.metadata.json +38 -0
- prowler/providers/alibabacloud/services/cs/cs_kubernetes_cluster_check_weekly/cs_kubernetes_cluster_check_weekly.py +62 -0
- prowler/providers/alibabacloud/services/cs/cs_kubernetes_dashboard_disabled/__init__.py +0 -0
- prowler/providers/alibabacloud/services/cs/cs_kubernetes_dashboard_disabled/cs_kubernetes_dashboard_disabled.metadata.json +39 -0
- prowler/providers/alibabacloud/services/cs/cs_kubernetes_dashboard_disabled/cs_kubernetes_dashboard_disabled.py +26 -0
- prowler/providers/alibabacloud/services/cs/cs_kubernetes_eni_multiple_ip_enabled/__init__.py +0 -0
- prowler/providers/alibabacloud/services/cs/cs_kubernetes_eni_multiple_ip_enabled/cs_kubernetes_eni_multiple_ip_enabled.metadata.json +39 -0
- prowler/providers/alibabacloud/services/cs/cs_kubernetes_eni_multiple_ip_enabled/cs_kubernetes_eni_multiple_ip_enabled.py +26 -0
- prowler/providers/alibabacloud/services/cs/cs_kubernetes_log_service_enabled/__init__.py +0 -0
- prowler/providers/alibabacloud/services/cs/cs_kubernetes_log_service_enabled/cs_kubernetes_log_service_enabled.metadata.json +40 -0
- prowler/providers/alibabacloud/services/cs/cs_kubernetes_log_service_enabled/cs_kubernetes_log_service_enabled.py +26 -0
- prowler/providers/alibabacloud/services/cs/cs_kubernetes_network_policy_enabled/__init__.py +0 -0
- prowler/providers/alibabacloud/services/cs/cs_kubernetes_network_policy_enabled/cs_kubernetes_network_policy_enabled.metadata.json +39 -0
- prowler/providers/alibabacloud/services/cs/cs_kubernetes_network_policy_enabled/cs_kubernetes_network_policy_enabled.py +26 -0
- prowler/providers/alibabacloud/services/cs/cs_kubernetes_private_cluster_enabled/__init__.py +0 -0
- prowler/providers/alibabacloud/services/cs/cs_kubernetes_private_cluster_enabled/cs_kubernetes_private_cluster_enabled.metadata.json +39 -0
- prowler/providers/alibabacloud/services/cs/cs_kubernetes_private_cluster_enabled/cs_kubernetes_private_cluster_enabled.py +26 -0
- prowler/providers/alibabacloud/services/cs/cs_kubernetes_rbac_enabled/__init__.py +0 -0
- prowler/providers/alibabacloud/services/cs/cs_kubernetes_rbac_enabled/cs_kubernetes_rbac_enabled.metadata.json +40 -0
- prowler/providers/alibabacloud/services/cs/cs_kubernetes_rbac_enabled/cs_kubernetes_rbac_enabled.py +28 -0
- prowler/providers/alibabacloud/services/cs/cs_service.py +354 -0
- prowler/providers/alibabacloud/services/ecs/__init__.py +0 -0
- prowler/providers/alibabacloud/services/ecs/ecs_attached_disk_encrypted/__init__.py +0 -0
- prowler/providers/alibabacloud/services/ecs/ecs_attached_disk_encrypted/ecs_attached_disk_encrypted.metadata.json +38 -0
- prowler/providers/alibabacloud/services/ecs/ecs_attached_disk_encrypted/ecs_attached_disk_encrypted.py +38 -0
- prowler/providers/alibabacloud/services/ecs/ecs_client.py +4 -0
- prowler/providers/alibabacloud/services/ecs/ecs_instance_endpoint_protection_installed/__init__.py +0 -0
- prowler/providers/alibabacloud/services/ecs/ecs_instance_endpoint_protection_installed/ecs_instance_endpoint_protection_installed.metadata.json +41 -0
- prowler/providers/alibabacloud/services/ecs/ecs_instance_endpoint_protection_installed/ecs_instance_endpoint_protection_installed.py +47 -0
- prowler/providers/alibabacloud/services/ecs/ecs_instance_latest_os_patches_applied/__init__.py +0 -0
- prowler/providers/alibabacloud/services/ecs/ecs_instance_latest_os_patches_applied/ecs_instance_latest_os_patches_applied.metadata.json +38 -0
- prowler/providers/alibabacloud/services/ecs/ecs_instance_latest_os_patches_applied/ecs_instance_latest_os_patches_applied.py +50 -0
- prowler/providers/alibabacloud/services/ecs/ecs_instance_no_legacy_network/__init__.py +0 -0
- prowler/providers/alibabacloud/services/ecs/ecs_instance_no_legacy_network/ecs_instance_no_legacy_network.metadata.json +38 -0
- prowler/providers/alibabacloud/services/ecs/ecs_instance_no_legacy_network/ecs_instance_no_legacy_network.py +34 -0
- prowler/providers/alibabacloud/services/ecs/ecs_securitygroup_restrict_rdp_internet/__init__.py +0 -0
- prowler/providers/alibabacloud/services/ecs/ecs_securitygroup_restrict_rdp_internet/ecs_securitygroup_restrict_rdp_internet.metadata.json +39 -0
- prowler/providers/alibabacloud/services/ecs/ecs_securitygroup_restrict_rdp_internet/ecs_securitygroup_restrict_rdp_internet.py +68 -0
- prowler/providers/alibabacloud/services/ecs/ecs_securitygroup_restrict_ssh_internet/__init__.py +0 -0
- prowler/providers/alibabacloud/services/ecs/ecs_securitygroup_restrict_ssh_internet/ecs_securitygroup_restrict_ssh_internet.metadata.json +39 -0
- prowler/providers/alibabacloud/services/ecs/ecs_securitygroup_restrict_ssh_internet/ecs_securitygroup_restrict_ssh_internet.py +68 -0
- prowler/providers/alibabacloud/services/ecs/ecs_service.py +380 -0
- prowler/providers/alibabacloud/services/ecs/ecs_unattached_disk_encrypted/__init__.py +0 -0
- prowler/providers/alibabacloud/services/ecs/ecs_unattached_disk_encrypted/ecs_unattached_disk_encrypted.metadata.json +38 -0
- prowler/providers/alibabacloud/services/ecs/ecs_unattached_disk_encrypted/ecs_unattached_disk_encrypted.py +38 -0
- prowler/providers/alibabacloud/services/ecs/lib/security_groups.py +23 -0
- prowler/providers/alibabacloud/services/oss/__init__.py +0 -0
- prowler/providers/alibabacloud/services/oss/oss_bucket_logging_enabled/__init__.py +0 -0
- prowler/providers/alibabacloud/services/oss/oss_bucket_logging_enabled/oss_bucket_logging_enabled.metadata.json +39 -0
- prowler/providers/alibabacloud/services/oss/oss_bucket_logging_enabled/oss_bucket_logging_enabled.py +37 -0
- prowler/providers/alibabacloud/services/oss/oss_bucket_not_publicly_accessible/__init__.py +0 -0
- prowler/providers/alibabacloud/services/oss/oss_bucket_not_publicly_accessible/oss_bucket_not_publicly_accessible.metadata.json +39 -0
- prowler/providers/alibabacloud/services/oss/oss_bucket_not_publicly_accessible/oss_bucket_not_publicly_accessible.py +89 -0
- prowler/providers/alibabacloud/services/oss/oss_bucket_secure_transport_enabled/__init__.py +0 -0
- prowler/providers/alibabacloud/services/oss/oss_bucket_secure_transport_enabled/oss_bucket_secure_transport_enabled.metadata.json +38 -0
- prowler/providers/alibabacloud/services/oss/oss_bucket_secure_transport_enabled/oss_bucket_secure_transport_enabled.py +87 -0
- prowler/providers/alibabacloud/services/oss/oss_client.py +4 -0
- prowler/providers/alibabacloud/services/oss/oss_service.py +317 -0
- prowler/providers/alibabacloud/services/ram/__init__.py +0 -0
- prowler/providers/alibabacloud/services/ram/ram_client.py +4 -0
- prowler/providers/alibabacloud/services/ram/ram_no_root_access_key/__init__.py +0 -0
- prowler/providers/alibabacloud/services/ram/ram_no_root_access_key/ram_no_root_access_key.metadata.json +39 -0
- prowler/providers/alibabacloud/services/ram/ram_no_root_access_key/ram_no_root_access_key.py +33 -0
- prowler/providers/alibabacloud/services/ram/ram_password_policy_lowercase/__init__.py +0 -0
- prowler/providers/alibabacloud/services/ram/ram_password_policy_lowercase/ram_password_policy_lowercase.metadata.json +39 -0
- prowler/providers/alibabacloud/services/ram/ram_password_policy_lowercase/ram_password_policy_lowercase.py +32 -0
- prowler/providers/alibabacloud/services/ram/ram_password_policy_max_login_attempts/__init__.py +0 -0
- prowler/providers/alibabacloud/services/ram/ram_password_policy_max_login_attempts/ram_password_policy_max_login_attempts.metadata.json +39 -0
- prowler/providers/alibabacloud/services/ram/ram_password_policy_max_login_attempts/ram_password_policy_max_login_attempts.py +32 -0
- prowler/providers/alibabacloud/services/ram/ram_password_policy_max_password_age/__init__.py +0 -0
- prowler/providers/alibabacloud/services/ram/ram_password_policy_max_password_age/ram_password_policy_max_password_age.metadata.json +39 -0
- prowler/providers/alibabacloud/services/ram/ram_password_policy_max_password_age/ram_password_policy_max_password_age.py +35 -0
- prowler/providers/alibabacloud/services/ram/ram_password_policy_minimum_length/__init__.py +0 -0
- prowler/providers/alibabacloud/services/ram/ram_password_policy_minimum_length/ram_password_policy_minimum_length.metadata.json +39 -0
- prowler/providers/alibabacloud/services/ram/ram_password_policy_minimum_length/ram_password_policy_minimum_length.py +30 -0
- prowler/providers/alibabacloud/services/ram/ram_password_policy_number/__init__.py +0 -0
- prowler/providers/alibabacloud/services/ram/ram_password_policy_number/ram_password_policy_number.metadata.json +39 -0
- prowler/providers/alibabacloud/services/ram/ram_password_policy_password_reuse_prevention/__init__.py +0 -0
- prowler/providers/alibabacloud/services/ram/ram_password_policy_password_reuse_prevention/ram_password_policy_password_reuse_prevention.metadata.json +39 -0
- prowler/providers/alibabacloud/services/ram/ram_password_policy_password_reuse_prevention/ram_password_policy_password_reuse_prevention.py +35 -0
- prowler/providers/alibabacloud/services/ram/ram_password_policy_symbol/__init__.py +0 -0
- prowler/providers/alibabacloud/services/ram/ram_password_policy_symbol/ram_password_policy_symbol.metadata.json +39 -0
- prowler/providers/alibabacloud/services/ram/ram_password_policy_symbol/ram_password_policy_symbol.py +34 -0
- prowler/providers/alibabacloud/services/ram/ram_password_policy_uppercase/__init__.py +0 -0
- prowler/providers/alibabacloud/services/ram/ram_password_policy_uppercase/ram_password_policy_uppercase.metadata.json +39 -0
- prowler/providers/alibabacloud/services/ram/ram_password_policy_uppercase/ram_password_policy_uppercase.py +32 -0
- prowler/providers/alibabacloud/services/ram/ram_policy_attached_only_to_group_or_roles/__init__.py +0 -0
- prowler/providers/alibabacloud/services/ram/ram_policy_attached_only_to_group_or_roles/ram_policy_attached_only_to_group_or_roles.metadata.json +39 -0
- prowler/providers/alibabacloud/services/ram/ram_policy_attached_only_to_group_or_roles/ram_policy_attached_only_to_group_or_roles.py +35 -0
- prowler/providers/alibabacloud/services/ram/ram_policy_no_administrative_privileges/__init__.py +0 -0
- prowler/providers/alibabacloud/services/ram/ram_policy_no_administrative_privileges/ram_policy_no_administrative_privileges.metadata.json +39 -0
- prowler/providers/alibabacloud/services/ram/ram_policy_no_administrative_privileges/ram_policy_no_administrative_privileges.py +73 -0
- prowler/providers/alibabacloud/services/ram/ram_rotate_access_key_90_days/__init__.py +0 -0
- prowler/providers/alibabacloud/services/ram/ram_rotate_access_key_90_days/ram_rotate_access_key_90_days.metadata.json +39 -0
- prowler/providers/alibabacloud/services/ram/ram_rotate_access_key_90_days/ram_rotate_access_key_90_days.py +58 -0
- prowler/providers/alibabacloud/services/ram/ram_service.py +478 -0
- prowler/providers/alibabacloud/services/ram/ram_user_console_access_unused/__init__.py +0 -0
- prowler/providers/alibabacloud/services/ram/ram_user_console_access_unused/ram_user_console_access_unused.metadata.json +39 -0
- prowler/providers/alibabacloud/services/ram/ram_user_console_access_unused/ram_user_console_access_unused.py +56 -0
- prowler/providers/alibabacloud/services/ram/ram_user_mfa_enabled_console_access/__init__.py +0 -0
- prowler/providers/alibabacloud/services/ram/ram_user_mfa_enabled_console_access/ram_user_mfa_enabled_console_access.metadata.json +39 -0
- prowler/providers/alibabacloud/services/ram/ram_user_mfa_enabled_console_access/ram_user_mfa_enabled_console_access.py +36 -0
- prowler/providers/alibabacloud/services/rds/__init__.py +0 -0
- prowler/providers/alibabacloud/services/rds/rds_client.py +4 -0
- prowler/providers/alibabacloud/services/rds/rds_instance_no_public_access_whitelist/__init__.py +0 -0
- prowler/providers/alibabacloud/services/rds/rds_instance_no_public_access_whitelist/rds_instance_no_public_access_whitelist.metadata.json +39 -0
- prowler/providers/alibabacloud/services/rds/rds_instance_no_public_access_whitelist/rds_instance_no_public_access_whitelist.py +36 -0
- prowler/providers/alibabacloud/services/rds/rds_instance_postgresql_log_connections_enabled/__init__.py +0 -0
- prowler/providers/alibabacloud/services/rds/rds_instance_postgresql_log_connections_enabled/rds_instance_postgresql_log_connections_enabled.metadata.json +39 -0
- prowler/providers/alibabacloud/services/rds/rds_instance_postgresql_log_connections_enabled/rds_instance_postgresql_log_connections_enabled.py +29 -0
- prowler/providers/alibabacloud/services/rds/rds_instance_postgresql_log_disconnections_enabled/__init__.py +0 -0
- prowler/providers/alibabacloud/services/rds/rds_instance_postgresql_log_disconnections_enabled/rds_instance_postgresql_log_disconnections_enabled.metadata.json +39 -0
- prowler/providers/alibabacloud/services/rds/rds_instance_postgresql_log_disconnections_enabled/rds_instance_postgresql_log_disconnections_enabled.py +29 -0
- prowler/providers/alibabacloud/services/rds/rds_instance_postgresql_log_duration_enabled/__init__.py +0 -0
- prowler/providers/alibabacloud/services/rds/rds_instance_postgresql_log_duration_enabled/rds_instance_postgresql_log_duration_enabled.metadata.json +38 -0
- prowler/providers/alibabacloud/services/rds/rds_instance_postgresql_log_duration_enabled/rds_instance_postgresql_log_duration_enabled.py +29 -0
- prowler/providers/alibabacloud/services/rds/rds_instance_sql_audit_enabled/__init__.py +0 -0
- prowler/providers/alibabacloud/services/rds/rds_instance_sql_audit_enabled/rds_instance_sql_audit_enabled.metadata.json +39 -0
- prowler/providers/alibabacloud/services/rds/rds_instance_sql_audit_enabled/rds_instance_sql_audit_enabled.py +32 -0
- prowler/providers/alibabacloud/services/rds/rds_instance_sql_audit_retention/__init__.py +0 -0
- prowler/providers/alibabacloud/services/rds/rds_instance_sql_audit_retention/rds_instance_sql_audit_retention.metadata.json +39 -0
- prowler/providers/alibabacloud/services/rds/rds_instance_sql_audit_retention/rds_instance_sql_audit_retention.py +41 -0
- prowler/providers/alibabacloud/services/rds/rds_instance_ssl_enabled/__init__.py +0 -0
- prowler/providers/alibabacloud/services/rds/rds_instance_ssl_enabled/rds_instance_ssl_enabled.metadata.json +39 -0
- prowler/providers/alibabacloud/services/rds/rds_instance_ssl_enabled/rds_instance_ssl_enabled.py +30 -0
- prowler/providers/alibabacloud/services/rds/rds_instance_tde_enabled/__init__.py +0 -0
- prowler/providers/alibabacloud/services/rds/rds_instance_tde_enabled/rds_instance_tde_enabled.metadata.json +39 -0
- prowler/providers/alibabacloud/services/rds/rds_instance_tde_enabled/rds_instance_tde_enabled.py +32 -0
- prowler/providers/alibabacloud/services/rds/rds_instance_tde_key_custom/__init__.py +0 -0
- prowler/providers/alibabacloud/services/rds/rds_instance_tde_key_custom/rds_instance_tde_key_custom.metadata.json +39 -0
- prowler/providers/alibabacloud/services/rds/rds_instance_tde_key_custom/rds_instance_tde_key_custom.py +38 -0
- prowler/providers/alibabacloud/services/rds/rds_service.py +274 -0
- prowler/providers/alibabacloud/services/securitycenter/__init__.py +0 -0
- prowler/providers/alibabacloud/services/securitycenter/securitycenter_advanced_or_enterprise_edition/__init__.py +0 -0
- prowler/providers/alibabacloud/services/securitycenter/securitycenter_advanced_or_enterprise_edition/securitycenter_advanced_or_enterprise_edition.metadata.json +43 -0
- prowler/providers/alibabacloud/services/securitycenter/securitycenter_advanced_or_enterprise_edition/securitycenter_advanced_or_enterprise_edition.py +48 -0
- prowler/providers/alibabacloud/services/securitycenter/securitycenter_all_assets_agent_installed/__init__.py +0 -0
- prowler/providers/alibabacloud/services/securitycenter/securitycenter_all_assets_agent_installed/securitycenter_all_assets_agent_installed.metadata.json +42 -0
- prowler/providers/alibabacloud/services/securitycenter/securitycenter_all_assets_agent_installed/securitycenter_all_assets_agent_installed.py +48 -0
- prowler/providers/alibabacloud/services/securitycenter/securitycenter_client.py +6 -0
- prowler/providers/alibabacloud/services/securitycenter/securitycenter_notification_enabled_high_risk/__init__.py +0 -0
- prowler/providers/alibabacloud/services/securitycenter/securitycenter_notification_enabled_high_risk/securitycenter_notification_enabled_high_risk.metadata.json +42 -0
- prowler/providers/alibabacloud/services/securitycenter/securitycenter_notification_enabled_high_risk/securitycenter_notification_enabled_high_risk.py +65 -0
- prowler/providers/alibabacloud/services/securitycenter/securitycenter_service.py +394 -0
- prowler/providers/alibabacloud/services/securitycenter/securitycenter_vulnerability_scan_enabled/__init__.py +0 -0
- prowler/providers/alibabacloud/services/securitycenter/securitycenter_vulnerability_scan_enabled/securitycenter_vulnerability_scan_enabled.metadata.json +39 -0
- prowler/providers/alibabacloud/services/securitycenter/securitycenter_vulnerability_scan_enabled/securitycenter_vulnerability_scan_enabled.py +68 -0
- prowler/providers/alibabacloud/services/sls/__init__.py +0 -0
- prowler/providers/alibabacloud/services/sls/sls_client.py +4 -0
- prowler/providers/alibabacloud/services/sls/sls_cloud_firewall_changes_alert_enabled/__init__.py +0 -0
- prowler/providers/alibabacloud/services/sls/sls_cloud_firewall_changes_alert_enabled/sls_cloud_firewall_changes_alert_enabled.metadata.json +39 -0
- prowler/providers/alibabacloud/services/sls/sls_cloud_firewall_changes_alert_enabled/sls_cloud_firewall_changes_alert_enabled.py +50 -0
- prowler/providers/alibabacloud/services/sls/sls_customer_created_cmk_changes_alert_enabled/__init__.py +0 -0
- prowler/providers/alibabacloud/services/sls/sls_customer_created_cmk_changes_alert_enabled/sls_customer_created_cmk_changes_alert_enabled.metadata.json +39 -0
- prowler/providers/alibabacloud/services/sls/sls_customer_created_cmk_changes_alert_enabled/sls_customer_created_cmk_changes_alert_enabled.py +48 -0
- prowler/providers/alibabacloud/services/sls/sls_logstore_retention_period/__init__.py +0 -0
- prowler/providers/alibabacloud/services/sls/sls_logstore_retention_period/sls_logstore_retention_period.metadata.json +38 -0
- prowler/providers/alibabacloud/services/sls/sls_logstore_retention_period/sls_logstore_retention_period.py +32 -0
- prowler/providers/alibabacloud/services/sls/sls_management_console_authentication_failures_alert_enabled/__init__.py +0 -0
- prowler/providers/alibabacloud/services/sls/sls_management_console_authentication_failures_alert_enabled/sls_management_console_authentication_failures_alert_enabled.metadata.json +39 -0
- prowler/providers/alibabacloud/services/sls/sls_management_console_authentication_failures_alert_enabled/sls_management_console_authentication_failures_alert_enabled.py +44 -0
- prowler/providers/alibabacloud/services/sls/sls_management_console_signin_without_mfa_alert_enabled/__init__.py +0 -0
- prowler/providers/alibabacloud/services/sls/sls_management_console_signin_without_mfa_alert_enabled/sls_management_console_signin_without_mfa_alert_enabled.metadata.json +39 -0
- prowler/providers/alibabacloud/services/sls/sls_management_console_signin_without_mfa_alert_enabled/sls_management_console_signin_without_mfa_alert_enabled.py +49 -0
- prowler/providers/alibabacloud/services/sls/sls_oss_bucket_policy_changes_alert_enabled/__init__.py +0 -0
- prowler/providers/alibabacloud/services/sls/sls_oss_bucket_policy_changes_alert_enabled/sls_oss_bucket_policy_changes_alert_enabled.metadata.json +39 -0
- prowler/providers/alibabacloud/services/sls/sls_oss_bucket_policy_changes_alert_enabled/sls_oss_bucket_policy_changes_alert_enabled.py +57 -0
- prowler/providers/alibabacloud/services/sls/sls_oss_permission_changes_alert_enabled/__init__.py +0 -0
- prowler/providers/alibabacloud/services/sls/sls_oss_permission_changes_alert_enabled/sls_oss_permission_changes_alert_enabled.metadata.json +39 -0
- prowler/providers/alibabacloud/services/sls/sls_oss_permission_changes_alert_enabled/sls_oss_permission_changes_alert_enabled.py +48 -0
- prowler/providers/alibabacloud/services/sls/sls_ram_role_changes_alert_enabled/__init__.py +0 -0
- prowler/providers/alibabacloud/services/sls/sls_ram_role_changes_alert_enabled/sls_ram_role_changes_alert_enabled.metadata.json +39 -0
- prowler/providers/alibabacloud/services/sls/sls_ram_role_changes_alert_enabled/sls_ram_role_changes_alert_enabled.py +54 -0
- prowler/providers/alibabacloud/services/sls/sls_rds_instance_configuration_changes_alert_enabled/__init__.py +0 -0
- prowler/providers/alibabacloud/services/sls/sls_rds_instance_configuration_changes_alert_enabled/sls_rds_instance_configuration_changes_alert_enabled.metadata.json +39 -0
- prowler/providers/alibabacloud/services/sls/sls_rds_instance_configuration_changes_alert_enabled/sls_rds_instance_configuration_changes_alert_enabled.py +72 -0
- prowler/providers/alibabacloud/services/sls/sls_root_account_usage_alert_enabled/__init__.py +0 -0
- prowler/providers/alibabacloud/services/sls/sls_root_account_usage_alert_enabled/sls_root_account_usage_alert_enabled.metadata.json +39 -0
- prowler/providers/alibabacloud/services/sls/sls_root_account_usage_alert_enabled/sls_root_account_usage_alert_enabled.py +50 -0
- prowler/providers/alibabacloud/services/sls/sls_security_group_changes_alert_enabled/__init__.py +0 -0
- prowler/providers/alibabacloud/services/sls/sls_security_group_changes_alert_enabled/sls_security_group_changes_alert_enabled.metadata.json +39 -0
- prowler/providers/alibabacloud/services/sls/sls_security_group_changes_alert_enabled/sls_security_group_changes_alert_enabled.py +56 -0
- prowler/providers/alibabacloud/services/sls/sls_service.py +137 -0
- prowler/providers/alibabacloud/services/sls/sls_unauthorized_api_calls_alert_enabled/__init__.py +0 -0
- prowler/providers/alibabacloud/services/sls/sls_unauthorized_api_calls_alert_enabled/sls_unauthorized_api_calls_alert_enabled.metadata.json +39 -0
- prowler/providers/alibabacloud/services/sls/sls_unauthorized_api_calls_alert_enabled/sls_unauthorized_api_calls_alert_enabled.py +56 -0
- prowler/providers/alibabacloud/services/sls/sls_vpc_changes_alert_enabled/__init__.py +0 -0
- prowler/providers/alibabacloud/services/sls/sls_vpc_changes_alert_enabled/sls_vpc_changes_alert_enabled.metadata.json +39 -0
- prowler/providers/alibabacloud/services/sls/sls_vpc_changes_alert_enabled/sls_vpc_changes_alert_enabled.py +57 -0
- prowler/providers/alibabacloud/services/sls/sls_vpc_network_route_changes_alert_enabled/__init__.py +0 -0
- prowler/providers/alibabacloud/services/sls/sls_vpc_network_route_changes_alert_enabled/sls_vpc_network_route_changes_alert_enabled.metadata.json +39 -0
- prowler/providers/alibabacloud/services/sls/sls_vpc_network_route_changes_alert_enabled/sls_vpc_network_route_changes_alert_enabled.py +52 -0
- prowler/providers/alibabacloud/services/vpc/__init__.py +0 -0
- prowler/providers/alibabacloud/services/vpc/vpc_client.py +4 -0
- prowler/providers/alibabacloud/services/vpc/vpc_flow_logs_enabled/__init__.py +0 -0
- prowler/providers/alibabacloud/services/vpc/vpc_flow_logs_enabled/vpc_flow_logs_enabled.metadata.json +39 -0
- prowler/providers/alibabacloud/services/vpc/vpc_flow_logs_enabled/vpc_flow_logs_enabled.py +30 -0
- prowler/providers/alibabacloud/services/vpc/vpc_service.py +102 -0
- prowler/providers/aws/aws_regions_by_service.json +20 -0
- prowler/providers/aws/services/apigateway/apigateway_restapi_waf_acl_attached/apigateway_restapi_waf_acl_attached.metadata.json +1 -3
- prowler/providers/aws/services/cloudtrail/cloudtrail_insights_exist/cloudtrail_insights_exist.metadata.json +1 -1
- prowler/providers/aws/services/cloudwatch/cloudwatch_changes_to_network_acls_alarm_configured/cloudwatch_changes_to_network_acls_alarm_configured.metadata.json +1 -2
- prowler/providers/aws/services/cloudwatch/cloudwatch_changes_to_network_gateways_alarm_configured/cloudwatch_changes_to_network_gateways_alarm_configured.metadata.json +1 -2
- prowler/providers/aws/services/cloudwatch/cloudwatch_changes_to_network_route_tables_alarm_configured/cloudwatch_changes_to_network_route_tables_alarm_configured.metadata.json +1 -2
- prowler/providers/aws/services/cloudwatch/cloudwatch_changes_to_vpcs_alarm_configured/cloudwatch_changes_to_vpcs_alarm_configured.metadata.json +1 -2
- 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 +1 -2
- 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 +1 -2
- prowler/providers/aws/services/cloudwatch/cloudwatch_log_metric_filter_authentication_failures/cloudwatch_log_metric_filter_authentication_failures.metadata.json +1 -2
- prowler/providers/aws/services/cloudwatch/cloudwatch_log_metric_filter_aws_organizations_changes/cloudwatch_log_metric_filter_aws_organizations_changes.metadata.json +1 -2
- 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 +1 -2
- prowler/providers/aws/services/cloudwatch/cloudwatch_log_metric_filter_policy_changes/cloudwatch_log_metric_filter_policy_changes.metadata.json +1 -2
- prowler/providers/aws/services/cloudwatch/cloudwatch_log_metric_filter_root_usage/cloudwatch_log_metric_filter_root_usage.metadata.json +1 -2
- prowler/providers/aws/services/cloudwatch/cloudwatch_log_metric_filter_security_group_changes/cloudwatch_log_metric_filter_security_group_changes.metadata.json +1 -2
- prowler/providers/aws/services/cloudwatch/cloudwatch_log_metric_filter_sign_in_without_mfa/cloudwatch_log_metric_filter_sign_in_without_mfa.metadata.json +1 -2
- prowler/providers/aws/services/cloudwatch/cloudwatch_log_metric_filter_unauthorized_api_calls/cloudwatch_log_metric_filter_unauthorized_api_calls.metadata.json +0 -1
- prowler/providers/aws/services/guardduty/guardduty_centrally_managed/guardduty_centrally_managed.metadata.json +16 -10
- prowler/providers/aws/services/guardduty/guardduty_ec2_malware_protection_enabled/guardduty_ec2_malware_protection_enabled.metadata.json +23 -14
- prowler/providers/aws/services/guardduty/guardduty_eks_audit_log_enabled/guardduty_eks_audit_log_enabled.metadata.json +19 -13
- prowler/providers/aws/services/guardduty/guardduty_eks_runtime_monitoring_enabled/guardduty_eks_runtime_monitoring_enabled.metadata.json +18 -12
- prowler/providers/aws/services/guardduty/guardduty_is_enabled/guardduty_is_enabled.metadata.json +24 -13
- prowler/providers/aws/services/guardduty/guardduty_lambda_protection_enabled/guardduty_lambda_protection_enabled.metadata.json +20 -14
- prowler/providers/aws/services/guardduty/guardduty_no_high_severity_findings/guardduty_no_high_severity_findings.metadata.json +18 -9
- prowler/providers/aws/services/guardduty/guardduty_rds_protection_enabled/guardduty_rds_protection_enabled.metadata.json +18 -11
- prowler/providers/aws/services/guardduty/guardduty_s3_protection_enabled/guardduty_s3_protection_enabled.metadata.json +21 -12
- prowler/providers/aws/services/lightsail/lightsail_database_public/lightsail_database_public.metadata.json +21 -13
- prowler/providers/aws/services/lightsail/lightsail_instance_automated_snapshots/lightsail_instance_automated_snapshots.metadata.json +24 -13
- prowler/providers/aws/services/lightsail/lightsail_instance_public/lightsail_instance_public.metadata.json +21 -13
- prowler/providers/aws/services/lightsail/lightsail_static_ip_unused/lightsail_static_ip_unused.metadata.json +23 -14
- prowler/providers/aws/services/macie/macie_automated_sensitive_data_discovery_enabled/macie_automated_sensitive_data_discovery_enabled.metadata.json +20 -12
- prowler/providers/aws/services/macie/macie_is_enabled/macie_is_enabled.metadata.json +17 -12
- prowler/providers/aws/services/mq/mq_broker_active_deployment_mode/mq_broker_active_deployment_mode.metadata.json +22 -13
- prowler/providers/aws/services/mq/mq_broker_auto_minor_version_upgrades/mq_broker_auto_minor_version_upgrades.metadata.json +21 -12
- prowler/providers/aws/services/mq/mq_broker_cluster_deployment_mode/mq_broker_cluster_deployment_mode.metadata.json +23 -14
- prowler/providers/aws/services/mq/mq_broker_logging_enabled/mq_broker_logging_enabled.metadata.json +22 -13
- prowler/providers/aws/services/mq/mq_broker_not_publicly_accessible/mq_broker_not_publicly_accessible.metadata.json +20 -12
- prowler/providers/aws/services/networkfirewall/networkfirewall_deletion_protection/networkfirewall_deletion_protection.metadata.json +21 -13
- prowler/providers/aws/services/networkfirewall/networkfirewall_in_all_vpc/networkfirewall_in_all_vpc.metadata.json +23 -13
- prowler/providers/aws/services/networkfirewall/networkfirewall_logging_enabled/networkfirewall_logging_enabled.metadata.json +20 -13
- prowler/providers/aws/services/networkfirewall/networkfirewall_multi_az/networkfirewall_multi_az.metadata.json +22 -14
- prowler/providers/aws/services/networkfirewall/networkfirewall_policy_default_action_fragmented_packets/networkfirewall_policy_default_action_fragmented_packets.metadata.json +26 -14
- prowler/providers/aws/services/networkfirewall/networkfirewall_policy_default_action_full_packets/networkfirewall_policy_default_action_full_packets.metadata.json +22 -13
- prowler/providers/aws/services/networkfirewall/networkfirewall_policy_rule_group_associated/networkfirewall_policy_rule_group_associated.metadata.json +25 -14
- prowler/providers/common/provider.py +12 -0
- prowler/providers/gcp/services/accesscontextmanager/__init__.py +0 -0
- prowler/providers/gcp/services/accesscontextmanager/accesscontextmanager_client.py +6 -0
- prowler/providers/gcp/services/accesscontextmanager/accesscontextmanager_service.py +101 -0
- prowler/providers/gcp/services/cloudresourcemanager/cloudresourcemanager_service.py +10 -0
- prowler/providers/gcp/services/cloudstorage/cloudstorage_service.py +13 -0
- prowler/providers/gcp/services/cloudstorage/cloudstorage_uses_vpc_service_controls/__init__.py +0 -0
- prowler/providers/gcp/services/cloudstorage/cloudstorage_uses_vpc_service_controls/cloudstorage_uses_vpc_service_controls.metadata.json +36 -0
- prowler/providers/gcp/services/cloudstorage/cloudstorage_uses_vpc_service_controls/cloudstorage_uses_vpc_service_controls.py +67 -0
- prowler/providers/gcp/services/compute/compute_instance_automatic_restart_enabled/__init__.py +0 -0
- prowler/providers/gcp/services/compute/compute_instance_automatic_restart_enabled/compute_instance_automatic_restart_enabled.metadata.json +36 -0
- prowler/providers/gcp/services/compute/compute_instance_automatic_restart_enabled/compute_instance_automatic_restart_enabled.py +35 -0
- prowler/providers/gcp/services/compute/compute_instance_deletion_protection_enabled/__init__.py +0 -0
- prowler/providers/gcp/services/compute/compute_instance_deletion_protection_enabled/compute_instance_deletion_protection_enabled.metadata.json +36 -0
- prowler/providers/gcp/services/compute/compute_instance_deletion_protection_enabled/compute_instance_deletion_protection_enabled.py +29 -0
- prowler/providers/gcp/services/compute/compute_instance_preemptible_vm_disabled/__init__.py +0 -0
- prowler/providers/gcp/services/compute/compute_instance_preemptible_vm_disabled/compute_instance_preemptible_vm_disabled.metadata.json +37 -0
- prowler/providers/gcp/services/compute/compute_instance_preemptible_vm_disabled/compute_instance_preemptible_vm_disabled.py +32 -0
- prowler/providers/gcp/services/compute/compute_service.py +16 -0
- prowler/providers/github/services/repository/repository_immutable_releases_enabled/__init__.py +0 -0
- prowler/providers/github/services/repository/repository_immutable_releases_enabled/repository_immutable_releases_enabled.metadata.json +33 -0
- prowler/providers/github/services/repository/repository_immutable_releases_enabled/repository_immutable_releases_enabled.py +41 -0
- prowler/providers/github/services/repository/repository_service.py +52 -0
- {prowler_cloud-5.14.1.dist-info → prowler_cloud-5.15.0.dist-info}/METADATA +40 -22
- {prowler_cloud-5.14.1.dist-info → prowler_cloud-5.15.0.dist-info}/RECORD +326 -73
- {prowler_cloud-5.14.1.dist-info → prowler_cloud-5.15.0.dist-info}/LICENSE +0 -0
- {prowler_cloud-5.14.1.dist-info → prowler_cloud-5.15.0.dist-info}/WHEEL +0 -0
- {prowler_cloud-5.14.1.dist-info → prowler_cloud-5.15.0.dist-info}/entry_points.txt +0 -0
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
from prowler.lib.check.models import Check, CheckReportAlibabaCloud
|
|
2
|
+
from prowler.providers.alibabacloud.services.oss.oss_client import oss_client
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
def _is_policy_public(policy_document: dict) -> bool:
|
|
6
|
+
"""
|
|
7
|
+
Check if a bucket policy allows public access.
|
|
8
|
+
|
|
9
|
+
A policy is considered public if it has a statement with:
|
|
10
|
+
- Effect: "Allow"
|
|
11
|
+
- Principal: ["*"] (or contains "*")
|
|
12
|
+
- No Condition elements
|
|
13
|
+
|
|
14
|
+
Args:
|
|
15
|
+
policy_document: The parsed policy document as a dictionary.
|
|
16
|
+
|
|
17
|
+
Returns:
|
|
18
|
+
bool: True if policy allows public access, False otherwise.
|
|
19
|
+
"""
|
|
20
|
+
if not policy_document:
|
|
21
|
+
return False
|
|
22
|
+
|
|
23
|
+
statements = policy_document.get("Statement", [])
|
|
24
|
+
if not isinstance(statements, list):
|
|
25
|
+
statements = [statements]
|
|
26
|
+
|
|
27
|
+
for statement in statements:
|
|
28
|
+
effect = statement.get("Effect", "")
|
|
29
|
+
principal = statement.get("Principal", [])
|
|
30
|
+
condition = statement.get("Condition")
|
|
31
|
+
|
|
32
|
+
# If there's a condition, it's not truly public
|
|
33
|
+
if condition:
|
|
34
|
+
continue
|
|
35
|
+
|
|
36
|
+
if effect == "Allow":
|
|
37
|
+
# Check if Principal is "*" or contains "*"
|
|
38
|
+
if isinstance(principal, list):
|
|
39
|
+
if "*" in principal:
|
|
40
|
+
return True
|
|
41
|
+
elif principal == "*":
|
|
42
|
+
return True
|
|
43
|
+
|
|
44
|
+
return False
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class oss_bucket_not_publicly_accessible(Check):
|
|
48
|
+
"""Check if OSS bucket is not anonymously or publicly accessible."""
|
|
49
|
+
|
|
50
|
+
def execute(self) -> list[CheckReportAlibabaCloud]:
|
|
51
|
+
findings = []
|
|
52
|
+
|
|
53
|
+
for bucket in oss_client.buckets.values():
|
|
54
|
+
report = CheckReportAlibabaCloud(metadata=self.metadata(), resource=bucket)
|
|
55
|
+
report.region = bucket.region
|
|
56
|
+
report.resource_id = bucket.name
|
|
57
|
+
report.resource_arn = bucket.arn
|
|
58
|
+
|
|
59
|
+
# Check bucket ACL
|
|
60
|
+
acl_public = False
|
|
61
|
+
if bucket.acl and bucket.acl != "private":
|
|
62
|
+
if bucket.acl in ["public-read", "public-read-write"]:
|
|
63
|
+
acl_public = True
|
|
64
|
+
|
|
65
|
+
# Check bucket policy
|
|
66
|
+
policy_public = _is_policy_public(bucket.policy)
|
|
67
|
+
|
|
68
|
+
# Determine status
|
|
69
|
+
if acl_public or policy_public:
|
|
70
|
+
report.status = "FAIL"
|
|
71
|
+
issues = []
|
|
72
|
+
if acl_public:
|
|
73
|
+
issues.append(f"Bucket ACL is set to {bucket.acl}")
|
|
74
|
+
if policy_public:
|
|
75
|
+
issues.append("Bucket policy allows public access (Principal: '*')")
|
|
76
|
+
report.status_extended = (
|
|
77
|
+
f"OSS bucket {bucket.name} is publicly accessible. "
|
|
78
|
+
+ "; ".join(issues)
|
|
79
|
+
)
|
|
80
|
+
else:
|
|
81
|
+
report.status = "PASS"
|
|
82
|
+
report.status_extended = (
|
|
83
|
+
f"OSS bucket {bucket.name} is not publicly accessible. "
|
|
84
|
+
f"ACL is {bucket.acl} and bucket policy does not allow public access."
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
findings.append(report)
|
|
88
|
+
|
|
89
|
+
return findings
|
|
File without changes
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"Provider": "alibabacloud",
|
|
3
|
+
"CheckID": "oss_bucket_secure_transport_enabled",
|
|
4
|
+
"CheckTitle": "Secure transfer required is set to Enabled",
|
|
5
|
+
"CheckType": [
|
|
6
|
+
"Sensitive file tampering"
|
|
7
|
+
],
|
|
8
|
+
"ServiceName": "oss",
|
|
9
|
+
"SubServiceName": "",
|
|
10
|
+
"ResourceIdTemplate": "acs:oss::account-id:bucket-name",
|
|
11
|
+
"Severity": "high",
|
|
12
|
+
"ResourceType": "AlibabaCloudOSSBucket",
|
|
13
|
+
"Description": "Enable **data encryption in transit**. The secure transfer enhances the security of OSS buckets by only allowing requests to the storage account via a secure connection.\n\nFor example, when calling REST APIs to access storage accounts, the connection must use **HTTPS**. Any requests using HTTP will be rejected.",
|
|
14
|
+
"Risk": "Without **secure transfer enforcement**, OSS buckets may accept HTTP requests, which are not encrypted in transit.\n\nThis exposes data to potential **interception** and **man-in-the-middle attacks**, compromising data confidentiality and integrity.",
|
|
15
|
+
"RelatedUrl": "",
|
|
16
|
+
"AdditionalURLs": [
|
|
17
|
+
"https://www.alibabacloud.com/help/doc-detail/85111.htm",
|
|
18
|
+
"https://www.trendmicro.com/cloudoneconformity/knowledge-base/alibaba-cloud/AlibabaCloud-OSS/enable-secure-transfer.html"
|
|
19
|
+
],
|
|
20
|
+
"Remediation": {
|
|
21
|
+
"Code": {
|
|
22
|
+
"CLI": "",
|
|
23
|
+
"NativeIaC": "",
|
|
24
|
+
"Other": "",
|
|
25
|
+
"Terraform": "resource \"alicloud_oss_bucket\" \"example\" {\n bucket = \"example-bucket\"\n \n policy = jsonencode({\n \"Version\": \"1\",\n \"Statement\": [{\n \"Effect\": \"Deny\",\n \"Principal\": [\"*\"],\n \"Action\": [\"oss:*\"],\n \"Resource\": [\"acs:oss:*:*:example-bucket\", \"acs:oss:*:*:example-bucket/*\"],\n \"Condition\": {\n \"Bool\": {\n \"acs:SecureTransport\": \"false\"\n }\n }\n }]\n })\n}"
|
|
26
|
+
},
|
|
27
|
+
"Recommendation": {
|
|
28
|
+
"Text": "1. Log on to the **OSS Console**\n2. In the bucket-list pane, click on a target OSS bucket\n3. Click on **Files** in the top middle of the console\n4. Click on **Authorize**\n5. Configure: `Whole Bucket`, `*`, `None` (Authorized Operation) and `http` (Conditions: Access Method) to deny HTTP access\n6. Click **Save**",
|
|
29
|
+
"Url": "https://hub.prowler.com/check/oss_bucket_secure_transport_enabled"
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
"Categories": [
|
|
33
|
+
"encryption"
|
|
34
|
+
],
|
|
35
|
+
"DependsOn": [],
|
|
36
|
+
"RelatedTo": [],
|
|
37
|
+
"Notes": ""
|
|
38
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
from prowler.lib.check.models import Check, CheckReportAlibabaCloud
|
|
2
|
+
from prowler.providers.alibabacloud.services.oss.oss_client import oss_client
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
def _is_secure_transport_enforced(policy_document: dict) -> bool:
|
|
6
|
+
"""
|
|
7
|
+
Check if a bucket policy enforces secure transport (HTTPS only).
|
|
8
|
+
|
|
9
|
+
A policy enforces secure transport if it has:
|
|
10
|
+
- "Condition": {"Bool": {"acs:SecureTransport": ["true"]}} with "Effect": "Allow"
|
|
11
|
+
OR
|
|
12
|
+
- "Condition": {"Bool": {"acs:SecureTransport": ["false"]}} with "Effect": "Deny"
|
|
13
|
+
|
|
14
|
+
Args:
|
|
15
|
+
policy_document: The parsed policy document as a dictionary.
|
|
16
|
+
|
|
17
|
+
Returns:
|
|
18
|
+
bool: True if secure transport is enforced, False otherwise.
|
|
19
|
+
"""
|
|
20
|
+
if not policy_document:
|
|
21
|
+
return False
|
|
22
|
+
|
|
23
|
+
statements = policy_document.get("Statement", [])
|
|
24
|
+
if not isinstance(statements, list):
|
|
25
|
+
statements = [statements]
|
|
26
|
+
|
|
27
|
+
for statement in statements:
|
|
28
|
+
effect = statement.get("Effect", "")
|
|
29
|
+
condition = statement.get("Condition", {})
|
|
30
|
+
|
|
31
|
+
if not condition:
|
|
32
|
+
continue
|
|
33
|
+
|
|
34
|
+
# Check for SecureTransport condition
|
|
35
|
+
bool_condition = condition.get("Bool", {})
|
|
36
|
+
secure_transport = bool_condition.get("acs:SecureTransport", [])
|
|
37
|
+
|
|
38
|
+
if secure_transport:
|
|
39
|
+
# Check if it's a list or single value
|
|
40
|
+
if isinstance(secure_transport, list):
|
|
41
|
+
secure_transport_value = (
|
|
42
|
+
secure_transport[0] if secure_transport else None
|
|
43
|
+
)
|
|
44
|
+
else:
|
|
45
|
+
secure_transport_value = secure_transport
|
|
46
|
+
|
|
47
|
+
# Secure transport is enforced if:
|
|
48
|
+
# 1. Effect: Allow with SecureTransport: true (only HTTPS allowed)
|
|
49
|
+
# 2. Effect: Deny with SecureTransport: false (HTTP denied)
|
|
50
|
+
if effect == "Allow" and secure_transport_value == "true":
|
|
51
|
+
return True
|
|
52
|
+
elif effect == "Deny" and secure_transport_value == "false":
|
|
53
|
+
return True
|
|
54
|
+
|
|
55
|
+
return False
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
class oss_bucket_secure_transport_enabled(Check):
|
|
59
|
+
"""Check if 'Secure transfer required' is set to 'Enabled' for OSS buckets."""
|
|
60
|
+
|
|
61
|
+
def execute(self) -> list[CheckReportAlibabaCloud]:
|
|
62
|
+
findings = []
|
|
63
|
+
|
|
64
|
+
for bucket in oss_client.buckets.values():
|
|
65
|
+
report = CheckReportAlibabaCloud(metadata=self.metadata(), resource=bucket)
|
|
66
|
+
report.region = bucket.region
|
|
67
|
+
report.resource_id = bucket.name
|
|
68
|
+
report.resource_arn = bucket.arn
|
|
69
|
+
|
|
70
|
+
# Check if secure transport is enforced via bucket policy
|
|
71
|
+
secure_transport_enforced = _is_secure_transport_enforced(bucket.policy)
|
|
72
|
+
|
|
73
|
+
if secure_transport_enforced:
|
|
74
|
+
report.status = "PASS"
|
|
75
|
+
report.status_extended = (
|
|
76
|
+
f"OSS bucket {bucket.name} has secure transfer required enabled."
|
|
77
|
+
)
|
|
78
|
+
else:
|
|
79
|
+
report.status = "FAIL"
|
|
80
|
+
if bucket.policy:
|
|
81
|
+
report.status_extended = f"OSS bucket {bucket.name} does not have secure transfer required enabled."
|
|
82
|
+
else:
|
|
83
|
+
report.status_extended = f"OSS bucket {bucket.name} does not have secure transfer required enabled."
|
|
84
|
+
|
|
85
|
+
findings.append(report)
|
|
86
|
+
|
|
87
|
+
return findings
|
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
import base64
|
|
2
|
+
import hashlib
|
|
3
|
+
import hmac
|
|
4
|
+
import json
|
|
5
|
+
from datetime import datetime
|
|
6
|
+
from email.utils import formatdate
|
|
7
|
+
from threading import Lock
|
|
8
|
+
from typing import Optional
|
|
9
|
+
from xml.etree import ElementTree
|
|
10
|
+
|
|
11
|
+
import requests
|
|
12
|
+
from pydantic.v1 import BaseModel
|
|
13
|
+
|
|
14
|
+
from prowler.lib.logger import logger
|
|
15
|
+
from prowler.lib.scan_filters.scan_filters import is_resource_filtered
|
|
16
|
+
from prowler.providers.alibabacloud.lib.service.service import AlibabaCloudService
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class OSS(AlibabaCloudService):
|
|
20
|
+
"""
|
|
21
|
+
OSS (Object Storage Service) service class for Alibaba Cloud.
|
|
22
|
+
|
|
23
|
+
This class provides methods to interact with Alibaba Cloud OSS service
|
|
24
|
+
to retrieve buckets, ACLs, and policies.
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
def __init__(self, provider):
|
|
28
|
+
# Call AlibabaCloudService's __init__
|
|
29
|
+
# Treat as regional for client generation consistency with other services
|
|
30
|
+
super().__init__(__class__.__name__, provider, global_service=False)
|
|
31
|
+
self._buckets_lock = Lock()
|
|
32
|
+
|
|
33
|
+
# Fetch OSS resources
|
|
34
|
+
self.buckets = {}
|
|
35
|
+
self.__threading_call__(self._list_buckets)
|
|
36
|
+
self.__threading_call__(self._get_bucket_acl, self.buckets.values())
|
|
37
|
+
self.__threading_call__(self._get_bucket_policy, self.buckets.values())
|
|
38
|
+
self.__threading_call__(self._get_bucket_logging, self.buckets.values())
|
|
39
|
+
|
|
40
|
+
def _list_buckets(self, regional_client=None):
|
|
41
|
+
region = "unknown"
|
|
42
|
+
try:
|
|
43
|
+
regional_client = regional_client or self.client
|
|
44
|
+
region = getattr(regional_client, "region", self.region)
|
|
45
|
+
endpoint = f"oss-{region}.aliyuncs.com"
|
|
46
|
+
endpoint_label = f"region {region}"
|
|
47
|
+
|
|
48
|
+
credentials = self.session.get_credentials()
|
|
49
|
+
|
|
50
|
+
date_str = formatdate(usegmt=True)
|
|
51
|
+
headers = {
|
|
52
|
+
"Date": date_str,
|
|
53
|
+
"Host": endpoint,
|
|
54
|
+
}
|
|
55
|
+
canonical_headers = []
|
|
56
|
+
if credentials.security_token:
|
|
57
|
+
headers["x-oss-security-token"] = credentials.security_token
|
|
58
|
+
canonical_headers.append(
|
|
59
|
+
f"x-oss-security-token:{credentials.security_token}"
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
canonical_headers_str = ""
|
|
63
|
+
if canonical_headers:
|
|
64
|
+
canonical_headers.sort()
|
|
65
|
+
canonical_headers_str = "\n".join(canonical_headers) + "\n"
|
|
66
|
+
|
|
67
|
+
string_to_sign = f"GET\n\n\n{date_str}\n{canonical_headers_str}/"
|
|
68
|
+
signature = base64.b64encode(
|
|
69
|
+
hmac.new(
|
|
70
|
+
credentials.access_key_secret.encode("utf-8"),
|
|
71
|
+
string_to_sign.encode("utf-8"),
|
|
72
|
+
hashlib.sha1,
|
|
73
|
+
).digest()
|
|
74
|
+
).decode()
|
|
75
|
+
headers["Authorization"] = f"OSS {credentials.access_key_id}:{signature}"
|
|
76
|
+
|
|
77
|
+
url = f"https://{endpoint}/"
|
|
78
|
+
response = requests.get(url, headers=headers, timeout=10)
|
|
79
|
+
if response.status_code != 200:
|
|
80
|
+
logger.error(
|
|
81
|
+
f"OSS - HTTP listing {endpoint_label} returned {response.status_code}: {response.text}"
|
|
82
|
+
)
|
|
83
|
+
return
|
|
84
|
+
|
|
85
|
+
try:
|
|
86
|
+
xml_root = ElementTree.fromstring(response.text)
|
|
87
|
+
except ElementTree.ParseError as error:
|
|
88
|
+
logger.error(
|
|
89
|
+
f"OSS - HTTP listing {endpoint_label} XML parse error: {error}"
|
|
90
|
+
)
|
|
91
|
+
return
|
|
92
|
+
|
|
93
|
+
for bucket_elem in xml_root.findall(".//Bucket"):
|
|
94
|
+
bucket_name = bucket_elem.findtext("Name", default="")
|
|
95
|
+
if not bucket_name:
|
|
96
|
+
continue
|
|
97
|
+
location = bucket_elem.findtext("Location", default=self.region)
|
|
98
|
+
arn = f"acs:oss::{self.audited_account}:{bucket_name}"
|
|
99
|
+
if self.audit_resources and not is_resource_filtered(
|
|
100
|
+
arn, self.audit_resources
|
|
101
|
+
):
|
|
102
|
+
continue
|
|
103
|
+
|
|
104
|
+
creation_str = bucket_elem.findtext("CreationDate")
|
|
105
|
+
with self._buckets_lock:
|
|
106
|
+
self.buckets[arn] = Bucket(
|
|
107
|
+
arn=arn,
|
|
108
|
+
name=bucket_name,
|
|
109
|
+
region=self._normalize_bucket_region(location),
|
|
110
|
+
creation_date=self._parse_creation_date(creation_str),
|
|
111
|
+
)
|
|
112
|
+
except Exception as error:
|
|
113
|
+
logger.error(
|
|
114
|
+
f"{region} -- {error.__class__.__name__}[{error.__traceback__.tb_lineno}]: {error}"
|
|
115
|
+
)
|
|
116
|
+
return
|
|
117
|
+
|
|
118
|
+
def _get_bucket_acl(self, bucket):
|
|
119
|
+
"""Get bucket ACL."""
|
|
120
|
+
logger.info(f"OSS - Getting ACL for bucket {bucket.name}...")
|
|
121
|
+
try:
|
|
122
|
+
# Get OSS client for the bucket's region
|
|
123
|
+
# OSS bucket operations use regional endpoint: oss-{region}.aliyuncs.com
|
|
124
|
+
oss_client = self.session.client("oss", bucket.region)
|
|
125
|
+
|
|
126
|
+
# Get bucket ACL
|
|
127
|
+
response = oss_client.get_bucket_acl(bucket.name)
|
|
128
|
+
|
|
129
|
+
if response and response.body:
|
|
130
|
+
# ACL can be retrieved from the response
|
|
131
|
+
# The ACL value is typically in the response body
|
|
132
|
+
acl_value = getattr(response.body, "acl", None)
|
|
133
|
+
if acl_value:
|
|
134
|
+
# ACL values: private, public-read, public-read-write
|
|
135
|
+
bucket.acl = acl_value
|
|
136
|
+
else:
|
|
137
|
+
# Try to get from access_control_list if available
|
|
138
|
+
acl_list = getattr(response.body, "access_control_list", None)
|
|
139
|
+
if acl_list:
|
|
140
|
+
grant = getattr(acl_list, "grant", None)
|
|
141
|
+
if grant:
|
|
142
|
+
# Check grants to determine ACL type
|
|
143
|
+
if isinstance(grant, list):
|
|
144
|
+
# Check if any grant has public access
|
|
145
|
+
for g in grant:
|
|
146
|
+
permission = getattr(g, "permission", "")
|
|
147
|
+
if permission in ["READ", "FULL_CONTROL"]:
|
|
148
|
+
if permission == "READ":
|
|
149
|
+
bucket.acl = "public-read"
|
|
150
|
+
else:
|
|
151
|
+
bucket.acl = "public-read-write"
|
|
152
|
+
break
|
|
153
|
+
else:
|
|
154
|
+
bucket.acl = "private"
|
|
155
|
+
else:
|
|
156
|
+
permission = getattr(grant, "permission", "")
|
|
157
|
+
if permission == "READ":
|
|
158
|
+
bucket.acl = "public-read"
|
|
159
|
+
elif permission == "FULL_CONTROL":
|
|
160
|
+
bucket.acl = "public-read-write"
|
|
161
|
+
else:
|
|
162
|
+
bucket.acl = "private"
|
|
163
|
+
else:
|
|
164
|
+
bucket.acl = "private"
|
|
165
|
+
else:
|
|
166
|
+
bucket.acl = "private"
|
|
167
|
+
else:
|
|
168
|
+
bucket.acl = "private"
|
|
169
|
+
|
|
170
|
+
except Exception as error:
|
|
171
|
+
logger.error(
|
|
172
|
+
f"{bucket.region} -- {error.__class__.__name__}[{error.__traceback__.tb_lineno}]: {error}"
|
|
173
|
+
)
|
|
174
|
+
|
|
175
|
+
def _get_bucket_policy(self, bucket):
|
|
176
|
+
"""Get bucket policy."""
|
|
177
|
+
logger.info(f"OSS - Getting policy for bucket {bucket.name}...")
|
|
178
|
+
try:
|
|
179
|
+
oss_client = self.session.client("oss", bucket.region)
|
|
180
|
+
|
|
181
|
+
response = oss_client.get_bucket_policy(bucket.name)
|
|
182
|
+
|
|
183
|
+
if response and response.body:
|
|
184
|
+
if response.body:
|
|
185
|
+
try:
|
|
186
|
+
bucket.policy = json.loads(response.body)
|
|
187
|
+
except json.JSONDecodeError:
|
|
188
|
+
bucket.policy = {}
|
|
189
|
+
else:
|
|
190
|
+
bucket.policy = {}
|
|
191
|
+
else:
|
|
192
|
+
bucket.policy = {}
|
|
193
|
+
|
|
194
|
+
except Exception as error:
|
|
195
|
+
# If bucket policy doesn't exist, that's OK - it means no public access via policy
|
|
196
|
+
error_code = getattr(error, "code", "")
|
|
197
|
+
if error_code in ["NoSuchBucketPolicy", "NoSuchBucket"]:
|
|
198
|
+
bucket.policy = {}
|
|
199
|
+
else:
|
|
200
|
+
logger.error(
|
|
201
|
+
f"{bucket.region} -- {error.__class__.__name__}[{error.__traceback__.tb_lineno}]: {error}"
|
|
202
|
+
)
|
|
203
|
+
bucket.policy = {}
|
|
204
|
+
|
|
205
|
+
def _get_bucket_logging(self, bucket):
|
|
206
|
+
"""Get bucket logging configuration using OSS SDK."""
|
|
207
|
+
logger.info(f"OSS - Getting logging configuration for bucket {bucket.name}...")
|
|
208
|
+
try:
|
|
209
|
+
oss_client = self.session.client("oss", bucket.region)
|
|
210
|
+
|
|
211
|
+
response = oss_client.get_bucket_logging(bucket.name)
|
|
212
|
+
|
|
213
|
+
if response and response.body:
|
|
214
|
+
logging_enabled = None
|
|
215
|
+
if hasattr(response.body, "logging_enabled"):
|
|
216
|
+
logging_enabled = response.body.logging_enabled
|
|
217
|
+
elif hasattr(response.body, "loggingenabled"):
|
|
218
|
+
logging_enabled = response.body.loggingenabled
|
|
219
|
+
elif hasattr(response.body, "bucket_logging"):
|
|
220
|
+
logging_enabled = response.body.bucket_logging
|
|
221
|
+
|
|
222
|
+
if logging_enabled:
|
|
223
|
+
target_bucket = None
|
|
224
|
+
target_prefix = None
|
|
225
|
+
|
|
226
|
+
for attr_name in [
|
|
227
|
+
"target_bucket",
|
|
228
|
+
"targetBucket",
|
|
229
|
+
"target_bucket_name",
|
|
230
|
+
"targetBucketName",
|
|
231
|
+
]:
|
|
232
|
+
if hasattr(logging_enabled, attr_name):
|
|
233
|
+
target_bucket = getattr(logging_enabled, attr_name)
|
|
234
|
+
break
|
|
235
|
+
|
|
236
|
+
for attr_name in [
|
|
237
|
+
"target_prefix",
|
|
238
|
+
"targetPrefix",
|
|
239
|
+
"target_prefix_name",
|
|
240
|
+
"targetPrefixName",
|
|
241
|
+
]:
|
|
242
|
+
if hasattr(logging_enabled, attr_name):
|
|
243
|
+
target_prefix = getattr(logging_enabled, attr_name)
|
|
244
|
+
break
|
|
245
|
+
|
|
246
|
+
if target_bucket:
|
|
247
|
+
bucket.logging_enabled = True
|
|
248
|
+
bucket.logging_target_bucket = (
|
|
249
|
+
str(target_bucket) if target_bucket else ""
|
|
250
|
+
)
|
|
251
|
+
bucket.logging_target_prefix = (
|
|
252
|
+
str(target_prefix) if target_prefix else ""
|
|
253
|
+
)
|
|
254
|
+
else:
|
|
255
|
+
bucket.logging_enabled = False
|
|
256
|
+
bucket.logging_target_bucket = ""
|
|
257
|
+
bucket.logging_target_prefix = ""
|
|
258
|
+
else:
|
|
259
|
+
bucket.logging_enabled = False
|
|
260
|
+
bucket.logging_target_bucket = ""
|
|
261
|
+
bucket.logging_target_prefix = ""
|
|
262
|
+
else:
|
|
263
|
+
bucket.logging_enabled = False
|
|
264
|
+
bucket.logging_target_bucket = ""
|
|
265
|
+
bucket.logging_target_prefix = ""
|
|
266
|
+
|
|
267
|
+
except Exception as error:
|
|
268
|
+
logger.error(
|
|
269
|
+
f"{bucket.region} -- {error.__class__.__name__}[{error.__traceback__.tb_lineno}]: {error}"
|
|
270
|
+
)
|
|
271
|
+
|
|
272
|
+
@staticmethod
|
|
273
|
+
def _normalize_bucket_region(bucket_location: str) -> str:
|
|
274
|
+
"""Normalize OSS bucket location values to region IDs."""
|
|
275
|
+
if not bucket_location:
|
|
276
|
+
return ""
|
|
277
|
+
|
|
278
|
+
normalized_location = bucket_location.lower()
|
|
279
|
+
|
|
280
|
+
# Remove protocol/hostname suffix if an endpoint was returned
|
|
281
|
+
if ".aliyuncs.com" in normalized_location:
|
|
282
|
+
normalized_location = normalized_location.split(".aliyuncs.com")[0]
|
|
283
|
+
|
|
284
|
+
# Strip leading OSS prefix (e.g., oss-ap-southeast-1 -> ap-southeast-1)
|
|
285
|
+
if normalized_location.startswith("oss-"):
|
|
286
|
+
normalized_location = normalized_location.replace("oss-", "", 1)
|
|
287
|
+
|
|
288
|
+
return normalized_location
|
|
289
|
+
|
|
290
|
+
@staticmethod
|
|
291
|
+
def _parse_creation_date(creation_date_str: Optional[str]) -> Optional[datetime]:
|
|
292
|
+
"""Parse OSS bucket creation date strings into datetime objects."""
|
|
293
|
+
if not creation_date_str:
|
|
294
|
+
return None
|
|
295
|
+
|
|
296
|
+
for date_format in ("%Y-%m-%dT%H:%M:%S.%f%z", "%Y-%m-%dT%H:%M:%S%z"):
|
|
297
|
+
try:
|
|
298
|
+
return datetime.strptime(
|
|
299
|
+
creation_date_str.replace("Z", "+00:00"), date_format
|
|
300
|
+
)
|
|
301
|
+
except (ValueError, AttributeError):
|
|
302
|
+
continue
|
|
303
|
+
return None
|
|
304
|
+
|
|
305
|
+
|
|
306
|
+
class Bucket(BaseModel):
|
|
307
|
+
"""OSS Bucket model."""
|
|
308
|
+
|
|
309
|
+
arn: str
|
|
310
|
+
name: str
|
|
311
|
+
region: str
|
|
312
|
+
acl: Optional[str] = None # private, public-read, public-read-write
|
|
313
|
+
policy: dict = {}
|
|
314
|
+
logging_enabled: bool = False
|
|
315
|
+
logging_target_bucket: str = ""
|
|
316
|
+
logging_target_prefix: str = ""
|
|
317
|
+
creation_date: Optional[datetime] = None
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"Provider": "alibabacloud",
|
|
3
|
+
"CheckID": "ram_no_root_access_key",
|
|
4
|
+
"CheckTitle": "No root account access key exists",
|
|
5
|
+
"CheckType": [
|
|
6
|
+
"Unusual logon",
|
|
7
|
+
"Cloud threat detection"
|
|
8
|
+
],
|
|
9
|
+
"ServiceName": "ram",
|
|
10
|
+
"SubServiceName": "",
|
|
11
|
+
"ResourceIdTemplate": "acs:ram::account-id:root",
|
|
12
|
+
"Severity": "critical",
|
|
13
|
+
"ResourceType": "AlibabaCloudRAMAccessKey",
|
|
14
|
+
"Description": "Ensure no **root account access key** exists. Access keys provide programmatic access to a given Alibaba Cloud account.\n\nIt is recommended that all access keys associated with the root account be removed.",
|
|
15
|
+
"Risk": "The **root account** is the most privileged user in an Alibaba Cloud account. Access Keys provide programmatic access to a given Alibaba Cloud account.\n\nRemoving access keys associated with the root account limits vectors by which the account can be compromised and encourages the creation and use of **role-based accounts** that are least privileged.",
|
|
16
|
+
"RelatedUrl": "",
|
|
17
|
+
"AdditionalURLs": [
|
|
18
|
+
"https://www.alibabacloud.com/help/doc-detail/102600.htm",
|
|
19
|
+
"https://www.trendmicro.com/cloudoneconformity/knowledge-base/alibaba-cloud/AlibabaCloud-RAM/remove-root-access-keys.html"
|
|
20
|
+
],
|
|
21
|
+
"Remediation": {
|
|
22
|
+
"Code": {
|
|
23
|
+
"CLI": "aliyun ram DeleteAccessKey --UserAccessKeyId <access_key_ID>",
|
|
24
|
+
"NativeIaC": "",
|
|
25
|
+
"Other": "",
|
|
26
|
+
"Terraform": ""
|
|
27
|
+
},
|
|
28
|
+
"Recommendation": {
|
|
29
|
+
"Text": "1. Log on to the **RAM Console** by using your Alibaba Cloud account (root account)\n2. Move the pointer over the account icon in the upper-right corner and click **AccessKey**\n3. Click **Continue to manage AccessKey**\n4. On the Security Management page, find the target access keys and click **Delete** to delete the target access keys permanently",
|
|
30
|
+
"Url": "https://hub.prowler.com/check/ram_no_root_access_key"
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
"Categories": [
|
|
34
|
+
"internet-exposed"
|
|
35
|
+
],
|
|
36
|
+
"DependsOn": [],
|
|
37
|
+
"RelatedTo": [],
|
|
38
|
+
"Notes": ""
|
|
39
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
from prowler.lib.check.models import Check, CheckReportAlibabaCloud
|
|
2
|
+
from prowler.providers.alibabacloud.services.ram.ram_client import ram_client
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class ram_no_root_access_key(Check):
|
|
6
|
+
"""Check if root account has no access keys."""
|
|
7
|
+
|
|
8
|
+
def execute(self) -> list[CheckReportAlibabaCloud]:
|
|
9
|
+
findings = []
|
|
10
|
+
|
|
11
|
+
report = CheckReportAlibabaCloud(metadata=self.metadata(), resource={})
|
|
12
|
+
report.region = ram_client.region
|
|
13
|
+
report.resource_id = "<root_account>"
|
|
14
|
+
report.resource_arn = f"acs:ram::{ram_client.audited_account}:root"
|
|
15
|
+
|
|
16
|
+
# Check if we're authenticated as root account
|
|
17
|
+
# Use the is_root flag from identity (set via STS GetCallerIdentity)
|
|
18
|
+
is_root = ram_client.provider.identity.is_root
|
|
19
|
+
|
|
20
|
+
if not is_root:
|
|
21
|
+
# If authenticated as RAM user, we can't verify root account access keys
|
|
22
|
+
report.status = "MANUAL"
|
|
23
|
+
report.status_extended = "Cannot verify root account access keys: authenticated as RAM user. This check requires root account credentials."
|
|
24
|
+
elif ram_client.root_access_keys:
|
|
25
|
+
report.status = "FAIL"
|
|
26
|
+
report.status_extended = "Root account has access keys."
|
|
27
|
+
else:
|
|
28
|
+
report.status = "PASS"
|
|
29
|
+
report.status_extended = "Root account does not have access keys."
|
|
30
|
+
|
|
31
|
+
findings.append(report)
|
|
32
|
+
|
|
33
|
+
return findings
|
|
File without changes
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"Provider": "alibabacloud",
|
|
3
|
+
"CheckID": "ram_password_policy_lowercase",
|
|
4
|
+
"CheckTitle": "RAM password policy requires at least one lowercase letter",
|
|
5
|
+
"CheckType": [
|
|
6
|
+
"Unusual logon",
|
|
7
|
+
"Abnormal account"
|
|
8
|
+
],
|
|
9
|
+
"ServiceName": "ram",
|
|
10
|
+
"SubServiceName": "",
|
|
11
|
+
"ResourceIdTemplate": "acs:ram::account-id:password-policy",
|
|
12
|
+
"Severity": "medium",
|
|
13
|
+
"ResourceType": "AlibabaCloudRAMPasswordPolicy",
|
|
14
|
+
"Description": "**RAM password policies** can be used to ensure password complexity.\n\nIt is recommended that the password policy require at least one **lowercase letter**.",
|
|
15
|
+
"Risk": "Enhancing complexity of a password policy increases account resiliency against **brute force logon attempts**.\n\nWeak passwords without character variety are more susceptible to dictionary attacks and automated password cracking tools.",
|
|
16
|
+
"RelatedUrl": "",
|
|
17
|
+
"AdditionalURLs": [
|
|
18
|
+
"https://www.alibabacloud.com/help/doc-detail/116413.htm",
|
|
19
|
+
"https://www.trendmicro.com/cloudoneconformity/knowledge-base/alibaba-cloud/AlibabaCloud-RAM/lowercase-letter-password-policy.html"
|
|
20
|
+
],
|
|
21
|
+
"Remediation": {
|
|
22
|
+
"Code": {
|
|
23
|
+
"CLI": "aliyun ram SetPasswordPolicy --RequireLowercaseCharacters true",
|
|
24
|
+
"NativeIaC": "",
|
|
25
|
+
"Other": "",
|
|
26
|
+
"Terraform": "resource \"alicloud_ram_password_policy\" \"example\" {\n require_lowercase_characters = true\n}"
|
|
27
|
+
},
|
|
28
|
+
"Recommendation": {
|
|
29
|
+
"Text": "1. Log on to the **RAM Console**\n2. Choose **Settings**\n3. In the Password section, click **Modify**\n4. In the Charset section, select **Lower case**\n5. Click **OK**",
|
|
30
|
+
"Url": "https://hub.prowler.com/check/ram_password_policy_lowercase"
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
"Categories": [
|
|
34
|
+
"secrets"
|
|
35
|
+
],
|
|
36
|
+
"DependsOn": [],
|
|
37
|
+
"RelatedTo": [],
|
|
38
|
+
"Notes": ""
|
|
39
|
+
}
|