

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用基于属性的访问权限控制（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) 来实现训练作业的这种隔离。您无需为每个租户创建多个 IAM 角色，而是可以通过配置会话链配置来为所有租户使用相同的 IAM 角色，该配置使用 AWS Security Token Service (AWS STS) 会话标签为您的训练作业请求临时的、有限权限的证书以访问特定租户。有关会话标签的更多信息，请参阅[在 AWS STS中传递会话标签](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html)。

创建训练作业时，您的会话链接配置使用 AWS STS 来请求临时安全证书。该请求会生成一个会话，并对其进行标记。每个 SageMaker 训练作业只能使用所有训练作业共享的单个角色访问特定的租户。通过会话链实施 ABAC，可以确保每个训练作业只能访问会话标签指定的租户，从而有效隔离和保护每个租户。以下部分将指导您完成使用 Pyth SageMaker on SDK 设置和使用 ABAC 进行多租户训练作业隔离的步骤。

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

要开始使用 ABAC 进行多租户训练作业隔离，您必须具备以下条件：
+ 租户在不同地点的命名保持一致。例如，如果租户的输入数据 Amazon S3 URI 为`s3://your-input-s3-bucket/example-tenant`，则该租户的亚马逊 FSx 目录应为`/fsx-train/train/example-tenant`，输出数据 Amazon S3 URI 应为`s3://your-output-s3-bucket/example-tenant`。
+ A SageMaker I 创造就业机会的角色。您可以使用 Amazon A SageMaker I 角色管理器创建 A SageMaker I 任务创建角色。有关信息，请参阅[使用角色管理器](https://docs.aws.amazon.com/sagemaker/latest/dg/role-manager-tutorial.html)。
+ 一个 SageMaker AI 执行角色`sts:AssumeRole`，其信任策略中包含和`sts:TagSession`权限。有关 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>

以下过程向您展示如何使用支持 ABAC 的多租户训练的 SageMaker Python SDK 创建带有会话标签链的训练作业。

**注意**  
除了多租户数据存储外，您还可以使用 ABAC 工作流程将会话标签传递给您的 Amazon VPC 执行角色以及您允许 SageMaker AI 调用的任何其他服务 AWS Key Management Service

**为 ABAC 启用会话标记链**

1. 导入`boto3`和 SageMaker Python 开发工具包。支持 ABAC 的训练作业隔离仅在 AI Python SDK 的 [2.217](https://pypi.org/project/sagemaker/2.217.0/) 或更高版本中可用。 SageMaker 

   ```
   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. 使用 Pyth SageMaker on SDK 定义一个估计器来创建训练作业。设置为`True`，`enable_session_tag_chaining`允许您的 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 只能读取训练任务请求中提供的标签，不能代表你向资源添加任何标签。

用于 SageMaker 训练的 ABAC 与 SageMaker AI 管理的温池兼容。要在暖池中使用 ABAC，匹配的训练作业必须具有相同的会话标记。有关更多信息，请参阅 [匹配的训练作业](train-warm-pools.md#train-warm-pools-matching-criteria)。