cloud-governance 1.1.370__tar.gz → 1.1.371__tar.gz

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 (279) hide show
  1. {cloud_governance-1.1.370/cloud_governance.egg-info → cloud_governance-1.1.371}/PKG-INFO +2 -1
  2. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/README.md +1 -0
  3. cloud_governance-1.1.371/cloud_governance/common/clouds/aws/iam/iam_operations.py +317 -0
  4. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/elasticsearch/modals/policy_es_data.py +2 -0
  5. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/utils/configs.py +2 -0
  6. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/main/environment_variables.py +1 -1
  7. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/main/main_oerations/main_operations.py +1 -1
  8. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/aws/monthly_report.py +2 -1
  9. cloud_governance-1.1.371/cloud_governance/policy/aws/unused_access_key.py +55 -0
  10. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/common_policies/send_aggregated_alerts.py +2 -1
  11. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/helpers/abstract_policy_operations.py +3 -3
  12. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/helpers/aws/aws_policy_operations.py +29 -2
  13. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/zombie_non_cluster/zombie_non_cluster_polices.py +1 -1
  14. {cloud_governance-1.1.370 → cloud_governance-1.1.371/cloud_governance.egg-info}/PKG-INFO +2 -1
  15. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance.egg-info/SOURCES.txt +1 -0
  16. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/setup.py +1 -1
  17. cloud_governance-1.1.370/cloud_governance/common/clouds/aws/iam/iam_operations.py +0 -160
  18. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/LICENSE +0 -0
  19. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/MANIFEST.in +0 -0
  20. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/__init__.py +0 -0
  21. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/__init__.py +0 -0
  22. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/clouds/__init__.py +0 -0
  23. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/clouds/aws/__init__.py +0 -0
  24. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/clouds/aws/ec2/__init__.py +0 -0
  25. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/clouds/aws/ec2/aws_monitor_tickets.py +0 -0
  26. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/clouds/aws/ec2/aws_tagging_operations.py +0 -0
  27. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/clouds/aws/ec2/collect_cro_reports.py +0 -0
  28. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/clouds/aws/ec2/cost_over_usage.py +0 -0
  29. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/clouds/aws/ec2/monitor_cro_instances.py +0 -0
  30. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/clouds/aws/ec2/run_cro.py +0 -0
  31. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/clouds/aws/ec2/tag_cro_instances.py +0 -0
  32. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/clouds/azure/__init__.py +0 -0
  33. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/clouds/azure/resource_groups/__init__.py +0 -0
  34. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/clouds/azure/resource_groups/abstract_resource.py +0 -0
  35. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/clouds/azure/resource_groups/azure_monitor_tickets.py +0 -0
  36. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/clouds/azure/resource_groups/azure_tagging_operations.py +0 -0
  37. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/clouds/azure/resource_groups/collect_cro_reports.py +0 -0
  38. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/clouds/azure/resource_groups/cost_over_usage.py +0 -0
  39. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/clouds/azure/resource_groups/monitor_cro_resources.py +0 -0
  40. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/clouds/azure/resource_groups/tag_cro_resources.py +0 -0
  41. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/clouds/common/__init__.py +0 -0
  42. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/clouds/common/abstract_collect_cro_reports.py +0 -0
  43. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/clouds/common/abstract_cost_over_usage.py +0 -0
  44. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/clouds/common/abstract_tagging_operations.py +0 -0
  45. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/common/__init__.py +0 -0
  46. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/common/abstract_monitor_tickets.py +0 -0
  47. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/common/cro_object.py +0 -0
  48. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/common/run_cro.py +0 -0
  49. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/monitor/__init__.py +0 -0
  50. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/monitor/cloud_monitor.py +0 -0
  51. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/utils/__init__.py +0 -0
  52. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/utils/common_operations.py +0 -0
  53. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/utils/constant_variables.py +0 -0
  54. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/utils/elastic_search_queries.py +0 -0
  55. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/__init__.py +0 -0
  56. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/__init__.py +0 -0
  57. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/__init__.py +0 -0
  58. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/athena/__init__.py +0 -0
  59. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/athena/abstract_athena_operations.py +0 -0
  60. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/athena/boto3_client_athena_operations.py +0 -0
  61. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/athena/pyathena_operations.py +0 -0
  62. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/cloudtrail/__init__.py +0 -0
  63. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/cloudtrail/cloudtrail_operations.py +0 -0
  64. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/cloudwatch/__init__.py +0 -0
  65. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/cloudwatch/cloudwatch_operations.py +0 -0
  66. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/cost_explorer/__init__.py +0 -0
  67. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/cost_explorer/cost_explorer_operations.py +0 -0
  68. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/dynamodb/__init__.py +0 -0
  69. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/dynamodb/dynamodb_operations.py +0 -0
  70. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/ec2/__init__.py +0 -0
  71. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/ec2/ec2_operations.py +0 -0
  72. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/iam/__init__.py +0 -0
  73. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/price/__init__.py +0 -0
  74. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/price/price.py +0 -0
  75. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/price/resources_pricing.py +0 -0
  76. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/rds/__init__.py +0 -0
  77. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/rds/rds_operations.py +0 -0
  78. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/resource_explorer/__init__.py +0 -0
  79. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/resource_explorer/resource_explorer_operations.py +0 -0
  80. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/resource_tagging_api/__init__.py +0 -0
  81. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/resource_tagging_api/resource_tag_api_operations.py +0 -0
  82. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/s3/__init__.py +0 -0
  83. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/s3/s3_operations.py +0 -0
  84. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/savingsplan/__init__.py +0 -0
  85. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/savingsplan/savings_plans_operations.py +0 -0
  86. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/sts/__init__.py +0 -0
  87. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/sts/sts_oprations.py +0 -0
  88. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/support/__init__.py +0 -0
  89. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/support/support_operations.py +0 -0
  90. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/utils/__init__.py +0 -0
  91. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/utils/common_methods.py +0 -0
  92. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/utils/utils.py +0 -0
  93. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/azure/__init__.py +0 -0
  94. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/azure/common/__init__.py +0 -0
  95. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/azure/common/common_operations.py +0 -0
  96. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/azure/compute/__init__.py +0 -0
  97. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/azure/compute/compute_operations.py +0 -0
  98. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/azure/compute/network_operations.py +0 -0
  99. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/azure/compute/resource_group_operations.py +0 -0
  100. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/azure/cost_management/__init__.py +0 -0
  101. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/azure/cost_management/cost_management_operations.py +0 -0
  102. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/azure/monitor/__init__.py +0 -0
  103. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/azure/monitor/monitor_management_operations.py +0 -0
  104. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/azure/subscriptions/__init__.py +0 -0
  105. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/azure/subscriptions/azure_operations.py +0 -0
  106. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/cloudability/__init__.py +0 -0
  107. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/cloudability/cloudability_operations.py +0 -0
  108. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/cloudability/templates/__init__.py +0 -0
  109. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/cloudability/templates/cloudability_dimensions.py +0 -0
  110. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/gcp/__init__.py +0 -0
  111. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/gcp/google_account.py +0 -0
  112. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/ibm/__init__.py +0 -0
  113. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/ibm/account/__init__.py +0 -0
  114. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/ibm/account/ibm_account.py +0 -0
  115. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/ibm/account/ibm_authenticator.py +0 -0
  116. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/ibm/classic/__init__.py +0 -0
  117. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/ibm/classic/classic_operations.py +0 -0
  118. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/ibm/developer_tools/__init__.py +0 -0
  119. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/ibm/developer_tools/schematic_operations.py +0 -0
  120. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/ibm/platform_services/__init__.py +0 -0
  121. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/ibm/platform_services/platform_service_operations.py +0 -0
  122. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/ibm/tagging/__init__.py +0 -0
  123. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/ibm/tagging/global_tagging_operations.py +0 -0
  124. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/ibm/vpc/__init__.py +0 -0
  125. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/clouds/ibm/vpc/vpc_infra_operations.py +0 -0
  126. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/elasticsearch/__init__.py +0 -0
  127. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/elasticsearch/elastic_upload.py +0 -0
  128. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/elasticsearch/elasticsearch_exceptions.py +0 -0
  129. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/elasticsearch/elasticsearch_operations.py +0 -0
  130. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/elasticsearch/modals/__init__.py +0 -0
  131. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/elasticsearch/modals/cost_usage_reports_data.py +0 -0
  132. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/google_drive/__init__.py +0 -0
  133. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/google_drive/gcp_operations.py +0 -0
  134. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/google_drive/google_drive_operations.py +0 -0
  135. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/google_drive/upload_to_gsheet.py +0 -0
  136. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/jira/__init__.py +0 -0
  137. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/jira/jira.py +0 -0
  138. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/jira/jira_exceptions.py +0 -0
  139. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/jira/jira_operations.py +0 -0
  140. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/ldap/__init__.py +0 -0
  141. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/ldap/ldap_search.py +0 -0
  142. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/logger/__init__.py +0 -0
  143. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/logger/init_logger.py +0 -0
  144. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/logger/logger_time_stamp.py +0 -0
  145. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/mails/__init__.py +0 -0
  146. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/mails/gmail.py +0 -0
  147. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/mails/mail_message.py +0 -0
  148. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/mails/postfix.py +0 -0
  149. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/mails/templates/cro_monitor_budget_remain_alert.j2 +0 -0
  150. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/mails/templates/cro_monitor_budget_remain_high_alert.j2 +0 -0
  151. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/mails/templates/cro_request_for_manager_approval.j2 +0 -0
  152. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/mails/templates/policy_alert_agg_message.j2 +0 -0
  153. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/pandas/__init__.py +0 -0
  154. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/pandas/pandas_operations.py +0 -0
  155. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/tool/__init__.py +0 -0
  156. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/tool/tool.py +0 -0
  157. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/utils/__init__.py +0 -0
  158. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/utils/api_requests.py +0 -0
  159. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/utils/json_datetime_encoder.py +0 -0
  160. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/common/utils/utils.py +0 -0
  161. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/main/__init__.py +0 -0
  162. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/main/environment_variables_exceptions.py +0 -0
  163. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/main/es_uploader.py +0 -0
  164. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/main/main.py +0 -0
  165. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/main/main_common_operations.py +0 -0
  166. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/main/main_oerations/__init__.py +0 -0
  167. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/main/run_cloud_resource_orchestration.py +0 -0
  168. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/__init__.py +0 -0
  169. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/aws/__init__.py +0 -0
  170. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/aws/cleanup/__init__.py +0 -0
  171. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/aws/cleanup/database_idle.py +0 -0
  172. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/aws/cleanup/instance_idle.py +0 -0
  173. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/aws/cleanup/instance_run.py +0 -0
  174. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/aws/cleanup/unattached_volume.py +0 -0
  175. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/aws/cleanup/unused_nat_gateway.py +0 -0
  176. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/aws/cost_billing_reports.py +0 -0
  177. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/aws/cost_explorer.py +0 -0
  178. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/aws/cost_explorer_payer_billings.py +0 -0
  179. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/aws/cost_over_usage.py +0 -0
  180. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/aws/ebs_in_use.py +0 -0
  181. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/aws/ec2_stop.py +0 -0
  182. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/aws/empty_roles.py +0 -0
  183. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/aws/ip_unattached.py +0 -0
  184. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/aws/monitor/__init__.py +0 -0
  185. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/aws/monitor/cluster_run.py +0 -0
  186. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/aws/optimize_resources_report.py +0 -0
  187. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/aws/s3_inactive.py +0 -0
  188. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/aws/skipped_resources.py +0 -0
  189. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/aws/spot_savings_analysis.py +0 -0
  190. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/aws/zombie_cluster_resource.py +0 -0
  191. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/aws/zombie_snapshots.py +0 -0
  192. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/azure/__init__.py +0 -0
  193. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/azure/cleanup/__init__.py +0 -0
  194. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/azure/cleanup/instance_idle.py +0 -0
  195. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/azure/cleanup/instance_run.py +0 -0
  196. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/azure/cleanup/ip_unattached.py +0 -0
  197. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/azure/cleanup/unattached_volume.py +0 -0
  198. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/azure/cleanup/unused_nat_gateway.py +0 -0
  199. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/azure/cost_billing_reports.py +0 -0
  200. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/common_policies/__init__.py +0 -0
  201. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/common_policies/cloudability_cost_reports.py +0 -0
  202. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/gcp/__init__.py +0 -0
  203. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/gcp/cost_billing_reports.py +0 -0
  204. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/helpers/__init__.py +0 -0
  205. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/helpers/aws/__init__.py +0 -0
  206. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/helpers/azure/__init__.py +0 -0
  207. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/helpers/azure/azure_policy_operations.py +0 -0
  208. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/helpers/cloudability_operations.py +0 -0
  209. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/ibm/__init__.py +0 -0
  210. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/ibm/cost_billing_reports.py +0 -0
  211. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/ibm/cost_usage_reports.py +0 -0
  212. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/ibm/ibm_cost_over_usage.py +0 -0
  213. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/ibm/ibm_cost_report.py +0 -0
  214. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/ibm/tag_baremetal.py +0 -0
  215. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/ibm/tag_resources.py +0 -0
  216. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/ibm/tag_vm.py +0 -0
  217. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/__init__.py +0 -0
  218. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/__init__.py +0 -0
  219. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/cost_expenditure/__init__.py +0 -0
  220. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/cost_expenditure/cost_report_policies.py +0 -0
  221. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/dynamodb_upload_data/__init__.py +0 -0
  222. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/dynamodb_upload_data/cloudtrail_to_dynamodb.py +0 -0
  223. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/dynamodb_upload_data/upload_data_to_dynamodb.py +0 -0
  224. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/tag_cluster/__init__.py +0 -0
  225. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/tag_cluster/remove_cluster_tags.py +0 -0
  226. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/tag_cluster/run_tag_cluster_resouces.py +0 -0
  227. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/tag_cluster/tag_cluster_operations.py +0 -0
  228. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/tag_cluster/tag_cluster_resouces.py +0 -0
  229. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/tag_non_cluster/__init__.py +0 -0
  230. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/tag_non_cluster/non_cluster_operations.py +0 -0
  231. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/tag_non_cluster/remove_non_cluster_tags.py +0 -0
  232. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/tag_non_cluster/run_tag_non_cluster_resources.py +0 -0
  233. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/tag_non_cluster/tag_non_cluster_resources.py +0 -0
  234. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/tag_non_cluster/update_na_tag_resources.py +0 -0
  235. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/tag_user/__init__.py +0 -0
  236. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/tag_user/iam_user_tags.py +0 -0
  237. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/tag_user/remove_user_tags.py +0 -0
  238. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/tag_user/run_tag_iam_user.py +0 -0
  239. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/tag_user/tag_iam_user.py +0 -0
  240. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/zombie_cluster/__init__.py +0 -0
  241. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/zombie_cluster/delete_ec2_resources.py +0 -0
  242. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/zombie_cluster/delete_iam_resources.py +0 -0
  243. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/zombie_cluster/delete_s3_resources.py +0 -0
  244. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/zombie_cluster/run_zombie_cluster_resources.py +0 -0
  245. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/zombie_cluster/validate_zombies.py +0 -0
  246. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/zombie_cluster/zombie_cluster_common_methods.py +0 -0
  247. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/zombie_non_cluster/__init__.py +0 -0
  248. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/zombie_non_cluster/run_zombie_non_cluster_policies.py +0 -0
  249. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/azure/__init__.py +0 -0
  250. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/azure/azure_policy_runner.py +0 -0
  251. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/gcp/__init__.py +0 -0
  252. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/gcp/gcp_policy_runner.py +0 -0
  253. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/gitleaks/__init__.py +0 -0
  254. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/gitleaks/gitleaks.py +0 -0
  255. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/ibm/__init__.py +0 -0
  256. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/ibm/ibm_operations/__init__.py +0 -0
  257. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/ibm/ibm_operations/ibm_operations.py +0 -0
  258. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/ibm/ibm_operations/ibm_policy_runner.py +0 -0
  259. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/ibm/tagging/__init__.py +0 -0
  260. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/ibm/tagging/tagging_operations.py +0 -0
  261. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_runners/__init__.py +0 -0
  262. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_runners/aws/__init__.py +0 -0
  263. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_runners/aws/policy_runner.py +0 -0
  264. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_runners/aws/upload_s3.py +0 -0
  265. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_runners/azure/__init__.py +0 -0
  266. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_runners/azure/policy_runner.py +0 -0
  267. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_runners/common/__init__.py +0 -0
  268. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_runners/common/abstract_policy_runner.py +0 -0
  269. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_runners/common/abstract_upload.py +0 -0
  270. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_runners/common_policy_runner.py +0 -0
  271. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_runners/elasticsearch/__init__.py +0 -0
  272. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_runners/elasticsearch/upload_elastic_search.py +0 -0
  273. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_runners/ibm/__init__.py +0 -0
  274. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance/policy/policy_runners/ibm/policy_runner.py +0 -0
  275. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance.egg-info/dependency_links.txt +0 -0
  276. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance.egg-info/not-zip-safe +0 -0
  277. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance.egg-info/requires.txt +0 -0
  278. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/cloud_governance.egg-info/top_level.txt +0 -0
  279. {cloud_governance-1.1.370 → cloud_governance-1.1.371}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cloud-governance
