

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

# 為 Amazon S3 儲存貯體建立工作階段政策
<a name="users-policies-session"></a>

*工作階段政策*是將使用者限制為 Amazon S3 儲存貯體特定部分的 AWS Identity and Access Management (IAM) 政策。它會透過即時評估存取來執行此作業。

**注意**  
 工作階段政策僅適用於 Amazon S3。對於 Amazon EFS，您可以使用 POSIX 檔案許可來限制存取。

當您需要將相同存取權授予使用者群組給 Amazon S3 儲存貯體的特定部分時，您可以使用工作階段政策。例如，使用者群組可能只需要存取 `home` 目錄。該使用者群組共用相同的 IAM 角色。

**注意**  
 工作階段政策的長度上限為 2048 個字元。如需詳細資訊，請參閱 *API 參考*中 `CreateUser`動作[的政策請求參數](https://docs.aws.amazon.com/transfer/latest/APIReference/API_CreateUser.html#API_CreateUser_RequestSyntax)。

若要建立工作階段政策，請在 IAM 政策中使用下列政策變數：
+ `${transfer:HomeBucket}`
+ `${transfer:HomeDirectory}`
+ `${transfer:HomeFolder}`
+ `${transfer:UserName}`

**重要**  
您無法在 受管政策中使用上述變數。您也無法在 IAM 角色定義中使用它們做為政策變數。您可以在 IAM 政策中建立這些變數，並在設定使用者時直接提供這些變數。此外，您無法在此工作階段政策中使用 `${aws:Username}`變數。此變數是指 IAM 使用者名稱，而不是 所需的使用者名稱 AWS Transfer Family。

## 工作階段政策範例
<a name="example-session-policy"></a>

下列程式碼顯示範例工作階段政策。

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
      {
          "Sid": "AllowListingOfUserFolder",
          "Action": [
              "s3:ListBucket"
          ],
          "Effect": "Allow",
          "Resource": [
              "arn:aws:s3:::${transfer:HomeBucket}"
          ],
          "Condition": {
              "StringLike": {
                  "s3:prefix": [
                      "${transfer:HomeFolder}/*",
                      "${transfer:HomeFolder}"
                  ]
              }
          }
      },
      {
          "Sid": "HomeDirObjectAccess",
          "Effect": "Allow",
          "Action": [
              "s3:PutObject",
              "s3:GetObject",
              "s3:DeleteObjectVersion",
              "s3:DeleteObject",
              "s3:GetObjectVersion",
              "s3:GetObjectACL",
              "s3:PutObjectACL"
          ],
          "Resource": "arn:aws:s3:::${transfer:HomeDirectory}/*"
       }
  ]
}
```

**注意**  
上述政策範例假設使用者已將主目錄設定為包含結尾斜線，以表示它是目錄。另一方面，如果您設定的使用者`HomeDirectory`沒有結尾斜線，則應該將其包含在政策中。

在先前的範例政策中，請注意 `transfer:HomeFolder`、 `transfer:HomeBucket`和 `transfer:HomeDirectory`政策參數的使用方式。這些參數是針對為使用者設定的 `HomeDirectory` 所設定，如 [HomeDirectory](https://docs.aws.amazon.com/transfer/latest/APIReference/API_CreateUser.html#TransferFamily-CreateUser-request-HomeDirectory) 和 中所述[實作您的 API Gateway 方法](authentication-api-gateway.md#authentication-api-method)。這些參數具有下列定義：
+ `transfer:HomeBucket` 參數會取代為 的第一個元件`HomeDirectory`。
+ `transfer:HomeFolder` 參數會取代為`HomeDirectory`參數的剩餘部分。
+ `transfer:HomeDirectory` 參數已移除正斜線 (`/`)，因此可以做為`Resource`陳述式中 S3 Amazon Resource Name (ARN) 的一部分。

**注意**  
 如果您使用的是邏輯目錄，也就是使用者的 `homeDirectoryType`是 `LOGICAL`，則不支援這些政策參數 (`HomeBucket`、 `HomeDirectory`和 `HomeFolder`)。

例如，假設為 Transfer Family 使用者設定的 `HomeDirectory` 參數是 `/home/bob/amazon/stuff/`。
+ `transfer:HomeBucket` 已設定為 `/home`。
+ `transfer:HomeFolder` 已設定為 `/bob/amazon/stuff/`。
+ `transfer:HomeDirectory` 會變成 `home/bob/amazon/stuff/`。

第一個`"Sid"`允許使用者列出從 開始的所有目錄`/home/bob/amazon/stuff/`。

第二個`"Sid"`限制使用者對相同路徑 的`put` 和 `get`存取`/home/bob/amazon/stuff/`。

實施上述政策後，當使用者登入時，他們只能存取主目錄中的物件。在連線時間， 會將這些變數 AWS Transfer Family 取代為使用者的適當值。這樣做可讓將相同政策文件套用到多名使用者的過程變得更為容易。此方法可減少管理使用者存取 Amazon S3 儲存貯體的 IAM 角色和政策管理的額外負荷。

您也可以使用工作階段政策，根據您的業務需求自訂每位使用者的存取權。如需詳細資訊，請參閱《*IAM 使用者指南*》中的 [ AssumeRole、AssumeRoleWithSAML 和 AssumeRoleWithWebIdentity 的許可](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_control-access_assumerole.html)。

**注意**  
AWS Transfer Family 會儲存政策 JSON，而不是政策的 Amazon Resource Name (ARN)。因此，當您在 IAM 主控台中變更政策時，您需要返回 AWS Transfer Family 主控台並使用最新的政策內容更新您的使用者。您可以在使用者組態區段**的政策資訊**索引標籤上更新使用者。 ****  
如果您使用的是 AWS CLI，您可以使用下列命令來更新政策。  

```
aws transfer update-user --server-id server --user-name user --policy \
   "$(aws iam get-policy-version --policy-arn policy --version-id version --output json)"
```

## 工作階段政策的巢狀取代
<a name="nested-variable-behavior"></a>

巢狀取代不會在 Transfer Family 工作階段政策中執行。工作階段政策可以使用巢狀變數，例如 `${transfer:HomeDirectory}`。處理政策時，外部變數 （例如 `${transfer:HomeDirectory}`) 可能會取代為包含另一個變數 （例如 \$1`amzn-s3-demo-bucket:/$(transfer:UserName}`) 的值。不過，巢狀變數不會進一步以實際使用者名稱 （例如 **johndoe**) 取代。

這表示在為 Transfer Family 建立工作階段政策時，您需要考慮此行為，並確保相應地設計政策結構和變數用量。巢狀變數可能無法如預期解析，且政策可能不會授予預期的許可。請務必徹底測試和驗證工作階段政策，以確保它們如預期般運作。此行為是實作 Transfer Family 環境的存取控制和許可時的重要考量。

此問題的一個解決方法是在工作階段政策中使用實際的 Amazon S3 儲存貯體名稱。因此，例如，使用`${transfer:HomeDirectory}`下列 ，其中 amzn-s3-demo-bucket 是您的實際儲存貯體：`${amzn-s3-demo-bucket/transfer:UserName}`。