

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

# 使用屬性型存取控制 (ABAC) 進行多租戶訓練
<a name="model-access-training-data-abac"></a>

在多租戶環境中，確保每個租戶的資料都已隔離且只能由授權的實體存取，這一點至關重要。SageMaker AI 支援使用[屬性型存取控制 (ABAC)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction_attribute-based-access-control.html) 來實現訓練任務的隔離。您可以設定工作階段鏈結組態，使用 AWS Security Token Service (AWS STS) 工作階段標籤請求臨時、有限權限的登入資料，讓訓練任務存取特定租用戶，而不是為每個租用戶建立多個 IAM 角色，為所有租用戶使用相同的 IAM 角色。如需工作階段標籤的詳細資訊，請參閱[在 AWS STS中傳遞工作階段標籤](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html)。

建立訓練任務時，您的工作階段鏈結組態會使用 AWS STS 來請求臨時安全登入資料。此請求會產生一個已標記的工作階段。每個 SageMaker 訓練任務只能使用由所有訓練任務共用的單一角色來存取特定租戶。透過使用工作階段鏈結實作 ABAC，您可以確保每個訓練任務只能存取由工作階段標籤指定的租戶，有效地隔離和保護每個租戶。下一節將引導您完成使用 SageMaker Python SDK 設定 ABAC 並用於多租戶訓練任務隔離的步驟。

## 先決條件
<a name="model-access-training-data-abac-prerequisites"></a>

若要開始使用 ABAC 進行多租戶訓練任務隔離，您必須具備下列項目：
+ 在各個位置命名一致的租戶。例如，如果租戶的輸入資料 Amazon S3 URI 是 `s3://your-input-s3-bucket/example-tenant`，則相同租戶的 Amazon FSx 目錄應該是 `/fsx-train/train/example-tenant`，而輸出資料 Amazon S3 URI 應該是 `s3://your-output-s3-bucket/example-tenant`。
+ SageMaker AI 任務建立角色。您可以使用 Amazon SageMaker AI 角色管理器建立 SageMaker AI 任務建立角色。如需詳細資訊，請參閱[使用角色管理器](https://docs.aws.amazon.com/sagemaker/latest/dg/role-manager-tutorial.html)。
+ 在其信任政策中具有 `sts:AssumeRole` 和 `sts:TagSession` 許可的 SageMaker AI 執行角色。如需 SageMaker AI 執行角色的詳細資訊，請參閱 [SageMaker AI 角色](https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-roles.html)。

  執行角色也應該有一個政策，允許任何屬性型多租戶架構中的租戶從連接至主體標籤的字首讀取。以下的範例政策會限制 SageMaker AI 執行角色存取與 `tenant-id` 金鑰相關聯的值。如需命名標籤金鑰的詳細資訊，請參閱 [IAM 和 STS 中的標記規則](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html#id_tags_rules)。

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

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Action": [
                  "s3:GetObject",
                  "s3:PutObject"
              ],
              "Resource": [
                  "arn:aws:s3:::your-input-s3-bucket/${aws:PrincipalTag/tenant-id}/*"
              ],
              "Effect": "Allow"
          },
          {
              "Action": [
                  "s3:PutObject"
              ],
              "Resource": "arn:aws:s3:::your-output-s3-bucket/${aws:PrincipalTag/tenant-id}/*",
              "Effect": "Allow"
          },
          {
              "Action": "s3:ListBucket",
              "Resource": "*",
              "Effect": "Allow"
          }
      ]
  }
  ```

------

## 建立工作階段標籤鏈結啟用的已訓練任務
<a name="model-access-training-data-abac-create-training-job"></a>

下列程序說明如何使用 SageMaker Python SDK 建立具有工作階段標籤鏈結的訓練任務，以進行已啟用 ABAC 的多租戶訓練。

**注意**  
除了多租戶資料儲存之外，您也可以使用 ABAC 工作流程將工作階段標籤傳遞給 Amazon VPC 的執行角色 AWS Key Management Service，以及您允許 SageMaker AI 呼叫的任何其他服務

**啟用 ABAC 的工作階段標籤鏈結**

1. 匯入 `boto3` 和 SageMaker Python SDK。已啟用 ABAC 的訓練任務隔離僅適用於 SageMaker AI Python SDK 的 [2.217](https://pypi.org/project/sagemaker/2.217.0/) 版或更新版本。

   ```
   import boto3
   import sagemaker
   
   from sagemaker.estimator import Estimator
   from sagemaker.inputs import TrainingInput
   ```

1. 設定 AWS STS 和 SageMaker AI 用戶端以使用租戶標記的工作階段標籤。您可以變更標籤值來指定不同的租戶。

   ```
   # Start an AWS STS client
   sts_client = boto3.client('sts')
   
   # Define your tenants using tags
   # The session tag key must match the principal tag key in your execution role policy
   tags = []
   tag = {}
   tag['Key'] = "tenant-id"
   tag['Value'] = "example-tenant"
   tags.append(tag)
   
   # Have AWS STS assume your ABAC-enabled job creation role
   response = sts_client.assume_role(
       RoleArn="arn:aws:iam::<account-id>:role/<your-training-job-creation-role>",
       RoleSessionName="SessionName",
       Tags=tags)
   credentials = response['Credentials']
   
   # Create a client with your job creation role (which was assumed with tags)
   sagemaker_client = boto3.client(
       'sagemaker',
       aws_access_key_id=credentials['AccessKeyId'],
       aws_secret_access_key=credentials['SecretAccessKey'],
       aws_session_token=credentials['SessionToken']
   )
   sagemaker_session = sagemaker.Session(sagemaker_client=sagemaker_client)
   ```

    將標籤 `"tenant-id=example-tenant"` 附加至任務建立角色時，執行角色會擷取這些標籤，以使用下列政策：

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Action": [
                   "s3:GetObject",
                   "s3:PutObject"
               ],
               "Resource": [
                   "arn:aws:s3:::your-input-s3-bucket/example-tenant/*"
               ],
               "Effect": "Allow"
           },
           {
               "Action": [
                   "s3:PutObject"
               ],
               "Resource": "arn:aws:s3:::your-output-s3-bucket/example-tenant/*",
               "Effect": "Allow"
           },
           {
               "Action": "s3:ListBucket",
               "Resource": "*",
               "Effect": "Allow"
           }
       ]
   }
   ```