3
- Version: 1.1.370
3
+ Version: 1.1.371
4
4
  Summary: Cloud Governance Tool
5
5
  Home-page: https://github.com/redhat-performance/cloud-governance
6
6
  Author: Red Hat
@@ -103,6 +103,7 @@ List of Policies:
103
103
  - zombie_snapshots
104
104
  - unused_nat_gateway
105
105
  - s3_inactive
106
+ - unused_access_key
106
107
  - empty_roles
107
108
  - tag_resources
108
109
  - tag_iam_user
@@ -35,6 +35,7 @@ List of Policies:
35
35
  - zombie_snapshots
36
36
  - unused_nat_gateway
37
37
  - s3_inactive
38
+ - unused_access_key
38
39
  - empty_roles
39
40
  - tag_resources
40
41
  - tag_iam_user
@@ -0,0 +1,317 @@
1
+ import os
2
+
3
+ import boto3
4
+
5
+ from cloud_governance.common.clouds.aws.utils.common_methods import get_boto3_client
6
+ from cloud_governance.common.clouds.aws.utils.utils import Utils
7
+ from cloud_governance.common.logger.init_logger import logger
8
+ from datetime import datetime, timezone
9
+
10
+
11
+ class IAMOperations:
12
+
13
+ ACCESS_KEY_LABEL_MAP = {"access key 1": 0, "access key 2": 1}
14
+
15
+ def __init__(self, iam_client=None):
16
+ self.iam_client = iam_client if iam_client else get_boto3_client('iam')
17
+ self.utils = Utils()
18
+ self.__sts_client = boto3.client('sts')
19
+
20
+ @property
21
+ def get_iam_client(self):
22
+ return self.iam_client
23
+
24
+ def get_user_tags(self, username: str):
25
+ """
26
+ This method return tags from the iam resources
27
+ @param username:
28
+ @return:
29
+ """
30
+ try:
31
+ user = self.iam_client.get_user(UserName=username)['User']
32
+ if user.get('Tags'):
33
+ return user.get('Tags')
34
+ else:
35
+ return []
36
+ except:
37
+ return []
38
+
39
+ def get_roles(self):
40
+ """
41
+ This method returns all roles
42
+ @return:
43
+ """
44
+ return self.utils.get_details_resource_list(func_name=self.iam_client.list_roles, input_tag='Roles',
45
+ check_tag='Marker')
46
+
47
+ def get_users(self):
48
+ """
49
+ This method returns all users
50
+ @return:
51
+ """
52
+ return self.utils.get_details_resource_list(self.iam_client.list_users, input_tag='Users', check_tag='Marker')
53
+
54
+ def get_account_alias_cloud_name(self):
55
+ """
56
+ This method returns the aws account alias and cloud name
57
+ @return:
58
+ """
59
+ try:
60
+ account_alias = self.iam_client.list_account_aliases()['AccountAliases']
61
+ if account_alias:
62
+ return account_alias[0].upper(), 'AwsCloud'.upper()
63
+ except:
64
+ return os.environ.get('account', '').upper(), 'AwsCloud'.upper()
65
+
66
+ def get_iam_users_list(self):
67
+ """
68
+ This method return the IAM users list
69
+ :return:
70
+ """
71
+ iam_users = []
72
+ users = self.get_users()
73
+ for user in users:
74
+ iam_users.append(user.get('UserName'))
75
+ return iam_users
76
+
77
+ def get_aws_account_id_name(self):
78
+ """
79
+ This method returns the aws account_id
80
+ :return:
81
+ """
82
+ response = self.__sts_client.get_caller_identity()
83
+ account_id = response['Account']
84
+ return account_id
85
+
86
+ def get_role(self, role_name: str):
87
+ """
88
+ This method returns the iam role data
89
+ :param role_name:
90
+ :return:
91
+ """
92
+ role_data = {}
93
+ try:
94
+ role_data = self.iam_client.get_role(RoleName=role_name).get('Role')
95
+ except Exception as err:
96
+ logger.error(err)
97
+ return role_data
98
+
99
+ def list_inline_role_policies(self, role_name: str):
100
+ """
101
+ This method returns the iam role inline policies
102
+ :param role_name:
103
+ :return:
104
+ """
105
+ role_policies = []
106
+ try:
107
+ role_policies = self.iam_client.list_role_policies(RoleName=role_name).get('PolicyNames', [])
108
+ except Exception as err:
109
+ logger.error(err)
110
+ return role_policies
111
+
112
+ def list_attached_role_policies(self, role_name: str):
113
+ """
114
+ This method returns the iam role attached policies
115
+ :param role_name:
116
+ :return:
117
+ """
118
+ attached_policies = []
119
+ try:
120
+ attached_policies = self.iam_client.list_attached_role_policies(RoleName=role_name).get('AttachedPolicies',
121
+ [])
122
+ except Exception as err:
123
+ logger.error(err)
124
+ return attached_policies
125
+
126
+ def delete_role(self, role_name: str):
127
+ """
128
+ This method deletes the iam role
129
+ :param role_name:
130
+ :return:
131
+ """
132
+ try:
133
+ self.iam_client.delete_role(RoleName=role_name)
134
+ return True
135
+ except Exception as err:
136
+ raise err
137
+
138
+ def tag_role(self, role_name: str, tags: list):
139
+ """
140
+ This method tags the iam role
141
+ :param role_name:
142
+ :param tags:
143
+ :return:
144
+ """
145
+ try:
146
+ self.iam_client.tag_role(RoleName=role_name, Tags=tags)
147
+ return True
148
+ except Exception as err:
149
+ raise err
150
+
151
+ def untag_role(self, role_name: str, tags: list):
152
+ """
153
+ This method untags the iam role
154
+ :param role_name:
155
+ :param tags:
156
+ :return:
157
+ """
158
+ try:
159
+ self.iam_client.untag_role(RoleName=role_name,
160
+ TagKeys=[key for tag in tags for key, _ in tag.items() if key == 'Key'])
161
+ return True
162
+ except Exception as err:
163
+ raise err
164
+
165
+ def tag_user(self, user_name: str, tags: list):
166
+ """
167
+ This method tags the IAM user.
168
+ :param user_name: The name of the IAM user to tag.
169
+ :param tags: A list of tags to associate with the user.
170
+ :return: True if tagging is successful, otherwise raises an exception.
171
+ """
172
+ try:
173
+ self.iam_client.tag_user(UserName=user_name, Tags=tags)
174
+ return True
175
+ except Exception as err:
176
+ raise err
177
+
178
+ def get_iam_users_access_keys(self):
179
+ """
180
+ Retrieves IAM users and summarizes:
181
+ - Access key status (active/inactive)
182
+ - Access key age in days
183
+ - Access key last used in days (or "N/A" if never used)
184
+ - Tags (as a list of dictionaries)
185
+ - Most recent key usage: last_activity_days
186
+ - IAM client region (global context, since IAM is non-regional)
187
+ - IAM user unique ID: ResourceId
188
+
189
+ Returns:
190
+ dict: {
191
+ "username": {
192
+ "Access key 1": [status, age_days, last_used_days],
193
+ "Access key 2": [...],
194
+ "last_activity_days": int or "N/A",
195
+ "tags": [{"Key": "tag_key", "Value": "tag_value"}, ...],
196
+ "region": "us-east-1",
197
+ "ResourceId": "AIDAEXAMPLEUSERID"
198
+ },
199
+ ...
200
+ }
201
+ """
202
+ result = {}
203
+ now = datetime.now(timezone.utc)
204
+ region_name = self.iam_client.meta.region_name or "global"
205
+
206
+ paginator = self.iam_client.get_paginator('list_users')
207
+ for page in paginator.paginate():
208
+ for user in page['Users']:
209
+ username = user['UserName']
210
+ result[username] = {}
211
+ # Access keys
212
+ access_keys = self.iam_client.list_access_keys(UserName=username)['AccessKeyMetadata']
213
+ for idx, key in enumerate(access_keys, start=1):
214
+ label = f"Access key {idx}"
215
+ status = key['Status'].lower()
216
+ age_days = (now - key['CreateDate']).days
217
+
218
+ # Get access key last used
219
+ try:
220
+ response = self.iam_client.get_access_key_last_used(AccessKeyId=key['AccessKeyId'])
221
+ last_used_date = response.get('AccessKeyLastUsed', {}).get('LastUsedDate')
222
+ if last_used_date:
223
+ last_used_days = (now - last_used_date).days
224
+ else:
225
+ last_used_days = "N/A"
226
+ except Exception:
227
+ last_used_days = "N/A"
228
+
229
+ result[username][label] = {'label': label, 'status': status, 'age_days': age_days, 'last_activity_days': last_used_days if last_used_days is not None else "N/A"}
230
+
231
+ # Tags as list of dicts
232
+ try:
233
+ tag_response = self.iam_client.list_user_tags(UserName=username)
234
+ tags = tag_response.get('Tags', [])
235
+ except Exception:
236
+ tags = []
237
+
238
+ result[username]["tags"] = tags
239
+ result[username]["region"] = region_name
240
+ result[username]["ResourceId"] = user.get('UserId') # <-- Unique ID
241
+
242
+ return result
243
+
244
+ def has_active_access_keys(self, username: str, access_key_label: str = None) -> bool:
245
+ """
246
+ Checks if the given IAM user has any active access keys.
247
+ Optionally filters by access key label ("Access Key 1" or "Access Key 2").
248
+
249
+ Args:
250
+ username (str): IAM user name
251
+ access_key_label (str): Label to filter access keys ("Access Key 1"/"Access Key 2")
252
+
253
+ Returns:
254
+ bool: True if any access key is active (and matches the label if provided), False otherwise
255
+ """
256
+ try:
257
+ keys = self.iam_client.list_access_keys(UserName=username)['AccessKeyMetadata']
258
+ except Exception as e:
259
+ logger.error(f"Failed to list access keys for user '{username}': {e}")
260
+ return False
261
+
262
+ # Sort keys by CreateDate ascending (oldest first)
263
+ keys.sort(key=lambda k: k['CreateDate'])
264
+
265
+ if access_key_label:
266
+ idx = self.ACCESS_KEY_LABEL_MAP.get(access_key_label.lower())
267
+ if idx is None or idx >= len(keys):
268
+ return False
269
+ return keys[idx].get('Status') == 'Active'
270
+
271
+ return any(k.get('Status') == 'Active' for k in keys)
272
+
273
+ def deactivate_user_access_key(self, username: str, **kwargs):
274
+ """
275
+ Deactivates the specified access key for the given IAM user.
276
+
277
+ Args:
278
+ username (str): IAM user name
279
+ access_key_label (str): Access Key 1 or Access Key 2 (case-insensitive)
280
+ """
281
+ access_key_label = kwargs.get('access_key_label', '').lower()
282
+ if not access_key_label:
283
+ logger.warning("No access key label provided for deactivation.")
284
+ return
285
+
286
+ try:
287
+ access_keys = self.iam_client.list_access_keys(UserName=username)['AccessKeyMetadata']
288
+ except Exception as e:
289
+ logger.error(f"Failed to list access keys for user '{username}': {e}")
290
+ return
291
+
292
+ # Sort keys by CreateDate ascending (oldest first) for consistent indexing
293
+ access_keys.sort(key=lambda k: k['CreateDate'])
294
+
295
+ idx = self.ACCESS_KEY_LABEL_MAP.get(access_key_label)
296
+ if idx is None or idx >= len(access_keys):
297
+ logger.warning(f"Access key label '{access_key_label}' not found for user '{username}'")
298
+ return
299
+
300
+ key_to_deactivate = access_keys[idx]
301
+ access_key_id = key_to_deactivate['AccessKeyId']
302
+ current_status = key_to_deactivate['Status'].lower()
303
+
304
+ if current_status == 'active':
305
+ try:
306
+ self.iam_client.update_access_key(
307
+ UserName=username,
308
+ AccessKeyId=access_key_id,
309
+ Status='Inactive'
310
+ )
311
+ logger.info(f"Access key '{access_key_id}' deactivated for user '{username}'")
312
+ except Exception as e:
313
+ logger.error(f"Failed to deactivate access key '{access_key_id}' for user '{username}': {e}")
314
+ else:
315
+ logger.info(f"Access key '{access_key_id}' is already inactive for user '{username}'")
316
+
317
+ logger.info(f"Access key deactivation processed for user '{username}'.")
@@ -37,6 +37,8 @@ class PolicyEsMetaData(dict):
37
37
  launch_time: str = ''
