本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
Amazon S3 的基於身分識別的政策範例
本節顯示用於控制 Amazon S3 存取權的數個範例 AWS Identity and Access Management (IAM) 身分型政策。如需值區政策 (以資源為基礎的政策) 範例,請參閱Amazon S3 的存儲桶政策。如需有關IAM策略語言的資訊,請參閱Amazon S3 中的政策和許可。
如果您是以程式設計方式來使用,則適用以下範例政策。但是,若要透過 Amazon S3 主控台來使用,您必須授予主控台所需的其他許可。如需有關搭配 Amazon S3 主控台使用這些政策的資訊,請參閱使用使用者政策來控制對儲存貯體的存取。
主題
允許使IAM用者存取其中一個值區
在此範例中,您想要授與IAM使用者存 AWS 帳戶 取其中一個值區的權限,amzn-s3-demo-bucket1
,並允許使用者新增、更新和刪除物件。
除了授予使用者 s3:PutObject
、s3:GetObject
與 s3:DeleteObject
許可之外,政策也會授予 s3:ListAllMyBuckets
、s3:GetBucketLocation
與 s3:ListBucket
許可。這些是主控台需要的額外許可。還需要 s3:PutObjectAcl
與 s3: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,讓她擁有
資料夾的特定 Amazon S3 許可。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
/Mary
/*" } ] }
然後,您可以將類似的政策附加至使用者 Carlos,並在 Resource
值中指定
。Carlos
和將政策連接至個別使用者不同,您可撰寫使用政策變數的單一政策,然後將政策連接至群組。首先,您必須建立群組,並將 Mary 及 Mary 新增至此群組。以下政策範例在
資料夾中允許一組 Amazon S3 許可。評估原則時,原則變數會amzn-s3-demo-bucket1
/${aws:username}${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使用指南中的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,您可用來在執行階段建立使用者專用資料夾。
然後,您可以使用聯合網頁身分識別, AWS Security Token Service 將身分識別提供者的資訊與您的應用程式整合,並取得每個使用者的臨時安全性憑證。然後,您可以建立允許應用程式存取儲存貯體的IAM政策,並執行諸如建立使用者特定資料夾和上傳資料之類的操作。如需有關網路身分同盟的詳細資訊,請參閱《IAM使用者指南》中的關於網路身分同盟。
允許群組在 Amazon S3 中有共用資料夾
如果將下列政策連接至群組,則會授予群組中的所有人存取 Amazon S3 的下列資料夾:
。群組成員只能存取原則所示的特定 Amazon S3 許可,而且僅限於特定資料夾中的物件。amzn-s3-demo-bucket1
/share/marketing
{ "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/*" } ] }
允許您的所有使用者讀取該儲存貯體某一部分中的物件
在此範例中,您會建立名為的群組
,其中包含 AWS 帳戶. IAM 然後您要連接政策,允許群組存取 AllUsers
GetObject
與 GetObjectVersion
,但只適用於
資料夾中的物件。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/*" } ] }
允許合作夥伴將檔案放置在該儲存貯體的特定部分中
在本例中,您要建立名為
的群組,代表合作夥伴公司。您為需要存取權的合作夥伴公司的特定人員或應用程式建立使用者,然後將使用者置於群組中。IAMAnyCompany
然後您要連接政策,讓群組 PutObject
可存取儲存貯體中的下列資料夾:
amzn-s3-demo-bucket1
/uploads/anycompany
您不希望
群組對儲存貯體執行任何其他操作,所以您新增陳述式明確拒絕任何 Amazon S3 動作的許可,但對 AWS 帳戶中的任何 Amazon S3 資源執行 AnyCompany
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 帳戶,您可以限制存取。例如,除非正在存取的 Amazon S3 資源已納入帳戶,否則此身分型IAM政策會使用Deny
效果來封鎖對 Amazon S3 動作的存取。
若要防止中的IAM主體存 AWS 帳戶 取帳戶以外的 Amazon S3 物件,請附上以下IAM政策:222222222222
{ "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 ID 是
。請務必將您自己原則中的這個值取代為您自己的 OU IDs。ou-acroot-exampleou
{ "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 中。IAM原則條件要求ou-acroot-exampleou
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:PrincipalOrgID
要aws:ResourceOrgID
且彼此相等。根據此需求,發出請求的主體與正在存取的資源必須位於同一個組織中。
授與擷取PublicAccessBlock組態的權限 AWS 帳戶
下列範例以身分識別為基礎的原則會將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,請參閱使用 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"}