------

1. 定義估算器，以使用 SageMaker Python SDK 建立訓練任務。將 `enable_session_tag_chaining` 設定為 `True` 以允許 SageMaker AI 訓練執行角色從您的任務建立角色檢索標籤。

   ```
   # Specify your training input
   trainingInput = TrainingInput(
       s3_data='s3://<your-input-bucket>/example-tenant',
       distribution='ShardedByS3Key',
       s3_data_type='S3Prefix'
   )
   
   # Specify your training job execution role 
   execution_role_arn = "arn:aws:iam::<account-id>:role/<your-training-job-execution-role>"
   
   # Define your esimator with session tag chaining enabled
   estimator = Estimator(
       image_uri="<your-training-image-uri>",
       role=execution_role_arn,
       instance_count=1,
       instance_type='ml.m4.xlarge',
       volume_size=20,
       max_run=3600,
       sagemaker_session=sagemaker_session,
       output_path="s3://<your-output-bucket>/example-tenant",
       enable_session_tag_chaining=True
   )
   
   estimator.fit(inputs=trainingInput, job_name="abac-demo")
   ```

SageMaker AI 只會讀取訓練任務請求中提供的標籤，不會代表您將任何標籤新增至資源。

ABAC for SageMaker 訓練與 SageMaker AI 受管暖集區不相容。若要將 ABAC 搭配暖集區使用，相符的訓練任務必須具有相同的工作階段標籤。如需詳細資訊，請參閱[符合的訓練任務](train-warm-pools.md#train-warm-pools-matching-criteria)。