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,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"Provider": "alibabacloud",
|
|
3
|
+
"CheckID": "cs_kubernetes_rbac_enabled",
|
|
4
|
+
"CheckTitle": "Role-based access control (RBAC) authorization is Enabled on Kubernetes Engine Clusters",
|
|
5
|
+
"CheckType": [
|
|
6
|
+
"Threat detection during container runtime",
|
|
7
|
+
"Abnormal account"
|
|
8
|
+
],
|
|
9
|
+
"ServiceName": "cs",
|
|
10
|
+
"SubServiceName": "",
|
|
11
|
+
"ResourceIdTemplate": "acs:cs:region:account-id:cluster/{cluster-id}",
|
|
12
|
+
"Severity": "high",
|
|
13
|
+
"ResourceType": "AlibabaCloudKubernetesCluster",
|
|
14
|
+
"Description": "In Kubernetes, authorizers interact by granting a permission if any authorizer grants the permission. The legacy authorizer in Kubernetes Engine grants broad, statically defined permissions.\n\nTo ensure that **RBAC** limits permissions correctly, you must disable the legacy authorizer. RBAC has significant security advantages, helps ensure that users only have access to specific cluster resources within their own namespace, and is now stable in Kubernetes.",
|
|
15
|
+
"Risk": "In Kubernetes, **RBAC** is used to grant permissions to resources at the cluster and namespace level. RBAC allows you to define roles with rules containing a set of permissions.\n\nWithout RBAC, legacy authorization mechanisms like **ABAC** grant **overly broad permissions**, increasing the risk of unauthorized access and privilege escalation.",
|
|
16
|
+
"RelatedUrl": "",
|
|
17
|
+
"AdditionalURLs": [
|
|
18
|
+
"https://help.aliyun.com/document_detail/87656.html",
|
|
19
|
+
"https://help.aliyun.com/document_detail/119596.html",
|
|
20
|
+
"https://www.trendmicro.com/cloudoneconformity/knowledge-base/alibaba-cloud/AlibabaCloud-ACK/enable-rbac-authorization.html"
|
|
21
|
+
],
|
|
22
|
+
"Remediation": {
|
|
23
|
+
"Code": {
|
|
24
|
+
"CLI": "RBAC is enabled by default on new ACK clusters. Verify cluster authorization configuration.",
|
|
25
|
+
"NativeIaC": "",
|
|
26
|
+
"Other": "",
|
|
27
|
+
"Terraform": ""
|
|
28
|
+
},
|
|
29
|
+
"Recommendation": {
|
|
30
|
+
"Text": "1. Log on to the **ACK Console**\n2. Navigate to **Clusters** -> **Authorizations** page\n3. Select the target RAM sub-account and configure the RBAC roles on specific clusters or namespaces\n4. Ensure **RBAC** is enabled and legacy ABAC authorization is disabled",
|
|
31
|
+
"Url": "https://hub.prowler.com/check/cs_kubernetes_rbac_enabled"
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
"Categories": [
|
|
35
|
+
"identity-access"
|
|
36
|
+
],
|
|
37
|
+
"DependsOn": [],
|
|
38
|
+
"RelatedTo": [],
|
|
39
|
+
"Notes": ""
|
|
40
|
+
}
|
prowler/providers/alibabacloud/services/cs/cs_kubernetes_rbac_enabled/cs_kubernetes_rbac_enabled.py
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
from prowler.lib.check.models import Check, CheckReportAlibabaCloud
|
|
2
|
+
from prowler.providers.alibabacloud.services.cs.cs_client import cs_client
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class cs_kubernetes_rbac_enabled(Check):
|
|
6
|
+
"""Check if RBAC authorization is enabled on Kubernetes Engine Clusters."""
|
|
7
|
+
|
|
8
|
+
def execute(self) -> list[CheckReportAlibabaCloud]:
|
|
9
|
+
findings = []
|
|
10
|
+
|
|
11
|
+
for cluster in cs_client.clusters:
|
|
12
|
+
report = CheckReportAlibabaCloud(metadata=self.metadata(), resource=cluster)
|
|
13
|
+
report.region = cluster.region
|
|
14
|
+
report.resource_id = cluster.id
|
|
15
|
+
report.resource_arn = f"acs:cs:{cluster.region}:{cs_client.audited_account}:cluster/{cluster.id}"
|
|
16
|
+
|
|
17
|
+
if cluster.rbac_enabled:
|
|
18
|
+
report.status = "PASS"
|
|
19
|
+
report.status_extended = (
|
|
20
|
+
f"Kubernetes cluster {cluster.name} has RBAC authorization enabled."
|
|
21
|
+
)
|
|
22
|
+
else:
|
|
23
|
+
report.status = "FAIL"
|
|
24
|
+
report.status_extended = f"Kubernetes cluster {cluster.name} does not have RBAC authorization enabled or is using legacy ABAC authorization."
|
|
25
|
+
|
|
26
|
+
findings.append(report)
|
|
27
|
+
|
|
28
|
+
return findings
|
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
from datetime import datetime
|
|
2
|
+
from typing import Optional
|
|
3
|
+
|
|
4
|
+
from alibabacloud_cs20151215 import models as cs_models
|
|
5
|
+
from pydantic.v1 import BaseModel
|
|
6
|
+
|
|
7
|
+
from prowler.lib.logger import logger
|
|
8
|
+
from prowler.lib.scan_filters.scan_filters import is_resource_filtered
|
|
9
|
+
from prowler.providers.alibabacloud.lib.service.service import AlibabaCloudService
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class CS(AlibabaCloudService):
|
|
13
|
+
"""
|
|
14
|
+
CS (Container Service) class for Alibaba Cloud Kubernetes (ACK).
|
|
15
|
+
|
|
16
|
+
This class provides methods to interact with Alibaba Cloud Container Service
|
|
17
|
+
to retrieve ACK clusters and their configurations.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
def __init__(self, provider):
|
|
21
|
+
# Call AlibabaCloudService's __init__
|
|
22
|
+
super().__init__(__class__.__name__, provider, global_service=False)
|
|
23
|
+
|
|
24
|
+
# Fetch CS resources
|
|
25
|
+
self.clusters = []
|
|
26
|
+
self.__threading_call__(self._describe_clusters)
|
|
27
|
+
|
|
28
|
+
def _describe_clusters(self, regional_client):
|
|
29
|
+
"""List all ACK clusters and fetch their details in a specific region."""
|
|
30
|
+
region = getattr(regional_client, "region", "unknown")
|
|
31
|
+
logger.info(f"CS - Describing Kubernetes clusters in {region}...")
|
|
32
|
+
|
|
33
|
+
try:
|
|
34
|
+
# DescribeClustersV1 returns cluster list
|
|
35
|
+
request = cs_models.DescribeClustersV1Request()
|
|
36
|
+
response = regional_client.describe_clusters_v1(request)
|
|
37
|
+
|
|
38
|
+
if response and response.body and response.body.clusters:
|
|
39
|
+
for cluster_data in response.body.clusters:
|
|
40
|
+
cluster_id = getattr(cluster_data, "cluster_id", "")
|
|
41
|
+
|
|
42
|
+
if not self.audit_resources or is_resource_filtered(
|
|
43
|
+
cluster_id, self.audit_resources
|
|
44
|
+
):
|
|
45
|
+
# Get detailed information for each cluster
|
|
46
|
+
cluster_detail = self._get_cluster_detail(
|
|
47
|
+
regional_client, cluster_id
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
if cluster_detail:
|
|
51
|
+
# Extract audit project name from meta_data
|
|
52
|
+
meta_data = cluster_detail.get("meta_data", {})
|
|
53
|
+
audit_project_name = meta_data.get("AuditProjectName", "")
|
|
54
|
+
|
|
55
|
+
# Check RBAC status - by default RBAC is enabled on ACK clusters
|
|
56
|
+
# We check if there are any indicators that RBAC is disabled
|
|
57
|
+
rbac_enabled = self._check_rbac_enabled(
|
|
58
|
+
cluster_detail, region
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
# Get node pools to check CloudMonitor
|
|
62
|
+
cloudmonitor_enabled = self._check_cloudmonitor_enabled(
|
|
63
|
+
regional_client, cluster_id
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
# Check if cluster checks have been run in the last week
|
|
67
|
+
last_check_time = self._get_last_cluster_check(
|
|
68
|
+
regional_client, cluster_id
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
# Check addons for dashboard, network policy, etc.
|
|
72
|
+
addons_status = self._check_cluster_addons(
|
|
73
|
+
cluster_detail, region
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
# Check for public API server endpoint
|
|
77
|
+
public_access_enabled = self._check_public_access(
|
|
78
|
+
cluster_detail, region
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
self.clusters.append(
|
|
82
|
+
Cluster(
|
|
83
|
+
id=cluster_id,
|
|
84
|
+
name=getattr(cluster_data, "name", cluster_id),
|
|
85
|
+
region=region,
|
|
86
|
+
cluster_type=getattr(
|
|
87
|
+
cluster_data, "cluster_type", ""
|
|
88
|
+
),
|
|
89
|
+
state=getattr(cluster_data, "state", ""),
|
|
90
|
+
audit_project_name=audit_project_name,
|
|
91
|
+
log_service_enabled=bool(audit_project_name),
|
|
92
|
+
cloudmonitor_enabled=cloudmonitor_enabled,
|
|
93
|
+
rbac_enabled=rbac_enabled,
|
|
94
|
+
last_check_time=last_check_time,
|
|
95
|
+
dashboard_enabled=addons_status[
|
|
96
|
+
"dashboard_enabled"
|
|
97
|
+
],
|
|
98
|
+
network_policy_enabled=addons_status[
|
|
99
|
+
"network_policy_enabled"
|
|
100
|
+
],
|
|
101
|
+
eni_multiple_ip_enabled=addons_status[
|
|
102
|
+
"eni_multiple_ip_enabled"
|
|
103
|
+
],
|
|
104
|
+
private_cluster_enabled=not public_access_enabled,
|
|
105
|
+
)
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
except Exception as error:
|
|
109
|
+
logger.error(
|
|
110
|
+
f"{regional_client.region} -- {error.__class__.__name__}[{error.__traceback__.tb_lineno}]: {error}"
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
def _get_cluster_detail(self, regional_client, cluster_id: str) -> dict:
|
|
114
|
+
"""Get detailed information for a specific cluster."""
|
|
115
|
+
try:
|
|
116
|
+
# DescribeClusterDetail returns detailed cluster information
|
|
117
|
+
request = cs_models.DescribeClusterDetailRequest()
|
|
118
|
+
response = regional_client.describe_cluster_detail(cluster_id, request)
|
|
119
|
+
|
|
120
|
+
if response and response.body:
|
|
121
|
+
# Convert response body to dict
|
|
122
|
+
body = response.body
|
|
123
|
+
result = {"meta_data": {}}
|
|
124
|
+
|
|
125
|
+
# Check if meta_data exists in the response
|
|
126
|
+
if hasattr(body, "meta_data"):
|
|
127
|
+
meta_data = body.meta_data
|
|
128
|
+
if meta_data:
|
|
129
|
+
result["meta_data"] = dict(meta_data)
|
|
130
|
+
|
|
131
|
+
return result
|
|
132
|
+
|
|
133
|
+
return {}
|
|
134
|
+
|
|
135
|
+
except Exception as error:
|
|
136
|
+
logger.error(
|
|
137
|
+
f"{regional_client.region} -- {error.__class__.__name__}[{error.__traceback__.tb_lineno}]: {error}"
|
|
138
|
+
)
|
|
139
|
+
return {}
|
|
140
|
+
|
|
141
|
+
def _check_cloudmonitor_enabled(self, regional_client, cluster_id: str) -> bool:
|
|
142
|
+
"""Check if CloudMonitor is enabled on cluster node pools."""
|
|
143
|
+
try:
|
|
144
|
+
# DescribeClusterNodePools returns node pool information
|
|
145
|
+
request = cs_models.DescribeClusterNodePoolsRequest()
|
|
146
|
+
response = regional_client.describe_cluster_node_pools(cluster_id, request)
|
|
147
|
+
|
|
148
|
+
if response and response.body and response.body.nodepools:
|
|
149
|
+
nodepools = response.body.nodepools
|
|
150
|
+
|
|
151
|
+
# Check if ALL node pools have CloudMonitor enabled
|
|
152
|
+
# If any node pool has cms_enabled=false, the cluster fails
|
|
153
|
+
for nodepool in nodepools:
|
|
154
|
+
kubernetes_config = getattr(nodepool, "kubernetes_config", None)
|
|
155
|
+
if kubernetes_config:
|
|
156
|
+
cms_enabled = getattr(kubernetes_config, "cms_enabled", False)
|
|
157
|
+
if not cms_enabled:
|
|
158
|
+
return False
|
|
159
|
+
|
|
160
|
+
# All node pools have CloudMonitor enabled
|
|
161
|
+
return True if nodepools else False
|
|
162
|
+
|
|
163
|
+
return False
|
|
164
|
+
|
|
165
|
+
except Exception as error:
|
|
166
|
+
logger.error(
|
|
167
|
+
f"{regional_client.region} -- {error.__class__.__name__}[{error.__traceback__.tb_lineno}]: {error}"
|
|
168
|
+
)
|
|
169
|
+
return False
|
|
170
|
+
|
|
171
|
+
def _check_rbac_enabled(self, cluster_detail: dict, region: str) -> bool:
|
|
172
|
+
"""
|
|
173
|
+
Check if RBAC is enabled on the cluster.
|
|
174
|
+
|
|
175
|
+
By default, RBAC is enabled on ACK clusters and ABAC is disabled.
|
|
176
|
+
We check for any indicators that RBAC might be disabled or legacy auth enabled.
|
|
177
|
+
"""
|
|
178
|
+
try:
|
|
179
|
+
# Check if cluster has RBAC enabled (default is true for ACK clusters)
|
|
180
|
+
# Look for security_options or parameters that indicate RBAC status
|
|
181
|
+
|
|
182
|
+
# Check meta_data for any RBAC-related settings
|
|
183
|
+
meta_data = cluster_detail.get("meta_data", {})
|
|
184
|
+
|
|
185
|
+
# If there's an explicit RBAC disabled flag, check it
|
|
186
|
+
if "RBACEnabled" in meta_data:
|
|
187
|
+
return meta_data.get("RBACEnabled", "true") in ["true", "True", True]
|
|
188
|
+
|
|
189
|
+
# Check parameters for authorization mode
|
|
190
|
+
parameters = cluster_detail.get("parameters", {})
|
|
191
|
+
if parameters:
|
|
192
|
+
# Check if there's an authorization mode parameter
|
|
193
|
+
auth_mode = parameters.get("authorization_mode", "RBAC")
|
|
194
|
+
if "ABAC" in auth_mode and "RBAC" not in auth_mode:
|
|
195
|
+
# Legacy ABAC-only mode
|
|
196
|
+
return False
|
|
197
|
+
|
|
198
|
+
# By default, RBAC is enabled on ACK clusters
|
|
199
|
+
# If we don't find explicit indicators that it's disabled, assume it's enabled
|
|
200
|
+
return True
|
|
201
|
+
|
|
202
|
+
except Exception as error:
|
|
203
|
+
logger.error(
|
|
204
|
+
f"{region} -- {error.__class__.__name__}[{error.__traceback__.tb_lineno}]: {error}"
|
|
205
|
+
)
|
|
206
|
+
# Default to True as RBAC is enabled by default on ACK
|
|
207
|
+
return True
|
|
208
|
+
|
|
209
|
+
def _get_last_cluster_check(self, regional_client, cluster_id: str):
|
|
210
|
+
"""
|
|
211
|
+
Get the most recent successful cluster check time.
|
|
212
|
+
|
|
213
|
+
Returns the finished_at timestamp of the most recent successful cluster check,
|
|
214
|
+
or None if no successful checks found.
|
|
215
|
+
"""
|
|
216
|
+
try:
|
|
217
|
+
# DescribeClusterChecks returns cluster check history
|
|
218
|
+
request = cs_models.DescribeClusterChecksRequest()
|
|
219
|
+
response = regional_client.describe_cluster_checks(cluster_id, request)
|
|
220
|
+
|
|
221
|
+
if response and response.body and response.body.checks:
|
|
222
|
+
checks = response.body.checks
|
|
223
|
+
|
|
224
|
+
# Find the most recent successful check
|
|
225
|
+
most_recent_check = None
|
|
226
|
+
|
|
227
|
+
for check in checks:
|
|
228
|
+
status = getattr(check, "status", "")
|
|
229
|
+
finished_at = getattr(check, "finished_at", None)
|
|
230
|
+
|
|
231
|
+
if status == "Succeeded" and finished_at:
|
|
232
|
+
# Parse the timestamp
|
|
233
|
+
if most_recent_check is None or finished_at > most_recent_check:
|
|
234
|
+
most_recent_check = finished_at
|
|
235
|
+
|
|
236
|
+
return most_recent_check
|
|
237
|
+
|
|
238
|
+
return None
|
|
239
|
+
|
|
240
|
+
except Exception as error:
|
|
241
|
+
logger.error(
|
|
242
|
+
f"{regional_client.region} -- {error.__class__.__name__}[{error.__traceback__.tb_lineno}]: {error}"
|
|
243
|
+
)
|
|
244
|
+
return None
|
|
245
|
+
|
|
246
|
+
def _check_cluster_addons(self, cluster_detail: dict, region: str) -> dict:
|
|
247
|
+
"""
|
|
248
|
+
Check cluster addons for various security configurations.
|
|
249
|
+
|
|
250
|
+
Returns:
|
|
251
|
+
dict: {
|
|
252
|
+
"dashboard_enabled": bool,
|
|
253
|
+
"network_policy_enabled": bool,
|
|
254
|
+
"eni_multiple_ip_enabled": bool
|
|
255
|
+
}
|
|
256
|
+
"""
|
|
257
|
+
result = {
|
|
258
|
+
"dashboard_enabled": False,
|
|
259
|
+
"network_policy_enabled": False,
|
|
260
|
+
"eni_multiple_ip_enabled": False,
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
try:
|
|
264
|
+
meta_data = cluster_detail.get("meta_data", {})
|
|
265
|
+
|
|
266
|
+
# Check Addons list in meta_data
|
|
267
|
+
# Note: Addons structure from API is typically a string representation of JSON or a list
|
|
268
|
+
# Based on sample: "Addons": [{"name": "gateway-api", ...}, ...]
|
|
269
|
+
addons = meta_data.get("Addons", [])
|
|
270
|
+
|
|
271
|
+
# If addons is string, try to parse it?
|
|
272
|
+
# The SDK typically handles this conversion, but let's be safe
|
|
273
|
+
if isinstance(addons, str):
|
|
274
|
+
import json
|
|
275
|
+
|
|
276
|
+
try:
|
|
277
|
+
addons = json.loads(addons)
|
|
278
|
+
except Exception:
|
|
279
|
+
addons = []
|
|
280
|
+
|
|
281
|
+
for addon in addons:
|
|
282
|
+
name = addon.get("name", "")
|
|
283
|
+
disabled = addon.get("disabled", False)
|
|
284
|
+
|
|
285
|
+
# Check 7.5: Kubernetes Dashboard
|
|
286
|
+
if name == "kubernetes-dashboard" and not disabled:
|
|
287
|
+
result["dashboard_enabled"] = True
|
|
288
|
+
|
|
289
|
+
# Check 7.7 & 7.8: Terway network plugin
|
|
290
|
+
if name == "terway-eniip" or name == "terway":
|
|
291
|
+
result["network_policy_enabled"] = True
|
|
292
|
+
result["eni_multiple_ip_enabled"] = True
|
|
293
|
+
|
|
294
|
+
return result
|
|
295
|
+
|
|
296
|
+
except Exception as error:
|
|
297
|
+
logger.error(
|
|
298
|
+
f"{region} -- {error.__class__.__name__}[{error.__traceback__.tb_lineno}]: {error}"
|
|
299
|
+
)
|
|
300
|
+
return result
|
|
301
|
+
|
|
302
|
+
def _check_public_access(self, cluster_detail: dict, region: str) -> bool:
|
|
303
|
+
"""
|
|
304
|
+
Check if cluster API server is accessible from public internet.
|
|
305
|
+
|
|
306
|
+
Returns:
|
|
307
|
+
bool: True if public access is enabled, False otherwise.
|
|
308
|
+
"""
|
|
309
|
+
try:
|
|
310
|
+
# Check master_url in cluster detail
|
|
311
|
+
master_url = cluster_detail.get("master_url", "")
|
|
312
|
+
|
|
313
|
+
# If master_url contains a public IP or DNS, public access is enabled
|
|
314
|
+
# Private clusters typically don't expose a public endpoint or have specific settings
|
|
315
|
+
|
|
316
|
+
# Check endpoint_public in parameters
|
|
317
|
+
parameters = cluster_detail.get("parameters", {})
|
|
318
|
+
endpoint_public = parameters.get("endpoint_public", "")
|
|
319
|
+
|
|
320
|
+
if endpoint_public:
|
|
321
|
+
return True
|
|
322
|
+
|
|
323
|
+
# If we can't find explicit indicator, check if master_url is present
|
|
324
|
+
# This is a heuristic - typical ACK public clusters expose a master_url
|
|
325
|
+
if master_url:
|
|
326
|
+
return True
|
|
327
|
+
|
|
328
|
+
return False
|
|
329
|
+
|
|
330
|
+
except Exception as error:
|
|
331
|
+
logger.error(
|
|
332
|
+
f"{region} -- {error.__class__.__name__}[{error.__traceback__.tb_lineno}]: {error}"
|
|
333
|
+
)
|
|
334
|
+
return False
|
|
335
|
+
|
|
336
|
+
|
|
337
|
+
# Models for CS service
|
|
338
|
+
class Cluster(BaseModel):
|
|
339
|
+
"""ACK Cluster model."""
|
|
340
|
+
|
|
341
|
+
id: str
|
|
342
|
+
name: str
|
|
343
|
+
region: str
|
|
344
|
+
cluster_type: str
|
|
345
|
+
state: str
|
|
346
|
+
audit_project_name: str = ""
|
|
347
|
+
log_service_enabled: bool = False
|
|
348
|
+
cloudmonitor_enabled: bool = False
|
|
349
|
+
rbac_enabled: bool = True # Default is True for ACK clusters
|
|
350
|
+
last_check_time: Optional[datetime] = None
|
|
351
|
+
dashboard_enabled: bool = False
|
|
352
|
+
network_policy_enabled: bool = False
|
|
353
|
+
eni_multiple_ip_enabled: bool = False
|
|
354
|
+
private_cluster_enabled: bool = False
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"Provider": "alibabacloud",
|
|
3
|
+
"CheckID": "ecs_attached_disk_encrypted",
|
|
4
|
+
"CheckTitle": "Virtual Machines disk are encrypted",
|
|
5
|
+
"CheckType": [
|
|
6
|
+
"Sensitive file tampering"
|
|
7
|
+
],
|
|
8
|
+
"ServiceName": "ecs",
|
|
9
|
+
"SubServiceName": "",
|
|
10
|
+
"ResourceIdTemplate": "acs:ecs:region:account-id:disk/{disk-id}",
|
|
11
|
+
"Severity": "high",
|
|
12
|
+
"ResourceType": "AlibabaCloudECSDisk",
|
|
13
|
+
"Description": "**ECS cloud disk encryption** protects your data at rest. The cloud disk data encryption feature automatically encrypts data when data is transferred from ECS instances to disks, and decrypts data when read from disks.\n\nEnsure that disks are encrypted when they are created with the creation of VM instances.",
|
|
14
|
+
"Risk": "**Unencrypted disks** attached to ECS instances pose a security risk as they may contain sensitive data that could be accessed if the disk is compromised or accessed by unauthorized parties.\n\nData at rest without encryption is vulnerable to **unauthorized access** if storage media is lost, stolen, or improperly decommissioned.",
|
|
15
|
+
"RelatedUrl": "",
|
|
16
|
+
"AdditionalURLs": [
|
|
17
|
+
"https://www.alibabacloud.com/help/doc-detail/59643.htm",
|
|
18
|
+
"https://www.trendmicro.com/cloudoneconformity/knowledge-base/alibaba-cloud/AlibabaCloud-ECS/encrypt-vm-instance-disks.html"
|
|
19
|
+
],
|
|
20
|
+
"Remediation": {
|
|
21
|
+
"Code": {
|
|
22
|
+
"CLI": "aliyun ecs CreateDisk --DiskName <disk_name> --Size <size> --Encrypted true --KmsKeyId <kms_key_id>",
|
|
23
|
+
"NativeIaC": "",
|
|
24
|
+
"Other": "",
|
|
25
|
+
"Terraform": "resource \"alicloud_ecs_disk\" \"encrypted\" {\n zone_id = \"cn-hangzhou-a\"\n disk_name = \"encrypted-disk\"\n category = \"cloud_efficiency\"\n size = 20\n encrypted = true\n kms_key_id = alicloud_kms_key.example.id\n}"
|
|
26
|
+
},
|
|
27
|
+
"Recommendation": {
|
|
28
|
+
"Text": "**Encrypt a system disk when copying an image:**\n1. Log on to the **ECS Console** > **Instances & Images** > **Images**\n2. Select the **Custom Image** tab and select target image\n3. Click **Copy Image** and check the **Encrypt** box\n4. Select a key and click **OK**\n\n**Encrypt a data disk when creating an instance:**\n1. Log on to the **ECS Console** > **Instances & Images** > **Instances** > **Create Instance**\n2. In the Storage section, click **Add Disk**\n3. Select **Disk Encryption** and choose a key\n\n**Note:** You cannot directly convert unencrypted disks to encrypted disks.",
|
|
29
|
+
"Url": "https://hub.prowler.com/check/ecs_attached_disk_encrypted"
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
"Categories": [
|
|
33
|
+
"encryption"
|
|
34
|
+
],
|
|
35
|
+
"DependsOn": [],
|
|
36
|
+
"RelatedTo": [],
|
|
37
|
+
"Notes": ""
|
|
38
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
from prowler.lib.check.models import Check, CheckReportAlibabaCloud
|
|
2
|
+
from prowler.providers.alibabacloud.services.ecs.ecs_client import ecs_client
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class ecs_attached_disk_encrypted(Check):
|
|
6
|
+
"""Check if attached disks are encrypted."""
|
|
7
|
+
|
|
8
|
+
def execute(self) -> list[CheckReportAlibabaCloud]:
|
|
9
|
+
findings = []
|
|
10
|
+
|
|
11
|
+
for disk in ecs_client.disks:
|
|
12
|
+
# Only check attached disks
|
|
13
|
+
if disk.is_attached:
|
|
14
|
+
report = CheckReportAlibabaCloud(
|
|
15
|
+
metadata=self.metadata(), resource=disk
|
|
16
|
+
)
|
|
17
|
+
report.region = disk.region
|
|
18
|
+
report.resource_id = disk.id
|
|
19
|
+
report.resource_arn = (
|
|
20
|
+
f"acs:ecs:{disk.region}:{ecs_client.audited_account}:disk/{disk.id}"
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
if disk.is_encrypted:
|
|
24
|
+
report.status = "PASS"
|
|
25
|
+
report.status_extended = (
|
|
26
|
+
f"Disk {disk.name if disk.name else disk.id} attached to instance "
|
|
27
|
+
f"{disk.attached_instance_id} is encrypted."
|
|
28
|
+
)
|
|
29
|
+
else:
|
|
30
|
+
report.status = "FAIL"
|
|
31
|
+
report.status_extended = (
|
|
32
|
+
f"Disk {disk.name if disk.name else disk.id} attached to instance "
|
|
33
|
+
f"{disk.attached_instance_id} is not encrypted."
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
findings.append(report)
|
|
37
|
+
|
|
38
|
+
return findings
|
prowler/providers/alibabacloud/services/ecs/ecs_instance_endpoint_protection_installed/__init__.py
ADDED
|
File without changes
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"Provider": "alibabacloud",
|
|
3
|
+
"CheckID": "ecs_instance_endpoint_protection_installed",
|
|
4
|
+
"CheckTitle": "The endpoint protection for all Virtual Machines is installed",
|
|
5
|
+
"CheckType": [
|
|
6
|
+
"Suspicious process",
|
|
7
|
+
"Webshell",
|
|
8
|
+
"Unusual logon",
|
|
9
|
+
"Sensitive file tampering",
|
|
10
|
+
"Malicious software"
|
|
11
|
+
],
|
|
12
|
+
"ServiceName": "ecs",
|
|
13
|
+
"SubServiceName": "",
|
|
14
|
+
"ResourceIdTemplate": "acs:ecs:region:account-id:instance/{instance-id}",
|
|
15
|
+
"Severity": "high",
|
|
16
|
+
"ResourceType": "AlibabaCloudECSInstance",
|
|
17
|
+
"Description": "Installing **endpoint protection systems** (like **Security Center** for Alibaba Cloud) provides real-time protection capability that helps identify and remove viruses, spyware, and other malicious software.\n\nConfigurable alerts notify when known malicious software attempts to install itself or run on ECS instances.",
|
|
18
|
+
"Risk": "ECS instances without **endpoint protection** are vulnerable to **malware**, **viruses**, and other security threats.\n\nEndpoint protection provides real-time monitoring and protection capabilities essential for detecting and preventing security incidents.",
|
|
19
|
+
"RelatedUrl": "",
|
|
20
|
+
"AdditionalURLs": [
|
|
21
|
+
"https://www.trendmicro.com/cloudoneconformity/knowledge-base/alibaba-cloud/AlibabaCloud-ECS/enable-endpoint-protection.html"
|
|
22
|
+
],
|
|
23
|
+
"Remediation": {
|
|
24
|
+
"Code": {
|
|
25
|
+
"CLI": "Logon to Security Center Console > Select Settings > Click Agent > Select virtual machines without Security Center agent > Click Install",
|
|
26
|
+
"NativeIaC": "",
|
|
27
|
+
"Other": "",
|
|
28
|
+
"Terraform": ""
|
|
29
|
+
},
|
|
30
|
+
"Recommendation": {
|
|
31
|
+
"Text": "1. Log on to the **Security Center Console**\n2. Select **Settings**\n3. Click **Agent**\n4. On the Agent tab, select the virtual machines without Security Center agent installed\n5. Click **Install**",
|
|
32
|
+
"Url": "https://hub.prowler.com/check/ecs_instance_endpoint_protection_installed"
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
"Categories": [
|
|
36
|
+
"forensics-ready"
|
|
37
|
+
],
|
|
38
|
+
"DependsOn": [],
|
|
39
|
+
"RelatedTo": [],
|
|
40
|
+
"Notes": ""
|
|
41
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
from prowler.lib.check.models import Check, CheckReportAlibabaCloud
|
|
2
|
+
from prowler.providers.alibabacloud.services.ecs.ecs_client import ecs_client
|
|
3
|
+
from prowler.providers.alibabacloud.services.securitycenter.securitycenter_client import (
|
|
4
|
+
securitycenter_client,
|
|
5
|
+
)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class ecs_instance_endpoint_protection_installed(Check):
|
|
9
|
+
"""Check if endpoint protection for all Virtual Machines is installed."""
|
|
10
|
+
|
|
11
|
+
def execute(self) -> list[CheckReportAlibabaCloud]:
|
|
12
|
+
findings = []
|
|
13
|
+
|
|
14
|
+
# Check each ECS instance for Security Center agent
|
|
15
|
+
for instance in ecs_client.instances:
|
|
16
|
+
# Only check running instances
|
|
17
|
+
if instance.status.lower() not in ["running", "starting"]:
|
|
18
|
+
continue
|
|
19
|
+
|
|
20
|
+
report = CheckReportAlibabaCloud(
|
|
21
|
+
metadata=self.metadata(), resource=instance
|
|
22
|
+
)
|
|
23
|
+
report.region = instance.region
|
|
24
|
+
report.resource_id = instance.id
|
|
25
|
+
report.resource_arn = f"acs:ecs:{instance.region}:{ecs_client.audited_account}:instance/{instance.id}"
|
|
26
|
+
|
|
27
|
+
# Check if Security Center agent is installed
|
|
28
|
+
instance_key = f"{instance.region}:{instance.id}"
|
|
29
|
+
agent = securitycenter_client.instance_agents.get(instance_key)
|
|
30
|
+
|
|
31
|
+
if agent:
|
|
32
|
+
if agent.agent_installed and agent.agent_status == "online":
|
|
33
|
+
report.status = "PASS"
|
|
34
|
+
report.status_extended = (
|
|
35
|
+
f"ECS instance {instance.name if instance.name else instance.id} "
|
|
36
|
+
"has Security Center agent installed and online."
|
|
37
|
+
)
|
|
38
|
+
else:
|
|
39
|
+
report.status = "FAIL"
|
|
40
|
+
report.status_extended = (
|
|
41
|
+
f"ECS instance {instance.name if instance.name else instance.id} "
|
|
42
|
+
f"does not have Security Center agent installed or agent is {agent.agent_status}."
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
findings.append(report)
|
|
46
|
+
|
|
47
|
+
return findings
|
prowler/providers/alibabacloud/services/ecs/ecs_instance_latest_os_patches_applied/__init__.py
ADDED
|
File without changes
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"Provider": "alibabacloud",
|
|
3
|
+
"CheckID": "ecs_instance_latest_os_patches_applied",
|
|
4
|
+
"CheckTitle": "The latest OS Patches for all Virtual Machines are applied",
|
|
5
|
+
"CheckType": [
|
|
6
|
+
"Malicious software",
|
|
7
|
+
"Web application threat detection"
|
|
8
|
+
],
|
|
9
|
+
"ServiceName": "ecs",
|
|
10
|
+
"SubServiceName": "",
|
|
11
|
+
"ResourceIdTemplate": "acs:ecs:region:account-id:instance/{instance-id}",
|
|
12
|
+
"Severity": "high",
|
|
13
|
+
"ResourceType": "AlibabaCloudECSInstance",
|
|
14
|
+
"Description": "Windows and Linux virtual machines should be kept updated to address specific bugs or flaws, improve OS or application's general stability, and fix **security vulnerabilities**.\n\nThe Alibaba Cloud **Security Center** checks for the latest updates in Linux and Windows systems.",
|
|
15
|
+
"Risk": "**Unpatched systems** are vulnerable to known security exploits and may be compromised by attackers.\n\nKeeping systems updated with the latest patches is critical for maintaining security and preventing **exploitation of known vulnerabilities**.",
|
|
16
|
+
"RelatedUrl": "",
|
|
17
|
+
"AdditionalURLs": [
|
|
18
|
+
"https://www.trendmicro.com/cloudoneconformity/knowledge-base/alibaba-cloud/AlibabaCloud-ECS/apply-latest-os-patches.html"
|
|
19
|
+
],
|
|
20
|
+
"Remediation": {
|
|
21
|
+
"Code": {
|
|
22
|
+
"CLI": "Logon to Security Center Console > Select Vulnerabilities > Apply all patches for vulnerabilities",
|
|
23
|
+
"NativeIaC": "",
|
|
24
|
+
"Other": "",
|
|
25
|
+
"Terraform": ""
|
|
26
|
+
},
|
|
27
|
+
"Recommendation": {
|
|
28
|
+
"Text": "1. Log on to the **Security Center Console**\n2. Select **Vulnerabilities**\n3. Ensure all vulnerabilities are fixed\n4. Apply all patches for vulnerabilities",
|
|
29
|
+
"Url": "https://hub.prowler.com/check/ecs_instance_latest_os_patches_applied"
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
"Categories": [
|
|
33
|
+
"vulnerabilities"
|
|
34
|
+
],
|
|
35
|
+
"DependsOn": [],
|
|
36
|
+
"RelatedTo": [],
|
|
37
|
+
"Notes": ""
|
|
38
|
+
}
|