38
38
  running_days: int = ''
39
39
  create_date: str = ''
40
+ age_days: int = ''
41
+ last_activity_days: int = ''
40
42
 
41
43
  def __post_init__(self):
42
44
  """
@@ -22,6 +22,8 @@ INSTANCE_IDLE_NETWORK_OUT_KILO_BYTES = 5 # In KiB
22
22
  EC2_NAMESPACE = 'AWS/EC2'
23
23
  CLOUDWATCH_METRICS_AVAILABLE_DAYS = 14
24
24
  AWS_DEFAULT_GLOBAL_REGION = 'us-east-1'
25
+ UNUSED_ACCESS_KEY_DAYS = 90
26
+ UNUSED_ACCESS_KEY_MAX_DAY = 1000
25
27
 
26
28
  # X86 to Graviton
27
29
  GRAVITON_MAPPINGS = {
@@ -98,7 +98,7 @@ class EnvironmentVariables:
98
98
  'ip_unattached', 'unused_nat_gateway',
99
99
  'instance_idle',
100
100
  'ec2_stop', 'ebs_in_use', 'database_idle',
101
- 's3_inactive',
101
+ 's3_inactive', 'unused_access_key',
102
102
  'empty_roles',
103
103
  'zombie_snapshots', 'skipped_resources',
104
104
  'monthly_report', 'optimize_resources_report']
@@ -42,7 +42,7 @@ class MainOperations:
42
42
  # @Todo support for all the aws policies, currently supports ec2_run as urgent requirement
43
43
  if self._policy in policies and self._policy in ["instance_run", "unattached_volume", "cluster_run",
44
44
  "ip_unattached", "unused_nat_gateway", "instance_idle",
45
- "zombie_snapshots", "database_idle", "s3_inactive",
45
+ "zombie_snapshots", "database_idle", "s3_inactive", "unused_access_key",
46
46
  "empty_roles", "tag_resources", "cost_usage_reports"]:
47
47
  source = policy_type
48
48
  if Utils.equal_ignore_case(policy_type, self._public_cloud_name):
@@ -37,7 +37,8 @@ class MonthlyReport:
37
37
  'ip_unattached': 'Delete all the elastic_ips that are unused',
38
38
  'unused_nat_gateway': ' Delete all unused nat gateways',
39
39
  'zombie_snapshots': 'Delete all the snapshots which the AMI does not use',
40
- 's3_inactive': 'Delete the empty buckets which don’t have any content.',
40
+ 's3_inactive': 'Delete the empty buckets which don’t have any content',
41
+ 'unused_access_key': 'Deactivate user access keys that are still active but have not been used',
41
42
  'empty_roles': 'Delete the empty role which does\'t have any policies',
42
43
  'zombie_cluster_resource': 'Delete up the cluster resources which are not deleted while cleaning the cluster'
43
44
  }
@@ -0,0 +1,55 @@
1
+ from cloud_governance.common.utils.configs import UNUSED_ACCESS_KEY_DAYS, UNUSED_ACCESS_KEY_MAX_DAY
2
+ from cloud_governance.policy.helpers.aws.aws_policy_operations import AWSPolicyOperations
3
+
4
+
5
+ class UnusedAccessKey(AWSPolicyOperations):
6
+ RESOURCE_ACTION = "DeActivate"
7
+
8
+ def __init__(self):
9
+ super().__init__()
10
+
11
+ def run_policy_operations(self):
12
+ """
13
+ This method returns a list of users with at least one active access key whose last used date is greater than UNUSED_ACCESS_KEY_DAYS
14
+ :return:
15
+ :rtype:
16
+ """
17
+ unused_access_keys = []
18
+ iam_users_access_keys = self._get_iam_users_access_keys()
19
+ for username, user_data in iam_users_access_keys.items():
20
+ for access_key_label, access_key_data in user_data.items():
21
+ if 'access key' in access_key_label.lower():
22
+ last_activity_days = access_key_data['last_activity_days']
23
+ age_days = access_key_data['age_days']
24
+ # if access key last_activity_days is "N/A", use age_days
25
+ if last_activity_days == "N/A":
26
+ last_activity_days = age_days
27
+ region = user_data['region']
28
+ user_name = username
29
+ tags = user_data.get('Tags', [])
30
+ cleanup_result = False
31
+ cleanup_days = 0
32
+ if int(last_activity_days) >= UNUSED_ACCESS_KEY_DAYS and self._has_active_access_keys(user_name, access_key_label) and self.get_skip_policy_value(tags=tags) not in ('NOTDELETE', 'SKIP'):
33
+ cleanup_days = self.get_clean_up_days_count(tags=tags)
34
+ cleanup_result = self.verify_and_delete_resource(resource_id=user_name, tags=tags,
35
+ clean_up_days=cleanup_days, access_key_label=access_key_label)
36
+ resource_data = self._get_es_schema(resource_id=user_name,
37
+ user=self.get_tag_name_from_tags(tags=tags, tag_name='User'),
38
+ skip_policy=self.get_skip_policy_value(tags=tags),
39
+ cleanup_days=cleanup_days,
40
+ dry_run=self._dry_run,
41
+ name=user_name,
42
+ region=region,
43
+ cleanup_result=str(cleanup_result),
44
+ resource_action=self.RESOURCE_ACTION,
45
+ cloud_name=self._cloud_name,
46
+ resource_type='UnusedAccessKey',
47
+ resource_state='Active',
48
+ age_days=age_days,
49
+ last_activity_days=last_activity_days,
50
+ unit_price=0)
51
+ unused_access_keys.append(resource_data)
52
+ if not cleanup_result:
53
+ self.update_resource_day_count_tag(resource_id=user_name, cleanup_days=cleanup_days, tags=tags)
54
+
55
+ return unused_access_keys
@@ -163,7 +163,8 @@ class SendAggregatedAlerts:
163
163
  if days >= days_to_take_action:
164
164
  delete_date = datetime.utcnow().date().__str__()
165
165
  alert_user = True
166
- if record.get('policy') in ['empty_roles', 's3_inactive']:
166
+ # Cross region policies
167
+ if record.get('policy') in ['empty_roles', 's3_inactive', 'unused_access_key']:
167
168
  record['RegionName'] = 'us-east-1'
168
169
  if Utils.equal_ignore_case(dry_run, 'yes'):
169
170
  record['DeleteDate'] = 'dry_run=yes'
@@ -111,7 +111,7 @@ class AbstractPolicyOperations(ABC):
111
111
  return 'NA'
112
112
 
113
113
  @abstractmethod
114
- def _delete_resource(self, resource_id: str):
114
+ def _delete_resource(self, resource_id: str, **kwargs):
115
115
  """
