Amazon S3 的身分型政策範例 - Amazon Simple Storage Service

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

Amazon S3 的身分型政策範例

本節顯示數個用於控制 Amazon S3 存取的範例 AWS Identity and Access Management (IAM) 身分型政策。如需儲存貯體政策 (資源型政策),請參閱 Amazon S3 的儲存貯體政策。如需 IAM 政策語言的相關資訊,請參閱 Amazon S3 中的政策和許可

如果您是以程式設計方式來使用,則適用以下範例政策。但是,若要透過 Amazon S3 主控台來使用,您必須授予主控台所需的其他許可。如需有關搭配 Amazon S3 主控台使用這些政策的資訊,請參閱使用使用者政策來控制對儲存貯體的存取

如需 S3 資源類型對 S3 API 操作的許可的詳細資訊,請參閱 Amazon S3 API 操作的必要許可

允許 IAM 使用者存取其中一個儲存貯體

在此範例中,您想要將 AWS 帳戶 存取權中的 IAM 使用者授予其中一個儲存貯體,amzn-s3-demo-bucket1,並允許使用者新增、更新和刪除物件。

除了授予使用者 s3:PutObjects3:GetObjects3:DeleteObject 許可之外,政策也會授予 s3:ListAllMyBucketss3:GetBucketLocations3:ListBucket 許可。這些是主控台需要的額外許可。還需要 s3:PutObjectAcls3:GetObjectAcl 動作才能在主控台中複製、剪下與貼上物件。如需授予使用者許可並使用主控台測試的演練範例,請參閱「使用使用者政策來控制對儲存貯體的存取」。

