本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用使用者政策來控制對儲存貯體的存取
此演練說明使用者許可與 Amazon S3 搭配運作的方式。在此範例中,您建立含有資料夾的儲存貯體。然後,您可以在 中建立 AWS Identity and Access Management IAM 使用者, AWS 帳戶 並對 Amazon S3 儲存貯體及其中的資料夾授予這些使用者增量許可。
主題
儲存貯體與資料夾的基本概念
Amazon S3 資料模型是單層式結構:您建立儲存貯體,儲存貯體存放物件。子儲存貯體或子資料夾沒有階層,但您可以模擬資料夾階層。Amazon S3 主控台之類工具可以在儲存貯體中顯示這些邏輯資料夾和子資料夾。
此主控台會顯示名為 companybucket
的儲存貯體有三個資料夾:Private
、Development
和 Finance
以及物件 s3-dg.pdf
。此主控台使用物件名稱 (金鑰) 建立內含資料夾與子資料夾的邏輯階層。請考量下列範例:
-
當您建立
Development
資料夾時,主控台會使用Development/
索引鍵建立物件。請注意結尾斜線的 (/
) 分隔符號。 -
在
Projects1.xls
資料夾上傳名為Development
的物件,此主控台會上傳該物件並為該物件提供Development/Projects1.xls
索引鍵。在索引鍵中,
Development
為字首,/
為分隔符號。Amazon S3 API 允許在其操作中使用字首與分隔符號。例如,您可以取得儲存貯體中所有包含特定字首與分隔符號之物件的清單。在主控台中,當您開啟Development
資料夾時,主控台便會列出該資料夾中的物件。在以下範例中,Development
資料夾包含一個物件。主控台在
Development
儲存貯體中列出companybucket
資料夾時會向 Amazon S3 傳送請求,並在請求中指定字首Development
和分隔符號/
。此主控台的回應就像是電腦檔案系統中的資料夾清單。先前的範例顯示儲存貯體companybucket
包含一個具有金鑰Development/Projects1.xls
的物件。
主控台使用物件金鑰來推論邏輯階層。Amazon S3 沒有實體階層。Amazon S3 只具有以單層式檔案結構包含物件的儲存貯體。當您使用 Amazon S3 API 建立物件時,可以使用暗指邏輯階層的物件金鑰。如此演練所示範,您可以在建立物件的邏輯階層時,管理對個別資料夾的存取權。
在您開始前,確保您熟悉根層級儲存貯體內容的概念。假設您的 companybucket
儲存貯體包含下列物件:
-
Private/privDoc1.txt
-
Private/privDoc2.zip
-
Development/project1.xls
-
Development/project2.xls
-
Finance/Tax2011/document1.pdf
-
Finance/Tax2011/document2.pdf
-
s3-dg.pdf
這些物件金鑰會建立以 Private
、Development
與 Finance
作為根層級資料夾,並以 s3-dg.pdf
作為根層級物件的邏輯階層。當您在 Amazon S3 主控台上選擇儲存貯體名稱時,根層級項目會出現。此主控台會將最上層的字首 (Private/
、Development/
與 Finance/
) 顯示為根層級資料夾。因為物件金鑰 s3-dg.pdf
沒有字首,所以會顯示為根層級項目。
演練摘要
您會在此演練中,建立其中含有三個資料夾 (Private
、Development
和 Finance
) 的儲存貯體。
您有兩名使用者:Alice 與 Bob。您希望 Alice 僅能夠存取 Development
資料夾,而您希望 Bob 僅能夠存取 Finance
資料夾。您希望讓 Private
資料夾內容保持未對外開放。在此逐步解說中,您會建立 IAM 使用者 (範例中的使用者名稱是 Alice 與 Bob) 並授予必要許可,以此來管理存取權。
IAM 也支援建立使用者群組和授予群組層級的許可,以套用至群組中的所有使用者。這可讓許可管理得更好。在此練習中,Alice 與 Bob 都需要一些一般許可。因此,您也會建立名為 Consultants
的群組,然後再於此群組中新增 Alice 與 Bob。您先將群組政策連接至該群組來授予許可。接著再將政策連接至特定的使用者,新增使用者專用的許可。
注意
此演練使用 companybucket
作為儲存貯體名稱、使用 Alice 與 Bob 作為 IAM 使用者,並使用 Consultants
作為群組名稱。因為 Amazon S3 要求全域唯一的儲存貯體名稱,所以您必須將儲存貯體名稱換成您建立的名稱。
準備演練
在此範例中,您會使用 AWS 帳戶 登入資料來建立 IAM 使用者。這些使用者在一開始都不具備任何許可。您對這些使用者遞增授予許可來執行特定的 Amazon S3 動作。為測試這些許可,您將使用每位使用者的憑證登入主控台。當您以 AWS 帳戶 擁有者身分遞增授予許可,並以 IAM 使用者身分測試許可時,每次都需要使用不同的登入資料登入和登出。您可以使用瀏覽器來執行此測試,但如果您能夠使用兩個不同的瀏覽器,便能加快此程序的速度。使用一個瀏覽器 AWS Management Console 使用您的 AWS 帳戶 登入資料連線至 ,並使用另一個瀏覽器與 IAM 使用者登入資料連線。
若要 AWS Management Console 使用您的 AWS 帳戶 登入資料登入 ,請前往 https://https://console.aws.amazon.com/
如需 IAM 的詳細資訊,請參閱《IAM 使用者指南》中的 AWS Management Console 登入頁面。
為 IAM 使用者提供登入連結
-
登入 AWS Management Console ,並在 https://https://console.aws.amazon.com/iam/
開啟 IAM 主控台。 -
在 Navigation (導覽) 窗格中,選擇 IAM Dashboard (IAM 儀表板)。
-
記下 IAM users sign in link: (IAM 使用者登入連結:) 下的 URL。將此連結提供給 IAM 使用者,讓他們使用 IAM 使用者名稱與密碼來登入主控台。
步驟 1:建立儲存貯體
在此步驟中,您會使用 AWS 帳戶 憑證來登入 Amazon S3 主控台、建立儲存貯體、將資料夾新增至儲存貯體,然後在每個資料夾中上傳一到兩份範例文件。
登入 AWS Management Console ,並在 https://console.aws.amazon.com/s3/
:// 開啟 Amazon S3 主控台。 -
建立儲存貯體。
如需逐步說明,請參閱 建立一般用途儲存貯體。
-
將一份文件上傳到儲存貯體。
此練習假設您在此儲存貯體的根層級中已有
s3-dg.pdf
文件。若要上傳不同的文件,請將其檔案名稱替換為s3-dg.pdf
。 -
將名為
Private
、Finance
和Development
的三個資料夾新增至儲存貯體。如需建立資料夾的逐步說明,請參閱《Amazon Simple Storage Service 使用者指南》中的 在 Amazon S3 主控台中使用資料夾整理物件。
-
在每個資料夾中上傳一到兩份文件。
此練習假設您已在每個資料夾中上傳了一些文件,而且儲存貯體已有具有下列金鑰的物件:
-
Private/privDoc1.txt
-
Private/privDoc2.zip
-
Development/project1.xls
-
Development/project2.xls
-
Finance/Tax2011/document1.pdf
-
Finance/Tax2011/document2.pdf
-
s3-dg.pdf
如需逐步說明,請參閱 上傳物件。
-
步驟 2:建立 IAM 使用者與群組
現在,請使用 IAM 主控台
另外建立一個名為 Consultants
的管理群組。然後將這兩名使用者新增至群組。如需逐步說明,請參閱建立 IAM 使用者群組。
警告
當您新增使用者與群組時,請勿指派任何會將許可授予這些使用者的政策。這些使用者在一開始不具有任何許可。您將在下列區段中授予額外的許可。您必須先確定已為這些 IAM 使用者指派密碼。您將使用這些使用者憑證來測試 Amazon S3 動作,並確認許可是否如預期般運作。
如需建立新 IAM 使用者的逐步說明,請參閱《IAM 使用者指南》中的在 AWS 帳戶中建立 IAM 使用者。為此演練建立使用者時,請選取 AWS Management Console 存取,並清除程式化存取。
如需建立管理群組的逐步說明,請參閱《IAM 使用者指南》中的建立您的第一個 IAM 管理員使用者和群組。
步驟 3:確認 IAM 使用者沒有許可
如果您使用兩個瀏覽器,您現在可以使用第二個瀏覽器,以其中一個 IAM 使用者憑證來登入主控台。
-
使用 IAM 使用者登入連結 (請參閱「為 IAM 使用者提供登入連結」),使用任一組 IAM 使用者憑證登入 AWS Management Console 。
-
開啟位於 https://console.aws.amazon.com/s3/
的 Amazon S3 主控台。 確認主控台訊息會通知您存取被拒。
您現在可以將額外的許可授予使用者。首先,您要連接群組政策,授予兩位使用者一些必要的許可。
步驟 4:授予群組層級的許可
您希望使用者都能執行下列動作:
-
列出父帳戶擁有的所有儲存貯體。要做到這一點,Bob 與 Alice 必須具備
s3:ListAllMyBuckets
動作的許可。 -
列出
companybucket
儲存貯體中的根層級項目、資料夾與物件。要做到這一點,Bob 與 Alice 必須具備可以對s3:ListBucket
儲存貯體執行companybucket
動作的許可。
首先,您建立會授予這些許可的政策,然後將該政策連接至 Consultants
群組。
步驟 4.1:授予列出所有儲存貯體的許可
在此步驟中,您將建立受管政策 (可將使用者基本許可授予使用者,以便其能列出父帳戶擁有的所有儲存貯體)。接著,您將政策連接至 Consultants
群組。當您將受管政策連接至使用者或群組時,即表示您授予該使用者或群組許可,讓他們可取得父 AWS 帳戶擁有之儲存貯體的清單。
-
登入 AWS Management Console ,並在 https://https://console.aws.amazon.com/iam/
開啟 IAM 主控台。 注意
由於您要授予使用者許可,請使用您的 AWS 帳戶 憑證來登入,不要以 IAM 使用者身分登入。
-
建立受管政策。
-
在左邊的導覽窗格中,選擇 Policies (政策),然後選擇 Create policy (建立政策)。
-
請選擇 JSON 索引標籤。
-
複製下列存取政策,並貼入政策的文字欄位中。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowGroupToSeeBucketListInTheConsole", "Action": ["s3:ListAllMyBuckets"], "Effect": "Allow", "Resource": ["arn:aws:s3:::*"] } ] }
政策是 JSON 文件。在此文件中,
Statement
是物件陣列,每一個物件均使用一組名稱值對來描述許可。前面的政策在描述一項特定的許可。Action
會指定存取類型。在政策中,s3:ListAllMyBuckets
是預先定義的 Amazon S3 動作。此動作涵蓋 Amazon S3 GET Service 操作,此操作會傳回已驗證的傳送者擁有的所有儲存貯體清單。Effect
元素值決定要允許或拒絕特定許可。 -
選擇 Review Policy (檢閱政策)。在下一個頁面中,於 Name (名稱) 欄位輸入
AllowGroupToSeeBucketListInTheConsole
,接著選擇 Create policy (建立政策)。注意
Summary (摘要) 項目會顯示訊息,指出該政策未授予任何許可。就本演練為例,您可放心地忽略此訊息。
-
-
將您建立的
AllowGroupToSeeBucketListInTheConsole
受管政策連接至Consultants
群組。如需連接受管政策的逐步說明,請參閱《IAM 使用者指南》中的新增和移除 IAM 身分許可。
您在 IAM 主控台中將政策文件連接至 IAM 使用者和群組。您希望這兩個使用者都能夠列出儲存貯體,因此將該政策連接至該群組。
-
測試許可。
-
使用 IAM 使用者登入連結 (請參閱 為 IAM 使用者提供登入連結),利用任一組 IAM 使用者憑證來登入主控台。
-
開啟位於 https://console.aws.amazon.com/s3/
的 Amazon S3 主控台。 主控台現在應會列出所有儲存貯體,但不會列出任何儲存貯體中的物件。
-
步驟 4.2:允許使用者列出儲存貯體的根層級內容
接下來,我們允許所有使用者在 Consultants
群組內列出根層級的 companybucket
儲存貯體項目。當使用者在 Amazon S3 主控台上選擇公司儲存貯體時,使用者可以看到儲存貯體中的根層級項目。
注意
此範例使用 companybucket
進行說明。您必須使用您建立的儲存貯體名稱。
若要了解您選擇儲存貯體名稱時主控台傳送給 Amazon S3 的請求、Amazon S3 傳回的回應,以及主控台如何解譯回應,請更仔細地查看流程。
當您選擇儲存貯體名稱時,主控台會將 GET 儲存貯體 (列出物件) 請求傳送給 Amazon S3。此要求包含下列參數:
-
其值為空字串的
prefix
參數。 -
其值為
delimiter
的/
參數。
下列是範例要求。
GET ?prefix=&delimiter=/ HTTP/1.1 Host: companybucket.s3.amazonaws.com Date: Wed, 01 Aug 2012 12:00:00 GMT Authorization: AWS AKIAIOSFODNN7EXAMPLE:xQE0diMbLRepdf3YB+FIEXAMPLE=
Amazon S3 傳回包含下列 <ListBucketResult/>
元素的回應。
<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> <Name>companybucket</Name> <Prefix></Prefix> <Delimiter>/</Delimiter> ... <Contents> <Key>s3-dg.pdf</Key> ... </Contents> <CommonPrefixes> <Prefix>Development/</Prefix> </CommonPrefixes> <CommonPrefixes> <Prefix>Finance/</Prefix> </CommonPrefixes> <CommonPrefixes> <Prefix>Private/</Prefix> </CommonPrefixes> </ListBucketResult>
金鑰 s3-dg.pdf
物件不含斜線 (/
) 分隔符號,而 <Contents>
會在 Amazon S3 元素中傳回金鑰。不過,範例儲存貯體中的所有其他金鑰都包含 /
分隔符號。Amazon S3 將這些金鑰分組,並針對每個不同的字首值 <CommonPrefixes>
、Development/
和 Finance/
,傳回一個 Private/
元素,這是從這些金鑰開頭到第一次出現指定的 /
分隔符號為止的子字串。
此主控台會解譯此結果,並將根層級項目顯示為三個資料夾與一個物件金鑰。
如果 Bob 或 Alice 開啟 Development 資料夾,主控台會將 GET 儲存貯體 (列出物件) 請求傳送給 Amazon S3,其中 prefix
和 delimiter
參數會設為下列值:
-
prefix
參數,值為Development/
。 -
delimiter
參數,值為「/
」。
Amazon S3 在回應中會傳回開頭為指定字首的物件金鑰。
<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> <Name>companybucket</Name> <Prefix>Development</Prefix> <Delimiter>/</Delimiter> ... <Contents> <Key>Project1.xls</Key> ... </Contents> <Contents> <Key>Project2.xls</Key> ... </Contents> </ListBucketResult>
此主控台會顯示物件金鑰。
現在重新授予使用者許可,以列出根層級的儲存貯體項目。若要列出儲存貯體內容,使用者需要呼叫 s3:ListBucket
動作的許可,如下列政策陳述式所示。為了確保使用者只會看到根層級內容,您新增條件來要求使用者必須在請求中指定空的 prefix
,亦即不允許使用者按兩下任何根層級資料夾。最後,您會再新增一項條件,要求使用者要求中必須包含值為「delimiter
」的 /
參數,才能要求資料夾的存取權。
{ "Sid": "AllowRootLevelListingOfCompanyBucket", "Action": ["s3:ListBucket"], "Effect": "Allow", "Resource": ["arn:aws:s3:::companybucket"], "Condition":{ "StringEquals":{ "s3:prefix":[""], "s3:delimiter":["/"] } } }
當您在 Amazon S3 主控台上選擇儲存貯體時,主控台會先傳送 GET 儲存貯體位置請求,以尋找部署儲存貯體 AWS 區域 的 。接著,主控台會使用儲存貯體的區域專用端點,傳送 GET 儲存貯體 (列出物件) 請求。因此,使用者若要使用主控台,您必須授予 s3:GetBucketLocation
動作的許可,如下列政策陳述式所示。
{ "Sid": "RequiredByS3Console", "Action": ["s3:GetBucketLocation"], "Effect": "Allow", "Resource": ["arn:aws:s3:::*"] }
允許使用者列出根層級儲存貯體內容
-
登入 AWS Management Console ,並在 https://https://console.aws.amazon.com/iam/
開啟 IAM 主控台。 使用您的 AWS 帳戶 登入資料,而不是 IAM 使用者的登入資料來登入 主控台。
-
以下列政策取代連接至
Consultants
群組的現有AllowGroupToSeeBucketListInTheConsole
受管政策。此政策同樣也會允許s3:ListBucket
動作。記得將政策Resource
中的
取代為您的儲存貯體名稱。companybucket
如需逐步說明,請參閱《IAM 使用者指南》中的編輯 IAM 政策。執行逐步說明時,請務必遵循這些步驟,將您的變更套用到連接該政策的所有主體實體。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowGroupToSeeBucketListAndAlsoAllowGetBucketLocationRequiredForListBucket", "Action": [ "s3:ListAllMyBuckets", "s3:GetBucketLocation" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::*" ] }, { "Sid": "AllowRootLevelListingOfCompanyBucket", "Action": ["s3:ListBucket"], "Effect": "Allow", "Resource": ["arn:aws:s3:::
companybucket
"], "Condition":{ "StringEquals":{ "s3:prefix":[""], "s3:delimiter":["/"] } } } ] } -
測試更新後的許可。
-
使用 IAM 使用者登入連結 (請參閱為 IAM 使用者提供登入連結) 登入 AWS Management Console。
開啟位於 https://console.aws.amazon.com/s3/
的 Amazon S3 主控台。 -
選擇您建立的儲存貯體,且主控台會顯示根層級儲存貯體項目。因為您尚未獲得指派這些許可,所以當您在儲存貯體中選擇任何資料夾時,會看不到資料夾內容。
-
當使用者使用 Amazon S3 主控台時,此測試會成功。在主控台上選擇儲存貯體時,主控台實作會傳送請求,該請求會包含值為空字串的 prefix
參數,以及其值為「delimiter
」的 /
參數。
步驟 4.3:群組政策摘要
您新增的群組政策最終目的是將下列最低許可授予 IAM 使用者 Alice 與 Bob:
-
列出父帳戶擁有的所有儲存貯體。
-
查看
companybucket
儲存貯體中的根層級項目。
即使如此,使用者能執行的操作仍然有限。接下來我們要授予使用者專用的許可,如下所示:
-
允許 Alice 在
Development
資料夾中取得物件與將物件放置到其中。 -
允許 Bob 在
Finance
資料夾中取得物件與將物件放置到其中。
對於使用者專用的許可,您應將政策指派給特定使用者而非群組。在下列區段中,您將授予 Alice 在 Development
資料夾中工作的許可。您可以重複這些步驟,將類似的許可授予 Bob,以便在 Finance
資料夾中工作。
步驟 5:將特定許可授予 IAM 使用者 Alice
您現在要將額外的許可授予 Alice,讓她可以看到 Development
資料夾的內容,並從該資料夾取得物件與將物件放置到其中。
步驟 5.1:對 IAM 使用者 Alice 授予許可來列出 Development 資料夾內容
Alice 若要能夠列出 Development
資料夾內容,您必須對使用者 Alice 套用可以授予 companybucket
儲存貯體之 s3:ListBucket
動作的政策,但前提是請求中必須包含字首 Development/
。您只想將此政策套用到使用者 Alice,因此會使用內嵌政策。如需內嵌政策的詳細資訊,請參閱《IAM 使用者指南》中的受管政策和內嵌政策。
-
登入 AWS Management Console 並開啟位於 https://https://console.aws.amazon.com/iam/
的 IAM 主控台。 使用您的 AWS 帳戶 登入資料,而不是 IAM 使用者的登入資料來登入 主控台。
-
建立內嵌政策,將列出
Development
資料夾內容的許可授予使用者 Alice。-
在左側導覽窗格中,選擇 Users (使用者)。
-
選擇使用者名稱 Alice。
-
在使用者詳細資訊頁面上,選擇 Permissions (許可) 索引標籤,然後選擇 Add inline policy (新增內嵌政策)。
-
請選擇 JSON 索引標籤。
-
複製下列政策,並將其貼入政策的文字欄位中。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowListBucketIfSpecificPrefixIsIncludedInRequest", "Action": ["s3:ListBucket"], "Effect": "Allow", "Resource": ["arn:aws:s3:::
companybucket
"], "Condition":{ "StringLike":{"s3:prefix":["Development/*"] } } } ] } -
選擇 Review Policy (檢閱政策)。在下一個頁面中,於 Name (名稱) 欄位輸入一個名稱,接著選擇 Create policy (建立政策)。
-
-
測試 Alice 的許可變更:
-
使用 IAM 使用者登入連結 (請參閱為 IAM 使用者提供登入連結) 登入 AWS Management Console。
開啟位於 https://console.aws.amazon.com/s3/
的 Amazon S3 主控台。 -
在 Amazon S3 主控台上,確認 Alice 可以看到儲存貯體中
Development/
資料夾中的物件清單。當使用者選擇
/Development
資料夾來查看其中的物件清單時,Amazon S3 主控台會將含有字首ListObjects
的/Development
請求傳送給 Amazon S3。因為使用者獲許可查看字首為Development
和分隔符號為/
的物件清單,所以 Amazon S3 會傳回金鑰前綴為Development/
的物件清單,而主控台會顯示該清單。
-
步驟 5.2:對 IAM 使用者 Alice 授予許可在 Development 資料夾中取得和放置物件
Alice 若要能從 Development
資料夾取得物件與將物件放置到其中,就需要呼叫 s3:GetObject
與 s3:PutObject
動作的許可。下列政策陳述式可以授予這些許可,但前提是要求中必須包含值為 prefix
的 Development/
參數。
{ "Sid":"AllowUserToReadWriteObjectData", "Action":["s3:GetObject", "s3:PutObject"], "Effect":"Allow", "Resource":["arn:aws:s3:::companybucket/Development/*"] }
-
登入 AWS Management Console ,並在 https://https://console.aws.amazon.com/s3/
開啟 Amazon S3 主控台。 使用您的 AWS 帳戶 登入資料,而不是 IAM 使用者的登入資料來登入 主控台。
-
編輯您在前一個步驟中建立的內嵌政策。
在左側導覽窗格中,選擇 Users (使用者)。
選擇使用者名稱 Alice。
在使用者詳細資訊頁面上,選擇 Permissions (許可) 標籤,然後展開 Inline Policies (內嵌政策) 區段。
在前一個步驟中建立的政策名稱旁,選擇 Edit Policy (編輯政策)。
複製下列政策並貼到政策文字欄位,以取代現有政策。
{ "Version": "2012-10-17", "Statement":[ { "Sid":"AllowListBucketIfSpecificPrefixIsIncludedInRequest", "Action":["s3:ListBucket"], "Effect":"Allow", "Resource":["arn:aws:s3:::
companybucket
"], "Condition":{ "StringLike":{"s3:prefix":["Development/*"] } } }, { "Sid":"AllowUserToReadWriteObjectDataInDevelopmentFolder", "Action":["s3:GetObject", "s3:PutObject"], "Effect":"Allow", "Resource":["arn:aws:s3:::companybucket
/Development/*"] } ] }
-
測試更新後的政策:
-
使用 IAM 使用者登入連結 (請參閱為 IAM 使用者提供登入連結) 登入 AWS Management Console。
-
開啟位於 https://console.aws.amazon.com/s3/
的 Amazon S3 主控台。 -
在 Amazon S3 主控台上,確認 Alice 現在已可以在
Development
資料夾中新增和下載物件。
-
步驟 5.3:對 IAM 使用者 Alice 明確拒絕儲存貯體中任何其他資料夾的許可
使用者 Alice 現在可以列出 companybucket
儲存貯體的根層級內容,也可以從 Development
資料夾取得物件與將物件放置到其中。若您確實想要限縮存取許可,可以明確拒絕 Alice 存取儲存貯體中的任何其他資料夾。如有任何其他政策 (儲存貯體政策或 ACL) 授予 Alice 存取儲存貯體中的任何其他資料夾,則這項明確拒絕將會覆寫這些許可。
您可以將下列陳述式新增至使用者 Alice 政策,以要求 Alice 傳送給 Amazon S3 的所有請求都包含 prefix
參數,值可以是 Development/*
或空字串。
{ "Sid": "ExplicitlyDenyAnyRequestsForAllOtherFoldersExceptDevelopment", "Action": ["s3:ListBucket"], "Effect": "Deny", "Resource": ["arn:aws:s3:::companybucket"], "Condition":{ "StringNotLike": {"s3:prefix":["Development/*",""] }, "Null" : {"s3:prefix":false } } }
Condition
區塊中有兩個條件式表達式。這些條件式表達式的結果使用了邏輯 AND
加以合併。當這兩項條件皆為 true 時,合併後條件的結果也會是 true。因為在此政策中的 Effect
為 Deny
,當 Condition
評估結果為 true 時,使用者將無法執行指定的 Action
。
-
Null
條件式表達式會確定來自 Alice 的要求包含了prefix
參數。prefix
參數必須能夠存取資料夾。如果您傳送的請求不含prefix
參數,Amazon S3 會傳回所有物件金鑰。若要求中包含了 null 值的
prefix
參數,表達式會評估為 true,因此整個Condition
也會評估為 true。您必須允許prefix
參數使用空字串作為值。從前面的討論,回想那允許 null 字串讓 Alice 可以像先前討論主控台時執行的操作一樣,擷取根層級儲存貯體項目。如需詳細資訊,請參閱步驟 4.2:允許使用者列出儲存貯體的根層級內容。 StringNotLike
條件式表達式可確保若指定prefix
參數的值,而非指定Development/*
,要求會失敗。
遵循以上區段中的步驟,並再次更新您為使用者 Alice 建立的內嵌政策。
複製下列政策並貼到政策文字欄位,以取代現有政策。
{ "Version": "2012-10-17", "Statement":[ { "Sid":"AllowListBucketIfSpecificPrefixIsIncludedInRequest", "Action":["s3:ListBucket"], "Effect":"Allow", "Resource":["arn:aws:s3:::
companybucket
"], "Condition":{ "StringLike":{"s3:prefix":["Development/*"] } } }, { "Sid":"AllowUserToReadWriteObjectDataInDevelopmentFolder", "Action":["s3:GetObject", "s3:PutObject"], "Effect":"Allow", "Resource":["arn:aws:s3:::companybucket
/Development/*"] }, { "Sid": "ExplicitlyDenyAnyRequestsForAllOtherFoldersExceptDevelopment", "Action": ["s3:ListBucket"], "Effect": "Deny", "Resource": ["arn:aws:s3:::companybucket
"], "Condition":{ "StringNotLike": {"s3:prefix":["Development/*",""] }, "Null" : {"s3:prefix":false } } } ] }
步驟 6:將特定許可授予 IAM 使用者 Bob
現在,您要授予 Bob 對 Finance
資料夾的許可。請遵循您稍早用來為 Alice 授予許可的步驟,但將 Development
資料夾置換成 Finance
資料夾。如需逐步說明,請參閱 步驟 5:將特定許可授予 IAM 使用者 Alice。
步驟 7:保護 Private 資料夾
在此範例中,您只有兩名使用者。您授予了群組層級所有必要的基本許可,並只有在您確實需要授予個別使用者層級的許可時,才授予使用者層級許可。此方法可將管理許可的工作降至最低。隨著使用者人數增加,管理許可可能會愈來愈麻煩。例如,我們不希望讓此範例中的任何使用者存取 Private
資料夾內容。如何確定未意外地授予使用者 Private
資料夾的許可? 您新增政策明確拒絕存取該資料夾。明確拒絕會覆寫其他任何許可。
若要確定 Private
資料夾未對外開放,可以在群組政策中新增下列兩個拒絕陳述式:
-
新增下列陳述式,明確拒絕任何對
Private
資料夾資源執行的動作 (companybucket/Private/*
)。{ "Sid": "ExplictDenyAccessToPrivateFolderToEveryoneInTheGroup", "Action": ["s3:*"], "Effect": "Deny", "Resource":["arn:aws:s3:::companybucket/Private/*"] }
-
要求中如有指定
Private/
字首,您也可以拒絕列出物件動作的許可。在主控台上,如果 Bob 或 Alice 開啟Private
資料夾,此政策會導致 Amazon S3 傳回錯誤回應。{ "Sid": "DenyListBucketOnPrivateFolder", "Action": ["s3:ListBucket"], "Effect": "Deny", "Resource": ["arn:aws:s3:::*"], "Condition":{ "StringLike":{"s3:prefix":["Private/"]} } }
以更新後包含前述拒絕陳述式的政策取代 Consultants
群組政策。套用更新後的政策後,群組中將無任何使用者可以存取儲存貯體中的 Private
資料夾。
-
登入 AWS Management Console ,並在 https://console.aws.amazon.com/s3/
:// 開啟 Amazon S3 主控台。 使用您的 AWS 帳戶 登入資料,而不是 IAM 使用者的登入資料來登入 主控台。
-
以下列政策取代連接至
Consultants
群組的現有AllowGroupToSeeBucketListInTheConsole
受管政策。請務必將政策中的
取代為您的儲存貯體名稱。companybucket
如需說明,請參閱《IAM 使用者指南》中的編輯客戶管理政策。執行逐步說明時,請務必遵循指示,將您的變更套用到獲指派該政策的所有主體實體。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowGroupToSeeBucketListAndAlsoAllowGetBucketLocationRequiredForListBucket", "Action": ["s3:ListAllMyBuckets", "s3:GetBucketLocation"], "Effect": "Allow", "Resource": ["arn:aws:s3:::*"] }, { "Sid": "AllowRootLevelListingOfCompanyBucket", "Action": ["s3:ListBucket"], "Effect": "Allow", "Resource": ["arn:aws:s3:::
companybucket
"], "Condition":{ "StringEquals":{"s3:prefix":[""]} } }, { "Sid": "RequireFolderStyleList", "Action": ["s3:ListBucket"], "Effect": "Deny", "Resource": ["arn:aws:s3:::*"], "Condition":{ "StringNotEquals":{"s3:delimiter":"/"} } }, { "Sid": "ExplictDenyAccessToPrivateFolderToEveryoneInTheGroup", "Action": ["s3:*"], "Effect": "Deny", "Resource":["arn:aws:s3:::companybucket
/Private/*"] }, { "Sid": "DenyListBucketOnPrivateFolder", "Action": ["s3:ListBucket"], "Effect": "Deny", "Resource": ["arn:aws:s3:::*"], "Condition":{ "StringLike":{"s3:prefix":["Private/"]} } } ] }
步驟 8:清理
若要清除,請開啟 IAM 主控台
為確保您未因儲存而被收費,您也應刪除您為此練習建立的物件與儲存貯體。
相關資源
《IAM 使用者指南》中的管理 IAM 政策