
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 策略。