概述

本文将详细介绍如何通过AWS管理控制台的IAM服务检查账户权限,导出权限策略的JSON格式信息,并使用Python代码创建包含权限策略名称和生效状态的Excel工作簿。

操作流程

利用AWS管理控制台的IAM服务检查我的AWS账户对多种AWS组件服务的权限并导出所有的权限策略(Permission Policy)的JSON格式文本信息到一个JSON文件中并创建Python代码文件在一个包含2列的Excel工作簿的表格,其中第一列是权限策略名称,从AWS IAM Policy Simulator工具里得到,第二列是它是否生效,是没有数据的空列,需要根据权限策略名称和JSON文件的配置信息,得到该权限策略是否生效的数据,找到JSON文件里生效了权限策略就输出“是”,否则输出“否”。

第一阶段:AWS IAM权限策略导出

步骤1:登录AWS管理控制台
  1. 访问 AWS管理控制台
  2. 使用您的凭证登录
步骤2:访问IAM服务
  1. 在服务搜索框中输入"IAM"并选择"IAM"服务
  2. 进入IAM仪表板
步骤3:获取权限策略信息
  1. 在左侧导航栏中选择"Policies"
  2. 这里会显示所有可用的策略(包括AWS托管策略和客户管理策略)
  3. 记录您需要分析的策略名称和ARN
步骤4:导出策略JSON(手动方法)

对于每个策略:

  1. 点击策略名称进入详情页
  2. 在"Policy document"部分,点击"Edit"
  3. 复制完整的JSON策略文档
  4. 将所有策略的JSON保存到一个文件中

第二阶段:Python代码实现

以下是完整的Python代码实现:

import json
import boto3
import pandas as pd
from botocore.exceptions import ClientError
import os

class AWSPolicyAnalyzer:
    def __init__(self, profile_name=None):
        """初始化AWS会话"""
        if profile_name:
            self.session = boto3.Session(profile_name=profile_name)
        else:
            self.session = boto3.Session()
        
        self.iam_client = self.session.client('iam')
        self.policies_data = []
        
    def get_all_policies(self):
        """获取所有IAM策略"""
        try:
            paginator = self.iam_client.get_paginator('list_policies')
            policies = []
            
            for page in paginator.paginate(Scope='All'):
                policies.extend(page['Policies'])
            
            return policies
        except ClientError as e:
            print(f"获取策略时出错: {e}")
            return []
    
    def export_policies_to_json(self, output_file='aws_policies.json'):
        """导出所有策略到JSON文件"""
        policies = self.get_all_policies()
        policies_info = []
        
        for policy in policies:
            try:
                # 获取策略详情
                policy_version = self.iam_client.get_policy_version(
                    PolicyArn=policy['Arn'],
                    VersionId=policy['DefaultVersionId']
                )
                
                policy_info = {
                    'PolicyName': policy['PolicyName'],
                    'PolicyArn': policy['Arn'],
                    'PolicyDocument': policy_version['PolicyVersion']['Document'],
                    'IsAttachable': policy['IsAttachable'],
                    'AttachmentCount': policy['AttachmentCount']
                }
                
                policies_info.append(policy_info)
                print(f"已处理策略: {policy['PolicyName']}")
                
            except ClientError as e:
                print(f"处理策略 {policy['PolicyName']} 时出错: {e}")
                continue
        
        # 保存到JSON文件
        with open(output_file, 'w', encoding='utf-8') as f:
            json.dump(policies_info, f, indent=2, ensure_ascii=False)
        
        print(f"策略已导出到: {output_file}")
        self.policies_data = policies_info
        return policies_info
    
    def is_policy_effective(self, policy_info):
        """检查策略是否生效"""
        try:
            # 策略生效的条件:
            # 1. 策略是可附加的
            # 2. 策略有附件或被使用
            # 3. 策略文档语法正确
            
            if not policy_info.get('IsAttachable', False):
                return "否"
            
            if policy_info.get('AttachmentCount', 0) > 0:
                return "是"
            
            # 检查策略文档是否有有效语句
            policy_doc = policy_info.get('PolicyDocument', {})
            statements = policy_doc.get('Statement', [])
            
            if not statements:
                return "否"
            
            # 检查是否有允许或拒绝的操作
            for statement in statements:
                if isinstance(statement, dict):
                    effect = statement.get('Effect', '').lower()
                    actions = statement.get('Action', [])
                    resources = statement.get('Resource', [])
                    
                    if effect in ['allow', 'deny'] and (actions or resources):
                        return "是"
            
            return "否"
            
        except Exception as e:
            print(f"检查策略 {policy_info.get('PolicyName', 'Unknown')} 生效状态时出错: {e}")
            return "否"
    
    def create_policy_analysis_excel(self, json_file='aws_policies.json', output_file='policy_analysis.xlsx'):
        """创建策略分析Excel文件"""
        try:
            # 如果还没有加载数据,从JSON文件加载
            if not self.policies_data:
                with open(json_file, 'r', encoding='utf-8') as f:
                    self.policies_data = json.load(f)
            
            # 准备Excel数据
            excel_data = []
            
            for policy in self.policies_data:
                policy_name = policy.get('PolicyName', 'Unknown')
                is_effective = self.is_policy_effective(policy)
                
                excel_data.append({
                    '权限策略名称': policy_name,
                    '是否生效': is_effective
                })
            
            # 创建DataFrame
            df = pd.DataFrame(excel_data)
            
            # 保存到Excel
            with pd.ExcelWriter(output_file, engine='openpyxl') as writer:
                df.to_excel(writer, sheet_name='策略分析', index=False)
                
                # 格式化工作表
                workbook = writer.book
                worksheet = writer.sheets['策略分析']
                
                # 设置列宽
                worksheet.column_dimensions['A'].width = 50
                worksheet.column_dimensions['B'].width = 15
                
                # 设置标题样式
                for cell in worksheet[1]:
                    cell.font = pd.ExcelWriter.workbook.add_format({'bold': True})
            
            print(f"分析结果已保存到: {output_file}")
            return True
            
        except Exception as e:
            print(f"创建Excel文件时出错: {e}")
            return False

