salesforce/cloudsplaining

GitHub: salesforce/cloudsplaining

Cloudsplaining 是一款 AWS IAM 安全评估工具,用于扫描策略以发现违反最小权限原则的配置,并生成按风险优先级排序的 HTML 报告。

Stars: 2197 | Forks: 216

## 注意:此仓库/项目已由 Salesforce 恢复。 ## Cloudsplaining Cloudsplaining 是一款 AWS IAM 安全评估工具,可识别违反最小权限原则的配置,并生成按风险优先级排序的 HTML 报告。 [![测试](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/087693126f153127.svg)](https://github.com/salesforce/cloudsplaining/actions?query=workflow%3ATest) [![文档状态](https://readthedocs.org/projects/cloudsplaining/badge/?version=latest)](https://cloudsplaining.readthedocs.io/en/latest/?badge=latest) [![在 https://gitter.im/cloudsplaining 加入聊天](https://badges.gitter.im/cloudsplaining.svg)](https://gitter.im/cloudsplaining?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Twitter](https://img.shields.io/twitter/url/https/twitter.com/kmcquade3.svg?style=social&label=Follow%20the%20author)](https://twitter.com/kmcquade3) [![PyPI](https://img.shields.io/pypi/v/cloudsplaining)](https://pypi.org/project/cloudsplaining) [![Python 版本](https://img.shields.io/pypi/pyversions/cloudsplaining)](#) [![下载量](https://static.pepy.tech/badge/cloudsplaining)](https://pepy.tech/project/cloudsplaining) * [示例报告](https://opensource.salesforce.com/cloudsplaining/) ## 文档 如需完整文档,请访问 [ReadTheDocs 上的项目](https://cloudsplaining.readthedocs.io/en/latest/)。 * [安装](#installation) * [速查表](#cheatsheet) * [示例报告](https://opensource.salesforce.com/cloudsplaining/) ## 概述 Cloudsplaining 可识别 AWS IAM 策略中违反最小权限原则的配置,并生成包含分类工作表的精美 HTML 报告。它可以扫描您 AWS 账户中的所有策略,也可以扫描单个策略文件。 它有助于识别未利用资源约束的 IAM 操作。它还通过标记在不加限制的情况下对相关 AWS 账户造成以下风险的 IAM 策略,来帮助确定修复过程的优先级: * 数据泄露 (`s3:GetObject`、`ssm:GetParameter`、`secretsmanager:GetSecretValue`) * 基础设施修改 * 资源暴露(修改基于资源的策略的能力) * 权限提升(基于 Rhino Security Labs 的研究) Cloudsplaining 还可以识别可由 AWS 计算服务(例如 EC2、ECS、EKS 或 Lambda)担任的 IAM 角色,因为它们可能比用户定义的角色带来更大的风险——特别是当 AWS 计算服务位于直接或间接暴露于互联网的实例上时。标记这些角色在特定场景下对渗透测试人员(或攻击者)特别有用。例如,如果攻击者获得了执行 [ssm:SendCommand](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_SendCommand.html) 的权限,并且存在安装了 SSM agent 的特权 EC2 实例,他们实际上就可以获得这些 EC2 实例的权限。通过 AWS Systems Manager Agent 进行远程代码执行已经是一个已知的提权/利用路径,但 Cloudsplaining 可以使识别这些情况的过程变得更加容易。有关示例,请参阅[示例报告](https://opensource.salesforce.com/cloudsplaining/#executive-summary)。 您还可以指定一个自定义排除文件,以过滤掉因各种原因产生的误报。例如,用户策略在设计上就是宽松的,而系统角色通常更严格。您可能还具有特定于组织多账户策略或 AWS 应用架构的排除项。 ## 动机 [Policy Sentry](https://engineering.salesforce.com/salesforce-cloud-security-automating-least-privilege-in-aws-iam-with-policy-sentry-b04fe457b8dc) 向我们揭示了,现在终于能够以可扩展的方式按照最小权限原则编写 IAM 策略了。在 Policy Sentry 发布之前,我们很容易找到缺乏资源约束的 IAM 策略文档。考虑下面的策略,它允许 IAM 主体(角色或用户)在 AWS 账户中的任何 S3 存储桶上运行 `s3:PutObject`: ``` { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:PutObject" ], "Resource": "*" } ] } ``` 这是不好的。理想情况下,应根据资源 ARN 限制访问,如下所示: ``` { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject" ], "Resource": "arn:aws:s3:::my-bucket/*" } ] } ``` Policy Sentry [让这一切变得非常简单](https://github.com/salesforce/policy_sentry/#policy-sentry)。一旦基础设施即代码开发人员或 AWS 管理员熟悉了该工具(它非常易于使用),我们发现它会被迅速采用。**然而**,如果您一直在使用 AWS,可能会有大量积压的 IAM 策略需要改进。如果您有数百个 AWS 账户,每个账户中包含数十个策略,我们如何通过编程方式识别出需要修复的策略来锁定这些 AWS 账户呢? 这就是我们开发 Cloudsplaining 的原因。 Cloudsplaining 可识别 AWS IAM 策略中违反最小权限原则的配置,并生成包含分类工作表的精美 HTML 报告。它可以扫描您 AWS 账户中的所有策略,也可以扫描单个策略文件。 ## 安装说明 #### Homebrew ``` brew tap salesforce/cloudsplaining https://github.com/salesforce/cloudsplaining brew install cloudsplaining ``` #### Pip3 ``` pip3 install --user cloudsplaining ``` * 现在您应该能够通过运行 `cloudsplaining --help` 从命令行执行 `cloudsplaining` 了。 #### Shell 自动补全 要启用 Bash 自动补全,请将以下内容放入您的 `.bashrc` 中: ``` eval "$(_CLOUDSPLAINING_COMPLETE=bash_source cloudsplaining)" ``` 要启用 ZSH 自动补全,请将以下内容放入您的 `.zshrc` 中: ``` eval "$(_CLOUDSPLAINING_COMPLETE=zsh_source cloudsplaining)" ``` ### 扫描单个 IAM 策略 您也可以扫描单个策略文件以识别风险,而不是扫描整个账户。 ``` cloudsplaining scan-policy-file --input-file examples/policies/explicit-actions.json ``` 输出将包含发现描述以及未利用资源约束的 IAM 操作列表。 输出将类似于以下内容: ``` Issue found: Data Exfiltration Actions: s3:GetObject Issue found: Resource Exposure Actions: ecr:DeleteRepositoryPolicy, ecr:SetRepositoryPolicy, s3:BypassGovernanceRetention, s3:DeleteAccessPointPolicy, s3:DeleteBucketPolicy, s3:ObjectOwnerOverrideToBucketOwner, s3:PutAccessPointPolicy, s3:PutAccountPublicAccessBlock, s3:PutBucketAcl, s3:PutBucketPolicy, s3:PutBucketPublicAccessBlock, s3:PutObjectAcl, s3:PutObjectVersionAcl Issue found: Unrestricted Infrastructure Modification Actions: ecr:BatchDeleteImage, ecr:CompleteLayerUpload, ecr:CreateRepository, ecr:DeleteLifecyclePolicy, ecr:DeleteRepository, ecr:DeleteRepositoryPolicy, ecr:InitiateLayerUpload, ecr:PutImage, ecr:PutImageScanningConfiguration, ecr:PutImageTagMutability, ecr:PutLifecyclePolicy, ecr:SetRepositoryPolicy, ecr:StartImageScan, ecr:StartLifecyclePolicyPreview, ecr:TagResource, ecr:UntagResource, ecr:UploadLayerPart, s3:AbortMultipartUpload, s3:BypassGovernanceRetention, s3:CreateAccessPoint, s3:CreateBucket, s3:DeleteAccessPoint, s3:DeleteAccessPointPolicy, s3:DeleteBucket, s3:DeleteBucketPolicy, s3:DeleteBucketWebsite, s3:DeleteObject, s3:DeleteObjectTagging, s3:DeleteObjectVersion, s3:DeleteObjectVersionTagging, s3:GetObject, s3:ObjectOwnerOverrideToBucketOwner, s3:PutAccelerateConfiguration, s3:PutAccessPointPolicy, s3:PutAnalyticsConfiguration, s3:PutBucketAcl, s3:PutBucketCORS, s3:PutBucketLogging, s3:PutBucketNotification, s3:PutBucketObjectLockConfiguration, s3:PutBucketPolicy, s3:PutBucketPublicAccessBlock, s3:PutBucketRequestPayment, s3:PutBucketTagging, s3:PutBucketVersioning, s3:PutBucketWebsite, s3:PutEncryptionConfiguration, s3:PutInventoryConfiguration, s3:PutLifecycleConfiguration, s3:PutMetricsConfiguration, s3:PutObject, s3:PutObjectAcl, s3:PutObjectLegalHold, s3:PutObjectRetention, s3:PutObjectTagging, s3:PutObjectVersionAcl, s3:PutObjectVersionTagging, s3:PutReplicationConfiguration, s3:ReplicateDelete, s3:ReplicateObject, s3:ReplicateTags, s3:RestoreObject, s3:UpdateJobPriority, s3:UpdateJobStatus ``` ### 扫描整个 AWS 账户 #### 下载账户授权详情 我们可以扫描整个 AWS 账户并生成报告。为此,我们利用 AWS IAM [get-account-authorization-details](https://docs.aws.amazon.com/cli/latest/reference/iam/get-account-authorization-details.html) API 调用,它会下载一个大型 JSON 文件(每个账户大约 100KB),其中包含该账户的所有 IAM 详细信息。这包括有关用户、组、角色、客户托管策略和 AWS 托管策略的数据。 * 您必须配置好可由 CLI 使用的 AWS 凭证。 * 您必须拥有运行 [iam:GetAccountAuthorizationDetails](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetAccountAuthorizationDetails.html) 的权限。`arn:aws:iam::aws:policy/SecurityAudit` 策略包含此权限,许多其他允许对 IAM 服务进行读取访问的策略也包含此权限。 * 要下载账户授权详情,请确保您已通过 AWS 身份验证,然后运行 `cloudsplaining` 的 `download` 命令: ``` cloudsplaining download ``` * 如果您希望使用 `~/.aws/credentials` 文件而不是环境变量,可以指定配置文件名称: ``` cloudsplaining download --profile myprofile ``` 它将在您当前的目录中下载一个包含您账户授权详细信息的 JSON 文件。 #### 创建排除文件 Cloudsplaining 工具不会试图了解您 AWS 账户中所有内容的上下文。通过编程方式理解其中某些事情的上下文是可能的——例如策略是否应用于实例配置文件、策略是否已附加、是否在使用内联 IAM 策略以及是否在使用 AWS 托管策略。**只有您了解您的 AWS 基础设施设计和 IAM 策略背后的上下文**。 因此,消除依赖于上下文的误报非常重要。您可以使用排除文件来完成此操作。我们提供了一个命令来为您生成排除文件,这样您就不必记住所需的格式。 您可以通过以下命令创建排除模板: ``` cloudsplaining create-exclusions-file ``` 这将在您当前目录中生成一个名为 `exclusions.yml` 的文件。 现在,当您运行 `scan` 命令时,您可以像这样使用排除文件: ``` cloudsplaining scan --exclusions-file exclusions.yml --input-file examples/files/example.json --output examples/files/ ``` 有关排除文件结构的更多信息,请参阅[过滤误报](#filtering-false-positives) #### 扫描授权详情文件 现在我们已经下载了账户授权文件,我们可以使用 `cloudsplaining` 扫描*所有*的 AWS IAM 策略。 运行以下命令: ``` cloudsplaining scan --exclusions-file exclusions.yml --input-file examples/files/example.json --output examples/files/ ``` 它将创建一个类似[这样](https://opensource.salesforce.com/cloudsplaining/)的 HTML 报告: 它还将创建一个原始 JSON 数据文件: * `default-iam-results.json`:包含报告的原始 JSON 输出。您可以使用此数据文件对扫描结果进行各种操作。例如,您可以编写一个 Python 脚本来解析这些数据并自动创建 JIRA 议题或 Salesforce 工作项。下面展示了一个示例条目。完整示例可在 [examples/files/iam-results-example.json](examples/files/iam-results-example.json) 中查看 ``` { "example-authz-details": [ { "AccountID": "012345678901", "ManagedBy": "Customer", "PolicyName": "InsecureUserPolicy", "Arn": "arn:aws:iam::012345678901:user/userwithlotsofpermissions", "ActionsCount": 2, "ServicesCount": 1, "Actions": [ "s3:PutObject", "s3:PutObjectAcl" ], "Services": [ "s3" ] } ] } ``` 有关示例输出,请参阅 [examples/files](examples/files) 文件夹。 #### 过滤误报 资源约束是最佳实践——特别是对于系统角色/实例配置文件——但有时,这是设计使然。例如,考虑这样一种情况:在用于配置 Terraform 的 EC2 实例的实例配置文件上使用了自定义 IAM 策略。*在这种情况下,宽泛的权限是设计需求*——因此我们不希望将这些包含在结果中。 您可以通过以下命令创建排除模板: ``` cloudsplaining create-exclusions-file ``` 这将在您当前目录中生成一个名为 `exclusions.yml` 的文件。 默认排除文件如下所示: ``` # 要从评估中排除的 Policy 名称 # 建议:在运行初始报告后,将已知设计上过于宽松的 policy 添加到此处。 policies: - "AWSServiceRoleFor*" - "*ServiceRolePolicy" - "*ServiceLinkedRolePolicy" - "AdministratorAccess" # Otherwise, this will take a long time - "service-role*" - "aws-service-role*" # 不要将这些 role、user 或 group 作为评估的一部分进行评估 roles: - "service-role*" - "aws-service-role*" users: - "" groups: - "" # 要包含在结果中的只读 Action,例如 s3:GetObject # 默认情况下,它包含可能导致 Data Exfiltration 的 Action include-actions: - "s3:GetObject" - "ssm:GetParameter" - "ssm:GetParameters" - "ssm:GetParametersByPath" - "secretsmanager:GetSecretValue" # 要从结果中包含的 Write Action,例如 kms:Decrypt exclude-actions: - "" ``` * 进行任何您想要的添加或修改。 * 在 `policies` 下,列出您要排除的策略名称路径。 * 如果您想排除名为 `MyRole` 的角色,请在 `roles` 列表中列出 `MyRole` 或 `MyR*`。 * 您可以对 `users` 和 `groups` 列表采用相同的方法。 现在,当您运行 `scan` 命令时,您可以像这样使用排除文件: ``` cloudsplaining scan --exclusions-file exclusions.yml --input-file examples/files/example.json --output examples/files/ ``` ### 扫描多个 AWS 账户 如果您的 IAM 用户或 IAM 角色拥有对跨多个 AWS 账户的通用 IAM 角色的 `sts:AssumeRole` 权限,您可以使用 `scan-multi-account` 命令。 下图描述了该过程的工作原理: ![使用 Cloudsplaining 扫描多个 AWS 账户的图表](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/684689742c153129.png) * 首先,您需要创建多账户配置文件。运行以下命令: ``` cloudsplaining create-multi-account-config-file \ -o multi-account-config.yml ``` * 这将生成一个名为 `multi-account-config.yml` 的文件,其内容如下: ``` accounts: default_account: 123456789012 prod: 123456789013 test: 123456789014 ``` 对于下一步,假设: * 我们在目标账户中有一个名为 `CommonSecurityRole` 的角色。 * 您 IAM 用户的凭证位于名为 `scanning-user` 的 AWS 凭证配置文件下。 * 该用户具有 `sts:AssumeRole` 权限,可以担任我们之前创建的 YAML 文件中指定的所有目标账户里的 `CommonSecurityRole`。 * 您希望将输出保存到名为 `my-results-bucket` 的 S3 存储桶中。 使用上述数据,您可以运行以下命令: ``` cloudsplaining scan-multi-account \ -c multi-account-config.yml \ --profile scanning-user \ --role-name CommonSecurityRole \ --output-bucket my-results-bucket ``` ## 自定义指南和附录 Cloudsplaining 支持自定义 HTML 报告的“指南”和“附录”部分,以包含特定于组织的安全建议和文档。 ### 工作原理 将 HTML 文件放置在您的项目根目录中: - `custom-guidance.html` - 自定义安全指南内容 - `custom-appendices.html` - 自定义附录内容 ### 行为 - **文件不存在**:显示默认的 AWS 安全建议 - **文件存在且有内容**:显示您的自定义 HTML 内容 - **文件存在但为空**:完全隐藏选项卡 - **混合配置**:每个选项卡独立工作 ### 示例用法 ``` # 创建自定义指导 echo '

