2025年2月14日:這篇文章更新了建議,使用 aws:PrincipalArn 條件鍵來限制 S3 存儲桶的訪問權限給 IAM 角色,而不是使用 aws:userid 條件鍵。
2021年4月2日:在“授予跨帳戶存儲桶訪問權限給特定 IAM 角色”部分,我們更新了第二個政策以修正錯誤。
2016年7月11日:這篇文章首次發佈。
客戶常常詢問如何限制 Amazon 簡單存儲服務 (Amazon S3) 存儲桶的訪問權限,僅限於特定的 AWS 身份和訪問管理 (IAM) 用戶或角色。一個常見的方法是使用 Principal 元素列出需要訪問存儲桶的用戶或角色。然而,Principal 元素需要用戶 ARN、角色 ARN 或假設角色 ARN 的精確值。它不支持使用萬用字元 (*) 來包含所有角色會話,也不允許使用策略變數。
在這篇博客文章中,我們展示了如何使用 Conditions 元素來限制 S3 存儲桶的訪問權限給帳戶內的特定 IAM 角色或用戶。即使同一帳戶中的其他用戶擁有 Admin 策略或 s3:* 的策略,如果他們沒有在 Conditions 元素中明確列出,他們將被拒絕訪問。您可以使用這種方法,例如,限制對具有敏感內容或額外安全要求的存儲桶的訪問。
解決方案概述
這篇文章中的解決方案使用存儲桶策略來限制對 S3 存儲桶的訪問,即使實體通過附加的基於身份的策略擁有對 S3 的完整 API 訪問權限。下圖說明了如何在與您的 IAM 用戶或 IAM 角色相同的帳戶中訪問 S3 存儲桶。我們建議您使用 IAM 角色,僅在不支持聯邦用戶的用例中使用 IAM 用戶。
圖1:說明如何在與您的 IAM 用戶或 IAM 角色相同的帳戶中訪問 S3 存儲桶的圖示
圖1中的工作流程如下:
IAM 用戶的策略和 IAM 角色的基於身份的策略授予對 “s3:*” 的訪問權限。
與存儲桶 B 關聯的 S3 存儲桶策略限制訪問僅限於 IAM 角色。這意味著只有 IAM 角色能夠訪問其內容。
IAM 用戶和 IAM 角色都可以訪問帳戶中的其他 S3 存儲桶(例如,存儲桶 A)。IAM 角色能夠訪問這兩個存儲桶,但用戶只能訪問沒有附加存儲桶策略的 S3 存儲桶。即使角色和用戶都有完整的 “s3:*” 許可權,存儲桶策略會否定對於未假設角色的任何人的存儲桶訪問權限。
跨帳戶方法的主要區別在於,每個存儲桶必須附加一個存儲桶策略,以允許來自其他帳戶的 IAM 角色訪問。下圖說明了這在跨帳戶部署場景中的工作方式。

