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.
Files changed (326) hide show
  1. dashboard/assets/images/providers/alibabacloud_provider.png +0 -0
  2. dashboard/compliance/cis_2_0_alibabacloud.py +24 -0
  3. dashboard/lib/layouts.py +1 -0
  4. dashboard/pages/compliance.py +8 -2
  5. dashboard/pages/overview.py +52 -1
  6. prowler/CHANGELOG.md +59 -20
  7. prowler/__main__.py +40 -0
  8. prowler/compliance/alibabacloud/__init__.py +0 -0
  9. prowler/compliance/alibabacloud/cis_2.0_alibabacloud.json +1833 -0
  10. prowler/compliance/aws/iso27001_2013_aws.json +158 -158
  11. prowler/compliance/aws/soc2_aws.json +100 -0
  12. prowler/compliance/azure/rbi_cyber_security_framework_azure.json +248 -0
  13. prowler/compliance/azure/soc2_azure.json +87 -1
  14. prowler/compliance/gcp/soc2_gcp.json +82 -1
  15. prowler/config/config.py +2 -1
  16. prowler/lib/check/check.py +47 -1
  17. prowler/lib/check/models.py +23 -0
  18. prowler/lib/check/utils.py +1 -1
  19. prowler/lib/cli/parser.py +3 -2
  20. prowler/lib/outputs/compliance/cis/cis_alibabacloud.py +106 -0
  21. prowler/lib/outputs/compliance/cis/models.py +35 -0
  22. prowler/lib/outputs/finding.py +16 -0
  23. prowler/lib/outputs/html/html.py +67 -0
  24. prowler/lib/outputs/outputs.py +2 -0
  25. prowler/lib/outputs/summary_table.py +3 -0
  26. prowler/providers/alibabacloud/__init__.py +0 -0
  27. prowler/providers/alibabacloud/alibabacloud_provider.py +872 -0
  28. prowler/providers/alibabacloud/config.py +41 -0
  29. prowler/providers/alibabacloud/exceptions/__init__.py +0 -0
  30. prowler/providers/alibabacloud/exceptions/exceptions.py +116 -0
  31. prowler/providers/alibabacloud/lib/__init__.py +0 -0
  32. prowler/providers/alibabacloud/lib/arguments/__init__.py +0 -0
  33. prowler/providers/alibabacloud/lib/arguments/arguments.py +58 -0
  34. prowler/providers/alibabacloud/lib/mutelist/__init__.py +0 -0
  35. prowler/providers/alibabacloud/lib/mutelist/mutelist.py +175 -0
  36. prowler/providers/alibabacloud/lib/service/__init__.py +0 -0
  37. prowler/providers/alibabacloud/lib/service/service.py +113 -0
  38. prowler/providers/alibabacloud/models.py +266 -0
  39. prowler/providers/alibabacloud/services/__init__.py +0 -0
  40. prowler/providers/alibabacloud/services/actiontrail/__init__.py +0 -0
  41. prowler/providers/alibabacloud/services/actiontrail/actiontrail_client.py +6 -0
  42. prowler/providers/alibabacloud/services/actiontrail/actiontrail_multi_region_enabled/__init__.py +0 -0
  43. prowler/providers/alibabacloud/services/actiontrail/actiontrail_multi_region_enabled/actiontrail_multi_region_enabled.metadata.json +39 -0
  44. prowler/providers/alibabacloud/services/actiontrail/actiontrail_multi_region_enabled/actiontrail_multi_region_enabled.py +81 -0
  45. prowler/providers/alibabacloud/services/actiontrail/actiontrail_oss_bucket_not_publicly_accessible/__init__.py +0 -0
  46. prowler/providers/alibabacloud/services/actiontrail/actiontrail_oss_bucket_not_publicly_accessible/actiontrail_oss_bucket_not_publicly_accessible.metadata.json +40 -0
  47. prowler/providers/alibabacloud/services/actiontrail/actiontrail_oss_bucket_not_publicly_accessible/actiontrail_oss_bucket_not_publicly_accessible.py +119 -0
  48. prowler/providers/alibabacloud/services/actiontrail/actiontrail_service.py +110 -0
  49. prowler/providers/alibabacloud/services/cs/__init__.py +0 -0
  50. prowler/providers/alibabacloud/services/cs/cs_client.py +4 -0
  51. prowler/providers/alibabacloud/services/cs/cs_kubernetes_cloudmonitor_enabled/__init__.py +0 -0
  52. prowler/providers/alibabacloud/services/cs/cs_kubernetes_cloudmonitor_enabled/cs_kubernetes_cloudmonitor_enabled.metadata.json +38 -0
  53. prowler/providers/alibabacloud/services/cs/cs_kubernetes_cloudmonitor_enabled/cs_kubernetes_cloudmonitor_enabled.py +26 -0
  54. prowler/providers/alibabacloud/services/cs/cs_kubernetes_cluster_check_recent/__init__.py +0 -0
  55. prowler/providers/alibabacloud/services/cs/cs_kubernetes_cluster_check_recent/cs_kubernetes_cluster_check_recent.metadata.json +38 -0
  56. prowler/providers/alibabacloud/services/cs/cs_kubernetes_cluster_check_recent/cs_kubernetes_cluster_check_recent.py +62 -0
  57. prowler/providers/alibabacloud/services/cs/cs_kubernetes_cluster_check_weekly/cs_kubernetes_cluster_check_weekly.metadata.json +38 -0
  58. prowler/providers/alibabacloud/services/cs/cs_kubernetes_cluster_check_weekly/cs_kubernetes_cluster_check_weekly.py +62 -0
  59. prowler/providers/alibabacloud/services/cs/cs_kubernetes_dashboard_disabled/__init__.py +0 -0
  60. prowler/providers/alibabacloud/services/cs/cs_kubernetes_dashboard_disabled/cs_kubernetes_dashboard_disabled.metadata.json +39 -0
  61. prowler/providers/alibabacloud/services/cs/cs_kubernetes_dashboard_disabled/cs_kubernetes_dashboard_disabled.py +26 -0
  62. prowler/providers/alibabacloud/services/cs/cs_kubernetes_eni_multiple_ip_enabled/__init__.py +0 -0
  63. prowler/providers/alibabacloud/services/cs/cs_kubernetes_eni_multiple_ip_enabled/cs_kubernetes_eni_multiple_ip_enabled.metadata.json +39 -0
  64. prowler/providers/alibabacloud/services/cs/cs_kubernetes_eni_multiple_ip_enabled/cs_kubernetes_eni_multiple_ip_enabled.py +26 -0
  65. prowler/providers/alibabacloud/services/cs/cs_kubernetes_log_service_enabled/__init__.py +0 -0
  66. prowler/providers/alibabacloud/services/cs/cs_kubernetes_log_service_enabled/cs_kubernetes_log_service_enabled.metadata.json +40 -0
  67. prowler/providers/alibabacloud/services/cs/cs_kubernetes_log_service_enabled/cs_kubernetes_log_service_enabled.py +26 -0
  68. prowler/providers/alibabacloud/services/cs/cs_kubernetes_network_policy_enabled/__init__.py +0 -0
  69. prowler/providers/alibabacloud/services/cs/cs_kubernetes_network_policy_enabled/cs_kubernetes_network_policy_enabled.metadata.json +39 -0
  70. prowler/providers/alibabacloud/services/cs/cs_kubernetes_network_policy_enabled/cs_kubernetes_network_policy_enabled.py +26 -0
  71. prowler/providers/alibabacloud/services/cs/cs_kubernetes_private_cluster_enabled/__init__.py +0 -0
  72. prowler/providers/alibabacloud/services/cs/cs_kubernetes_private_cluster_enabled/cs_kubernetes_private_cluster_enabled.metadata.json +39 -0
  73. prowler/providers/alibabacloud/services/cs/cs_kubernetes_private_cluster_enabled/cs_kubernetes_private_cluster_enabled.py +26 -0
  74. prowler/providers/alibabacloud/services/cs/cs_kubernetes_rbac_enabled/__init__.py +0 -0
  75. prowler/providers/alibabacloud/services/cs/cs_kubernetes_rbac_enabled/cs_kubernetes_rbac_enabled.metadata.json +40 -0
  76. prowler/providers/alibabacloud/services/cs/cs_kubernetes_rbac_enabled/cs_kubernetes_rbac_enabled.py +28 -0
  77. prowler/providers/alibabacloud/services/cs/cs_service.py +354 -0
  78. prowler/providers/alibabacloud/services/ecs/__init__.py +0 -0
  79. prowler/providers/alibabacloud/services/ecs/ecs_attached_disk_encrypted/__init__.py +0 -0
  80. prowler/providers/alibabacloud/services/ecs/ecs_attached_disk_encrypted/ecs_attached_disk_encrypted.metadata.json +38 -0
  81. prowler/providers/alibabacloud/services/ecs/ecs_attached_disk_encrypted/ecs_attached_disk_encrypted.py +38 -0
  82. prowler/providers/alibabacloud/services/ecs/ecs_client.py +4 -0
  83. prowler/providers/alibabacloud/services/ecs/ecs_instance_endpoint_protection_installed/__init__.py +0 -0
  84. prowler/providers/alibabacloud/services/ecs/ecs_instance_endpoint_protection_installed/ecs_instance_endpoint_protection_installed.metadata.json +41 -0
  85. prowler/providers/alibabacloud/services/ecs/ecs_instance_endpoint_protection_installed/ecs_instance_endpoint_protection_installed.py +47 -0
  86. prowler/providers/alibabacloud/services/ecs/ecs_instance_latest_os_patches_applied/__init__.py +0 -0
  87. prowler/providers/alibabacloud/services/ecs/ecs_instance_latest_os_patches_applied/ecs_instance_latest_os_patches_applied.metadata.json +38 -0
  88. prowler/providers/alibabacloud/services/ecs/ecs_instance_latest_os_patches_applied/ecs_instance_latest_os_patches_applied.py +50 -0
  89. prowler/providers/alibabacloud/services/ecs/ecs_instance_no_legacy_network/__init__.py +0 -0
  90. prowler/providers/alibabacloud/services/ecs/ecs_instance_no_legacy_network/ecs_instance_no_legacy_network.metadata.json +38 -0
  91. prowler/providers/alibabacloud/services/ecs/ecs_instance_no_legacy_network/ecs_instance_no_legacy_network.py +34 -0
  92. prowler/providers/alibabacloud/services/ecs/ecs_securitygroup_restrict_rdp_internet/__init__.py +0 -0
  93. prowler/providers/alibabacloud/services/ecs/ecs_securitygroup_restrict_rdp_internet/ecs_securitygroup_restrict_rdp_internet.metadata.json +39 -0
  94. prowler/providers/alibabacloud/services/ecs/ecs_securitygroup_restrict_rdp_internet/ecs_securitygroup_restrict_rdp_internet.py +68 -0
  95. prowler/providers/alibabacloud/services/ecs/ecs_securitygroup_restrict_ssh_internet/__init__.py +0 -0
  96. prowler/providers/alibabacloud/services/ecs/ecs_securitygroup_restrict_ssh_internet/ecs_securitygroup_restrict_ssh_internet.metadata.json +39 -0
  97. prowler/providers/alibabacloud/services/ecs/ecs_securitygroup_restrict_ssh_internet/ecs_securitygroup_restrict_ssh_internet.py +68 -0
  98. prowler/providers/alibabacloud/services/ecs/ecs_service.py +380 -0
  99. prowler/providers/alibabacloud/services/ecs/ecs_unattached_disk_encrypted/__init__.py +0 -0
  100. prowler/providers/alibabacloud/services/ecs/ecs_unattached_disk_encrypted/ecs_unattached_disk_encrypted.metadata.json +38 -0
  101. prowler/providers/alibabacloud/services/ecs/ecs_unattached_disk_encrypted/ecs_unattached_disk_encrypted.py +38 -0
  102. prowler/providers/alibabacloud/services/ecs/lib/security_groups.py +23 -0
  103. prowler/providers/alibabacloud/services/oss/__init__.py +0 -0
  104. prowler/providers/alibabacloud/services/oss/oss_bucket_logging_enabled/__init__.py +0 -0
  105. prowler/providers/alibabacloud/services/oss/oss_bucket_logging_enabled/oss_bucket_logging_enabled.metadata.json +39 -0
  106. prowler/providers/alibabacloud/services/oss/oss_bucket_logging_enabled/oss_bucket_logging_enabled.py +37 -0
  107. prowler/providers/alibabacloud/services/oss/oss_bucket_not_publicly_accessible/__init__.py +0 -0
  108. prowler/providers/alibabacloud/services/oss/oss_bucket_not_publicly_accessible/oss_bucket_not_publicly_accessible.metadata.json +39 -0
  109. prowler/providers/alibabacloud/services/oss/oss_bucket_not_publicly_accessible/oss_bucket_not_publicly_accessible.py +89 -0
  110. prowler/providers/alibabacloud/services/oss/oss_bucket_secure_transport_enabled/__init__.py +0 -0
  111. prowler/providers/alibabacloud/services/oss/oss_bucket_secure_transport_enabled/oss_bucket_secure_transport_enabled.metadata.json +38 -0
  112. prowler/providers/alibabacloud/services/oss/oss_bucket_secure_transport_enabled/oss_bucket_secure_transport_enabled.py +87 -0
  113. prowler/providers/alibabacloud/services/oss/oss_client.py +4 -0
  114. prowler/providers/alibabacloud/services/oss/oss_service.py +317 -0
  115. prowler/providers/alibabacloud/services/ram/__init__.py +0 -0
  116. prowler/providers/alibabacloud/services/ram/ram_client.py +4 -0
  117. prowler/providers/alibabacloud/services/ram/ram_no_root_access_key/__init__.py +0 -0
  118. prowler/providers/alibabacloud/services/ram/ram_no_root_access_key/ram_no_root_access_key.metadata.json +39 -0
  119. prowler/providers/alibabacloud/services/ram/ram_no_root_access_key/ram_no_root_access_key.py +33 -0
  120. prowler/providers/alibabacloud/services/ram/ram_password_policy_lowercase/__init__.py +0 -0
  121. prowler/providers/alibabacloud/services/ram/ram_password_policy_lowercase/ram_password_policy_lowercase.metadata.json +39 -0
  122. prowler/providers/alibabacloud/services/ram/ram_password_policy_lowercase/ram_password_policy_lowercase.py +32 -0
  123. prowler/providers/alibabacloud/services/ram/ram_password_policy_max_login_attempts/__init__.py +0 -0
  124. prowler/providers/alibabacloud/services/ram/ram_password_policy_max_login_attempts/ram_password_policy_max_login_attempts.metadata.json +39 -0
  125. prowler/providers/alibabacloud/services/ram/ram_password_policy_max_login_attempts/ram_password_policy_max_login_attempts.py +32 -0
  126. prowler/providers/alibabacloud/services/ram/ram_password_policy_max_password_age/__init__.py +0 -0
  127. prowler/providers/alibabacloud/services/ram/ram_password_policy_max_password_age/ram_password_policy_max_password_age.metadata.json +39 -0
  128. prowler/providers/alibabacloud/services/ram/ram_password_policy_max_password_age/ram_password_policy_max_password_age.py +35 -0
  129. prowler/providers/alibabacloud/services/ram/ram_password_policy_minimum_length/__init__.py +0 -0
  130. prowler/providers/alibabacloud/services/ram/ram_password_policy_minimum_length/ram_password_policy_minimum_length.metadata.json +39 -0
  131. prowler/providers/alibabacloud/services/ram/ram_password_policy_minimum_length/ram_password_policy_minimum_length.py +30 -0
  132. prowler/providers/alibabacloud/services/ram/ram_password_policy_number/__init__.py +0 -0
  133. prowler/providers/alibabacloud/services/ram/ram_password_policy_number/ram_password_policy_number.metadata.json +39 -0
  134. prowler/providers/alibabacloud/services/ram/ram_password_policy_password_reuse_prevention/__init__.py +0 -0
  135. prowler/providers/alibabacloud/services/ram/ram_password_policy_password_reuse_prevention/ram_password_policy_password_reuse_prevention.metadata.json +39 -0
  136. prowler/providers/alibabacloud/services/ram/ram_password_policy_password_reuse_prevention/ram_password_policy_password_reuse_prevention.py +35 -0
  137. prowler/providers/alibabacloud/services/ram/ram_password_policy_symbol/__init__.py +0 -0
  138. prowler/providers/alibabacloud/services/ram/ram_password_policy_symbol/ram_password_policy_symbol.metadata.json +39 -0
  139. prowler/providers/alibabacloud/services/ram/ram_password_policy_symbol/ram_password_policy_symbol.py +34 -0
  140. prowler/providers/alibabacloud/services/ram/ram_password_policy_uppercase/__init__.py +0 -0
  141. prowler/providers/alibabacloud/services/ram/ram_password_policy_uppercase/ram_password_policy_uppercase.metadata.json +39 -0
  142. prowler/providers/alibabacloud/services/ram/ram_password_policy_uppercase/ram_password_policy_uppercase.py +32 -0
  143. prowler/providers/alibabacloud/services/ram/ram_policy_attached_only_to_group_or_roles/__init__.py +0 -0
  144. 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
  145. prowler/providers/alibabacloud/services/ram/ram_policy_attached_only_to_group_or_roles/ram_policy_attached_only_to_group_or_roles.py +35 -0
  146. prowler/providers/alibabacloud/services/ram/ram_policy_no_administrative_privileges/__init__.py +0 -0
  147. prowler/providers/alibabacloud/services/ram/ram_policy_no_administrative_privileges/ram_policy_no_administrative_privileges.metadata.json +39 -0
  148. prowler/providers/alibabacloud/services/ram/ram_policy_no_administrative_privileges/ram_policy_no_administrative_privileges.py +73 -0
  149. prowler/providers/alibabacloud/services/ram/ram_rotate_access_key_90_days/__init__.py +0 -0
  150. prowler/providers/alibabacloud/services/ram/ram_rotate_access_key_90_days/ram_rotate_access_key_90_days.metadata.json +39 -0
  151. prowler/providers/alibabacloud/services/ram/ram_rotate_access_key_90_days/ram_rotate_access_key_90_days.py +58 -0
  152. prowler/providers/alibabacloud/services/ram/ram_service.py +478 -0
  153. prowler/providers/alibabacloud/services/ram/ram_user_console_access_unused/__init__.py +0 -0
  154. prowler/providers/alibabacloud/services/ram/ram_user_console_access_unused/ram_user_console_access_unused.metadata.json +39 -0
  155. prowler/providers/alibabacloud/services/ram/ram_user_console_access_unused/ram_user_console_access_unused.py +56 -0
  156. prowler/providers/alibabacloud/services/ram/ram_user_mfa_enabled_console_access/__init__.py +0 -0
  157. prowler/providers/alibabacloud/services/ram/ram_user_mfa_enabled_console_access/ram_user_mfa_enabled_console_access.metadata.json +39 -0
  158. prowler/providers/alibabacloud/services/ram/ram_user_mfa_enabled_console_access/ram_user_mfa_enabled_console_access.py +36 -0
  159. prowler/providers/alibabacloud/services/rds/__init__.py +0 -0
  160. prowler/providers/alibabacloud/services/rds/rds_client.py +4 -0
  161. prowler/providers/alibabacloud/services/rds/rds_instance_no_public_access_whitelist/__init__.py +0 -0
  162. prowler/providers/alibabacloud/services/rds/rds_instance_no_public_access_whitelist/rds_instance_no_public_access_whitelist.metadata.json +39 -0
  163. prowler/providers/alibabacloud/services/rds/rds_instance_no_public_access_whitelist/rds_instance_no_public_access_whitelist.py +36 -0
  164. prowler/providers/alibabacloud/services/rds/rds_instance_postgresql_log_connections_enabled/__init__.py +0 -0
  165. prowler/providers/alibabacloud/services/rds/rds_instance_postgresql_log_connections_enabled/rds_instance_postgresql_log_connections_enabled.metadata.json +39 -0
  166. prowler/providers/alibabacloud/services/rds/rds_instance_postgresql_log_connections_enabled/rds_instance_postgresql_log_connections_enabled.py +29 -0
  167. prowler/providers/alibabacloud/services/rds/rds_instance_postgresql_log_disconnections_enabled/__init__.py +0 -0
  168. prowler/providers/alibabacloud/services/rds/rds_instance_postgresql_log_disconnections_enabled/rds_instance_postgresql_log_disconnections_enabled.metadata.json +39 -0
  169. prowler/providers/alibabacloud/services/rds/rds_instance_postgresql_log_disconnections_enabled/rds_instance_postgresql_log_disconnections_enabled.py +29 -0
  170. prowler/providers/alibabacloud/services/rds/rds_instance_postgresql_log_duration_enabled/__init__.py +0 -0
  171. prowler/providers/alibabacloud/services/rds/rds_instance_postgresql_log_duration_enabled/rds_instance_postgresql_log_duration_enabled.metadata.json +38 -0
  172. prowler/providers/alibabacloud/services/rds/rds_instance_postgresql_log_duration_enabled/rds_instance_postgresql_log_duration_enabled.py +29 -0
  173. prowler/providers/alibabacloud/services/rds/rds_instance_sql_audit_enabled/__init__.py +0 -0
  174. prowler/providers/alibabacloud/services/rds/rds_instance_sql_audit_enabled/rds_instance_sql_audit_enabled.metadata.json +39 -0
  175. prowler/providers/alibabacloud/services/rds/rds_instance_sql_audit_enabled/rds_instance_sql_audit_enabled.py +32 -0
  176. prowler/providers/alibabacloud/services/rds/rds_instance_sql_audit_retention/__init__.py +0 -0
  177. prowler/providers/alibabacloud/services/rds/rds_instance_sql_audit_retention/rds_instance_sql_audit_retention.metadata.json +39 -0
  178. prowler/providers/alibabacloud/services/rds/rds_instance_sql_audit_retention/rds_instance_sql_audit_retention.py +41 -0
  179. prowler/providers/alibabacloud/services/rds/rds_instance_ssl_enabled/__init__.py +0 -0
  180. prowler/providers/alibabacloud/services/rds/rds_instance_ssl_enabled/rds_instance_ssl_enabled.metadata.json +39 -0
  181. prowler/providers/alibabacloud/services/rds/rds_instance_ssl_enabled/rds_instance_ssl_enabled.py +30 -0
  182. prowler/providers/alibabacloud/services/rds/rds_instance_tde_enabled/__init__.py +0 -0
  183. prowler/providers/alibabacloud/services/rds/rds_instance_tde_enabled/rds_instance_tde_enabled.metadata.json +39 -0
  184. prowler/providers/alibabacloud/services/rds/rds_instance_tde_enabled/rds_instance_tde_enabled.py +32 -0
  185. prowler/providers/alibabacloud/services/rds/rds_instance_tde_key_custom/__init__.py +0 -0
  186. prowler/providers/alibabacloud/services/rds/rds_instance_tde_key_custom/rds_instance_tde_key_custom.metadata.json +39 -0
  187. prowler/providers/alibabacloud/services/rds/rds_instance_tde_key_custom/rds_instance_tde_key_custom.py +38 -0
  188. prowler/providers/alibabacloud/services/rds/rds_service.py +274 -0
  189. prowler/providers/alibabacloud/services/securitycenter/__init__.py +0 -0
  190. prowler/providers/alibabacloud/services/securitycenter/securitycenter_advanced_or_enterprise_edition/__init__.py +0 -0
  191. prowler/providers/alibabacloud/services/securitycenter/securitycenter_advanced_or_enterprise_edition/securitycenter_advanced_or_enterprise_edition.metadata.json +43 -0
  192. prowler/providers/alibabacloud/services/securitycenter/securitycenter_advanced_or_enterprise_edition/securitycenter_advanced_or_enterprise_edition.py +48 -0
  193. prowler/providers/alibabacloud/services/securitycenter/securitycenter_all_assets_agent_installed/__init__.py +0 -0
  194. prowler/providers/alibabacloud/services/securitycenter/securitycenter_all_assets_agent_installed/securitycenter_all_assets_agent_installed.metadata.json +42 -0
  195. prowler/providers/alibabacloud/services/securitycenter/securitycenter_all_assets_agent_installed/securitycenter_all_assets_agent_installed.py +48 -0
  196. prowler/providers/alibabacloud/services/securitycenter/securitycenter_client.py +6 -0
  197. prowler/providers/alibabacloud/services/securitycenter/securitycenter_notification_enabled_high_risk/__init__.py +0 -0
  198. prowler/providers/alibabacloud/services/securitycenter/securitycenter_notification_enabled_high_risk/securitycenter_notification_enabled_high_risk.metadata.json +42 -0
  199. prowler/providers/alibabacloud/services/securitycenter/securitycenter_notification_enabled_high_risk/securitycenter_notification_enabled_high_risk.py +65 -0
  200. prowler/providers/alibabacloud/services/securitycenter/securitycenter_service.py +394 -0
  201. prowler/providers/alibabacloud/services/securitycenter/securitycenter_vulnerability_scan_enabled/__init__.py +0 -0
  202. prowler/providers/alibabacloud/services/securitycenter/securitycenter_vulnerability_scan_enabled/securitycenter_vulnerability_scan_enabled.metadata.json +39 -0
  203. prowler/providers/alibabacloud/services/securitycenter/securitycenter_vulnerability_scan_enabled/securitycenter_vulnerability_scan_enabled.py +68 -0
  204. prowler/providers/alibabacloud/services/sls/__init__.py +0 -0
  205. prowler/providers/alibabacloud/services/sls/sls_client.py +4 -0
  206. prowler/providers/alibabacloud/services/sls/sls_cloud_firewall_changes_alert_enabled/__init__.py +0 -0
  207. prowler/providers/alibabacloud/services/sls/sls_cloud_firewall_changes_alert_enabled/sls_cloud_firewall_changes_alert_enabled.metadata.json +39 -0
  208. prowler/providers/alibabacloud/services/sls/sls_cloud_firewall_changes_alert_enabled/sls_cloud_firewall_changes_alert_enabled.py +50 -0
  209. prowler/providers/alibabacloud/services/sls/sls_customer_created_cmk_changes_alert_enabled/__init__.py +0 -0
  210. prowler/providers/alibabacloud/services/sls/sls_customer_created_cmk_changes_alert_enabled/sls_customer_created_cmk_changes_alert_enabled.metadata.json +39 -0
  211. prowler/providers/alibabacloud/services/sls/sls_customer_created_cmk_changes_alert_enabled/sls_customer_created_cmk_changes_alert_enabled.py +48 -0
  212. prowler/providers/alibabacloud/services/sls/sls_logstore_retention_period/__init__.py +0 -0
  213. prowler/providers/alibabacloud/services/sls/sls_logstore_retention_period/sls_logstore_retention_period.metadata.json +38 -0
  214. prowler/providers/alibabacloud/services/sls/sls_logstore_retention_period/sls_logstore_retention_period.py +32 -0
  215. prowler/providers/alibabacloud/services/sls/sls_management_console_authentication_failures_alert_enabled/__init__.py +0 -0
  216. prowler/providers/alibabacloud/services/sls/sls_management_console_authentication_failures_alert_enabled/sls_management_console_authentication_failures_alert_enabled.metadata.json +39 -0
  217. prowler/providers/alibabacloud/services/sls/sls_management_console_authentication_failures_alert_enabled/sls_management_console_authentication_failures_alert_enabled.py +44 -0
  218. prowler/providers/alibabacloud/services/sls/sls_management_console_signin_without_mfa_alert_enabled/__init__.py +0 -0
  219. 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
  220. prowler/providers/alibabacloud/services/sls/sls_management_console_signin_without_mfa_alert_enabled/sls_management_console_signin_without_mfa_alert_enabled.py +49 -0
  221. prowler/providers/alibabacloud/services/sls/sls_oss_bucket_policy_changes_alert_enabled/__init__.py +0 -0
  222. prowler/providers/alibabacloud/services/sls/sls_oss_bucket_policy_changes_alert_enabled/sls_oss_bucket_policy_changes_alert_enabled.metadata.json +39 -0
  223. prowler/providers/alibabacloud/services/sls/sls_oss_bucket_policy_changes_alert_enabled/sls_oss_bucket_policy_changes_alert_enabled.py +57 -0
  224. prowler/providers/alibabacloud/services/sls/sls_oss_permission_changes_alert_enabled/__init__.py +0 -0
  225. prowler/providers/alibabacloud/services/sls/sls_oss_permission_changes_alert_enabled/sls_oss_permission_changes_alert_enabled.metadata.json +39 -0
  226. prowler/providers/alibabacloud/services/sls/sls_oss_permission_changes_alert_enabled/sls_oss_permission_changes_alert_enabled.py +48 -0
  227. prowler/providers/alibabacloud/services/sls/sls_ram_role_changes_alert_enabled/__init__.py +0 -0
  228. prowler/providers/alibabacloud/services/sls/sls_ram_role_changes_alert_enabled/sls_ram_role_changes_alert_enabled.metadata.json +39 -0
  229. prowler/providers/alibabacloud/services/sls/sls_ram_role_changes_alert_enabled/sls_ram_role_changes_alert_enabled.py +54 -0
  230. prowler/providers/alibabacloud/services/sls/sls_rds_instance_configuration_changes_alert_enabled/__init__.py +0 -0
  231. prowler/providers/alibabacloud/services/sls/sls_rds_instance_configuration_changes_alert_enabled/sls_rds_instance_configuration_changes_alert_enabled.metadata.json +39 -0
  232. prowler/providers/alibabacloud/services/sls/sls_rds_instance_configuration_changes_alert_enabled/sls_rds_instance_configuration_changes_alert_enabled.py +72 -0
  233. prowler/providers/alibabacloud/services/sls/sls_root_account_usage_alert_enabled/__init__.py +0 -0
  234. prowler/providers/alibabacloud/services/sls/sls_root_account_usage_alert_enabled/sls_root_account_usage_alert_enabled.metadata.json +39 -0
  235. prowler/providers/alibabacloud/services/sls/sls_root_account_usage_alert_enabled/sls_root_account_usage_alert_enabled.py +50 -0
  236. prowler/providers/alibabacloud/services/sls/sls_security_group_changes_alert_enabled/__init__.py +0 -0
  237. prowler/providers/alibabacloud/services/sls/sls_security_group_changes_alert_enabled/sls_security_group_changes_alert_enabled.metadata.json +39 -0
  238. prowler/providers/alibabacloud/services/sls/sls_security_group_changes_alert_enabled/sls_security_group_changes_alert_enabled.py +56 -0
  239. prowler/providers/alibabacloud/services/sls/sls_service.py +137 -0
  240. prowler/providers/alibabacloud/services/sls/sls_unauthorized_api_calls_alert_enabled/__init__.py +0 -0
  241. prowler/providers/alibabacloud/services/sls/sls_unauthorized_api_calls_alert_enabled/sls_unauthorized_api_calls_alert_enabled.metadata.json +39 -0
  242. prowler/providers/alibabacloud/services/sls/sls_unauthorized_api_calls_alert_enabled/sls_unauthorized_api_calls_alert_enabled.py +56 -0
  243. prowler/providers/alibabacloud/services/sls/sls_vpc_changes_alert_enabled/__init__.py +0 -0
  244. prowler/providers/alibabacloud/services/sls/sls_vpc_changes_alert_enabled/sls_vpc_changes_alert_enabled.metadata.json +39 -0
  245. prowler/providers/alibabacloud/services/sls/sls_vpc_changes_alert_enabled/sls_vpc_changes_alert_enabled.py +57 -0
  246. prowler/providers/alibabacloud/services/sls/sls_vpc_network_route_changes_alert_enabled/__init__.py +0 -0
  247. prowler/providers/alibabacloud/services/sls/sls_vpc_network_route_changes_alert_enabled/sls_vpc_network_route_changes_alert_enabled.metadata.json +39 -0
  248. prowler/providers/alibabacloud/services/sls/sls_vpc_network_route_changes_alert_enabled/sls_vpc_network_route_changes_alert_enabled.py +52 -0
  249. prowler/providers/alibabacloud/services/vpc/__init__.py +0 -0
  250. prowler/providers/alibabacloud/services/vpc/vpc_client.py +4 -0
  251. prowler/providers/alibabacloud/services/vpc/vpc_flow_logs_enabled/__init__.py +0 -0
  252. prowler/providers/alibabacloud/services/vpc/vpc_flow_logs_enabled/vpc_flow_logs_enabled.metadata.json +39 -0
  253. prowler/providers/alibabacloud/services/vpc/vpc_flow_logs_enabled/vpc_flow_logs_enabled.py +30 -0
  254. prowler/providers/alibabacloud/services/vpc/vpc_service.py +102 -0
  255. prowler/providers/aws/aws_regions_by_service.json +20 -0
  256. prowler/providers/aws/services/apigateway/apigateway_restapi_waf_acl_attached/apigateway_restapi_waf_acl_attached.metadata.json +1 -3
  257. prowler/providers/aws/services/cloudtrail/cloudtrail_insights_exist/cloudtrail_insights_exist.metadata.json +1 -1
  258. prowler/providers/aws/services/cloudwatch/cloudwatch_changes_to_network_acls_alarm_configured/cloudwatch_changes_to_network_acls_alarm_configured.metadata.json +1 -2
  259. prowler/providers/aws/services/cloudwatch/cloudwatch_changes_to_network_gateways_alarm_configured/cloudwatch_changes_to_network_gateways_alarm_configured.metadata.json +1 -2
  260. 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
  261. prowler/providers/aws/services/cloudwatch/cloudwatch_changes_to_vpcs_alarm_configured/cloudwatch_changes_to_vpcs_alarm_configured.metadata.json +1 -2
  262. 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
  263. 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
  264. prowler/providers/aws/services/cloudwatch/cloudwatch_log_metric_filter_authentication_failures/cloudwatch_log_metric_filter_authentication_failures.metadata.json +1 -2
  265. prowler/providers/aws/services/cloudwatch/cloudwatch_log_metric_filter_aws_organizations_changes/cloudwatch_log_metric_filter_aws_organizations_changes.metadata.json +1 -2
  266. 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
  267. prowler/providers/aws/services/cloudwatch/cloudwatch_log_metric_filter_policy_changes/cloudwatch_log_metric_filter_policy_changes.metadata.json +1 -2
  268. prowler/providers/aws/services/cloudwatch/cloudwatch_log_metric_filter_root_usage/cloudwatch_log_metric_filter_root_usage.metadata.json +1 -2
  269. prowler/providers/aws/services/cloudwatch/cloudwatch_log_metric_filter_security_group_changes/cloudwatch_log_metric_filter_security_group_changes.metadata.json +1 -2
  270. 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
  271. prowler/providers/aws/services/cloudwatch/cloudwatch_log_metric_filter_unauthorized_api_calls/cloudwatch_log_metric_filter_unauthorized_api_calls.metadata.json +0 -1
  272. prowler/providers/aws/services/guardduty/guardduty_centrally_managed/guardduty_centrally_managed.metadata.json +16 -10
  273. prowler/providers/aws/services/guardduty/guardduty_ec2_malware_protection_enabled/guardduty_ec2_malware_protection_enabled.metadata.json +23 -14
  274. prowler/providers/aws/services/guardduty/guardduty_eks_audit_log_enabled/guardduty_eks_audit_log_enabled.metadata.json +19 -13
  275. prowler/providers/aws/services/guardduty/guardduty_eks_runtime_monitoring_enabled/guardduty_eks_runtime_monitoring_enabled.metadata.json +18 -12
  276. prowler/providers/aws/services/guardduty/guardduty_is_enabled/guardduty_is_enabled.metadata.json +24 -13
  277. prowler/providers/aws/services/guardduty/guardduty_lambda_protection_enabled/guardduty_lambda_protection_enabled.metadata.json +20 -14
  278. prowler/providers/aws/services/guardduty/guardduty_no_high_severity_findings/guardduty_no_high_severity_findings.metadata.json +18 -9
  279. prowler/providers/aws/services/guardduty/guardduty_rds_protection_enabled/guardduty_rds_protection_enabled.metadata.json +18 -11
  280. prowler/providers/aws/services/guardduty/guardduty_s3_protection_enabled/guardduty_s3_protection_enabled.metadata.json +21 -12
  281. prowler/providers/aws/services/lightsail/lightsail_database_public/lightsail_database_public.metadata.json +21 -13
  282. prowler/providers/aws/services/lightsail/lightsail_instance_automated_snapshots/lightsail_instance_automated_snapshots.metadata.json +24 -13
  283. prowler/providers/aws/services/lightsail/lightsail_instance_public/lightsail_instance_public.metadata.json +21 -13
  284. prowler/providers/aws/services/lightsail/lightsail_static_ip_unused/lightsail_static_ip_unused.metadata.json +23 -14
  285. prowler/providers/aws/services/macie/macie_automated_sensitive_data_discovery_enabled/macie_automated_sensitive_data_discovery_enabled.metadata.json +20 -12
  286. prowler/providers/aws/services/macie/macie_is_enabled/macie_is_enabled.metadata.json +17 -12
  287. prowler/providers/aws/services/mq/mq_broker_active_deployment_mode/mq_broker_active_deployment_mode.metadata.json +22 -13
  288. prowler/providers/aws/services/mq/mq_broker_auto_minor_version_upgrades/mq_broker_auto_minor_version_upgrades.metadata.json +21 -12
  289. prowler/providers/aws/services/mq/mq_broker_cluster_deployment_mode/mq_broker_cluster_deployment_mode.metadata.json +23 -14
  290. prowler/providers/aws/services/mq/mq_broker_logging_enabled/mq_broker_logging_enabled.metadata.json +22 -13
  291. prowler/providers/aws/services/mq/mq_broker_not_publicly_accessible/mq_broker_not_publicly_accessible.metadata.json +20 -12
  292. prowler/providers/aws/services/networkfirewall/networkfirewall_deletion_protection/networkfirewall_deletion_protection.metadata.json +21 -13
  293. prowler/providers/aws/services/networkfirewall/networkfirewall_in_all_vpc/networkfirewall_in_all_vpc.metadata.json +23 -13
  294. prowler/providers/aws/services/networkfirewall/networkfirewall_logging_enabled/networkfirewall_logging_enabled.metadata.json +20 -13
  295. prowler/providers/aws/services/networkfirewall/networkfirewall_multi_az/networkfirewall_multi_az.metadata.json +22 -14
  296. prowler/providers/aws/services/networkfirewall/networkfirewall_policy_default_action_fragmented_packets/networkfirewall_policy_default_action_fragmented_packets.metadata.json +26 -14
  297. prowler/providers/aws/services/networkfirewall/networkfirewall_policy_default_action_full_packets/networkfirewall_policy_default_action_full_packets.metadata.json +22 -13
  298. prowler/providers/aws/services/networkfirewall/networkfirewall_policy_rule_group_associated/networkfirewall_policy_rule_group_associated.metadata.json +25 -14
  299. prowler/providers/common/provider.py +12 -0
  300. prowler/providers/gcp/services/accesscontextmanager/__init__.py +0 -0
  301. prowler/providers/gcp/services/accesscontextmanager/accesscontextmanager_client.py +6 -0
  302. prowler/providers/gcp/services/accesscontextmanager/accesscontextmanager_service.py +101 -0
  303. prowler/providers/gcp/services/cloudresourcemanager/cloudresourcemanager_service.py +10 -0
  304. prowler/providers/gcp/services/cloudstorage/cloudstorage_service.py +13 -0
  305. prowler/providers/gcp/services/cloudstorage/cloudstorage_uses_vpc_service_controls/__init__.py +0 -0
  306. prowler/providers/gcp/services/cloudstorage/cloudstorage_uses_vpc_service_controls/cloudstorage_uses_vpc_service_controls.metadata.json +36 -0
  307. prowler/providers/gcp/services/cloudstorage/cloudstorage_uses_vpc_service_controls/cloudstorage_uses_vpc_service_controls.py +67 -0
  308. prowler/providers/gcp/services/compute/compute_instance_automatic_restart_enabled/__init__.py +0 -0
  309. prowler/providers/gcp/services/compute/compute_instance_automatic_restart_enabled/compute_instance_automatic_restart_enabled.metadata.json +36 -0
  310. prowler/providers/gcp/services/compute/compute_instance_automatic_restart_enabled/compute_instance_automatic_restart_enabled.py +35 -0
  311. prowler/providers/gcp/services/compute/compute_instance_deletion_protection_enabled/__init__.py +0 -0
  312. prowler/providers/gcp/services/compute/compute_instance_deletion_protection_enabled/compute_instance_deletion_protection_enabled.metadata.json +36 -0
  313. prowler/providers/gcp/services/compute/compute_instance_deletion_protection_enabled/compute_instance_deletion_protection_enabled.py +29 -0
  314. prowler/providers/gcp/services/compute/compute_instance_preemptible_vm_disabled/__init__.py +0 -0
  315. prowler/providers/gcp/services/compute/compute_instance_preemptible_vm_disabled/compute_instance_preemptible_vm_disabled.metadata.json +37 -0
  316. prowler/providers/gcp/services/compute/compute_instance_preemptible_vm_disabled/compute_instance_preemptible_vm_disabled.py +32 -0
  317. prowler/providers/gcp/services/compute/compute_service.py +16 -0
  318. prowler/providers/github/services/repository/repository_immutable_releases_enabled/__init__.py +0 -0
  319. prowler/providers/github/services/repository/repository_immutable_releases_enabled/repository_immutable_releases_enabled.metadata.json +33 -0
  320. prowler/providers/github/services/repository/repository_immutable_releases_enabled/repository_immutable_releases_enabled.py +41 -0
  321. prowler/providers/github/services/repository/repository_service.py +52 -0
  322. {prowler_cloud-5.14.1.dist-info → prowler_cloud-5.15.0.dist-info}/METADATA +40 -22
  323. {prowler_cloud-5.14.1.dist-info → prowler_cloud-5.15.0.dist-info}/RECORD +326 -73
  324. {prowler_cloud-5.14.1.dist-info → prowler_cloud-5.15.0.dist-info}/LICENSE +0 -0
  325. {prowler_cloud-5.14.1.dist-info → prowler_cloud-5.15.0.dist-info}/WHEEL +0 -0
  326. {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
@@ -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
@@ -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
@@ -0,0 +1,4 @@
1
+ from prowler.providers.alibabacloud.services.rds.rds_service import RDS
2
+ from prowler.providers.common.provider import Provider
3
+
4
+ rds_client = RDS(Provider.get_global_provider())