cloud-governance 1.1.369__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.
- {cloud_governance-1.1.369/cloud_governance.egg-info → cloud_governance-1.1.371}/PKG-INFO +2 -1
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/README.md +1 -0
- cloud_governance-1.1.371/cloud_governance/common/clouds/aws/iam/iam_operations.py +317 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/elasticsearch/modals/policy_es_data.py +2 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/utils/configs.py +2 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/main/environment_variables.py +3 -1
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/main/main_oerations/main_operations.py +1 -1
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/aws/monthly_report.py +2 -1
- cloud_governance-1.1.371/cloud_governance/policy/aws/unused_access_key.py +55 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/common_policies/send_aggregated_alerts.py +4 -2
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/helpers/abstract_policy_operations.py +3 -3
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/helpers/aws/aws_policy_operations.py +29 -2
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/zombie_non_cluster/zombie_non_cluster_polices.py +1 -1
- {cloud_governance-1.1.369 → cloud_governance-1.1.371/cloud_governance.egg-info}/PKG-INFO +2 -1
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance.egg-info/SOURCES.txt +1 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/setup.py +1 -1
- cloud_governance-1.1.369/cloud_governance/common/clouds/aws/iam/iam_operations.py +0 -160
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/LICENSE +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/MANIFEST.in +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/clouds/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/clouds/aws/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/clouds/aws/ec2/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/clouds/aws/ec2/aws_monitor_tickets.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/clouds/aws/ec2/aws_tagging_operations.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/clouds/aws/ec2/collect_cro_reports.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/clouds/aws/ec2/cost_over_usage.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/clouds/aws/ec2/monitor_cro_instances.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/clouds/aws/ec2/run_cro.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/clouds/aws/ec2/tag_cro_instances.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/clouds/azure/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/clouds/azure/resource_groups/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/clouds/azure/resource_groups/abstract_resource.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/clouds/azure/resource_groups/azure_monitor_tickets.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/clouds/azure/resource_groups/azure_tagging_operations.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/clouds/azure/resource_groups/collect_cro_reports.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/clouds/azure/resource_groups/cost_over_usage.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/clouds/azure/resource_groups/monitor_cro_resources.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/clouds/azure/resource_groups/tag_cro_resources.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/clouds/common/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/clouds/common/abstract_collect_cro_reports.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/clouds/common/abstract_cost_over_usage.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/clouds/common/abstract_tagging_operations.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/common/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/common/abstract_monitor_tickets.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/common/cro_object.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/common/run_cro.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/monitor/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/monitor/cloud_monitor.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/utils/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/utils/common_operations.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/utils/constant_variables.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/cloud_resource_orchestration/utils/elastic_search_queries.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/athena/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/athena/abstract_athena_operations.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/athena/boto3_client_athena_operations.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/athena/pyathena_operations.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/cloudtrail/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/cloudtrail/cloudtrail_operations.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/cloudwatch/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/cloudwatch/cloudwatch_operations.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/cost_explorer/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/cost_explorer/cost_explorer_operations.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/dynamodb/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/dynamodb/dynamodb_operations.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/ec2/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/ec2/ec2_operations.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/iam/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/price/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/price/price.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/price/resources_pricing.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/rds/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/rds/rds_operations.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/resource_explorer/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/resource_explorer/resource_explorer_operations.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/resource_tagging_api/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/resource_tagging_api/resource_tag_api_operations.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/s3/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/s3/s3_operations.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/savingsplan/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/savingsplan/savings_plans_operations.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/sts/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/sts/sts_oprations.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/support/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/support/support_operations.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/utils/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/utils/common_methods.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/aws/utils/utils.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/azure/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/azure/common/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/azure/common/common_operations.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/azure/compute/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/azure/compute/compute_operations.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/azure/compute/network_operations.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/azure/compute/resource_group_operations.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/azure/cost_management/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/azure/cost_management/cost_management_operations.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/azure/monitor/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/azure/monitor/monitor_management_operations.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/azure/subscriptions/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/azure/subscriptions/azure_operations.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/cloudability/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/cloudability/cloudability_operations.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/cloudability/templates/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/cloudability/templates/cloudability_dimensions.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/gcp/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/gcp/google_account.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/ibm/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/ibm/account/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/ibm/account/ibm_account.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/ibm/account/ibm_authenticator.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/ibm/classic/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/ibm/classic/classic_operations.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/ibm/developer_tools/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/ibm/developer_tools/schematic_operations.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/ibm/platform_services/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/ibm/platform_services/platform_service_operations.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/ibm/tagging/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/ibm/tagging/global_tagging_operations.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/ibm/vpc/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/clouds/ibm/vpc/vpc_infra_operations.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/elasticsearch/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/elasticsearch/elastic_upload.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/elasticsearch/elasticsearch_exceptions.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/elasticsearch/elasticsearch_operations.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/elasticsearch/modals/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/elasticsearch/modals/cost_usage_reports_data.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/google_drive/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/google_drive/gcp_operations.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/google_drive/google_drive_operations.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/google_drive/upload_to_gsheet.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/jira/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/jira/jira.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/jira/jira_exceptions.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/jira/jira_operations.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/ldap/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/ldap/ldap_search.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/logger/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/logger/init_logger.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/logger/logger_time_stamp.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/mails/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/mails/gmail.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/mails/mail_message.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/mails/postfix.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/mails/templates/cro_monitor_budget_remain_alert.j2 +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/mails/templates/cro_monitor_budget_remain_high_alert.j2 +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/mails/templates/cro_request_for_manager_approval.j2 +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/mails/templates/policy_alert_agg_message.j2 +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/pandas/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/pandas/pandas_operations.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/tool/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/tool/tool.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/utils/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/utils/api_requests.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/utils/json_datetime_encoder.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/utils/utils.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/main/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/main/environment_variables_exceptions.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/main/es_uploader.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/main/main.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/main/main_common_operations.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/main/main_oerations/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/main/run_cloud_resource_orchestration.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/aws/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/aws/cleanup/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/aws/cleanup/database_idle.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/aws/cleanup/instance_idle.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/aws/cleanup/instance_run.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/aws/cleanup/unattached_volume.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/aws/cleanup/unused_nat_gateway.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/aws/cost_billing_reports.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/aws/cost_explorer.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/aws/cost_explorer_payer_billings.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/aws/cost_over_usage.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/aws/ebs_in_use.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/aws/ec2_stop.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/aws/empty_roles.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/aws/ip_unattached.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/aws/monitor/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/aws/monitor/cluster_run.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/aws/optimize_resources_report.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/aws/s3_inactive.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/aws/skipped_resources.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/aws/spot_savings_analysis.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/aws/zombie_cluster_resource.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/aws/zombie_snapshots.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/azure/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/azure/cleanup/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/azure/cleanup/instance_idle.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/azure/cleanup/instance_run.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/azure/cleanup/ip_unattached.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/azure/cleanup/unattached_volume.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/azure/cleanup/unused_nat_gateway.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/azure/cost_billing_reports.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/common_policies/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/common_policies/cloudability_cost_reports.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/gcp/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/gcp/cost_billing_reports.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/helpers/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/helpers/aws/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/helpers/azure/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/helpers/azure/azure_policy_operations.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/helpers/cloudability_operations.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/ibm/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/ibm/cost_billing_reports.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/ibm/cost_usage_reports.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/ibm/ibm_cost_over_usage.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/ibm/ibm_cost_report.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/ibm/tag_baremetal.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/ibm/tag_resources.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/ibm/tag_vm.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/cost_expenditure/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/cost_expenditure/cost_report_policies.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/dynamodb_upload_data/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/dynamodb_upload_data/cloudtrail_to_dynamodb.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/dynamodb_upload_data/upload_data_to_dynamodb.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/tag_cluster/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/tag_cluster/remove_cluster_tags.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/tag_cluster/run_tag_cluster_resouces.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/tag_cluster/tag_cluster_operations.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/tag_cluster/tag_cluster_resouces.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/tag_non_cluster/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/tag_non_cluster/non_cluster_operations.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/tag_non_cluster/remove_non_cluster_tags.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/tag_non_cluster/run_tag_non_cluster_resources.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/tag_non_cluster/tag_non_cluster_resources.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/tag_non_cluster/update_na_tag_resources.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/tag_user/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/tag_user/iam_user_tags.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/tag_user/remove_user_tags.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/tag_user/run_tag_iam_user.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/tag_user/tag_iam_user.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/zombie_cluster/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/zombie_cluster/delete_ec2_resources.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/zombie_cluster/delete_iam_resources.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/zombie_cluster/delete_s3_resources.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/zombie_cluster/run_zombie_cluster_resources.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/zombie_cluster/validate_zombies.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/zombie_cluster/zombie_cluster_common_methods.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/zombie_non_cluster/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/aws/zombie_non_cluster/run_zombie_non_cluster_policies.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/azure/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/azure/azure_policy_runner.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/gcp/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/gcp/gcp_policy_runner.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/gitleaks/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/gitleaks/gitleaks.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/ibm/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/ibm/ibm_operations/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/ibm/ibm_operations/ibm_operations.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/ibm/ibm_operations/ibm_policy_runner.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/ibm/tagging/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_operations/ibm/tagging/tagging_operations.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_runners/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_runners/aws/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_runners/aws/policy_runner.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_runners/aws/upload_s3.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_runners/azure/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_runners/azure/policy_runner.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_runners/common/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_runners/common/abstract_policy_runner.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_runners/common/abstract_upload.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_runners/common_policy_runner.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_runners/elasticsearch/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_runners/elasticsearch/upload_elastic_search.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_runners/ibm/__init__.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/policy_runners/ibm/policy_runner.py +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance.egg-info/dependency_links.txt +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance.egg-info/not-zip-safe +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance.egg-info/requires.txt +0 -0
- {cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance.egg-info/top_level.txt +0 -0
- {cloud_governance-1.1.369 → 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.
|
|
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
|
|
@@ -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}'.")
|
{cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/common/utils/configs.py
RENAMED
|
@@ -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 = {
|
{cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/main/environment_variables.py
RENAMED
|
@@ -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']
|
|
@@ -283,6 +283,8 @@ class EnvironmentVariables:
|
|
|
283
283
|
self._environment_variables_dict['POLICIES_TO_ALERT'] = literal_eval(
|
|
284
284
|
EnvironmentVariables.get_env('POLICIES_TO_ALERT', '[]'))
|
|
285
285
|
self._environment_variables_dict['ADMIN_MAIL_LIST'] = EnvironmentVariables.get_env('ADMIN_MAIL_LIST', '')
|
|
286
|
+
self._environment_variables_dict['SKIP_POLICIES_ALERT'] = literal_eval(
|
|
287
|
+
EnvironmentVariables.get_env('SKIP_POLICIES_ALERT', "['']"))
|
|
286
288
|
if self._environment_variables_dict.get('policy') in ['send_aggregated_alerts', 'cloudability_cost_reports']:
|
|
287
289
|
self._environment_variables_dict['COMMON_POLICIES'] = True
|
|
288
290
|
# CRO -- Cloud Resource Orch
|
|
@@ -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):
|
{cloud_governance-1.1.369 → cloud_governance-1.1.371}/cloud_governance/policy/aws/monthly_report.py
RENAMED
|
@@ -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
|
|
@@ -20,6 +20,7 @@ class SendAggregatedAlerts:
|
|
|
20
20
|
self.__mail_to = self.__environment_variables.get('EMAIL_TO') # testing purposes
|
|
21
21
|
self.__mail_cc = self.__environment_variables.get('EMAIL_CC', [])
|
|
22
22
|
self.__alert_dry_run = self.__environment_variables.get('ALERT_DRY_RUN')
|
|
23
|
+
self.__skip_policies_alert = self.__environment_variables.get('SKIP_POLICIES_ALERT')
|
|
23
24
|
self.__mail_message = MailMessage()
|
|
24
25
|
self.__postfix = Postfix()
|
|
25
26
|
self.__es_operations = ElasticSearchOperations()
|
|
@@ -55,7 +56,7 @@ class SendAggregatedAlerts:
|
|
|
55
56
|
"ebs_in_use",
|
|
56
57
|
"instance_run", "cluster_run", "optimize_resource_report",
|
|
57
58
|
"optimize_resources_report", "skipped_resources"
|
|
58
|
-
]
|
|
59
|
+
] + self.__skip_policies_alert
|
|
59
60
|
}
|
|
60
61
|
}
|
|
61
62
|
],
|
|
@@ -162,7 +163,8 @@ class SendAggregatedAlerts:
|
|
|
162
163
|
if days >= days_to_take_action:
|
|
163
164
|
delete_date = datetime.utcnow().date().__str__()
|
|
164
165
|
alert_user = True
|
|
165
|
-
|
|
166
|
+
# Cross region policies
|
|
167
|
+
if record.get('policy') in ['empty_roles', 's3_inactive', 'unused_access_key']:
|
|
166
168
|
record['RegionName'] = 'us-east-1'
|
|
167
169
|
if Utils.equal_ignore_case(dry_run, 'yes'):
|
|
168
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.
|
|
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
|