使用基于属性的访问控制 (ABAC) 进行多租户培训 - Amazon SageMaker
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

使用基于属性的访问控制 (ABAC) 进行多租户培训

在多租户环境中,确保每个租户的数据是隔离的,并且只有授权实体才能访问,这一点至关重要。 SageMaker 支持使用基于属性的访问控制 (ABAC) 来实现训练作业的这种隔离。与其为每个租户创建多个IAM角色,不如配置会话链接配置,该配置使用 Amazon Security Token Service (Amazon STS) 会话标签为您的训练作业请求临时的、有限权限的凭证以访问特定租户,从而为所有租户使用同IAM一个角色。有关会话标签的更多信息,请参阅中的传递会话标签 Amazon STS

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

先决条件

要开始使用多ABAC租户训练作业隔离,您必须具备以下条件:

  • 不同地点命名一致的租户。例如,如果租户的 Amazon S3 URI 输入数据为s3://your-input-s3-bucket/example-tenant,则该租户的亚马逊FSx目录应为/fsx-train/train/example-tenant,输出数据URI应为 Amazon S3 s3://your-output-s3-bucket/example-tenant

  • 创造 SageMaker 就业机会的角色。您可以使用 Amazon 角色管理器创建 SageMaker 任务创建 SageMaker角色。有关信息,请参阅使用角色管理器

  • 在其信任策略中具有sts:AssumeRolests:TagSession权限的 SageMaker 执行角色。有关 SageMaker 执行角色的更多信息,请参阅SageMaker 角色

    执行角色还应有一个策略,允许任何基于属性的多租户架构中的租户从附加到主体标签的前缀中读取。以下是一个策略示例,该策略将 SageMaker 执行角色限制为有权访问与tenant-id密钥关联的值。有关命名标签键的更多信息,请参阅IAM和STS中的标记规则

    { "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}/*" }, { "Action": "s3:ListBucket", "Resource": "*", "Effect": "Allow" } ] }

创建启用会话标签链接的训练作业

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

注意

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

启用会话标签链接 ABAC
  1. 导入boto3和 SageMaker Python SDK。ABAC启用训练作业隔离功能仅在 Python 版本 2.217 或更高版本中可用。 SageMaker SDK

    import boto3 import sagemaker from sagemaker.estimator import Estimator from sagemaker.inputs import TrainingInput
  2. 设置 Amazon STS 和 SageMaker 客户端,以使用标有租户标签的会话标签。您可以更改标签值以指定其他租户。

    # 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"将标签附加到任务创建角色时,执行角色会提取这些标签以使用以下策略:

    { "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/*" }, { "Action": "s3:ListBucket", "Resource": "*", "Effect": "Allow" } ] }
  3. 使用 Python SageMaker 定义一个估计器来创建训练作业。SDK设置enable_session_tag_chainingTrue,允许您的 SageMaker训练执行角色从您的任务创建角色中检索标签。

    # 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 只能读取训练任务请求中提供的标签,不能代表您向资源添加任何标签。

ABAC用于 SageMaker 训练与 SageMaker 托管的温水池兼容。要ABAC与温池一起使用,匹配的训练作业必须具有相同的会话标签。有关更多信息,请参阅 匹配的训练作业