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