飞鱼加速器官方网下载
  • 36

如何限制 Amazon S3 存储桶访问特定 IAM 角色 安全博客

限制 Amazon S3 存储桶访问特定 IAM 角色的方法

关键要点

学习如何通过 IAM 策略限制对 Amazon S3 存储桶的访问。使用 awsPrincipalArn 条件键,而不是 awsuserid 条件键来限制访问。提供了示例策略,以确保只有特定 IAM 角色可以访问 S3 存储桶。

2025年2月14日:本文更新了建议,通过使用 awsPrincipalArn 条件键来限制 S3 存储桶访问特定 IAM 角色的访问,而不是使用 awsuserid 条件键。

2021年4月2日:在“授予跨账户存储桶访问特定 IAM 角色”部分中,我们更新了第二个策略以修复错误。

2016年7月11日:此文首次发布。

客户经常询问如何将对 Amazon Simple Storage Service (Amazon S3) 存储桶的访问限制为仅特定的 AWS Identity and Access Management (IAM) 用户或角色。一个常见的方法是使用 Principal 元素列出需要访问存储桶的用户或角色。然而,Principal 元素需要用户 ARN、角色 ARN 或假设角色 ARN 的确切值,无法使用通配符 () 来包含所有角色会话,也不支持使用策略变量。

在这篇博文中,我们展示了如何使用 Conditions 元素限制 S3 存储桶对特定 IAM 角色或用户的访问,即使同一账户中的其他用户拥有 Admin 策略或 s3 策略,如果未显式列在 Conditions 元素中,他们也会被拒绝访问。您可以使用这种方法来限制对内容敏感或具有额外安全要求的存储桶的访问。

解决方案概述

本文的解决方案使用存储桶策略来限制对 S3 存储桶的访问,即使某个实体通过附加的基于身份的策略访问完整的 S3 API。以下图示展示了在与您的 IAM 用户或 IAM 角色同一账户中访问 S3 存储桶的方式。

图1 同一账户的 S3 存储桶访问示例

图1中的工作流程如下:

IAM 用户的策略和 IAM 角色的基于身份的策略授予对 “s3” 的访问。与存储桶 B 关联的 S3 存储桶策略仅限制 IAM 角色的访问。这意味着只有该 IAM 角色能够访问其内容。IAM 用户和 IAM 角色可以访问账户中的其他 S3 存储桶例如:存储桶 A。IAM 角色能够访问两个存储桶,但用户只能访问未附加存储桶策略的 S3 存储桶。尽管角色和用户都有完整的 “s3” 权限,但存储桶策略会否定未假设该角色的任何人的访问。

在跨账户访问的主要区别在于,每个存储桶必须附加存储桶策略以允许来自其他账户的 IAM 角色访问。以下图示展示了这种跨账户部署场景中的访问方式。

图2 不同账户的 S3 存储桶访问示例

图2中的工作流程如下:

IAM 角色的基于身份的策略和存储桶账户的 IAM 用户策略均授予 “s3” 的访问权限。存储桶策略 B 拒绝所有 IAM 用户和角色的访问 除非 指定的角色,并且策略定义了该角色对存储桶的允许操作。存储桶策略 A 允许来自其他账户的 IAM 角色访问。IAM 用户和 IAM 角色都可以访问存储桶 A,因为 IAM 用户在同一账户且存储桶策略 A 中对该角色有明确的 Allow 权限。角色能够访问两个存储桶,因为存储桶策略 B 中的 Deny 仅适用于 IAM 角色以外的主体。

使用 awsPrincipalArn 条件

可以使用不同类型的条件键将发出请求的主体的细节与您指定的策略中的主体属性进行比较。我们建议使用 awsPrincipalArn 键。awsPrincipalArn 键比较发出请求的主体的 Amazon 资源名称ARN与您在策略中指定的 ARN。

您也可以使用 awsuserid 策略变量来唯一标识用户或角色在其显式 Deny 语句中。使用 awsuserid 查找值的复杂性增加,因为您必须使用有效凭证执行 API 调用。处理 IAM 角色时,这项活动的复杂性更大,因为您需要获取 AssumedRoleUser 信息,它将不仅包含唯一角色 ID,还包括在假设角色时提供的 rolesessionname。例如,AssumedRoleUser 的 awsuserid 将如下所示:

如何限制 Amazon S3 存储桶访问特定 IAM 角色 安全博客

awsuserid AROADBQP57FF2AEXAMPLErolesessionname

当您有大量用户和角色要包含在策略中时,管理和跟踪这些 ID 会变得不便。

为了减轻这些挑战,我们建议使用 awsPrincipalArn 条件键。对于 IAM 角色,请求上下文返回角色的 ARN,而不是假设角色的用户的 ARN。AWS 建议在策略中指定资源的 ARN,而不是唯一 ID,并定期执行 IAM 策略审计。让我们看看如何在 IAM 策略中使用条件键。

授予同一账户存储桶访问特定角色

在从同一账户访问存储桶时,通常不需要使用存储桶策略,因为策略定义了用户直接 IAM 策略中已经授予的访问权限。S3 存储桶策略通常用于跨账户访问,但您也可以使用它们通过显式 Deny 来限制访问。该 Deny 适用于所有主体,无论它们是在与存储桶同一账户中还是在其他账户中。

