
Cloudsplaining 是一款 AWS IAM 安全评估工具,用于识别最低权限原则的违反情况,并生成按风险优先级排序的报告。
Cloudsplaining 是一个 AWS IAM 安全评估工具,用于识别违反最小权限原则的情况,并生成基于风险优先级的 HTML 报告。
完整的文档,请访问 ReadTheDocs 上的项目。
Cloudsplaining 能够识别 AWS IAM 策略中违反最小权限原则的情况,并生成美观的 HTML 报告。它可以扫描您 AWS 账户中的所有策略、跨多个 AWS 账户扫描,或者扫描单个策略文件。
该工具有助于识别未使用资源约束的 IAM 操作,同时通过标记出以下无限制情况下给 AWS 账户带来风险的 IAM 策略,来帮助优先处理修复工作:
s3:GetObject、ssm:GetParameter、secretsmanager:GetSecretValue)Cloudsplaining 还会识别那些可以被 AWS 计算服务(如 EC2、ECS、EKS 或 Lambda)担任的 IAM 角色,因为这些角色可能比用户定义的角色带来更大的风险——尤其是在 AWS 计算服务实例直接或间接暴露于互联网的情况下。标记这些角色对渗透测试人员(或攻击者)在特定场景下尤为有用。例如,如果攻击者获得了执行 ssm:SendCommand 的权限,并且存在已安装 SSM 代理的高权限 EC2 实例,那么他们实际上就拥有了这些 EC2 实例的权限。通过 AWS Systems Manager Agent 进行远程代码执行已经是已知的权限提升/利用路径,但 Cloudsplaining 可以更轻松地识别这些情况。有关示例,请参阅样例报告。
您还可以指定一个自定义排除文件,以过滤掉因各种原因产生的误报结果。例如,用户策略通常是宽松设计的,而系统角色则通常更严格。您可能还会根据组织的多账户策略或 AWS 应用架构制定特定的排除项。
Policy Sentry 向我们揭示了以可扩展的方式最终按照最小权限原则编写 IAM 策略是可行的。在 Policy Sentry 发布之前,人们很容易发现缺少资源约束的 IAM 策略文档。考虑以下策略,它允许 IAM 主体(角色或用户)对 AWS 账户中的任何 S3 存储桶执行 s3:PutObject 操作:```json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:PutObject"
],
"Resource": "*"
}
]
}
这很糟糕。理想情况下,访问权限应根据资源ARN进行限制,如下所示:```json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject"
],
"Resource": "arn:aws:s3:::my-bucket/*"
}
]
}
Policy Sentry 让这变得非常容易。一旦基础设施即代码开发者或AWS管理员熟悉了该工具(它非常容易使用),我们发现采用速度会非常快。然而,如果你一直在使用AWS,很可能有大量IAM策略积压需要改进。如果你有数百个AWS账户,每个账户中有几十个策略,我们如何通过编程方式识别需要修复的策略来锁定这些AWS账户?
这就是我们编写Cloudsplaining的原因。
Cloudsplaining可以识别AWS IAM策略中的最小权限违规,并生成漂亮的HTML报告。它可以扫描你AWS账户中的所有策略、跨多个AWS账户,或者可以扫描单个策略文件。
brew tap salesforce/cloudsplaining https://github.com/salesforce/cloudsplaining brew install cloudsplaining
#### Pip3```bash
pip3 install --user cloudsplaining
cloudsplaining --help 在命令行中执行 cloudsplaining。要启用 Bash 补全,请将以下内容放入你的 .bashrc:```bash
eval "$(_CLOUDSPLAINING_COMPLETE=bash_source cloudsplaining)"
为了启用 ZSH 补全功能,请将此内容放入您的 .zshrc 文件中:```bash
eval "$(_CLOUDSPLAINING_COMPLETE=zsh_source cloudsplaining)"
您还可以扫描单个策略文件以识别风险,而不是扫描整个账户。```bash cloudsplaining scan-policy-file --input-file examples/policies/explicit-actions.json
输出将包含一个发现描述以及一个未利用资源约束的IAM操作列表。
输出将类似于以下内容:```console
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 IAM的get-account-authorization-details API调用,该调用会下载一个大型JSON文件(每个账户约100KB),其中包含该账户的所有IAM详细信息,包括用户、组、角色、客户管理策略和AWS管理策略的数据。
您必须配置好可供CLI使用的AWS凭证。
您必须具有运行iam:GetAccountAuthorizationDetails的权限。策略arn:aws:iam::aws:policy/SecurityAudit包含了此权限,其他许多允许对IAM服务进行读取访问的策略也包含此权限。
要下载账户授权详情,请确保您已通过AWS认证,然后运行cloudsplaining的download命令:```bash
cloudsplaining download
* 如果您更喜欢使用 `~/.aws/credentials` 文件而不是环境变量,您可以指定配置文件名称:```bash
cloudsplaining download --profile myprofile
它将在您当前目录中下载一个JSON文件,其中包含您账户授权详细信息。
Cloudsplaining工具并不试图理解您AWS账户中所有内容的上下文。可以通过编程方式理解其中某些内容的上下文——例如,策略是否应用于实例配置文件、策略是否已附加、是否在使用内联IAM策略,以及是否在使用AWS托管策略。只有您了解AWS基础设施设计和IAM策略背后的上下文。
因此,消除依赖于上下文的误报非常重要。您可以使用排除文件来实现这一点。我们包含了一个命令,可以为您生成一个排除文件模板,这样您就不必记住所需的格式。
您可以通过以下命令创建排除模板:```bash cloudsplaining create-exclusions-file
这将在当前目录中生成一个名为 `exclusions.yml` 的文件。
现在,当你运行 `scan` 命令时,你可以像这样使用排除文件:```bash
cloudsplaining scan --exclusions-file exclusions.yml --input-file examples/files/example.json --output examples/files/
有关排除文件结构的更多信息,请参阅过滤误报
既然我们已经下载了账户授权文件,就可以使用 cloudsplaining 扫描 所有 AWS IAM 策略。
运行以下命令:```bash 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](https://github.com/salesforce/cloudsplaining/blob/master/examples/files/iam-results-example.json)查看。```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 文件夹以获取示例输出。
资源约束是最佳实践——尤其是针对系统角色/实例配置文件——但有时,这些是有意设计的。例如,考虑一种情况:为预置 Terraform 的 EC2 实例的实例配置文件使用了自定义 IAM 策略。在这种情况下,宽泛的权限是设计需求——因此我们不希望将这些包含在结果中。
您可以通过以下命令创建排除模板:```bash cloudsplaining create-exclusions-file
这将在当前目录中生成一个名为 `exclusions.yml` 的文件。
默认的排除文件看起来像这样:```yaml
# Policy names to exclude from evaluation
# Suggestion: Add policies here that are known to be overly permissive by design, after you run the initial report.
policies:
- "AWSServiceRoleFor*"
- "*ServiceRolePolicy"
- "*ServiceLinkedRolePolicy"
- "AdministratorAccess" # Otherwise, this will take a long time
- "service-role*"
- "aws-service-role*"
# Don't evaluate these roles, users, or groups as part of the evaluation
roles:
- "service-role*"
- "aws-service-role*"
users:
- ""
groups:
- ""
# Read-only actions to include in the results, such as s3:GetObject
# By default, it includes Actions that could lead to Data Exfiltration
include-actions:
- "s3:GetObject"
- "ssm:GetParameter"
- "ssm:GetParameters"
- "ssm:GetParametersByPath"
- "secretsmanager:GetSecretValue"
# Write actions to include from the results, such as kms:Decrypt
exclude-actions:
- ""
policies 下,列出您想要排除的策略名称的路径。MyRole 的角色,请在 roles 列表中列出 MyRole 或 MyR*。users 和 groups 列表采用相同的方法。现在当您运行 scan 命令时,您可以使用排除文件,如下所示:```bash
cloudsplaining scan --exclusions-file exclusions.yml --input-file examples/files/example.json --output examples/files/
### 扫描多个 AWS 账户
如果你的 IAM 用户或 IAM 角色拥有 `sts:AssumeRole` 权限,可以访问多个 AWS 账户中的公共 IAM 角色,你可以使用 `scan-multi-account` 命令。
此图展示了该过程的工作原理:

> 注意:如果你是跨账户访问的新手,请查看 [官方 AWS 教程:使用 IAM 角色跨 AWS 账户委派访问](https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_cross-account-with-roles.html)。这可以帮助你搭建上述架构。
* 首先,你需要创建多账户配置文件。运行以下命令:```bash
cloudsplaining create-multi-account-config-file \
-o multi-account-config.yml
multi-account-config.yml 的文件,其内容如下:```yaml
accounts:
default_account: 123456789012
prod: 123456789013
test: 123456789014> 注意:请注意上方文件的格式包含 `account_name: accountID`。编辑文件内容以设置您所需的账户名称和账户ID。您可以包含任意多个账户ID。
下一步,假设:
* 在目标账户中有一个名为 `CommonSecurityRole` 的角色。
* 您的IAM用户的凭证位于名为 `scanning-user` 的AWS凭证配置文件中。
* 该用户具有 `sts:AssumeRole` 权限,可以承担之前创建的YAML文件中指定的所有目标账户中的 `CommonSecurityRole`。
* 您希望将输出保存到名为 `my-results-bucket` 的S3存储桶中。
基于以上信息,您可以运行以下命令:```bash
cloudsplaining scan-multi-account \
-c multi-account-config.yml \
--profile scanning-user \
--role-name CommonSecurityRole \
--output-bucket my-results-bucket
请注意,如果在没有
--profile标志的情况下运行上述命令,它将按照标准的 AWS 凭证优先级顺序 执行(即环境变量、凭证配置文件、ECS 容器凭证,最后是 EC2 实例配置文件凭证)。
Cloudsplaining 支持自定义 HTML 报告的指导与附录部分,以包含组织特定的安全建议和文档。
将 HTML 文件放在项目根目录中:
custom-guidance.html - 自定义安全指导内容custom-appendices.html - 自定义附录内容echo '
Follow these organization-specific steps:
echo '
Additional company resources:
' > custom-appendices.html ``` # 使用自定义内容生成报告 cloudsplaining scan --input-file account-data.json --output reports/cloudsplaining download
cloudsplaining download --profile someprofile
cloudsplaining scan --input-file default.json
cloudsplaining scan --input-file default.json --exclusions-file exclusions.yml
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
cloudsplaining create-multi-account-config-file -o accounts.yml cloudsplaining scan-multi-account -c accounts.yml -r TargetRole --output-directory ./
## 常见问题
**默认情况下它会扫描所有策略吗?**
不会,它只会扫描附加到IAM主体的策略。
**下载命令会下载所有策略版本吗?**
默认情况下不会。如果你想这样做,请指定 `--include-non-default-policy-versions` 标志。注意,`scan` 工具目前不操作非默认版本。
**我按照安装说明操作了,但完全无法通过命令行执行程序。该怎么办?**
这很可能是你的PATH问题。你的PATH环境变量没有考虑由 `pip3` 安装的二进制包。在Mac上,根据你安装的版本,输入以下命令可能可以修复此问题。结果可能因人而异。```bash
export PATH=$HOME/Library/Python/3.7/bin/:$PATH
我按照安装说明操作,但收到一个 ModuleNotFoundError 提示 No module named policy_sentry.analysis.expand。该怎么办?
请尝试升级到最新版本的 Cloudsplaining。该错误已在 0.0.10 版本中修复。