116
116
  This method deletes the resource
117
117
  :param resource_id:
@@ -144,7 +144,7 @@ class AbstractPolicyOperations(ABC):
144
144
  :rtype:
145
145
  """
146
146
  if self._resource_id == resource_id and self._force_delete and self._dry_run == 'no':
147
- self._delete_resource(resource_id=resource_id)
147
+ self._delete_resource(resource_id=resource_id, **kwargs)
148
148
  return True
149
149
  if not days_to_delete_resource:
150
150
  days_to_delete_resource = self._days_to_take_action
@@ -157,7 +157,7 @@ class AbstractPolicyOperations(ABC):
157
157
  if clean_up_days >= days_to_delete_resource:
158
158
  if self._dry_run == 'no':
159
159
  if self.get_skip_policy_value(tags=tags) not in ('NOTDELETE', 'SKIP'):
160
- self._delete_resource(resource_id=resource_id)
160
+ self._delete_resource(resource_id=resource_id, **kwargs)
161
161
  cleanup_resources = True
162
162
  return cleanup_resources
163
163
 
@@ -21,7 +21,7 @@ class AWSPolicyOperations(AbstractPolicyOperations):
21
21
  self.policy_name = self._environment_variables_dict.get('policy')
22
22
  self._cloud_name = 'AWS'
23
23
  self._ec2_client = get_boto3_client(client='ec2', region_name=self._region)
24
- self._s3_client = get_boto3_client('s3', region_name=self._region)
24
+ self._s3_client = get_boto3_client(client='s3', region_name=self._region)
25
25
  self._iam_operations = IAMOperations()
26
26
  self._rds_operations = RDSOperations(region_name=self._region)
27
27
  self._s3operations = S3Operations(region_name=self._region)
@@ -46,7 +46,7 @@ class AWSPolicyOperations(AbstractPolicyOperations):
46
46
  return tag.get('Value').strip()
47
47
  return ''
48
48
 
49
- def _delete_resource(self, resource_id: str):
49
+ def _delete_resource(self, resource_id: str, **kwargs):
50
50
  """