在这种情况下,您可以使用 IAM 用户或角色的 ARN 以及 awsPrincipalArn 条件键 在 StringNotEquals 或 StringNotLike 条件中使用通配符字符串。此外,您可以使用 awsPrincipalARN 键将发出请求的主体的 ARN 与您在策略中指定的 ARN 进行比较。使用条件逻辑元素允许使用通配符字符串接受任何角色会话名称。

一旦您有了要允许访问的角色的 ARN,需要阻止来自同一账户的其他用户访问存储桶。阻止未使用 IAM 角色凭证的用户访问存储桶及其对象的示例策略如下:

json{ Version 20121017 Statement [ { Effect Deny Principal Action s3 Resource [ arnawss3amzns3demobucket arnawss3amzns3demobucket/ ] Condition { StringNotEquals { awsPrincipalArn [ arnawsiam111122223333role/ltROLENAMEgt ] } } } ]}

飞鱼加速

对 IAM 用户使用相同策略,如下所示:

json{ Version 20121017 Statement [ { Effect Deny Principal Action s3 Resource [ arnawss3amzns3demobucket arnawss3amzns3demobucket/ ] Condition { StringNotEquals { awsPrincipalARN [ arnawsiam111122223333role/ltROLENAMEgt arnawsiam111122223333user/ltUSERNAMEgt ] } } } ]}

授予跨账户存储桶访问特定 IAM 角色

当授予 IAM 用户或角色跨账户存储桶访问权限时,必须定义 IAM 用户或角色在获得授权后可以执行的操作。了解有关授予 IAM 实体通过 CLI/API 和控制台访问存储桶所需权限的更多信息,可以参考《编写 IAM 策略:如何授予对 Amazon S3 存储桶的访问》。根据 此博客文章 所获得的信息,示例存储桶策略如下:

json{ Version 20121017 Statement [ { Effect Allow Principal { AWS arnawsiam111122223333role/ltROLENAMEgt } Action s3ListBucket Resource arnawss3amzns3demobucket } { Effect Allow Principal { AWS arnawsiam111122223333role/ltROLENAMEgt } Action [ s3GetObject s3PutObject s3DeleteObject ] Resource arnawss3amzns3demobucket/ } { Effect Deny Principal Action s3 Resource [ arnawss3amzns3demobucket arnawss3amzns3demobucket/ ] Condition { StringNotEquals { awsPrincipalARN [ arnawsiam111122223333role/ltROLENAMEgt ] } } } ]}

要授予其他账户中的 IAM 用户访问权限,您需要将 IAM 用户的 ARN 添加到 awsPrincipalArn 条件中,如前面部分所述。除了 awsPrincipalArn 条件外,您还需要在这些策略的 Principal 元素中添加 IAM 用户的完整 ARN。示例策略如下:

json{ Version 20121017 Statement [ { Effect Allow Principal [ { AWS [ arnawsiam444455556666role/ltROLENAMEgt arnawsiam444455556666user/ltUSERNAMEgt ] } ] Action s3ListBucket Resource arnawss3amzns3demobucket } { Effect Allow Principal [ { AWS [ arnawsiam444455556666role/ltROLENAMEgt arnawsiam444455556666user/ltUSERNAMEgt ] } ] Action [ s3GetObject s3PutObject s3DeleteObject ] Resource arnawss3amzns3demobucket/ } { Effect Deny Principal Action s3 Resource [ arnawss3amzns3demobucket arnawss3amzns3demobucket/ ] Condition { StringNotEquals { awsPrincipalARN [ arnawsiam444455556666role/ltROLENAMEgt arnawsiam444455556666user/ltUSERNAMEgt ] } } } ]}

除了在存储桶策略中包含角色权限外,还需要在 IAM 用户或角色的用户策略中定义这些权限。这些权限被添加到 客户管理策略中,并 附加 到 IAM 控制台中的角色或用户,示例策略文件如下:

json{ Version 20121017 Statement [ { Effect Allow Action s3ListAllMyBuckets Resource } { Effect Allow Action s3ListBucket Resource arnawss3amzns3demobucket } { Effect Allow Action [ s3GetObject s3PutObject s3DeleteObject ] Resource arnawss3amzns3demobucket/ } ]}

通过遵循本文中的指导,您可以在同一账户和跨账户场景中将 S3 存储桶访问限制为特定 IAM 角色或用户,即使用户拥有 Admin 策略或策略 “s3”。这种逻辑在许多应用中皆有使用,具体需求因用例而异。我们建议尽可能采用最小权限原则,仅授予执行必要任务所需的最小权限。

如果您对本文有反馈,请在评论区留言。如果您对本文有疑问,可以在 AWS Identity and Access Management rePost 开启新线程,或 联系 AWS 支持。

作者介绍

Chris Craig这篇博文的原作者现已不在 AWS。2016年首次发布时,我们没有包含作者简介。

Laura VerghoteLaura 是公共部门客户在欧洲、中东和非洲 (EMEA) 地区的高级解决方案架构师。她与客户合作,设计和构建 AWS 云中的解决方案,弥补复杂商业需求与技术解决方案之间的差距。她最初加入 AWS 担任技术培训师,在 EMEA 向开发人员、管理员、架构师和合作伙伴提供培训内容方面拥有广泛经验。

Ashwin PhadkeAshwin 是一名高级解决方案架构师,与大型企业和独立软件供应商 (ISV) 客户合作,构建高可用性、可扩展和安全的应用程序,并帮助他们成功导航云旅程。他对信息安全充满热情,乐于为客户的安全挑战提供创造性解决方案。

标签

精华 IAM 角色 NotPrincipal 元素 安全博客