发布于: Oct 30, 2022

Amazon S3 存储桶访问的安全性是许多客户关心的问题,客户经常问我如何将 Amazon S3 存储桶访问权限限制到特定的 Amazon Identity and Access Management (IAM) 角色。通常,他们会尝试以对待 IAM 用户的相同方式执行此操作:使用存储桶策略显式 Deny 不想授予访问权限的所有 Principals(用户和角色)。这种方法的缺点是需要维护存储桶策略。如果将一个新的 IAM 用户添加到账户,并且其 Action  “s3:*”,则该用户将获得访问该存储桶的权限。您可以反转逻辑并在存储桶策略的 Deny 语句中利用 NotPrincipal 元素,而不必指定要阻止其访问的用户列表。此元素会为其值中未列出的任何用户创建一个显式的 Deny

但事实证明,这种反转逻辑的方法在处理 IAM 角色时存在问题,因为这种角色的 Principal 值包含两个 Amazon 资源名称 (ARN),即 role ARN  assumed-role ARN role ARN IAM 角色本身的标识符, assumed-role ARN 则用于标识日志中的角色会话。在使用 NotPrincipal 元素时,您必须同时包含两个 ARN,此方法才能正常工作,其中第二个 ARN 应包含一个变量名称。通常,您应指定一个通配符,用于表示变量字符串,但不允许在 Principal  NotPrincipal 元素中指定此通配符。在本博文中,我会向您展示如何使用 Conditions(而非 NotPrincipal 元素),将 S3 存储桶的访问权限限制到一个账户内的特定 IAM 角色或用户。即便相同账户中的另一个用户拥有 Admin 策略或带有 s3:* 的策略,只要未被显式列出,也同样会被拒绝。例如,您可以使用此方法配置存储桶,以供 Auto Scaling 组内的实例访问。您还可以使用此方法,限制对具有高级别安全需求的存储桶的访问。

本文所述的解决方案使用存储桶策略来管理对 S3 存储桶的访问即使实体可以访问完整的 S3 API。下图展示了此解决方案如何应用于同一账户内的存储桶。

  1. IAM 用户的策略和角色的用户策略授予对 “s3:*” 的访问权限。
  2. S3 存储桶策略将访问权限限制为仅限该角色。
  3. IAM 用户和角色都可以访问该账户中的存储桶。该角色可以访问这两个存储桶,但用户只能访问没有附加存储桶策略的存储桶。即使角色和用户都拥有完整的 “s3:*” 权限,存储桶策略仍会拒绝任何不具有该角色的人员访问该存储桶。

跨账户方法的主要不同之处在于,每个存储桶必须附加存储桶策略。下图展示了这种方法如何应用于跨账户部署场景。

  1. IAM 角色的用户策略和存储桶账户中的 IAM 用户策略均授予对“s3:*”的访问权限
  2. 如果任何人的 user:id 与角色的相应值不同,并且策略定义了允许角色对存储桶执行哪些操作,则存储桶策略会拒绝其访问。
  3. 存储桶策略允许从其他账户访问角色。
  4. IAM 用户和角色可以在存储桶策略中没有 Deny 的情况下访问存储桶。角色可以同时访问这两个存储桶,因为 Deny 仅适用于其 user:id 不等于角色的相应值的主体。

相关文章