BeyondTrust/bedrock-keys-security

GitHub: BeyondTrust/bedrock-keys-security

用于发现和清理 AWS Bedrock API 密钥创建的幽灵 IAM 用户,提供应急响应能力和预防性 SCP 策略

Stars: 5 | Forks: 0

# Bedrock API 密钥安全 用于 AWS Bedrock API 密钥的安全工具包。发现幽灵 IAM 用户、解码泄露的密钥、自动化清理并执行预防性控制。 [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](LICENSE) [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/) [![Twitter](https://img.shields.io/twitter/url/https/twitter.com/MrCloudSec.svg?style=social&label=Follow%20the%20author)](https://twitter.com/MrCloudSec) ## 动机 当用户通过 AWS Console 创建长期 Bedrock API 密钥时,AWS 会静默配置一个名为 `BedrockAPIKey-xxxx` 的 IAM 用户,并附加 `AmazonBedrockLimitedAccess` 托管策略。尽管其名称暗示受限,但该策略授予了广泛的权限: - 对所有资源的 `bedrock:*`(完全 Bedrock 管理员权限) - `iam:ListRoles`(身份枚举) - `kms:DescribeKey`(加密密钥发现) - `ec2:Describe*`(网络侦察) 这些幽灵用户永远不会被自动清理。它们随着时间推移不断积累,制造出大多数组织都不知道其存在的、不断扩大的攻击面。 ### 攻击路径 ![Attack Paths Diagram](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/38c7335f5c092900.jpg) **LLMjacking:** 获取泄露密钥的攻击者可以在所有 AWS 区域启动工作线程以消耗基础模型容量。有组织报告称,每个区域的欺诈费用每天超过 14,000 美元。 ![LLMJacking Attack Flow](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/5bdfc7e8b7092902.jpg) **权限提升:** 如果攻击者在幽灵用户上创建了 IAM 访问密钥,或者已存在此类密钥,他们将获得持久性 IAM 凭证(`AKIA...`),其权限范围远超 Bedrock。从那里,他们可以横向移动到 S3、Secrets Manager 和其他服务,即使在原始 Bedrock 密钥过期之后。 ## 概述 AWS Bedrock API 密钥([于 2025 年 7 月推出](https://aws.amazon.com/blogs/machine-learning/accelerate-ai-development-with-amazon-bedrock-api-keys/))引入了多种安全风险,组织在部署前必须充分了解。虽然旨在简化身份验证,但它们通过幽灵 IAM 用户创建、过度特权的默认策略和持有者令牌认证,制造了永久的攻击面。 长期密钥会自动配置 IAM 用户(`BedrockAPIKey-xxxx`),并授予无限期持续的管理员级 Bedrock 权限,即使在密钥被删除或过期后也是如此。在发布后的 14 天内,密钥就已经泄露到了 GitHub。犯罪组织据估计每年从被盗密钥中获得 100 万美元的年收入,每个区域的欺诈费用每天高达 14,000 美元。 此工具包提供: - **发现:** 扫描您账户中的幽灵 IAM 用户并对其风险进行分类 - **事件响应:** 紧急密钥撤销、CloudTrail 时间线和取证报告 - **密钥解码:** 离线分析泄露的密钥以提取账户和身份信息 - **预防:** 服务控制策略,用于在组织层面阻止或限制 API 密钥的使用 ## 安装 从 PyPI 安装: ``` pip install bedrock-keys-security ``` 或从源码安装: ``` git clone https://github.com/BeyondTrust/bedrock-keys-security.git cd bedrock-keys-security pip install . ``` 验证安装: ``` bks --version ``` 安装后,`bks` 命令将全局可用。需要 Python 3.10+ 和 AWS 凭证。各命令所需的最低权限: | Command | IAM Permissions Required | |---|---| | `scan` | `iam:ListUsers`, `iam:ListServiceSpecificCredentials`, `iam:ListAccessKeys`, `iam:ListAttachedUserPolicies`, `iam:ListUserPolicies` | | `cleanup` | All scan permissions + `iam:DeleteAccessKey`, `iam:DeleteServiceSpecificCredential`, `iam:DetachUserPolicy`, `iam:DeleteUserPolicy`, `iam:DeleteUser` | | `revoke-key` | `iam:PutUserPolicy`, `iam:ListServiceSpecificCredentials`, `iam:DeleteServiceSpecificCredential` | | `timeline` | `cloudtrail:LookupEvents` | | `report` | `iam:GetUser`, `iam:ListServiceSpecificCredentials`, `iam:ListAccessKeys`, `iam:ListAttachedUserPolicies`, `iam:ListUserPolicies` | | `decode-key` | None (offline) | ## 使用方法 ### 扫描 运行扫描以发现您账户中的所有幽灵 IAM 用户: ``` bks scan # scan with default profile bks scan --profile prod # use a specific AWS profile bks scan --json # machine-readable output bks scan --csv output.csv # export to CSV bks scan --verbose # detailed output ``` 每个幽灵用户按风险级别分类: - **ACTIVE:** 拥有有效的 Bedrock API 凭证 - **ORPHANED:** 没有剩余的活动凭证(可安全删除) - **AT RISK:** 拥有授予 `bedrock:*` 和侦察权限的 IAM 访问密钥,且独立于 API 密钥持续存在 Scan Example ### 清理 删除不再具有活动凭证的孤立幽灵用户: ``` bks cleanup --dry-run # preview what would be deleted bks cleanup # delete with confirmation prompt bks cleanup --force # skip confirmation (use with caution) ``` 仅影响 ORPHANED 用户。ACTIVE 和 AT RISK 用户永远不会被自动删除。 ### 事件响应 当密钥泄露时,`bks` 提供紧急响应功能: ``` bks revoke-key BedrockAPIKey-xxxx # emergency key revocation bks timeline BedrockAPIKey-xxxx # CloudTrail timeline (last 7 days) bks timeline BedrockAPIKey-xxxx --days 30 # extended timeline bks report BedrockAPIKey-xxxx # full incident report bks report BedrockAPIKey-xxxx --output report.txt ``` `revoke-key` 命令应用内联拒绝策略并在单个操作中删除所有 Bedrock 凭证。 Revoke Key ### 密钥解码 离线解码泄露的 Bedrock API 密钥,无需 AWS 凭证: ``` bks decode-key "ABSKQmVkcm9ja0FQSUtleS..." bks decode-key "bedrock-api-key-YmVkcm9ja..." --json ``` 提取嵌入的 IAM 用户名、AWS 账户 ID、区域和密钥格式。适用于对在 GitHub、Pastebin 或其他公共来源发现的密钥进行分类。 ![Long-term Key Decode](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/11c10d916d092903.png) ![Short-term Key Decode](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/693440b5e2092905.png) ## 使用服务控制策略进行预防 提供了四种 SCP 用于组织层面的强制执行。通过 AWS Organizations 将它们应用于 OU(组织单元)。 ### 1. 阻止所有 API 密钥(推荐) 最简单的方法:阻止创建和使用所有 Bedrock API 密钥: ``` aws organizations create-policy \ --name Block-Bedrock-API-Keys \ --type SERVICE_CONTROL_POLICY \ --content file://scps/1-block-all-keys.json ``` ### 2. 强制执行 90 天最长生命周期 如果必须使用 API 密钥,请限制损害窗口: ``` aws organizations create-policy \ --content file://scps/2-enforce-90day-max.json \ --type SERVICE_CONTROL_POLICY ``` ### 3. 仅阻止长期密钥 允许短期密钥,同时阻止更危险的长期(ABSK)密钥: ``` aws organizations create-policy \ --content file://scps/3-block-long-term-only.json \ --type SERVICE_CONTROL_POLICY ``` ### 4. 阻止幽灵提权 防止在幽灵用户上创建 IAM 访问密钥。这阻断了权限提升路径: ``` aws organizations create-policy \ --content file://scps/4-block-phantom-access-keys.json \ --type SERVICE_CONTROL_POLICY ``` ## 推荐替代方案:STS 临时凭证 大多数团队不需要 Bedrock API 密钥。AWS STS 临时凭证是推荐的方法: - 自动过期(1–12 小时) - 不创建幽灵用户 - 标准 AWS SigV4 签名(而非持有者令牌) - 无持久凭证泄露风险 ``` aws sts assume-role \ --role-arn arn:aws:iam::ACCOUNT:role/BedrockRole \ --role-session-name bedrock-session \ --duration-seconds 3600 export AWS_ACCESS_KEY_ID=ASIA... export AWS_SECRET_ACCESS_KEY=... export AWS_SESSION_TOKEN=... aws bedrock invoke-model --model-id anthropic.claude-3-sonnet... ``` 对于硬编码为使用持有者令牌的旧版应用程序、不支持 SigV4 的第三方工具或缺乏 STS 集成的供应商软件,API 密钥可能仍然是必要的。在这些情况下,请使用最长 12 小时生命周期的短期密钥,并通过上述 SCP 强制执行限制。 ## 研究发现 - 幽灵 IAM 用户永远不会被 AWS 自动清理 - `AmazonBedrockLimitedAccess` 授予 `bedrock:*` 以及侦察权限 - 密钥在创建后约 2 周内(中位数)泄露到 GitHub - 犯罪集团利用泄露的密钥通过 LLMjacking 操作每年产生超过 100 万美元的收入