

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

# 使用使用者政策來控制對儲存貯體的存取
<a name="walkthrough1"></a>

此演練說明使用者許可與 Amazon S3 搭配運作的方式。在此範例中，您建立含有資料夾的儲存貯體。然後，您可以在 中建立 AWS Identity and Access Management IAM 使用者， AWS 帳戶 並對 Amazon S3 儲存貯體及其中的資料夾授予這些使用者增量許可。

**Topics**
+ [儲存貯體與資料夾的基本概念](#walkthrough-background1)
+ [演練摘要](#walkthrough-scenario)
+ [準備演練](#walkthrough-what-you-need)
+ [步驟 1：建立儲存貯體](#walkthrough1-create-bucket)
+ [步驟 2：建立 IAM 使用者與群組](#walkthrough1-add-users)
+ [步驟 3：確認 IAM 使用者沒有許可](#walkthrough1-verify-no-user-permissions)
+ [步驟 4：授予群組層級的許可](#walkthrough-group-policy)
+ [步驟 5：將特定許可授予 IAM 使用者 Alice](#walkthrough-grant-user1-permissions)
+ [步驟 6：將特定許可授予 IAM 使用者 Bob](#walkthrough1-grant-permissions-step5)
+ [步驟 7：保護 Private 資料夾](#walkthrough-secure-private-folder-explicit-deny)
+ [步驟 8：清理](#walkthrough-cleanup)
+ [相關資源](#RelatedResources-walkthrough1)

## 儲存貯體與資料夾的基本概念
<a name="walkthrough-background1"></a>

Amazon S3 資料模型是單層式結構：您建立儲存貯體，儲存貯體存放物件。子儲存貯體或子資料夾沒有階層，但您可以模擬資料夾階層。Amazon S3 主控台之類工具可以在儲存貯體中顯示這些邏輯資料夾和子資料夾。

此主控台會顯示名為 `companybucket` 的儲存貯體有三個資料夾：`Private`、`Development` 和 `Finance` 以及物件 `s3-dg.pdf`。此主控台使用物件名稱 (金鑰) 建立內含資料夾與子資料夾的邏輯階層。請考量下列範例：
+ 當您建立 `Development` 資料夾時，主控台會使用 `Development/` 索引鍵建立物件。請注意結尾斜線的 (`/`) 分隔符號。
+ 在 `Projects1.xls` 資料夾上傳名為 `Development` 的物件，此主控台會上傳該物件並為該物件提供 `Development/Projects1.xls` 索引鍵。

  在索引鍵中，`Development` 為[字首](https://docs.aws.amazon.com/general/latest/gr/glos-chap.html#keyprefix)，`/` 為分隔符號。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` 沒有字首，所以會顯示為根層級項目。



## 演練摘要
<a name="walkthrough-scenario"></a>

您會在此演練中，建立其中含有三個資料夾 (`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 要求全域唯一的儲存貯體名稱，所以您必須將儲存貯體名稱換成您建立的名稱。

## 準備演練
<a name="walkthrough-what-you-need"></a>

 在此範例中，您會使用 AWS 帳戶 登入資料來建立 IAM 使用者。這些使用者在一開始都不具備任何許可。您對這些使用者遞增授予許可來執行特定的 Amazon S3 動作。為測試這些許可，您將使用每位使用者的憑證登入主控台。當您以 AWS 帳戶 擁有者的身分逐步授予許可，並以 IAM 使用者身分測試許可時，每次都需要使用不同的登入資料來登入和登出。您可以使用瀏覽器來執行此測試，但如果您能夠使用兩個不同的瀏覽器，便能加快此程序的速度。使用一個瀏覽器 AWS 管理主控台 使用您的 AWS 帳戶 登入資料連線至 ，並使用另一個瀏覽器與 IAM 使用者登入資料連線。

 若要 AWS 管理主控台 使用您的 AWS 帳戶 登入資料登入 ，請前往 https：//[https://console.aws.amazon.com/](https://console.aws.amazon.com/)。 IAM 使用者無法使用相同的連結登入。IAM 使用者必須使用已啟用 IAM 功能的登入頁面。帳戶擁有者可以將此連結提供給其使用者。

如需 IAM 的詳細資訊，請參閱*《IAM 使用者指南》*中的 [AWS 管理主控台 登入頁面](https://docs.aws.amazon.com/IAM/latest/UserGuide/console.html)。

### 為 IAM 使用者提供登入連結
<a name="walkthrough-sign-in-user-credentials"></a>

1. 登入 AWS 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 的 IAM 主控台。

1. 在 **Navigation (導覽)** 窗格中，選擇 **IAM Dashboard (IAM 儀表板)**。

1. 記下 **IAM users sign in link: (IAM 使用者登入連結：)** 下的 URL。將此連結提供給 IAM 使用者，讓他們使用 IAM 使用者名稱與密碼來登入主控台。

## 步驟 1：建立儲存貯體
<a name="walkthrough1-create-bucket"></a>

在此步驟中，您會使用 AWS 帳戶 憑證來登入 Amazon S3 主控台、建立儲存貯體、將資料夾新增至儲存貯體，然後在每個資料夾中上傳一到兩份範例文件。

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/) 開啟 Amazon S3 主控台。

1. 建立儲存貯體。

   如需逐步說明，請參閱 [建立一般用途儲存貯體](create-bucket-overview.md)。

1. 將一份文件上傳到儲存貯體。

   此練習假設您在此儲存貯體的根層級中已有 `s3-dg.pdf` 文件。若要上傳不同的文件，請將其檔案名稱替換為 `s3-dg.pdf`。

1. 將名為 `Private`、`Finance` 和 `Development` 的三個資料夾新增至儲存貯體。

   如需建立資料夾的逐步說明，請參閱*《Amazon Simple Storage Service 使用者指南》*中的 [在 Amazon S3 主控台中使用資料夾整理物件](using-folders.md)。

1. 在每個資料夾中上傳一到兩份文件。

   此練習假設您已在每個資料夾中上傳了一些文件，而且儲存貯體已有具有下列金鑰的物件：
   + `Private/privDoc1.txt`
   + `Private/privDoc2.zip`
   + `Development/project1.xls`
   + `Development/project2.xls`
   + `Finance/Tax2011/document1.pdf`
   + `Finance/Tax2011/document2.pdf`
   + `s3-dg.pdf`

   

   如需逐步說明，請參閱 [上傳物件](upload-objects.md)。

## 步驟 2：建立 IAM 使用者與群組
<a name="walkthrough1-add-users"></a>

現在，請使用 [IAM 主控台](https://console.aws.amazon.com/iam/)，將 Alice 與 Bob 這兩位 IAM 使用者新增至 AWS 帳戶。如需逐步說明，請參閱《IAM 使用者指南》**中的[在 AWS 帳戶中建立 IAM 使用者](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html#id_users_create_console)。

另外建立一個名為 `Consultants` 的管理群組。然後將這兩名使用者新增至群組。如需逐步說明，請參閱[建立 IAM 使用者群組](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_groups_create.html)。

**警告**  
當您新增使用者與群組時，請勿指派任何會將許可授予這些使用者的政策。這些使用者在一開始不具有任何許可。您將在下列區段中授予額外的許可。您必須先確定已為這些 IAM 使用者指派密碼。您將使用這些使用者憑證來測試 Amazon S3 動作，並確認許可是否如預期般運作。

如需建立新 IAM 使用者的逐步說明，請參閱《IAM 使用者指南》**中的[在 AWS 帳戶中建立 IAM 使用者](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html)。為此演練建立使用者時，請選取 **AWS 管理主控台 存取**，並清除[程式化存取](https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-secret-access-keys)。

如需建立管理群組的逐步說明，請參閱《IAM 使用者指南》**中的[建立您的第一個 IAM 管理員使用者和群組](https://docs.aws.amazon.com/IAM/latest/UserGuide/getting-started_create-admin-group.html)。



## 步驟 3：確認 IAM 使用者沒有許可
<a name="walkthrough1-verify-no-user-permissions"></a>

如果您使用兩個瀏覽器，您現在可以使用第二個瀏覽器，以其中一個 IAM 使用者憑證來登入主控台。

1. 使用 IAM 使用者登入連結 (請參閱「[為 IAM 使用者提供登入連結](#walkthrough-sign-in-user-credentials)」)，使用任一組 IAM 使用者憑證登入 AWS 管理主控台 。

1. 開啟位於 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/) 的 Amazon S3 主控台。

    確認主控台訊息會通知您存取被拒。

您現在可以將額外的許可授予使用者。首先，您要連接群組政策，授予兩位使用者一些必要的許可。

## 步驟 4：授予群組層級的許可
<a name="walkthrough-group-policy"></a>

您希望使用者都能執行下列動作：
+ 列出父帳戶擁有的所有儲存貯體。要做到這一點，Bob 與 Alice 必須具備 `s3:ListAllMyBuckets` 動作的許可。
+ 列出 `companybucket` 儲存貯體中的根層級項目、資料夾與物件。要做到這一點，Bob 與 Alice 必須具備可以對 `s3:ListBucket` 儲存貯體執行 `companybucket` 動作的許可。

首先，您建立會授予這些許可的政策，然後將該政策連接至 `Consultants` 群組。

### 步驟 4.1：授予列出所有儲存貯體的許可
<a name="walkthrough1-grant-permissions-step1"></a>

在此步驟中，您將建立受管政策 (可將使用者基本許可授予使用者，以便其能列出父帳戶擁有的所有儲存貯體)。接著，您將政策連接至 `Consultants` 群組。當您將受管政策連接至使用者或群組時，即表示您授予該使用者或群組許可，讓他們可取得父 AWS 帳戶擁有之儲存貯體的清單。

1. 登入 AWS 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 的 IAM 主控台。
**注意**  
由於您要授予使用者許可，請使用您的 AWS 帳戶 憑證來登入，不要以 IAM 使用者身分登入。

1. 建立受管政策。

   1. 在左邊的導覽窗格中，選擇 **Policies (政策)**，然後選擇 **Create policy (建立政策)**。

   1. 請選擇 **JSON** 索引標籤。

   1. 複製下列存取政策，並貼入政策的文字欄位中。

------
#### [ 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` 元素值決定要允許或拒絕特定許可。

   1. 選擇 **Review Policy** (檢閱政策)。在下一個頁面中，於 **Name (名稱)** 欄位輸入 `AllowGroupToSeeBucketListInTheConsole`，接著選擇 **Create policy (建立政策)**。
**注意**  
**Summary (摘要)** 項目會顯示訊息，指出該政策未授予任何許可。就本演練為例，您可放心地忽略此訊息。

1. 將您建立的 `AllowGroupToSeeBucketListInTheConsole` 受管政策連接至 `Consultants` 群組。

   如需連接受管政策的逐步說明，請參閱《IAM 使用者指南》**中的[新增和移除 IAM 身分許可](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html#attach-managed-policy-console)。

   您在 IAM 主控台中將政策文件連接至 IAM 使用者和群組。您希望這兩個使用者都能夠列出儲存貯體，因此將該政策連接至該群組。

1. 測試許可。

   1. 使用 IAM 使用者登入連結 (請參閱 [為 IAM 使用者提供登入連結](#walkthrough-sign-in-user-credentials))，利用任一組 IAM 使用者憑證來登入主控台。

   1. 開啟位於 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/) 的 Amazon S3 主控台。

      主控台現在應會列出所有儲存貯體，但不會列出任何儲存貯體中的物件。

### 步驟 4.2：允許使用者列出儲存貯體的根層級內容
<a name="walkthrough1-grant-permissions-step2"></a>

接下來，我們允許所有使用者在 `Consultants` 群組內列出根層級的 `companybucket` 儲存貯體項目。當使用者在 Amazon S3 主控台上選擇公司儲存貯體時，使用者可以看到儲存貯體中的根層級項目。

**注意**  
此範例使用 `companybucket` 進行說明。您必須使用您建立的儲存貯體名稱。

若要了解您選擇儲存貯體名稱時主控台傳送給 Amazon S3 的請求、Amazon S3 傳回的回應，以及主控台如何解譯回應，請更仔細地查看流程。

當您選擇儲存貯體名稱時，主控台會將 [GET 儲存貯體 (列出物件)](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html) 請求傳送給 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 儲存貯體 (列出物件)](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html) 請求傳送給 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 儲存貯體位置](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGETlocation.html)請求，以尋找部署儲存貯體 AWS 區域 的 。接著，主控台會使用儲存貯體的區域專用端點，傳送 [GET 儲存貯體 (列出物件)](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html) 請求。因此，使用者若要使用主控台，您必須授予 `s3:GetBucketLocation` 動作的許可，如下列政策陳述式所示。

```
{
   "Sid": "RequiredByS3Console",
   "Action": ["s3:GetBucketLocation"],
   "Effect": "Allow",
   "Resource": ["arn:aws:s3:::*"]
}
```

**允許使用者列出根層級儲存貯體內容**

1. 登入 AWS 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 的 IAM 主控台。

   使用您的 AWS 帳戶 登入資料，而不是 IAM 使用者的登入資料來登入 主控台。

1. 以下列政策取代連接至 `Consultants` 群組的現有 `AllowGroupToSeeBucketListInTheConsole` 受管政策。此政策同樣也會允許 `s3:ListBucket` 動作。記得將政策 `Resource` 中的 *`companybucket`* 取代為您的儲存貯體名稱。

   如需逐步說明，請參閱《IAM 使用者指南》**中的[編輯 IAM 政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-edit.html)。執行逐步說明時，請務必遵循這些步驟，將您的變更套用到連接該政策的所有主體實體。

------
#### [ JSON ]

****  

   ```
   {
     "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":["/"]
                              }
                      }
        }
     ] 
   }
   ```

------

1. 測試更新後的許可。

   1. 使用 IAM 使用者登入連結 (請參閱[為 IAM 使用者提供登入連結](#walkthrough-sign-in-user-credentials)) 登入 AWS 管理主控台。

      開啟位於 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/) 的 Amazon S3 主控台。

   1. 選擇您建立的儲存貯體，且主控台會顯示根層級儲存貯體項目。因為您尚未獲得指派這些許可，所以當您在儲存貯體中選擇任何資料夾時，會看不到資料夾內容。

當使用者使用 Amazon S3 主控台時，此測試會成功。在主控台上選擇儲存貯體時，主控台實作會傳送請求，該請求會包含值為空字串的 `prefix` 參數，以及其值為「`delimiter`」的 `/` 參數。

### 步驟 4.3：群組政策摘要
<a name="walkthrough-group-policy-summary"></a>

您新增的群組政策最終目的是將下列最低許可授予 IAM 使用者 Alice 與 Bob：
+ 列出父帳戶擁有的所有儲存貯體。
+ 查看 `companybucket` 儲存貯體中的根層級項目。

即使如此，使用者能執行的操作仍然有限。接下來我們要授予使用者專用的許可，如下所示：
+ 允許 Alice 在 `Development` 資料夾中取得物件與將物件放置到其中。
+ 允許 Bob 在 `Finance` 資料夾中取得物件與將物件放置到其中。

對於使用者專用的許可，您應將政策指派給特定使用者而非群組。在下列區段中，您將授予 Alice 在 `Development` 資料夾中工作的許可。您可以重複這些步驟，將類似的許可授予 Bob，以便在 `Finance` 資料夾中工作。

## 步驟 5：將特定許可授予 IAM 使用者 Alice
<a name="walkthrough-grant-user1-permissions"></a>

您現在要將額外的許可授予 Alice，讓她可以看到 `Development` 資料夾的內容，並從該資料夾取得物件與將物件放置到其中。

### 步驟 5.1：對 IAM 使用者 Alice 授予許可來列出 Development 資料夾內容
<a name="walkthrough-grant-user1-permissions-listbucket"></a>

Alice 若要能夠列出 `Development` 資料夾內容，您必須對使用者 Alice 套用可以授予 `companybucket` 儲存貯體之 `s3:ListBucket` 動作的政策，但前提是請求中必須包含字首 `Development/`。您只想將此政策套用到使用者 Alice，因此會使用內嵌政策。如需內嵌政策的詳細資訊，請參閱《IAM 使用者指南》**中的[受管政策和內嵌政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html)。

1. 登入 AWS 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 的 IAM 主控台。

   使用您的 AWS 帳戶 登入資料，而不是 IAM 使用者的登入資料來登入 主控台。

1. 建立內嵌政策，將列出 `Development` 資料夾內容的許可授予使用者 Alice。

   1. 在左側導覽窗格中，選擇 **Users** (使用者)。

   1. 選擇使用者名稱 **Alice**。

   1. 在使用者詳細資訊頁面上，選擇**許可**索引標籤，然後選擇**新增內嵌政策**。

   1. 請選擇 **JSON** 索引標籤。

   1. 複製下列政策，並將其貼入政策的文字欄位中。

------
#### [ JSON ]

****  

      ```
      {
          "Version":"2012-10-17",		 	 	   
          "Statement": [
          {
            "Sid": "AllowListBucketIfSpecificPrefixIsIncludedInRequest",
            "Action": ["s3:ListBucket"],
            "Effect": "Allow",
            "Resource": ["arn:aws:s3:::companybucket"],
            "Condition": { "StringLike": {"s3:prefix": ["Development/*"] }
             }
          }
        ]
      }
      ```

------

   1. 選擇 **Review Policy** (檢閱政策)。在下一個頁面中，於 **Name (名稱)** 欄位輸入一個名稱，接著選擇 **Create policy (建立政策)**。

1. 測試 Alice 的許可變更：

   1. 使用 IAM 使用者登入連結 (請參閱[為 IAM 使用者提供登入連結](#walkthrough-sign-in-user-credentials)) 登入 AWS 管理主控台。

   1. 開啟位於 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/) 的 Amazon S3 主控台。

   1. 在 Amazon S3 主控台上，確認 Alice 可以看到儲存貯體中 `Development/` 資料夾中的物件清單。

      當使用者選擇 `/Development` 資料夾來查看其中的物件清單時，Amazon S3 主控台會將含有字首 `ListObjects` 的 `/Development` 請求傳送給 Amazon S3。因為使用者獲許可查看字首為 `Development` 和分隔符號為 `/` 的物件清單，所以 Amazon S3 會傳回金鑰前綴為 `Development/` 的物件清單，而主控台會顯示該清單。

### 步驟 5.2：對 IAM 使用者 Alice 授予許可在 Development 資料夾中取得和放置物件
<a name="walkthrough-grant-user1-permissions-get-put-object"></a>

Alice 若要能從 `Development` 資料夾取得物件與將物件放置到其中，就需要呼叫 `s3:GetObject` 與 `s3:PutObject` 動作的許可。下列政策陳述式可以授予這些許可，但前提是要求中必須包含值為 `prefix` 的 `Development/` 參數。

```
{
    "Sid":"AllowUserToReadWriteObjectData",
    "Action":["s3:GetObject", "s3:PutObject"],
    "Effect":"Allow",
    "Resource":["arn:aws:s3:::companybucket/Development/*"]
 }
```



1. 登入 AWS 管理主控台 ，並在 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)：// 開啟 Amazon S3 主控台。

   使用您的 AWS 帳戶 登入資料，而不是 IAM 使用者的登入資料來登入 主控台。

1. 編輯您在前一個步驟中建立的內嵌政策。

   1. 在左側導覽窗格中，選擇 **Users** (使用者)。

   1. 選擇使用者名稱 Alice。

   1. 在使用者詳細資訊頁面上，選擇**許可**標籤，然後展開**​內嵌政策**區段。

   1. 在前一個步驟中建立的政策名稱旁，選擇 **Edit Policy (編輯政策)**。

   1. 複製下列政策並貼到政策文字欄位，以取代現有政策。

------
#### [ JSON ]

****  

      ```
      {
           "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/*"]
            }
         ]
      }
      ```

------

1. 測試更新後的政策：

   1. 使用 IAM 使用者登入連結 (請參閱[為 IAM 使用者提供登入連結](#walkthrough-sign-in-user-credentials)) 登入 AWS 管理主控台。

   1. 開啟位於 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/) 的 Amazon S3 主控台。

   1. 在 Amazon S3 主控台上，確認 Alice 現在已可以在 `Development` 資料夾中新增和下載物件。

### 步驟 5.3：對 IAM 使用者 Alice 明確拒絕儲存貯體中任何其他資料夾的許可
<a name="walkthrough-grant-user1-explicit-deny-other-access"></a>

使用者 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：允許使用者列出儲存貯體的根層級內容](#walkthrough1-grant-permissions-step2)。
+ `StringNotLike` 條件式表達式可確保若指定 `prefix` 參數的值，而非指定 `Development/*`，要求會失敗。

遵循以上區段中的步驟，並再次更新您為使用者 Alice 建立的內嵌政策。

複製下列政策並貼到政策文字欄位，以取代現有政策。

------
#### [ JSON ]

****  

```
{
   "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
<a name="walkthrough1-grant-permissions-step5"></a>

現在，您要授予 Bob 對 `Finance` 資料夾的許可。請遵循您稍早用來為 Alice 授予許可的步驟，但將 `Development` 資料夾置換成 `Finance` 資料夾。如需逐步說明，請參閱 [步驟 5：將特定許可授予 IAM 使用者 Alice](#walkthrough-grant-user1-permissions)。

## 步驟 7：保護 Private 資料夾
<a name="walkthrough-secure-private-folder-explicit-deny"></a>

在此範例中，您只有兩名使用者。您授予了群組層級所有必要的基本許可，並只有在您確實需要授予個別使用者層級的許可時，才授予使用者層級許可。此方法可將管理許可的工作降至最低。隨著使用者人數增加，管理許可可能會愈來愈麻煩。例如，我們不希望讓此範例中的任何使用者存取 `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` 資料夾。

1. 登入 AWS 管理主控台 ，並在 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)：// 開啟 Amazon S3 主控台。

   使用您的 AWS 帳戶 登入資料，而不是 IAM 使用者的登入資料來登入 主控台。

1. 以下列政策取代連接至 `Consultants` 群組的現有 `AllowGroupToSeeBucketListInTheConsole` 受管政策。記得將政策中的 *`companybucket`* 取代為您的儲存貯體名稱。

   如需說明，請參閱《IAM 使用者指南》**中的[編輯客戶管理政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-edit.html#edit-managed-policy-console)。執行逐步說明時，請務必遵循指示，將您的變更套用到獲指派該政策的所有主體實體。

------
#### [ JSON ]

****  

   ```
   {
     "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：清理
<a name="walkthrough-cleanup"></a>

若要清除，請開啟 [IAM 主控台](https://console.aws.amazon.com/iam/)並移除使用者 Alice 和 Bob。如需逐步說明，請參閱《IAM 使用者指南》**中的[刪除 IAM 使用者](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_manage.html#id_users_deleting)。

為確保您未因儲存而被收費，您也應刪除您為此練習建立的物件與儲存貯體。

## 相關資源
<a name="RelatedResources-walkthrough1"></a>
+ *《IAM 使用者指南》*中的[管理 IAM 政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage.html)