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,478 @@
|
|
|
1
|
+
import json
|
|
2
|
+
from datetime import datetime
|
|
3
|
+
from typing import Optional
|
|
4
|
+
|
|
5
|
+
from alibabacloud_ram20150501 import models as ram_models
|
|
6
|
+
from pydantic.v1 import BaseModel
|
|
7
|
+
|
|
8
|
+
from prowler.lib.logger import logger
|
|
9
|
+
from prowler.lib.scan_filters.scan_filters import is_resource_filtered
|
|
10
|
+
from prowler.providers.alibabacloud.lib.service.service import AlibabaCloudService
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class RAM(AlibabaCloudService):
|
|
14
|
+
"""
|
|
15
|
+
RAM (Resource Access Management) service class for Alibaba Cloud.
|
|
16
|
+
|
|
17
|
+
This class provides methods to interact with Alibaba Cloud RAM service
|
|
18
|
+
to retrieve users, access keys, MFA devices, password policies, etc.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
def __init__(self, provider):
|
|
22
|
+
# Call AlibabaCloudService's __init__
|
|
23
|
+
super().__init__(__class__.__name__, provider, global_service=True)
|
|
24
|
+
|
|
25
|
+
# Fetch RAM resources
|
|
26
|
+
self.users = self._list_users()
|
|
27
|
+
self.password_policy = self._get_password_policy()
|
|
28
|
+
self.mfa_devices = self._list_virtual_mfa_devices()
|
|
29
|
+
self.groups = self._list_groups()
|
|
30
|
+
self.policies = self._list_policies()
|
|
31
|
+
|
|
32
|
+
# Enrich users with additional information
|
|
33
|
+
self._get_user_mfa_devices()
|
|
34
|
+
self._get_user_access_keys()
|
|
35
|
+
self._get_user_login_profile()
|
|
36
|
+
self._list_policies_for_user()
|
|
37
|
+
self._list_groups_for_user()
|
|
38
|
+
|
|
39
|
+
# Get root account access keys
|
|
40
|
+
self.root_access_keys = self._get_root_access_keys()
|
|
41
|
+
|
|
42
|
+
# Get policy documents
|
|
43
|
+
self._get_policy_documents()
|
|
44
|
+
|
|
45
|
+
def _list_users(self):
|
|
46
|
+
"""List all RAM users."""
|
|
47
|
+
logger.info("RAM - Listing Users...")
|
|
48
|
+
users = []
|
|
49
|
+
|
|
50
|
+
try:
|
|
51
|
+
request = ram_models.ListUsersRequest()
|
|
52
|
+
response = self.client.list_users(request)
|
|
53
|
+
|
|
54
|
+
if response and response.body and response.body.users:
|
|
55
|
+
for user_data in response.body.users.user:
|
|
56
|
+
if not self.audit_resources or is_resource_filtered(
|
|
57
|
+
user_data.user_name, self.audit_resources
|
|
58
|
+
):
|
|
59
|
+
users.append(
|
|
60
|
+
User(
|
|
61
|
+
name=user_data.user_name,
|
|
62
|
+
user_id=user_data.user_id,
|
|
63
|
+
display_name=getattr(user_data, "display_name", ""),
|
|
64
|
+
create_date=getattr(user_data, "create_date", None),
|
|
65
|
+
update_date=getattr(user_data, "update_date", None),
|
|
66
|
+
)
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
except Exception as error:
|
|
70
|
+
logger.error(
|
|
71
|
+
f"{error.__class__.__name__}[{error.__traceback__.tb_lineno}]: {error}"
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
return users
|
|
75
|
+
|
|
76
|
+
def _get_password_policy(self):
|
|
77
|
+
"""Get password policy settings."""
|
|
78
|
+
logger.info("RAM - Getting Password Policy...")
|
|
79
|
+
|
|
80
|
+
try:
|
|
81
|
+
response = self.client.get_password_policy()
|
|
82
|
+
|
|
83
|
+
if response and response.body and response.body.password_policy:
|
|
84
|
+
policy = response.body.password_policy
|
|
85
|
+
return PasswordPolicy(
|
|
86
|
+
minimum_password_length=getattr(
|
|
87
|
+
policy, "minimum_password_length", 8
|
|
88
|
+
),
|
|
89
|
+
require_lowercase_characters=getattr(
|
|
90
|
+
policy, "require_lowercase_characters", False
|
|
91
|
+
),
|
|
92
|
+
require_uppercase_characters=getattr(
|
|
93
|
+
policy, "require_uppercase_characters", False
|
|
94
|
+
),
|
|
95
|
+
require_numbers=getattr(policy, "require_numbers", False),
|
|
96
|
+
require_symbols=getattr(policy, "require_symbols", False),
|
|
97
|
+
hard_expiry=getattr(policy, "hard_expiry", False),
|
|
98
|
+
max_password_age=getattr(policy, "max_password_age", 0),
|
|
99
|
+
password_reuse_prevention=getattr(
|
|
100
|
+
policy, "password_reuse_prevention", 0
|
|
101
|
+
),
|
|
102
|
+
max_login_attempts=getattr(policy, "max_login_attemps", 0),
|
|
103
|
+
)
|
|
104
|
+
return None
|
|
105
|
+
|
|
106
|
+
except Exception as error:
|
|
107
|
+
logger.error(
|
|
108
|
+
f"{error.__class__.__name__}[{error.__traceback__.tb_lineno}]: {error}"
|
|
109
|
+
)
|
|
110
|
+
return None
|
|
111
|
+
|
|
112
|
+
def _list_virtual_mfa_devices(self):
|
|
113
|
+
"""List all virtual MFA devices."""
|
|
114
|
+
logger.info("RAM - Listing Virtual MFA Devices...")
|
|
115
|
+
mfa_devices = []
|
|
116
|
+
|
|
117
|
+
try:
|
|
118
|
+
response = self.client.list_virtual_mfadevices()
|
|
119
|
+
|
|
120
|
+
if response and response.body and response.body.virtual_mfadevices:
|
|
121
|
+
for device in response.body.virtual_mfadevices.virtual_mfadevice:
|
|
122
|
+
mfa_devices.append(
|
|
123
|
+
MFADevice(
|
|
124
|
+
serial_number=device.serial_number,
|
|
125
|
+
user_name=(
|
|
126
|
+
getattr(device, "user", {}).get("user_name", "")
|
|
127
|
+
if hasattr(device, "user")
|
|
128
|
+
else ""
|
|
129
|
+
),
|
|
130
|
+
enable_date=getattr(device, "activate_date", None),
|
|
131
|
+
)
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
except Exception as error:
|
|
135
|
+
logger.error(
|
|
136
|
+
f"{error.__class__.__name__}[{error.__traceback__.tb_lineno}]: {error}"
|
|
137
|
+
)
|
|
138
|
+
|
|
139
|
+
return mfa_devices
|
|
140
|
+
|
|
141
|
+
def _list_groups(self):
|
|
142
|
+
"""List all RAM groups."""
|
|
143
|
+
logger.info("RAM - Listing Groups...")
|
|
144
|
+
groups = []
|
|
145
|
+
|
|
146
|
+
try:
|
|
147
|
+
request = ram_models.ListGroupsRequest()
|
|
148
|
+
response = self.client.list_groups(request)
|
|
149
|
+
|
|
150
|
+
if response and response.body and response.body.groups:
|
|
151
|
+
for group_data in response.body.groups.group:
|
|
152
|
+
groups.append(
|
|
153
|
+
Group(
|
|
154
|
+
name=group_data.group_name,
|
|
155
|
+
group_id=getattr(group_data, "group_id", ""),
|
|
156
|
+
create_date=getattr(group_data, "create_date", None),
|
|
157
|
+
)
|
|
158
|
+
)
|
|
159
|
+
|
|
160
|
+
except Exception as error:
|
|
161
|
+
logger.error(
|
|
162
|
+
f"{error.__class__.__name__}[{error.__traceback__.tb_lineno}]: {error}"
|
|
163
|
+
)
|
|
164
|
+
|
|
165
|
+
return groups
|
|
166
|
+
|
|
167
|
+
def _list_policies(self):
|
|
168
|
+
"""List all RAM policies."""
|
|
169
|
+
logger.info("RAM - Listing Policies...")
|
|
170
|
+
policies = {}
|
|
171
|
+
|
|
172
|
+
try:
|
|
173
|
+
# List custom policies
|
|
174
|
+
request = ram_models.ListPoliciesRequest(policy_type="Custom")
|
|
175
|
+
response = self.client.list_policies(request)
|
|
176
|
+
|
|
177
|
+
if response and response.body and response.body.policies:
|
|
178
|
+
for policy_data in response.body.policies.policy:
|
|
179
|
+
policy_name = policy_data.policy_name
|
|
180
|
+
policies[policy_name] = Policy(
|
|
181
|
+
name=policy_name,
|
|
182
|
+
policy_type="Custom",
|
|
183
|
+
description=getattr(policy_data, "description", ""),
|
|
184
|
+
create_date=getattr(policy_data, "create_date", None),
|
|
185
|
+
update_date=getattr(policy_data, "update_date", None),
|
|
186
|
+
attachment_count=getattr(policy_data, "attachment_count", 0),
|
|
187
|
+
)
|
|
188
|
+
|
|
189
|
+
except Exception as error:
|
|
190
|
+
logger.error(
|
|
191
|
+
f"{error.__class__.__name__}[{error.__traceback__.tb_lineno}]: {error}"
|
|
192
|
+
)
|
|
193
|
+
|
|
194
|
+
return policies
|
|
195
|
+
|
|
196
|
+
def _get_policy_documents(self):
|
|
197
|
+
"""Get policy documents for all custom policies."""
|
|
198
|
+
logger.info("RAM - Getting Policy Documents...")
|
|
199
|
+
|
|
200
|
+
for policy_name, policy in self.policies.items():
|
|
201
|
+
if policy.policy_type == "Custom":
|
|
202
|
+
try:
|
|
203
|
+
request = ram_models.GetPolicyRequest(
|
|
204
|
+
policy_name=policy_name, policy_type="Custom"
|
|
205
|
+
)
|
|
206
|
+
response = self.client.get_policy(request)
|
|
207
|
+
|
|
208
|
+
if response and response.body and response.body.policy:
|
|
209
|
+
policy_data = response.body.policy
|
|
210
|
+
# Get the default policy version
|
|
211
|
+
default_version = getattr(policy_data, "default_version", None)
|
|
212
|
+
if default_version:
|
|
213
|
+
# Get the policy version document
|
|
214
|
+
version_request = ram_models.GetPolicyVersionRequest(
|
|
215
|
+
policy_name=policy_name,
|
|
216
|
+
policy_type="Custom",
|
|
217
|
+
version_id=default_version,
|
|
218
|
+
)
|
|
219
|
+
version_response = self.client.get_policy_version(
|
|
220
|
+
version_request
|
|
221
|
+
)
|
|
222
|
+
if (
|
|
223
|
+
version_response
|
|
224
|
+
and version_response.body
|
|
225
|
+
and version_response.body.policy_version
|
|
226
|
+
):
|
|
227
|
+
policy_doc_str = getattr(
|
|
228
|
+
version_response.body.policy_version,
|
|
229
|
+
"policy_document",
|
|
230
|
+
None,
|
|
231
|
+
)
|
|
232
|
+
if policy_doc_str:
|
|
233
|
+
try:
|
|
234
|
+
policy.document = json.loads(policy_doc_str)
|
|
235
|
+
except json.JSONDecodeError:
|
|
236
|
+
logger.warning(
|
|
237
|
+
f"Could not parse policy document for {policy_name}"
|
|
238
|
+
)
|
|
239
|
+
policy.document = None
|
|
240
|
+
except Exception as error:
|
|
241
|
+
logger.error(
|
|
242
|
+
f"{error.__class__.__name__}[{error.__traceback__.tb_lineno}]: {error}"
|
|
243
|
+
)
|
|
244
|
+
policy.document = None
|
|
245
|
+
|
|
246
|
+
def _get_user_mfa_devices(self):
|
|
247
|
+
"""Get MFA devices for each user."""
|
|
248
|
+
logger.info("RAM - Getting User MFA Devices...")
|
|
249
|
+
|
|
250
|
+
for user in self.users:
|
|
251
|
+
user.mfa_devices = []
|
|
252
|
+
for device in self.mfa_devices:
|
|
253
|
+
if device.user_name == user.name:
|
|
254
|
+
user.mfa_devices.append(device)
|
|
255
|
+
|
|
256
|
+
def _get_user_access_keys(self):
|
|
257
|
+
"""Get access keys for each user."""
|
|
258
|
+
logger.info("RAM - Getting User Access Keys...")
|
|
259
|
+
|
|
260
|
+
for user in self.users:
|
|
261
|
+
try:
|
|
262
|
+
request = ram_models.ListAccessKeysRequest(user_name=user.name)
|
|
263
|
+
response = self.client.list_access_keys(request)
|
|
264
|
+
|
|
265
|
+
user.access_keys = []
|
|
266
|
+
if response and response.body and response.body.access_keys:
|
|
267
|
+
for key_data in response.body.access_keys.access_key:
|
|
268
|
+
user.access_keys.append(
|
|
269
|
+
AccessKey(
|
|
270
|
+
access_key_id=key_data.access_key_id,
|
|
271
|
+
status=key_data.status,
|
|
272
|
+
create_date=getattr(key_data, "create_date", None),
|
|
273
|
+
)
|
|
274
|
+
)
|
|
275
|
+
except Exception as error:
|
|
276
|
+
logger.error(
|
|
277
|
+
f"{error.__class__.__name__}[{error.__traceback__.tb_lineno}]: {error}"
|
|
278
|
+
)
|
|
279
|
+
user.access_keys = []
|
|
280
|
+
|
|
281
|
+
def _get_user_login_profile(self):
|
|
282
|
+
"""Get login profile for each user to check console access."""
|
|
283
|
+
logger.info("RAM - Getting User Login Profiles...")
|
|
284
|
+
|
|
285
|
+
for user in self.users:
|
|
286
|
+
try:
|
|
287
|
+
request = ram_models.GetLoginProfileRequest(user_name=user.name)
|
|
288
|
+
response = self.client.get_login_profile(request)
|
|
289
|
+
|
|
290
|
+
if response and response.body and response.body.login_profile:
|
|
291
|
+
profile = response.body.login_profile
|
|
292
|
+
user.has_console_access = True
|
|
293
|
+
user.password_last_used = getattr(
|
|
294
|
+
profile, "password_last_used", None
|
|
295
|
+
)
|
|
296
|
+
user.mfa_bind_required = getattr(profile, "mfabind_required", False)
|
|
297
|
+
|
|
298
|
+
except Exception:
|
|
299
|
+
# User doesn't have console access
|
|
300
|
+
user.has_console_access = False
|
|
301
|
+
user.password_last_used = None
|
|
302
|
+
user.mfa_bind_required = False
|
|
303
|
+
|
|
304
|
+
def _list_policies_for_user(self):
|
|
305
|
+
"""List policies attached to each user."""
|
|
306
|
+
logger.info("RAM - Listing Policies for Users...")
|
|
307
|
+
|
|
308
|
+
for user in self.users:
|
|
309
|
+
try:
|
|
310
|
+
request = ram_models.ListPoliciesForUserRequest(user_name=user.name)
|
|
311
|
+
response = self.client.list_policies_for_user(request)
|
|
312
|
+
|
|
313
|
+
user.attached_policies = []
|
|
314
|
+
if response and response.body and response.body.policies:
|
|
315
|
+
for policy_data in response.body.policies.policy:
|
|
316
|
+
user.attached_policies.append(
|
|
317
|
+
AttachedPolicy(
|
|
318
|
+
policy_name=policy_data.policy_name,
|
|
319
|
+
policy_type=policy_data.policy_type,
|
|
320
|
+
attach_date=getattr(policy_data, "attach_date", None),
|
|
321
|
+
)
|
|
322
|
+
)
|
|
323
|
+
|
|
324
|
+
except Exception as error:
|
|
325
|
+
logger.error(
|
|
326
|
+
f"{error.__class__.__name__}[{error.__traceback__.tb_lineno}]: {error}"
|
|
327
|
+
)
|
|
328
|
+
user.attached_policies = []
|
|
329
|
+
|
|
330
|
+
def _list_groups_for_user(self):
|
|
331
|
+
"""List groups for each user."""
|
|
332
|
+
logger.info("RAM - Listing Groups for Users...")
|
|
333
|
+
|
|
334
|
+
for user in self.users:
|
|
335
|
+
try:
|
|
336
|
+
request = ram_models.ListGroupsForUserRequest(user_name=user.name)
|
|
337
|
+
response = self.client.list_groups_for_user(request)
|
|
338
|
+
|
|
339
|
+
user.groups = []
|
|
340
|
+
if response and response.body and response.body.groups:
|
|
341
|
+
for group_data in response.body.groups.group:
|
|
342
|
+
user.groups.append(group_data.group_name)
|
|
343
|
+
|
|
344
|
+
except Exception as error:
|
|
345
|
+
logger.error(
|
|
346
|
+
f"{error.__class__.__name__}[{error.__traceback__.tb_lineno}]: {error}"
|
|
347
|
+
)
|
|
348
|
+
user.groups = []
|
|
349
|
+
|
|
350
|
+
def _get_root_access_keys(self):
|
|
351
|
+
"""Get root account access keys.
|
|
352
|
+
|
|
353
|
+
Note: This only works when authenticated as the root account.
|
|
354
|
+
If authenticated as a RAM user, this will return empty list as
|
|
355
|
+
RAM users cannot query root account access keys.
|
|
356
|
+
"""
|
|
357
|
+
logger.info("RAM - Getting Root Account Access Keys...")
|
|
358
|
+
root_access_keys = []
|
|
359
|
+
|
|
360
|
+
# Check if we're authenticated as root account
|
|
361
|
+
# Use the is_root flag from identity (set via STS GetCallerIdentity)
|
|
362
|
+
is_root = self.provider.identity.is_root
|
|
363
|
+
|
|
364
|
+
if not is_root:
|
|
365
|
+
# If we're authenticated as a RAM user, we can't query root account access keys
|
|
366
|
+
logger.warning(
|
|
367
|
+
"RAM - Cannot query root account access keys: authenticated as RAM user, not root account"
|
|
368
|
+
)
|
|
369
|
+
return root_access_keys
|
|
370
|
+
|
|
371
|
+
try:
|
|
372
|
+
# Call ListAccessKeys without user_name to get root account access keys
|
|
373
|
+
# This only works when called with root account credentials
|
|
374
|
+
request = ram_models.ListAccessKeysRequest()
|
|
375
|
+
response = self.client.list_access_keys(request)
|
|
376
|
+
|
|
377
|
+
if response and response.body and response.body.access_keys:
|
|
378
|
+
for key_data in response.body.access_keys.access_key:
|
|
379
|
+
root_access_keys.append(
|
|
380
|
+
AccessKey(
|
|
381
|
+
access_key_id=key_data.access_key_id,
|
|
382
|
+
status=key_data.status,
|
|
383
|
+
create_date=getattr(key_data, "create_date", None),
|
|
384
|
+
)
|
|
385
|
+
)
|
|
386
|
+
except Exception as error:
|
|
387
|
+
logger.error(
|
|
388
|
+
f"{error.__class__.__name__}[{error.__traceback__.tb_lineno}]: {error}"
|
|
389
|
+
)
|
|
390
|
+
|
|
391
|
+
return root_access_keys
|
|
392
|
+
|
|
393
|
+
|
|
394
|
+
# Models for RAM service
|
|
395
|
+
class User(BaseModel):
|
|
396
|
+
"""RAM User model."""
|
|
397
|
+
|
|
398
|
+
name: str
|
|
399
|
+
user_id: str
|
|
400
|
+
display_name: str = ""
|
|
401
|
+
create_date: Optional[datetime] = None
|
|
402
|
+
update_date: Optional[datetime] = None
|
|
403
|
+
has_console_access: bool = False
|
|
404
|
+
password_last_used: Optional[datetime] = None
|
|
405
|
+
mfa_bind_required: bool = False
|
|
406
|
+
mfa_devices: list = []
|
|
407
|
+
access_keys: list = []
|
|
408
|
+
attached_policies: list = []
|
|
409
|
+
groups: list = []
|
|
410
|
+
|
|
411
|
+
|
|
412
|
+
class AccessKey(BaseModel):
|
|
413
|
+
"""Access Key model."""
|
|
414
|
+
|
|
415
|
+
access_key_id: str
|
|
416
|
+
status: str
|
|
417
|
+
create_date: Optional[datetime] = None
|
|
418
|
+
|
|
419
|
+
|
|
420
|
+
class MFADevice(BaseModel):
|
|
421
|
+
"""MFA Device model."""
|
|
422
|
+
|
|
423
|
+
serial_number: str
|
|
424
|
+
user_name: str
|
|
425
|
+
enable_date: Optional[datetime] = None
|
|
426
|
+
|
|
427
|
+
|
|
428
|
+
class PasswordPolicy(BaseModel):
|
|
429
|
+
"""Password Policy model."""
|
|
430
|
+
|
|
431
|
+
minimum_password_length: int = 8
|
|
432
|
+
require_lowercase_characters: bool = False
|
|
433
|
+
require_uppercase_characters: bool = False
|
|
434
|
+
require_numbers: bool = False
|
|
435
|
+
require_symbols: bool = False
|
|
436
|
+
hard_expiry: bool = False
|
|
437
|
+
max_password_age: int = 0
|
|
438
|
+
password_reuse_prevention: int = 0
|
|
439
|
+
max_login_attempts: int = 0
|
|
440
|
+
|
|
441
|
+
|
|
442
|
+
class AccountSummary(BaseModel):
|
|
443
|
+
"""Account Summary model."""
|
|
444
|
+
|
|
445
|
+
users: int = 0
|
|
446
|
+
groups: int = 0
|
|
447
|
+
roles: int = 0
|
|
448
|
+
policies: int = 0
|
|
449
|
+
mfa_devices: int = 0
|
|
450
|
+
mfa_devices_in_use: int = 0
|
|
451
|
+
|
|
452
|
+
|
|
453
|
+
class Group(BaseModel):
|
|
454
|
+
"""RAM Group model."""
|
|
455
|
+
|
|
456
|
+
name: str
|
|
457
|
+
group_id: str
|
|
458
|
+
create_date: Optional[datetime] = None
|
|
459
|
+
|
|
460
|
+
|
|
461
|
+
class Policy(BaseModel):
|
|
462
|
+
"""RAM Policy model."""
|
|
463
|
+
|
|
464
|
+
name: str
|
|
465
|
+
policy_type: str
|
|
466
|
+
description: str = ""
|
|
467
|
+
create_date: Optional[datetime] = None
|
|
468
|
+
update_date: Optional[datetime] = None
|
|
469
|
+
attachment_count: int = 0
|
|
470
|
+
document: Optional[dict] = None
|
|
471
|
+
|
|
472
|
+
|
|
473
|
+
class AttachedPolicy(BaseModel):
|
|
474
|
+
"""Attached Policy model."""
|
|
475
|
+
|
|
476
|
+
policy_name: str
|
|
477
|
+
policy_type: str
|
|
478
|
+
attach_date: Optional[datetime] = None
|
|
File without changes
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"Provider": "alibabacloud",
|
|
3
|
+
"CheckID": "ram_user_console_access_unused",
|
|
4
|
+
"CheckTitle": "Users not logged on for 90 days or longer are disabled for console logon",
|
|
5
|
+
"CheckType": [
|
|
6
|
+
"Unusual logon",
|
|
7
|
+
"Abnormal account"
|
|
8
|
+
],
|
|
9
|
+
"ServiceName": "ram",
|
|
10
|
+
"SubServiceName": "",
|
|
11
|
+
"ResourceIdTemplate": "acs:ram::account-id:user/{user-name}",
|
|
12
|
+
"Severity": "medium",
|
|
13
|
+
"ResourceType": "AlibabaCloudRAMUser",
|
|
14
|
+
"Description": "Alibaba Cloud **RAM users** can log on to the Alibaba Cloud console by using their username and password.\n\nIf a user has not logged on for **90 days or longer**, it is recommended to disable the console access of the user.",
|
|
15
|
+
"Risk": "Disabling users from having unnecessary logon privileges will reduce the opportunity that an **abandoned user** or a user with **compromised password** to be exploited.\n\nInactive accounts are common targets for attackers attempting account takeover.",
|
|
16
|
+
"RelatedUrl": "",
|
|
17
|
+
"AdditionalURLs": [
|
|
18
|
+
"https://www.alibabacloud.com/help/doc-detail/116820.htm",
|
|
19
|
+
"https://www.trendmicro.com/cloudoneconformity/knowledge-base/alibaba-cloud/AlibabaCloud-RAM/inactive-ram-user.html"
|
|
20
|
+
],
|
|
21
|
+
"Remediation": {
|
|
22
|
+
"Code": {
|
|
23
|
+
"CLI": "aliyun ram DeleteLoginProfile --UserName <ram_user>",
|
|
24
|
+
"NativeIaC": "",
|
|
25
|
+
"Other": "",
|
|
26
|
+
"Terraform": ""
|
|
27
|
+
},
|
|
28
|
+
"Recommendation": {
|
|
29
|
+
"Text": "1. Log on to the **RAM Console**\n2. Choose **Identities** > **Users**\n3. In the User Logon Name/Display Name column, click the username of the target RAM user\n4. In the Console Logon Management section, click **Modify Logon Settings**\n5. In the Console Password Logon section, select **Disabled**\n6. Click **OK**",
|
|
30
|
+
"Url": "https://hub.prowler.com/check/ram_user_console_access_unused"
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
"Categories": [
|
|
34
|
+
"identity-access"
|
|
35
|
+
],
|
|
36
|
+
"DependsOn": [],
|
|
37
|
+
"RelatedTo": [],
|
|
38
|
+
"Notes": ""
|
|
39
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import datetime
|
|
2
|
+
|
|
3
|
+
from prowler.lib.check.models import Check, CheckReportAlibabaCloud
|
|
4
|
+
from prowler.providers.alibabacloud.services.ram.ram_client import ram_client
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class ram_user_console_access_unused(Check):
|
|
8
|
+
"""Check if RAM users with console access have logged in within the configured days."""
|
|
9
|
+
|
|
10
|
+
def execute(self) -> list[CheckReportAlibabaCloud]:
|
|
11
|
+
maximum_unused_days = ram_client.audit_config.get("max_console_access_days", 90)
|
|
12
|
+
findings = []
|
|
13
|
+
for user in ram_client.users:
|
|
14
|
+
report = CheckReportAlibabaCloud(metadata=self.metadata(), resource=user)
|
|
15
|
+
report.region = ram_client.region
|
|
16
|
+
report.resource_id = user.name
|
|
17
|
+
report.resource_arn = (
|
|
18
|
+
f"acs:ram::{ram_client.audited_account}:user/{user.name}"
|
|
19
|
+
)
|
|
20
|
+
if user.has_console_access:
|
|
21
|
+
if user.password_last_used:
|
|
22
|
+
time_since_insertion = (
|
|
23
|
+
datetime.datetime.now()
|
|
24
|
+
- datetime.datetime.strptime(
|
|
25
|
+
str(user.password_last_used), "%Y-%m-%d %H:%M:%S+00:00"
|
|
26
|
+
)
|
|
27
|
+
)
|
|
28
|
+
if time_since_insertion.days > maximum_unused_days:
|
|
29
|
+
report.status = "FAIL"
|
|
30
|
+
report.status_extended = (
|
|
31
|
+
f"RAM user {user.name} has not logged in to the console "
|
|
32
|
+
f"in the past {maximum_unused_days} days "
|
|
33
|
+
f"({time_since_insertion.days} days)."
|
|
34
|
+
)
|
|
35
|
+
else:
|
|
36
|
+
report.status = "PASS"
|
|
37
|
+
report.status_extended = (
|
|
38
|
+
f"RAM user {user.name} has logged in to the console "
|
|
39
|
+
f"in the past {maximum_unused_days} days "
|
|
40
|
+
f"({time_since_insertion.days} days)."
|
|
41
|
+
)
|
|
42
|
+
else:
|
|
43
|
+
# User has console access but has never logged in
|
|
44
|
+
report.status = "FAIL"
|
|
45
|
+
report.status_extended = (
|
|
46
|
+
f"RAM user {user.name} has console access enabled "
|
|
47
|
+
"but has never logged in to the console."
|
|
48
|
+
)
|
|
49
|
+
else:
|
|
50
|
+
report.status = "PASS"
|
|
51
|
+
report.status_extended = (
|
|
52
|
+
f"RAM user {user.name} does not have console access enabled."
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
findings.append(report)
|
|
56
|
+
return findings
|
|
File without changes
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"Provider": "alibabacloud",
|
|
3
|
+
"CheckID": "ram_user_mfa_enabled_console_access",
|
|
4
|
+
"CheckTitle": "Multi-factor authentication is enabled for all RAM users that have a console password",
|
|
5
|
+
"CheckType": [
|
|
6
|
+
"Unusual logon",
|
|
7
|
+
"Abnormal account"
|
|
8
|
+
],
|
|
9
|
+
"ServiceName": "ram",
|
|
10
|
+
"SubServiceName": "",
|
|
11
|
+
"ResourceIdTemplate": "acs:ram::account-id:user/{user-name}",
|
|
12
|
+
"Severity": "high",
|
|
13
|
+
"ResourceType": "AlibabaCloudRAMUser",
|
|
14
|
+
"Description": "**Multi-Factor Authentication (MFA)** adds an extra layer of protection on top of a username and password.\n\nWith MFA enabled, when a user logs on to Alibaba Cloud, they will be prompted for their username and password followed by an authentication code from their virtual MFA device. It is recommended that MFA be enabled for all users that have a console password.",
|
|
15
|
+
"Risk": "**MFA** requires users to verify their identities by entering two authentication factors. When MFA is enabled, an attacker faces at least two different authentication mechanisms.\n\nThe additional security makes it significantly harder for an attacker to gain access even if passwords are compromised.",
|
|
16
|
+
"RelatedUrl": "",
|
|
17
|
+
"AdditionalURLs": [
|
|
18
|
+
"https://www.alibabacloud.com/help/doc-detail/119555.htm",
|
|
19
|
+
"https://www.trendmicro.com/cloudoneconformity/knowledge-base/alibaba-cloud/AlibabaCloud-RAM/ram-user-multi-factor-authentication-enabled.html"
|
|
20
|
+
],
|
|
21
|
+
"Remediation": {
|
|
22
|
+
"Code": {
|
|
23
|
+
"CLI": "",
|
|
24
|
+
"NativeIaC": "",
|
|
25
|
+
"Other": "",
|
|
26
|
+
"Terraform": ""
|
|
27
|
+
},
|
|
28
|
+
"Recommendation": {
|
|
29
|
+
"Text": "1. Log on to the **RAM Console**\n2. For each user with console access, go to the user's details\n3. In the **Console Logon Management** section, click **Modify Logon Settings**\n4. For `Enable MFA`, select **Required**\n5. Click **OK** to save the settings",
|
|
30
|
+
"Url": "https://hub.prowler.com/check/ram_user_mfa_enabled_console_access"
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
"Categories": [
|
|
34
|
+
"encryption"
|
|
35
|
+
],
|
|
36
|
+
"DependsOn": [],
|
|
37
|
+
"RelatedTo": [],
|
|
38
|
+
"Notes": ""
|
|
39
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
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_user_mfa_enabled_console_access(Check):
|
|
6
|
+
"""Check if all RAM users with console access have MFA enabled."""
|
|
7
|
+
|
|
8
|
+
def execute(self) -> list[CheckReportAlibabaCloud]:
|
|
9
|
+
findings = []
|
|
10
|
+
|
|
11
|
+
for user in ram_client.users:
|
|
12
|
+
# Only check users with console access
|
|
13
|
+
if user.has_console_access:
|
|
14
|
+
report = CheckReportAlibabaCloud(
|
|
15
|
+
metadata=self.metadata(), resource=user
|
|
16
|
+
)
|
|
17
|
+
report.region = ram_client.region
|
|
18
|
+
report.resource_id = user.name
|
|
19
|
+
report.resource_arn = (
|
|
20
|
+
f"acs:ram::{ram_client.audited_account}:user/{user.name}"
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
# Check if MFA is required for console access
|
|
24
|
+
# mfa_bind_required indicates whether MFA is required in the login profile
|
|
25
|
+
if user.mfa_bind_required:
|
|
26
|
+
report.status = "PASS"
|
|
27
|
+
report.status_extended = (
|
|
28
|
+
f"RAM user {user.name} has MFA enabled for console access."
|
|
29
|
+
)
|
|
30
|
+
else:
|
|
31
|
+
report.status = "FAIL"
|
|
32
|
+
report.status_extended = f"RAM user {user.name} has console access but does not have MFA enabled."
|
|
33
|
+
|
|
34
|
+
findings.append(report)
|
|
35
|
+
|
|
36
|
+
return findings
|
|
File without changes
|
prowler/providers/alibabacloud/services/rds/rds_instance_no_public_access_whitelist/__init__.py
ADDED
|
File without changes
|