def main():
    """主函数"""
    # 初始化分析器
    analyzer = AWSPolicyAnalyzer()
    
    # 导出策略到JSON
    print("正在导出AWS IAM策略...")
    analyzer.export_policies_to_json('aws_policies.json')
    
    # 创建分析Excel
    print("正在创建策略分析Excel...")
    analyzer.create_policy_analysis_excel('aws_policies.json', 'policy_analysis.xlsx')
    
    print("操作完成!")
    print("生成的文件:")
    print("- aws_policies.json: 包含所有策略的JSON数据")
    print("- policy_analysis.xlsx: 包含策略名称和生效状态的Excel文件")

if __name__ == "__main__":
    main()

第三阶段:依赖安装和配置

安装必要的Python包
pip install boto3 pandas openpyxl
AWS凭证配置

确保您的AWS凭证已正确配置,可以通过以下方式之一:

  1. AWS CLI配置:aws configure
  2. 环境变量:设置AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY
  3. IAM角色(如果在EC2实例上运行)

第四阶段:运行和分析

运行Python脚本
python aws_policy_analyzer.py
输出文件说明
  1. aws_policies.json: 包含所有IAM策略的完整JSON信息
  2. policy_analysis.xlsx: 包含两列的Excel文件
    • 第一列:权限策略名称
    • 第二列:是否生效(“是"或"否”)

代码详细说明

1. AWSPolicyAnalyzer类

这个类是核心组件,负责:

  • 与AWS IAM服务交互
  • 导出策略信息
  • 分析策略有效性
  • 生成输出文件

2. 策略有效性判断逻辑

代码通过以下条件判断策略是否生效:

  • 策略是否可附加(IsAttachable
  • 策略是否有附件(AttachmentCount
  • 策略文档是否包含有效的允许/拒绝语句

3. 错误处理

代码包含完整的异常处理,确保:

  • AWS API调用失败时不会中断整个流程
  • 单个策略处理失败不影响其他策略
  • 提供详细的错误信息用于调试

高级功能和扩展

1. 支持多个AWS配置文件

# 可以指定特定的AWS配置文件
analyzer = AWSPolicyAnalyzer(profile_name='my-profile')

2. 自定义策略分析规则

您可以修改is_policy_effective方法来实现更复杂的策略有效性判断逻辑。

3. 批量操作支持

代码使用分页器处理大量策略,确保能够获取账户中的所有策略。

安全注意事项

  1. 最小权限原则: 确保执行此脚本的IAM角色/用户只有必要的读取权限
  2. 敏感信息保护: 生成的JSON文件包含策略详情,请妥善保管
  3. 审计跟踪: 建议在受控环境中运行此类脚本

故障排除

常见问题及解决方案

  1. 权限不足错误

    • 确保IAM用户/角色有iam:ListPoliciesiam:GetPolicyVersion权限
  2. 速率限制错误

    • 代码包含基本的错误重试逻辑,但对于大量策略可能需要添加延迟
  3. JSON格式错误

    • 确保AWS CLI和SDK版本兼容

结论

通过本文介绍的方法,您可以:

  • 系统性地分析AWS账户中的IAM权限策略
  • 自动化导出策略信息和分析过程
  • 生成易于理解的报告用于安全审计和合规检查

这种方法不仅提高了权限管理的效率,还为持续的安全监控奠定了基础。您可以根据具体需求进一步扩展此解决方案,例如添加更复杂的策略分析规则或集成到CI/CD流水线中。

Logo

葡萄城是专业的软件开发技术和低代码平台提供商,聚焦软件开发技术,以“赋能开发者”为使命,致力于通过表格控件、低代码和BI等各类软件开发工具和服务

更多推荐