Company Security Guidelines

Follow these organization-specific steps:

  • Review with security team
  • Document in JIRA ticket
  • Get approval before remediation
' > custom-guidance.html # 创建自定义附录 echo '

Internal Resources

Additional company resources:

' > custom-appendices.html ``` # 使用自定义内容生成报告 cloudsplaining scan --input-file account-data.json --output reports/ ## 速查表 ``` # 下载 authorization details cloudsplaining download # 从特定的 AWS profile 下载 cloudsplaining download --profile someprofile # 扫描 Authorization details cloudsplaining scan --input-file default.json # 使用自定义排除项扫描 Authorization details cloudsplaining scan --input-file default.json --exclusions-file exclusions.yml # 扫描 Policy 文件 cloudsplaining scan-policy-file --input-file examples/policies/wildcards.json cloudsplaining scan-policy-file --input-file examples/policies/wildcards.json --exclusions-file examples/example-exclusions.yml # 扫描多个 Account # 生成 multi account 配置文件 cloudsplaining create-multi-account-config-file -o accounts.yml cloudsplaining scan-multi-account -c accounts.yml -r TargetRole --output-directory ./ ``` ## 常见问题解答 **它默认会扫描所有策略吗?** 不会,它只会扫描附加到 IAM 主体的策略。 **download 命令会下载所有策略版本吗?** 默认情况下不会。如果您想这样做,请指定 `--include-non-default-policy-versions` 标志。请注意,`scan` 工具当前不对非默认版本进行操作。 **我按照安装说明操作了,但根本无法通过命令行执行程序。我该怎么办?** 这可能是 PATH 的问题。您的 PATH 环境变量未考虑到由 `pip3` 安装的二进制包。在 Mac 上,您可以通过输入以下命令来解决此问题,具体取决于您安装的版本。具体情况可能会有所不同。 ``` export PATH=$HOME/Library/Python/3.7/bin/:$PATH ``` **我按照安装说明操作了,但收到了 `ModuleNotFoundError`,提示 `No module named policy_sentry.analysis.expand`。我该怎么办?** 请尝试升级到最新版本的 Cloudsplaining。此错误在 0.0.10 版本中已修复。 ## 参考文献 * Salesforce 的 [Kinnaird McQuade](https://twitter.com/kmcquade3) 开发的 [Policy Sentry](https://github.com/salesforce/policy_sentry/) * [Summit Route](http://summitroute.com/) 和 Duo Labs 的 [Scott Piper](https://twitter.com/0xdabbad00) 开发的 [Parliament](https://github.com/duo-labs/parliament/) * Rhino Security Labs 的 [Spencer Gietzen](https://twitter.com/SpenGietz) 撰写的 [AWS Privilege Escalation Methods](https://github.com/RhinoSecurityLabs/AWS-IAM-Privilege-Escalation) * [了解策略摘要中的访问级别摘要](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_understand-policy-summary-access-level-summaries.html) * [利用跨多个服务网格的下一代基于区块链的 AI 来透明地自动化多云 IAM 魔法 :mage_man:](http://kmcquade.com/rick.html)
标签:AWS, DevSecOps, DPI, HTML报告, IAM, IAM策略, Python, Salesforce, 上游代理, 云基础设施, 反取证, 多模态安全, 安全合规, 安全评估, 文档结构分析, 无后门, 最小权限原则, 权限审计, 策略分析, 网络代理, 自定义脚本, 逆向工具