51
51
  This method deletes the resource by verifying the policy
52
52
  :param resource_id:
@@ -58,6 +58,8 @@ class AWSPolicyOperations(AbstractPolicyOperations):
58
58
  try:
59
59
  if self._policy == 's3_inactive':
60
60
  self._s3_client.delete_bucket(Bucket=resource_id)
61
+ elif self._policy == 'unused_access_key':
62
+ self._iam_operations.deactivate_user_access_key(username=resource_id, **kwargs)
61
63
  elif self._policy == 'empty_roles':
62
64
  response = self._iam_operations.delete_role(role_name=resource_id)
63
65
  elif self._policy == 'unattached_volume':
@@ -147,6 +149,8 @@ class AWSPolicyOperations(AbstractPolicyOperations):
147
149
  try:
148
150
  if self._policy == 's3_inactive':
149
151
  self._s3_client.put_bucket_tagging(Bucket=resource_id, Tagging={'TagSet': tags})
152
+ elif self._policy == 'unused_access_key':
153
+ self._iam_operations.tag_user(user_name=resource_id, tags=tags)
150
154
  elif self._policy == 'empty_roles':
151
155
  self._iam_operations.tag_role(role_name=resource_id, tags=tags)
152
156
  elif self._policy in ('ip_unattached', 'unused_nat_gateway', 'zombie_snapshots', 'unattached_volume',
@@ -196,6 +200,29 @@ class AWSPolicyOperations(AbstractPolicyOperations):
196
200
  volumes = self._ec2_operations.get_volumes(**kwargs)
197
201
  return volumes
198
202
 
203
+ def _get_iam_users_access_keys(self) -> dict:
204
+ """
205
+ This method returns a list of user access keys with their age in days, last used time in days, user tags, and more.
206
+ :return: list of user access keys
207
+ """
208
+ return self._iam_operations.get_iam_users_access_keys()
209
+
210
+ def _has_active_access_keys(self, user_name: str, access_key_label: str) -> bool:
211
+ """
212
+ This method checks if the given IAM user has any active access keys.
213
+ :return:
214
+ :rtype:
215
+ """
216
+ return self._iam_operations.has_active_access_keys(username=user_name, access_key_label=access_key_label)
217
+
218
+ def _deactivate_access_key(self, user_name: str, access_key_label: str) -> bool:
219
+ """
220
+ This method checks if the given IAM user has any active access keys.
221
+ :return:
222
+ :rtype:
223
+ """
224
+ return self._iam_operations.deactivate_user_access_key(username=user_name, access_key_label=access_key_label)
225
+
199
226
  def _get_active_cluster_ids(self):
200
227
  """
201
228
  This method returns the active cluster id's
@@ -45,7 +45,7 @@ class ZombieNonClusterPolicies(NonClusterZombiePolicy):
45
45
  logger.error('ElasticSearch host is not pingable, Please check ')
46
46
 
47
47
  if self._policy_output:
48
- # if self._policy not in ('ec2_idle', 'ebs_in_use', 'ec2_run', 's3_inactive', 'zombie_snapshots', 'nat_gateway_unused'):
48
+ # if self._policy not in ('ec2_idle', 'ebs_in_use', 'ec2_run', 's3_inactive', 'unused_access_key', 'zombie_snapshots', 'nat_gateway_unused'):
49
49
  # beautify_data = self._beautify_upload_data(upload_resource_data=response)
50
50
  # policy_result = {'count': len(beautify_data), self._policy: beautify_data}
51
51
  logger.info(policy_result)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cloud-governance
3
- Version: 1.1.370
3
+ Version: 1.1.371
4
4
  Summary: Cloud Governance Tool
5
5
  Home-page: https://github.com/redhat-performance/cloud-governance
6
6
  Author: Red Hat
@@ -103,6 +103,7 @@ List of Policies:
103
103
  - zombie_snapshots
104
104
  - unused_nat_gateway
105
105
  - s3_inactive
106
+ - unused_access_key
106
107
  - empty_roles
107
108
  - tag_resources
108
109
  - tag_iam_user
@@ -177,6 +177,7 @@ cloud_governance/policy/aws/optimize_resources_report.py
177
177
  cloud_governance/policy/aws/s3_inactive.py
178
178
  cloud_governance/policy/aws/skipped_resources.py
179
179
  cloud_governance/policy/aws/spot_savings_analysis.py
180
+ cloud_governance/policy/aws/unused_access_key.py
180
181
  cloud_governance/policy/aws/zombie_cluster_resource.py
181
182
  cloud_governance/policy/aws/zombie_snapshots.py
182
183
  cloud_governance/policy/aws/cleanup/__init__.py
@@ -2,7 +2,7 @@ from codecs import open
2
2
  from os import path
3
3
  from setuptools import setup, find_packages
4
4
 
5
- __version__ = '1.1.370'
5
+ __version__ = '1.1.371'
6
6
 
7
7
  here = path.abspath(path.dirname(__file__))
8
8