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 主控台使用這些政策的資訊,請參閱使用使用者政策來控制對儲存貯體的存取

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

在此範例中,您想要授與 IAM 使用者 AWS 帳戶 存取您其中一個值區 DOC-EXAMPLE-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:::DOC-EXAMPLE-BUCKET1" }, { "Effect":"Allow", "Action":[ "s3:PutObject", "s3:PutObjectAcl", "s3:GetObject", "s3:GetObjectAcl", "s3:DeleteObject" ], "Resource":"arn:aws:s3:::DOC-EXAMPLE-BUCKET1/*" } ] }

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

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

DOC-EXAMPLE-BUCKET1 Mary/ Carlos/

若要授與每位使用者只能存取自己資料夾的存取權,您可以為每位使用者撰寫一項政策,並分別予以連接。例如,您可以將下列政策連接至使用者 Mary,讓她擁有 DOC-EXAMPLE-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:::DOC-EXAMPLE-BUCKET1/Mary/*" } ] }

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

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

{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "s3:PutObject", "s3:GetObject", "s3:GetObjectVersion", "s3:DeleteObject", "s3:DeleteObjectVersion" ], "Resource":"arn:aws:s3:::DOC-EXAMPLE-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:::DOC-EXAMPLE-BUCKET1", "Condition":{ "StringEquals":{ "s3:prefix":[""], "s3:delimiter":["/"] } } }, { "Sid": "AllowListBucketOfASpecificUserPrefix", "Action": "s3:ListBucket", "Effect": "Allow", "Resource": "arn:aws:s3:::DOC-EXAMPLE-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:::DOC-EXAMPLE-BUCKET1/${aws:username}/*" } ] }
注意

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

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

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

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

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

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

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

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

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

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

如果將下列政策連接至群組,則會授予群組中的所有人存取 Amazon S3 的下列資料夾:DOC-EXAMPLE-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:::DOC-EXAMPLE-BUCKET1/share/marketing/*" } ] }

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

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

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

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

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

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

DOC-EXAMPLE-BUCKET1/uploads/anycompany

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

{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":"s3:PutObject", "Resource":"arn:aws:s3:::DOC-EXAMPLE-BUCKET1/uploads/anycompany/*" }, { "Effect":"Deny", "Action":"s3:*", "NotResource":"arn:aws:s3:::DOC-EXAMPLE-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 ID 來取代您自己政策中的這個值。

{ "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 的值與列出的 OU 比較,不區分大小寫。

限制組織內 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:ResourceOrgIDaws:PrincipalOrgID 彼此相等。根據此需求,發出請求的主體與正在存取的資源必須位於同一個組織中。

下列範例以身分識別為基礎的原則會將s3:GetAccountPublicAccessBlock權限授與使用者。您需要將這些許可的 Resource 值設成 "*"。如需有關資源 ARN 的資訊,請參閱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,請參閱使用 AWS CLI 來透過 Amazon S3 進行開發

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

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

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