{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action": "s3:ListAllMyBuckets", "Resource":"*" }, { "Effect":"Allow", "Action":["s3:ListBucket","s3:GetBucketLocation"], "Resource":"arn:aws:s3:::amzn-s3-demo-bucket1" }, { "Effect":"Allow", "Action":[ "s3:PutObject", "s3:PutObjectAcl", "s3:GetObject", "s3:GetObjectAcl", "s3:DeleteObject" ], "Resource":"arn:aws:s3:::amzn-s3-demo-bucket1/*" } ] }

允許每個 IAM 使用者存取儲存貯體中的資料夾

在此範例中,您希望兩個 IAM 使用者 Mary 和 Carlos 能夠存取您的儲存貯體,amzn-s3-demo-bucket1,以便他們可以新增、更新和刪除物件。不過,您希望限制每位使用者只能存取儲存貯體中的單一字首 (資料夾)。您可以建立名稱與其使用者名稱相符的資料夾。

amzn-s3-demo-bucket1 Mary/ Carlos/

若要授與每位使用者只能存取自己資料夾的存取權,您可以為每位使用者撰寫一項政策,並分別予以連接。例如,您可以將下列政策連接至使用者 Mary,讓她擁有 amzn-s3-demo-bucket1/Mary 資料夾的特定 Amazon S3 許可。

{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "s3:PutObject", "s3:GetObject", "s3:GetObjectVersion", "s3:DeleteObject", "s3:DeleteObjectVersion" ], "Resource":"arn:aws:s3:::amzn-s3-demo-bucket1/Mary/*" } ] }

然後,您可以將類似的政策附加至使用者 Carlos,並在 Resource 值中指定 Carlos

和將政策連接至個別使用者不同,您可撰寫使用政策變數的單一政策,然後將政策連接至群組。首先,您必須建立群組,並將 Mary 及 Mary 新增至此群組。以下政策範例在 amzn-s3-demo-bucket1/${aws:username} 資料夾中允許一組 Amazon S3 許可。評估政策時,政策變數${aws:username}會以請求者的使用者名稱取代。例如,如果 Mary 傳送放置物件的要求,只有當 Mary 將物件上傳至 amzn-s3-demo-bucket1/Mary 資料夾時,才允許此操作。

{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "s3:PutObject", "s3:GetObject", "s3:GetObjectVersion", "s3:DeleteObject", "s3:DeleteObjectVersion" ], "Resource":"arn:aws:s3:::amzn-s3-demo-bucket1/${aws:username}/*" } ] }
注意

使用政策變數時,您必須在政策中明確指定版本 2012-10-17。IAM 政策語言的預設版本 2008-10-17 不支援政策變數。

如果您希望在 Amazon S3 主控台上測試前一項政策,主控台需要額外的許可,如以下政策中所示。如需主控台如何使用這些許可的資訊,請參閱「使用使用者政策來控制對儲存貯體的存取」。

{ "Version":"2012-10-17", "Statement": [ { "Sid": "AllowGroupToSeeBucketListInTheConsole", "Action": [ "s3:ListAllMyBuckets", "s3:GetBucketLocation" ], "Effect": "Allow", "Resource": "arn:aws:s3:::*" }, { "Sid": "AllowRootLevelListingOfTheBucket", "Action": "s3:ListBucket", "Effect": "Allow", "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1", "Condition":{ "StringEquals":{ "s3:prefix":[""], "s3:delimiter":["/"] } } }, { "Sid": "AllowListBucketOfASpecificUserPrefix", "Action": "s3:ListBucket", "Effect": "Allow", "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1", "Condition":{ "StringLike":{"s3:prefix":["${aws:username}/*"] } } }, { "Sid": "AllowUserSpecificActionsOnlyInTheSpecificUserPrefix", "Effect":"Allow", "Action":[ "s3:PutObject", "s3:GetObject", "s3:GetObjectVersion", "s3:DeleteObject", "s3:DeleteObjectVersion" ], "Resource":"arn:aws:s3:::amzn-s3-demo-bucket1/${aws:username}/*" } ] }
注意

在 2012-10-17 版本的政策中,政策變數是以 $ 開頭。如果您的物件金鑰 (物件名稱) 包含 $,這項語法變更可能會造成衝突。

若要避免此衝突,請使用 ${$} 指定 $ 字元。例如,若要在政策中包含物件金鑰 my$file,請將它指定為 my${$}file

雖然 IAM 使用者名稱是易讀且人為可讀的識別碼,但它們不需要全域唯一。例如,如果使用者 Carlos 離職但有另一位 Carlos 入職,則新 Carlos 可以存取舊 Carlos 的資訊。

您可以根據 IAM 使用者 IDs 建立資料夾,而不是使用使用者名稱。每個 IAM 使用者 ID 都是唯一的。在本例中,您必須修改前一項政策,以使用 ${aws:userid} 政策變數。如需使用者識別符的詳細資訊,請參閱 IAM 使用者指南中的 Word 識別符IAM

{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "s3:PutObject", "s3:GetObject", "s3:GetObjectVersion", "s3:DeleteObject", "s3:DeleteObjectVersion" ], "Resource":"arn:aws:s3:::amzn-s3-demo-bucket1/home/${aws:userid}/*" } ] }

允許非 IAM 使用者 (行動應用程式使用者) 存取儲存貯體中的資料夾

假設您希望開發行動應用程式,一種將使用者資料存放在 S3 儲存貯體的遊戲。您希望在您的儲存貯體中,為每一位應用程式使用者建立一個資料夾。您也想要限制每個使用者存取自己的資料夾。但您無法在有人下載應用程式並開始玩遊戲之前建立資料夾,因為您沒有其使用者 ID。

在本例中,您可要求使用者使用 Login with Amazon、Facebook 或 Google 等公用身分提供者,登入您的應用程式。在使用者透過這些提供者之一登入您的應用程式後,他們就會有一個使用者 ID,您可用來在執行階段建立使用者專用資料夾。

然後,您可以使用 中的 Web 身分聯合 AWS Security Token Service ,將身分提供者的資訊與您的應用程式整合,並取得每個使用者的臨時安全憑證。然後,您可以建立 IAM 政策,允許應用程式存取您的儲存貯體,並執行建立使用者特定資料夾和上傳資料等操作。如需 Web 身分聯合的詳細資訊,請參閱 IAM 使用者指南中的關於 Web 身分聯合

允許群組在 Amazon S3 中有共用資料夾

如果將下列政策連接至群組,則會授予群組中的所有人存取 Amazon S3 的下列資料夾:amzn-s3-demo-bucket1/share/marketing。群組成員只能存取原則所示的特定 Amazon S3 許可,而且僅限於特定資料夾中的物件。

{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "s3:PutObject", "s3:GetObject", "s3:GetObjectVersion", "s3:DeleteObject", "s3:DeleteObjectVersion" ], "Resource":"arn:aws:s3:::amzn-s3-demo-bucket1/share/marketing/*" } ] }

允許您的所有使用者讀取該儲存貯體某一部分中的物件

在此範例中,您會建立名為 的群組AllUsers,其中包含 擁有的所有 IAM 使用者 AWS 帳戶。然後您要連接政策,允許群組存取 GetObjectGetObjectVersion,但只適用於 amzn-s3-demo-bucket1/readonly 資料夾中的物件。

{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "s3:GetObject", "s3:GetObjectVersion" ], "Resource":"arn:aws:s3:::amzn-s3-demo-bucket1/readonly/*" } ] }

允許合作夥伴將檔案放置在該儲存貯體的特定部分中

在本例中,您要建立名為 AnyCompany 的群組,代表合作夥伴公司。您可以在需要存取的合作夥伴公司為特定人員或應用程式建立 IAM 使用者,然後將使用者放入群組。

然後您要連接政策,讓群組 PutObject 可存取儲存貯體中的下列資料夾:

amzn-s3-demo-bucket1/uploads/anycompany

您不希望 AnyCompany 群組對儲存貯體執行任何其他操作,所以您新增陳述式明確拒絕任何 Amazon S3 動作的許可,但對 AWS 帳戶中的任何 Amazon S3 資源執行 PutObject 除外。

{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":"s3:PutObject", "Resource":"arn:aws:s3:::amzn-s3-demo-bucket1/uploads/anycompany/*" }, { "Effect":"Deny", "Action":"s3:*", "NotResource":"arn:aws:s3:::amzn-s3-demo-bucket1/uploads/anycompany/*" } ] }

限制對特定 AWS 帳戶中 Amazon S3 儲存貯體的存取

如果您想要確保您的 Amazon S3 主體僅存取受信任的資源 AWS 帳戶,您可以限制存取。例如,此身分型 IAM 政策使用 Deny效果來封鎖對 Amazon S3 動作的存取,除非正在存取的 Amazon S3 資源位於 帳戶中222222222222。若要防止 中的 IAM 主體 AWS 帳戶 存取帳戶外的 Amazon S3 物件,請附加下列 IAM 政策:

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DenyS3AccessOutsideMyBoundary", "Effect": "Deny", "Action": [ "s3:*" ], "Resource": "*", "Condition": { "StringNotEquals": { "aws:ResourceAccount": [ "222222222222" ] } } } ] }
注意

此政策不會取代現有的 IAM 存取控制,因為它不會授予任何存取權。相反地,此政策會作為您其他 IAM 許可的額外防護機制,無論透過其他 IAM 政策授予的許可為何。

務必使用您自己的 AWS 帳戶取代帳戶 ID 222222222222。若要將政策套用至多個帳戶的同時仍維持此限制,請以 aws:PrincipalAccount 條件金鑰取代帳户 ID。此條件要求主體和資源必須位於同一個帳户中。

限制對組織單位內 Amazon S3 儲存貯體的存取

如果您在 中設定了組織單位 (OU) AWS Organizations,您可能想要將 Amazon S3 儲存貯體存取權限制為組織的特定部分。在此範例中,我們將使用 aws:ResourceOrgPaths 金鑰限制 Amazon S3 儲存貯體只能存取組織中的 OU。在此範例中,OU IDou-acroot-exampleou。請務必使用您自己的 OU IDs 取代您自己的政策中的此值。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowS3AccessOutsideMyBoundary", "Effect": "Allow", "Action": [ "s3:*" ], "Resource": "*", "Condition": { "ForAllValues:StringNotLike": { "aws:ResourceOrgPaths": [ "o-acorg/r-acroot/ou-acroot-exampleou/" ] } } } ] }
注意

此政策不會授予任何存取權。反之,此政策會作為您其他 IAM 許可的後端,防止您的主體存取 OU 定義界限外的 Amazon S3 物件。

該政策會拒絕存取 Amazon S3 動作,除非正在存取的 Amazon S3 物件位於組織中的 ou-acroot-exampleou OU 中。IAM 政策條件要求 aws:ResourceOrgPaths多值條件索引鍵 包含任何列出的 OU 路徑。此政策使用ForAllValues:StringNotLike運算子將 的值aws:ResourceOrgPaths與列出的 OUs 進行比較,而不會區分大小寫。

限制組織內 Amazon S3 儲存貯體的存取權

若要限制對組織中 Amazon S3 物件的存取,請將 IAM 政策連接至組織的根目錄,並將其套用至組織中的所有帳戶。若要要求您的 IAM 主體遵循此規則,請使用服務控制政策 (SCP)。如果您選擇使用 SCP,請務必先徹底測試 SCP,再將政策連接至組織的根目錄。

在下列範例政策中,除非存取的 Amazon S3 物件與存取它的 IAM 主體位於相同的組織中,否則會拒絕存取 Amazon S3 動作:

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DenyS3AccessOutsideMyBoundary", "Effect": "Deny", "Action": [ "s3:*" ], "Resource": "arn:aws:s3:::*/*", "Condition": { "StringNotEquals": { "aws:ResourceOrgID": "${aws:PrincipalOrgID}" } } } ] }
注意

此政策不會授予任何存取權。反之,此政策會作為您其他 IAM 許可的後端,防止您的主體存取組織外的任何 Amazon S3 物件。此政策也會套用到政策生效後建立的 Amazon S3 資源。

此範例中的 IAM 政策條件需要 aws:ResourceOrgID和 相互aws:PrincipalOrgID相等。根據此需求,發出請求的主體與正在存取的資源必須位於同一個組織中。

下列以身分為基礎的政策範例會將s3:GetAccountPublicAccessBlock許可授予使用者。您需要將這些許可的 Resource 值設成 "*"。如需資源 ARNs 的相關資訊,請參閱 Amazon S3 的政策資源

{ "Version":"2012-10-17", "Statement":[ { "Sid":"statement1", "Effect":"Allow", "Action":[ "s3:GetAccountPublicAccessBlock" ], "Resource":[ "*" ] } ] }

將儲存貯體建立限制為一個區域

假設 AWS 帳戶 管理員想要授予其使用者 (Dave) 許可,僅在南美洲 (聖保羅) 區域中建立儲存貯體。帳戶管理員可連接下列使用者政策,授予附條件的 s3:CreateBucket 許可,如下所示。Condition 區塊中的金鑰/值對會指定 s3:LocationConstraint 金鑰與 sa-east-1 區域當做值。

注意

在此範例中,儲存貯體擁有者要將許可授予其使用者之一,所以可使用儲存貯體政策或使用者政策。本例示範使用者政策。

如需 Amazon S3 區域的清單,請參閱《AWS 一般參考》中的區域與端點

{ "Version":"2012-10-17", "Statement":[ { "Sid":"statement1", "Effect":"Allow", "Action": "s3:CreateBucket", "Resource": "arn:aws:s3:::*", "Condition": { "StringLike": { "s3:LocationConstraint": "sa-east-1" } } } ] }
新增明確拒絕

上述政策限制使用者只能在 sa-east-1 區域建立儲存貯體,任何其他區域皆不可。不過,可能有其他政策會授予此使用者許可,使其可在其他區域建立儲存貯體。例如,假設使用者屬於某個群組,而此群組所連接的政策允許群組許可範圍中的所有使用者在另一區域建立儲存貯體。為了確保使用者不會取得在任何其他區域中建立儲存貯體的許可,您可以在上述政策中新增明確拒絕陳述式。

Deny 陳述式使用 StringNotLike 條件。亦即,如果位置限制條件不是 sa-east-1,便拒絕建立儲存貯體的要求。明確拒絕不允許使用者在任何其他 區域中建立儲存貯體,無論使用者取得的其他許可為何。下列政策包含明確拒絕陳述式。

{ "Version":"2012-10-17", "Statement":[ { "Sid":"statement1", "Effect":"Allow", "Action": "s3:CreateBucket", "Resource": "arn:aws:s3:::*", "Condition": { "StringLike": { "s3:LocationConstraint": "sa-east-1" } } }, { "Sid":"statement2", "Effect":"Deny", "Action": "s3:CreateBucket", "Resource": "arn:aws:s3:::*", "Condition": { "StringNotLike": { "s3:LocationConstraint": "sa-east-1" } } } ] }
使用 測試政策 AWS CLI

您可以使用下列create-bucket AWS CLI 命令來測試政策。本例使用 bucketconfig.txt 檔案指定位置限制條件。請注意 Windows 檔案路徑。您需要適時更新儲存貯體名稱及路徑。您必須使用 --profile 參數提供使用者憑證。如需設定和使用 的詳細資訊 AWS CLI,請參閱 Amazon S3 Word 參考中的使用 AWS CLI 與 Amazon S3 一起開發Amazon S3 API

aws s3api create-bucket --bucket examplebucket --profile AccountADave --create-bucket-configuration file://c:/Users/someUser/bucketconfig.txt

bucketconfig.txt 檔案會指定組態,如下所示。

{"LocationConstraint": "sa-east-1"}