aws-samples/sample-AWS-Security-Hub-Cost-Estimation-Tool

GitHub: aws-samples/sample-AWS-Security-Hub-Cost-Estimation-Tool

一个用于估算 AWS Security Hub 成本的只读数据收集工具,通过扫描组织内各账户的实际资源使用情况生成 CSV 成本估算报告。

Stars: 2 | Forks: 0

# AWS Security Hub 成本估算工具 **一次性、只读的数据收集工具**,用于估算您组织内的 AWS Security Hub 成本。 ## 此工具的功能 此工具**运行一次**,从您的 AWS 账户收集资源指标,并生成用于成本估算的 CSV 报告。它: - ✅ **只读操作** - 不对您的环境进行任何更改 - ✅ **一次性执行** - 收集数据快照后停止 - ✅ **无持久资源** - Lambda 通过 CloudFormation 运行一次,结果保存至 S3 - ✅ **无论是否启用 Security Hub 均可工作** - 无论 Security Hub 当前是否处于活动状态,都会收集资源数据 **使用场景:** 根据您当前的资源使用情况估算每月的 Security Hub 成本——无论您是在启用 Security Hub 之前进行评估,还是在审查现有部署的成本。 ## 收集的内容 | 指标 | 来源 | 用途 | |--------|--------|----------| | EC2 实例小时数/月 | Cost Explorer(管理账户,上月) | Security Hub EC2 定价 | | ECR 推送的镜像(最近 7 天) | Inspector(如已启用),否则为 ECR API | Security Hub ECR 扫描定价 | | Lambda 函数(最近 90 天内活跃) | Inspector(如已启用),否则为 Lambda API | Security Hub Lambda 扫描定价 | | IAM 用户和角色 | IAM API | Security Hub IAM 分析定价 | ## 部署概览 ``` ┌─────────────────────────────────────────────────────────────────┐ │ Step 1: Deploy IAM Role to Management Account │ │ │ │ Management Account (SecurityHubCostEstimatorRole) │ │ └──> Used for org-wide EC2 hours via Cost Explorer │ │ │ │ ⚠️ Cost Explorer data is only available here │ └─────────────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────────────┐ │ Step 2: Deploy IAM Role to Member Accounts (via StackSets) │ │ │ │ ├──> Member Account 1 (SecurityHubCostEstimatorRole) │ │ ├──> Member Account 2 (SecurityHubCostEstimatorRole) │ │ ├──> Member Account 3 (SecurityHubCostEstimatorRole) │ │ └──> ... (all member accounts) │ │ │ │ ⚠️ Lambda CANNOT run without this role in each account │ └─────────────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────────────┐ │ Step 3: Deploy Lambda Collector (in Audit/Security Account) │ │ │ │ Audit/Security Account │ │ │ │ │ └──> Lambda Function (runs once automatically) │ │ │ │ │ ├──> Assumes role in Management Account │ │ │ └──> Gets org-wide EC2 hours (Cost Explorer) │ │ ├──> Assumes role in Member Account 1 │ │ ├──> Assumes role in Member Account 2 │ │ └──> Saves results to S3 │ └─────────────────────────────────────────────────────────────────┘ ``` ## 快速入门 ### 选项 1:CloudFormation 部署(推荐) **这是推荐的方法** - 部署一个自动运行一次的 Lambda 函数。 #### 前置条件 在开始之前,您需要: 1. **管理账户访问权限**(或 CloudFormation StackSets 委派管理员)以便在整个组织内部署角色 2. **审计/安全账户访问权限**,您将在此账户中运行 Lambda 收集器 3. 将运行 Lambda 的审计/安全账户的**账户 ID** #### 步骤 1:将只读角色部署到管理账户 **首先将 IAM 角色部署到您的管理(付费)账户。** Lambda 使用此角色从 Cost Explorer 检索组织范围内的 EC2 小时数,这仅在管理账户中可用。 从您的**管理账户**执行: ``` aws cloudformation deploy \ --template-file member-account-role.yaml \ --stack-name security-hub-cost-estimator-role \ --parameter-overrides CollectorAccountId=YOUR_COLLECTOR_ACCOUNT_ID \ --capabilities CAPABILITY_NAMED_IAM ``` #### 步骤 2:将只读角色部署到所有成员账户 **通过 StackSets 将 IAM 角色部署到每个成员账户。** Lambda 需要此角色来从每个账户收集 ECR、Lambda 和 IAM 数据。 **选项 A:通过 CloudFormation StackSets 部署(推荐)** 从您的管理账户或 CloudFormation 委派管理员执行: ``` # 克隆 repository git clone cd aws-security-hub-cost-estimator # 通过 StackSets 部署(从 management account 或 delegated admin 运行) aws cloudformation create-stack-set \ --template-body file://member-account-role.yaml \ --stack-set-name security-hub-cost-estimator-roles \ --permission-model SERVICE_MANAGED \ --auto-deployment Enabled=true,RetainStacksOnAccountRemoval=false \ --capabilities CAPABILITY_NAMED_IAM \ --parameters ParameterKey=CollectorAccountId,ParameterValue=YOUR_COLLECTOR_ACCOUNT_ID \ --call-as SELF # 为您的 organization 中的所有 account 创建 stack instance aws cloudformation create-stack-instances \ --stack-set-name security-hub-cost-estimator-roles \ --deployment-targets OrganizationalUnitIds='["YOUR_ROOT_OU_ID"]' \ --regions '["us-east-1"]' \ --operation-preferences FailureTolerancePercentage=100,MaxConcurrentPercentage=100 ``` **选项 B:通过 AWS 控制台部署** 1. 登录到您的**管理账户**或 CloudFormation 委派管理员账户 2. 导航到 **CloudFormation** → **StackSets** 3. 点击 **Create StackSet** 4. 选择 **Template is ready** → **Upload a template file** 5. 上传 `member-account-role.yaml` 6. 点击 **Next** 7. 输入 StackSet 名称:`security-hub-cost-estimator-roles` 8. 将参数 **CollectorAccountId** 设置为您的审计/安全账户 ID 9. 点击 **Next** 10. 在 **Permissions** 下,选择 **Service-managed permissions** 11. 启用 **Automatic deployment** 12. 点击 **Next** 13. 在 **Deployment targets** 下,选择 **Deploy to organization** 14. 选择您的根 OU 或特定 OU 15. 选择区域:**us-east-1** 16. 设置 **Maximum concurrent accounts**:100% 17. 设置 **Failure tolerance**:100% 18. 点击 **Next** → **Submit** #### 步骤 3:部署 Lambda 收集器 在您的审计/安全工具账户中部署 Lambda 函数: **选项 A:通过 AWS CLI 部署** ``` # 部署 stack aws cloudformation deploy \ --template-file security-hub-cost-estimator.yaml \ --stack-name security-hub-cost-estimator \ --parameter-overrides \ CrossAccountRoleName=SecurityHubCostEstimatorRole \ TargetRegion=us-east-1 \ ManagementAccountId=YOUR_MANAGEMENT_ACCOUNT_ID \ --capabilities CAPABILITY_IAM ``` **选项 B:通过 AWS 控制台部署** 1. 登录到您的**审计/安全账户** 2. 导航到 **CloudFormation** → **Stacks** 3. 点击 **Create stack** → **With new resources (standard)** 4. 选择 **Template is ready** → **Upload a template file** 5. 上传 `security-hub-cost-estimator.yaml` 6. 点击 **Next** 7. 输入堆栈名称:`security-hub-cost-estimator` 8. 设置参数: - **CrossAccountRoleName**:`SecurityHubCostEstimatorRole` - **TargetRegion**:`us-east-1`(或您的首选区域) - **ManagementAccountId**:您的管理(付费)账户 ID - **AccountIds**:留空以通过 Organizations 自动发现 9. 点击 **Next** 10. 滚动到底部,勾选 **I acknowledge that AWS CloudFormation might create IAM resources** 11. 点击 **Submit** 创建堆栈时,Lambda 函数会自动运行一次。结果将保存到由该堆栈创建的 S3 存储桶中。 #### 步骤 3:检索结果 ``` # 从 stack outputs 获取 bucket name BUCKET=$(aws cloudformation describe-stacks \ --stack-name security-hub-cost-estimator \ --query 'Stacks[0].Outputs[?OutputKey==`ResultsBucket`].OutputValue' \ --output text) # 下载结果 aws s3 ls s3://$BUCKET/ aws s3 cp s3://$BUCKET/security_hub_cost_data_YYYYMMDD_HHMMSS.csv ./ ``` ### 选项 2:Python 脚本(手动) 如果您倾向于手动运行收集或需要更多控制,请使用这些脚本。 **运行位置:** 从 AWS CloudShell、您的本地计算机或具有适当 AWS 凭证的 EC2 实例运行。 #### 前置条件 ``` pip install boto3 ``` #### 运行脚本 **单账户:** ``` python3 collect_security_hub_data.py ``` **多账户:** ``` python3 collect_security_hub_data_multi_account.py --role-name SecurityHubCostEstimatorRole --management-account YOUR_MANAGEMENT_ACCOUNT_ID ``` ## 输出 创建一个 CSV 文件:`security_hub_data_YYYYMMDD_HHMMSS.csv` 示例: ``` Account ID,Region,ECR Images (Last 7 Days),Lambda Functions (Active 90 Days),IAM Users,IAM Roles,Data Source ECR,Data Source Lambda 123456789012,us-east-1,42,30,12,85,Inspector,Inspector 234567890123,us-east-1,10,15,5,45,ECR API,Lambda API Org-Wide EC2 Monthly Hours (from Cost Explorer),18000 Avg EC2 Instances (Hours/720),25.0 ``` 将此数据与 [Security Hub 定价计算器](https://aws.amazon.com/security-hub/pricing/) 或您的内部定价工具结合使用。 ## 所需的 IAM 权限 **唯一的要求是在每个账户中拥有一个只读 IAM 角色**。当使用提供的 IAM 策略进行部署时,该工具旨在不对您的环境进行任何更改。 ### 成员账户角色(只读) 将 `member-account-role.yaml` 部署到每个账户。这将创建一个采用最低权限原则设计的角色,仅授予以下只读权限: | 服务 | 权限 | 用途 | |---------|-------------|---------| | **Cost Explorer** | `ce:GetCostAndUsage` | 获取上个月的 EC2 实例小时数,用于 Security Hub EC2 定价 | | **ECR** | `ecr:DescribeRepositories`
`ecr:DescribeImages` | 计算最近 7 天内推送的容器镜像数量,用于 Security Hub ECR 扫描定价 | | **Lambda** | `lambda:ListFunctions` | 计算最近 90 天内活跃的 Lambda 函数数量,用于 Security Hub Lambda 扫描定价 | | **IAM** | `iam:ListUsers`
`iam:ListRoles` | 计算 IAM 资源数量,用于 Security Hub IAM 分析定价 | | **Amazon Inspector** | `inspector2:ListCoverage` | 如果已启用,从 Inspector 获取 ECR 和 Lambda 数据(首选来源) |
查看完整的 IAM 策略 JSON ``` { "Version": "2012-10-17", "Statement": [ { "Sid": "CostExplorerReadOnly", "Effect": "Allow", "Action": ["ce:GetCostAndUsage"], "Resource": "*" }, { "Sid": "ECRReadOnly", "Effect": "Allow", "Action": [ "ecr:DescribeRepositories", "ecr:DescribeImages" ], "Resource": "*" }, { "Sid": "LambdaReadOnly", "Effect": "Allow", "Action": ["lambda:ListFunctions"], "Resource": "*" }, { "Sid": "IAMReadOnly", "Effect": "Allow", "Action": [ "iam:ListUsers", "iam:ListRoles" ], "Resource": "*" }, { "Sid": "InspectorReadOnly", "Effect": "Allow", "Action": ["inspector2:ListCoverage"], "Resource": "*", "Comment": "Amazon Inspector - resource-level permissions not supported" } ] } ``` 角色信任策略将访问权限限制为**仅限**您收集器账户中的 Lambda 执行角色: ``` { "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::COLLECTOR_ACCOUNT_ID:root" }, "Action": "sts:AssumeRole", "Condition": { "StringLike": { "aws:PrincipalArn": "arn:aws:iam::COLLECTOR_ACCOUNT_ID:role/*LambdaExecutionRole*" } } }] } ```
### 收集器账户权限 您收集器账户中的 Lambda 函数需要: - `sts:AssumeRole` - 用于担任成员账户中的只读角色 - `organizations:ListAccounts` - 用于发现账户(如果未提供明确列表) - `s3:PutObject` - 用于将结果保存到 S3 存储桶 这些权限由 `security-hub-cost-estimator.yaml` 自动配置。 ## 使用示例 ### 单账户 - 不同区域 ``` python3 collect_security_hub_data.py --region us-west-2 ``` ### 单账户 - 特定 AWS Profile ``` python3 collect_security_hub_data.py --profile production ``` ### 多账户 - 通过 Organizations 自动发现 ``` python3 collect_security_hub_data_multi_account.py \ --role-name SecurityHubDataCollectionRole \ --management-account YOUR_MANAGEMENT_ACCOUNT_ID ``` ### 多账户 - 特定账户列表 ``` python3 collect_security_hub_data_multi_account.py \ --role-name SecurityHubDataCollectionRole \ --management-account YOUR_MANAGEMENT_ACCOUNT_ID \ --accounts 111111111111,222222222222,333333333333 ``` ### 多账户 - 不同区域 ``` python3 collect_security_hub_data_multi_account.py \ --role-name SecurityHubDataCollectionRole \ --management-account YOUR_MANAGEMENT_ACCOUNT_ID \ --region eu-west-1 ``` ## 多账户设置 要进行多账户收集,必须将只读 IAM 角色部署到每个成员账户。请使用上述快速入门部分中的 CloudFormation StackSets 方法,或手动部署: ### 将角色部署到成员账户 使用提供的 `member-account-role.yaml` 模板: ``` aws cloudformation deploy \ --template-file member-account-role.yaml \ --stack-name security-hub-cost-estimator-role \ --parameter-overrides CollectorAccountId=MANAGEMENT_ACCOUNT_ID \ --capabilities CAPABILITY_NAMED_IAM ``` 这将创建一个具有以下特点的角色: - 用于 Cost Explorer、ECR、Lambda、IAM 和 Amazon Inspector 的**只读权限** - **信任策略**,将访问权限限制为仅限您收集器账户中的 Lambda 执行角色 - **无写入权限** - 无法修改任何资源 ## 注意事项 - **只读设计**:与提供的 IAM 策略配合使用时,脚本旨在不对您的 AWS 环境进行任何更改 - **EC2 小时数**:从管理(付费)账户的 Cost Explorer 中检索上一个日历月的数据(组织范围的总量) - **ECR 镜像**:最近 7 天内推送的镜像,如果启用了 Inspector 则从中获取数据,否则通过 ECR API 获取 - **Lambda 函数**:在最近 90 天内更新或调用的函数,如果启用了 Inspector 则从中获取数据,否则通过 Lambda API 获取 - **多账户**:并行处理 5 个账户(可通过 `--max-workers` 配置) - **一次性执行**:创建 CloudFormation 堆栈时 Lambda 运行一次 ## 许可证 MIT License - 详见 LICENSE 文件
标签:Amazon Inspector, AWS, CloudFormation, CostExplorer, CSV 报告, DPI, EC2, ECR, IaC, IAM, Lambda, S3, SaaS 成本, SecurityHub, Web技术栈, 二进制发布, 云计费, 只读工具, 开源工具, 成本估算, 报表生成, 数据收集工具, 漏洞探索, 组织管理, 财务管理, 资源监控, 资源采集, 逆向工具