圖2:說明如何在與您的 IAM 角色不同的帳戶中訪問 S3 存儲桶的圖示
圖2中的工作流程如下:
IAM 角色的基於身份的策略和存儲桶帳戶中的 IAM 用戶的策略都授予對 “s3:*” 的訪問權限。
存儲桶策略 B 拒絕所有 IAM 用戶和角色的訪問,除了指定的角色,並且策略定義了角色可以對存儲桶執行的操作。
存儲桶策略 A 允許來自其他帳戶的 IAM 角色訪問。
IAM 用戶和 IAM 角色都可以訪問存儲桶 A,因為 IAM 用戶在同一帳戶中,並且存儲桶策略 A 中有對角色的明確允許。角色可以訪問這兩個存儲桶,因為存儲桶策略 B 中的拒絕僅針對 IAM 角色以外的主體。
使用 aws:PrincipalArn 條件
您可以使用不同類型的條件鍵來比較發出請求的主體的詳細信息與您在策略中指定的主體屬性。我們建議您使用 aws:PrincipalArn 鍵。aws:PrincipalArn 鍵將發出請求的主體的 Amazon 資源名稱 (ARN) 與您在策略中指定的 ARN 進行比較。
您也可以使用 aws:userid 策略變數在其明確的拒絕聲明中唯一識別用戶或角色。使用 aws:userid 查找值時會增加複雜性,因為您必須使用有效憑證執行 API 調用。當使用 IAM 角色時,此活動具有額外的複雜性,因為您需要獲取 AssumedRoleUser 信息,這不僅包括唯一的角色 ID,還包括假設角色時提供的角色會話名稱。例如,AssumedRoleUser 的 aws:userid 將如下所示:
當您有大量用戶和角色需要包含在策略中時,管理和跟踪這些 ID 會變得不方便。
為了減輕這些挑戰,我們建議您使用 aws:PrincipalArn 條件鍵。對於 IAM 角色,請求上下文返回角色的 ARN,而不是假設角色的用戶的 ARN。AWS 建議您在策略中指定資源的 ARN,而不是唯一 ID,並且定期執行 IAM 策略審核。讓我們看看如何在 IAM 策略中使用條件鍵。
授予同一帳戶的特定角色存儲桶訪問權限
當從同一帳戶中訪問存儲桶時,在大多數情況下不需要使用存儲桶策略,因為策略定義的訪問權限已經由用戶的直接 IAM 策略授予。S3 存儲桶策略通常用於跨帳戶訪問,但您也可以使用它們來通過明確的拒絕來限制訪問。拒絕將適用於所有主體,無論他們是在與存儲桶相同的帳戶中還是在不同的帳戶中。
在這種情況下,您使用 IAM 用戶或角色 ARN 與 aws:PrincipalArn 條件鍵在 StringNotEquals 或 StringNotLike 條件中使用萬用字元字符串。此外,您使用 aws:PrincipalARN 鍵將發出請求的主體的 ARN 與您在策略中指定的 ARN 進行比較。使用條件邏輯元素允許使用萬用字元字符串,以允許任何角色會話名稱被接受。
一旦您擁有要允許訪問的角色的 ARN,您需要阻止來自與存儲桶相同帳戶的其他用戶的訪問。阻止未使用 IAM 角色憑證的用戶訪問存儲桶及其對象的示例策略如下所示。
對於 IAM 用戶,使用如下所示的相同策略。
授予跨帳戶存儲桶訪問權限給特定 IAM 角色
當授予跨帳戶存儲桶訪問權限給 IAM 用戶或角色時,您必須定義 IAM 用戶或角色被允許使用授予的訪問權限做什麼。了解更多關於允許 IAM 實體通過 CLI/API 和控制台訪問存儲桶所需的權限,請參閱撰寫 IAM 策略:如何授予訪問 Amazon S3 存儲桶的權限。根據這篇博客文章中的信息,示例存儲桶策略如下所示。
要授予其他帳戶中的 IAM 用戶訪問權限,您需要將 IAM 用戶的 ARN 添加到 aws:PrincipalArn 條件中,如本博客文章前面部分所述。除了 aws:PrincipalArn 條件,您還需要將 IAM 用戶的完整 ARN 添加到這些策略的 Principal 元素中。示例策略如下所示。
除了在存儲桶策略中包含角色權限外,您還需要在 IAM 用戶或角色的用戶策略中定義這些權限。這些權限被添加到客戶管理的策略中,並附加到 IAM 控制台中的角色或用戶,示例策略文件如下所示。
通過遵循這篇文章中的指導,您可以在同一帳戶和跨帳戶場景中限制 S3 存儲桶的訪問權限給特定的 IAM 角色或用戶,即使用戶擁有 Admin 策略或 “s3:*” 的策略。在許多應用中,這種邏輯的要求會因用例而異。我們建議在可能的情況下採用最小權限原則,並僅授予執行必要任務所需的最低權限。
如果您對這篇文章有反饋,請在下方的評論區提交評論。如果您對這篇文章有疑問,請在 AWS 身份和訪問管理 re:Post 上開啟一個新線程或聯繫 AWS 支援。
Chris Craig
這篇博客文章的原作者已不在 AWS。2016年,當這篇文章首次發佈時,我們沒有包含作者簡介。
本文由 AI 台灣 運用 AI 技術編撰,內容僅供參考,請自行核實相關資訊。
歡迎加入我們的 AI TAIWAN 台灣人工智慧中心 FB 社團,
隨時掌握最新 AI 動態與實用資訊!