Amazon SageMaker 基于身份的策略示例 - Amazon SageMaker
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

Amazon SageMaker 基于身份的策略示例

默认情况下,IAM 用户和角色没有创建或修改 SageMaker 资源的权限。它们还无法使用 AWS 管理控制台、AWS CLI 或 AWS API 执行任务。IAM 管理员必须创建 IAM 策略,为用户和角色授予权限,以便对他们所需的指定资源执行特定的 API 操作。然后,管理员必须将这些策略附加到需要这些权限的 IAM 用户或组。要了解如何将策略附加到 IAM 用户或组,请参阅 中的添加和删除 IAM IAM 用户指南身份权限

要了解如何使用这些示例 JSON 策略文档创建基于IAM身份的策略,请参阅 中的在 JSON 选项卡上创建策略IAM 用户指南

策略最佳实践

基于身份的策略非常强大。它们确定某个人是否可以创建、访问或删除您账户中的 SageMaker 资源。这些操作可能会使 AWS 账户产生成本。创建或编辑基于身份的策略时,请遵循以下准则和建议:

  • 开始使用 AWS 托管策略 – 要快速开始使用 SageMaker,请使用 AWS 托管策略,为您的员工授予他们所需的权限。这些策略已在您的账户中提供,并由 AWS 维护和更新。有关更多信息,请参阅 IAM 用户指南 中的利用 AWS 托管策略开始使用权限

  • 授予最低权限 – 创建自定义策略时,仅授予执行任务所需的许可。最开始只授予最低权限,然后根据需要授予其他权限。这样做比起一开始就授予过于宽松的权限而后再尝试收紧权限来说更为安全。有关更多信息,请参阅 IAM 用户指南 中的授予最小权限

  • 为敏感操作启用 MFA – 为增强安全性,要求 IAM 用户使用多重身份验证 (MFA) 来访问敏感资源或 API 操作。有关更多信息,请参阅 IAM 用户指南 中的在 AWS 中使用多重身份验证 (MFA)

  • 使用策略条件来增强安全性 – 在切实可行的范围内,定义基于身份的策略在哪些情况下允许访问资源。例如,您可编写条件来指定请求必须来自允许的 IP 地址范围。您也可以编写条件,以便仅允许指定日期或时间范围内的请求,或者要求使用 SSL 或 MFA。有关更多信息,请参阅 IAM 用户指南 中的 IAM JSON 策略元素:Condition

使用 SageMaker 控制台

要访问 Amazon SageMaker 控制台,您必须拥有一组最低的权限。这些权限必须允许您列出和查看有关您的 SageMaker 账户中的 AWS 资源的详细信息。如果创建比必需的最低权限更为严格的基于身份的策略,对于附加了该策略的实体(IAM 用户或角色),控制台将无法按预期正常运行。

为确保这些实体仍可使用 SageMaker 控制台,也可向实体附加以下 AWS 托管策略。有关更多信息,请参阅 中的向用户添加权限IAM 用户指南

对于只需要调用 AWS CLI 或 AWS API 的用户,您无需为其提供最低控制台权限。相反,只允许访问与您尝试执行的 API 操作相匹配的操作。

使用 Amazon SageMaker 控制台所需要的权限

权限参考表列出 Amazon SageMaker API 操作并显示每个操作所需的权限。有关 Amazon SageMaker API 操作的更多信息,请参阅Amazon SageMaker API 权限:操作、权限和资源参考

要使用 Amazon SageMaker 控制台,您需要授予对其他操作的权限。具体而言,控制台需要允许 ec2 操作显示子网、VPC 和安全组的权限。(可选) 控制台需要为 和 等任务创建CreateNotebook执行角色CreateTrainingJob的权限CreateModel。使用以下权限策略授予这些权限:

{ "Version": "2012-10-17", "Statement": [ { "Sid": "SageMakerApis", "Effect": "Allow", "Action": [ "sagemaker:*" ], "Resource": "*" }, { "Sid": "VpcConfigurationForCreateForms", "Effect": "Allow", "Action": [ "ec2:DescribeVpcs", "ec2:DescribeSubnets", "ec2:DescribeSecurityGroups" ], "Resource": "*" }, { "Sid":"KmsKeysForCreateForms", "Effect":"Allow", "Action":[ "kms:DescribeKey", "kms:ListAliases" ], "Resource":"*" }, { "Sid": "AccessAwsMarketplaceSubscritions", "Effect": "Allow", "Action": [ "aws-marketplace:ViewSubscriptions" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "codecommit:BatchGetRepositories", "codecommit:CreateRepository", "codecommit:GetRepository", "codecommit:ListRepositories", "codecommit:ListBranches", "secretsmanager:CreateSecret", "secretsmanager:DescribeSecret", "secretsmanager:ListSecrets" ], "Resource": "*" }, { "Sid":"ListAndCreateExecutionRoles", "Effect":"Allow", "Action":[ "iam:ListRoles", "iam:CreateRole", "iam:CreatePolicy", "iam:AttachRolePolicy" ], "Resource":"*" }, { "Sid": "DescribeECRMetaData", "Effect": "Allow", "Action": [ "ecr:Describe*" ], "Resource": "*" }, { "Sid": "PassRoleForExecutionRoles", "Effect": "Allow", "Action": [ "iam:PassRole" ], "Resource": "*", "Condition": { "StringEquals": { "iam:PassedToService": "sagemaker.amazonaws.com" } } } ] }

使用 Amazon SageMaker Ground Truth 控制台所需要的权限

要使用 Amazon SageMaker Ground Truth 控制台,您需要授予其他资源的权限。具体而言,控制台需要 AWS Marketplace 的权限来查看订阅,需要 Amazon Cognito 操作的权限来管理您的专用员工,需要 Amazon S3 操作的权限来访问您的输入和输出文件,以及 AWS Lambda 操作的权限来列出和调用函数。使用以下权限策略授予这些权限:

{ "Version": "2012-10-17", "Statement": [ { "Sid": "GroundTruthConsole", "Effect": "Allow", "Action": [ "aws-marketplace:DescribeListings", "aws-marketplace:ViewSubscriptions", "cognito-idp:AdminAddUserToGroup", "cognito-idp:AdminCreateUser", "cognito-idp:AdminDeleteUser", "cognito-idp:AdminDisableUser", "cognito-idp:AdminEnableUser", "cognito-idp:AdminRemoveUserFromGroup", "cognito-idp:CreateGroup", "cognito-idp:CreateUserPool", "cognito-idp:CreateUserPoolClient", "cognito-idp:CreateUserPoolDomain", "cognito-idp:DescribeUserPool", "cognito-idp:DescribeUserPoolClient", "cognito-idp:ListGroups", "cognito-idp:ListIdentityProviders", "cognito-idp:ListUsers", "cognito-idp:ListUsersInGroup", "cognito-idp:ListUserPoolClients", "cognito-idp:ListUserPools", "cognito-idp:UpdateUserPool", "cognito-idp:UpdateUserPoolClient", "groundtruthlabeling:DescribeConsoleJob", "groundtruthlabeling:ListDatasetObjects", "groundtruthlabeling:RunFilterOrSampleManifestJob", "groundtruthlabeling:RunGenerateManifestByCrawlingJob", "lambda:InvokeFunction", "lambda:ListFunctions", "s3:GetObject", "s3:PutObject", "s3:SelectObjectContent" ], "Resource": "*" } ] }

使用 Amazon Augmented AI(预览版)控制台所需的权限

要使用 Augmented AI 控制台,您需要授予其他资源的权限。使用以下权限策略授予这些权限:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "sagemaker:*Algorithm", "sagemaker:*Algorithms", "sagemaker:*App", "sagemaker:*Apps", "sagemaker:*AutoMLJob", "sagemaker:*AutoMLJobs", "sagemaker:*CodeRepositories", "sagemaker:*CodeRepository", "sagemaker:*CompilationJob", "sagemaker:*CompilationJobs", "sagemaker:*Endpoint", "sagemaker:*EndpointConfig", "sagemaker:*EndpointConfigs", "sagemaker:*EndpointWeightsAndCapacities", "sagemaker:*Endpoints", "sagemaker:*Environment", "sagemaker:*EnvironmentVersion", "sagemaker:*EnvironmentVersions", "sagemaker:*Environments", "sagemaker:*Experiment", "sagemaker:*Experiments", "sagemaker:*FlowDefinitions", "sagemaker:*HumanLoop", "sagemaker:*HumanLoops", "sagemaker:*HumanTaskUi", "sagemaker:*HumanTaskUis", "sagemaker:*HyperParameterTuningJob", "sagemaker:*HyperParameterTuningJobs", "sagemaker:*LabelingJob", "sagemaker:*LabelingJobs", "sagemaker:*Metrics", "sagemaker:*Model", "sagemaker:*ModelPackage", "sagemaker:*ModelPackages", "sagemaker:*Models", "sagemaker:*MonitoringExecutions", "sagemaker:*MonitoringSchedule", "sagemaker:*MonitoringSchedules", "sagemaker:*NotebookInstance", "sagemaker:*NotebookInstanceLifecycleConfig", "sagemaker:*NotebookInstanceLifecycleConfigs", "sagemaker:*NotebookInstanceUrl", "sagemaker:*NotebookInstances", "sagemaker:*ProcessingJob", "sagemaker:*ProcessingJobs", "sagemaker:*RenderUiTemplate", "sagemaker:*Search", "sagemaker:*SearchSuggestions", "sagemaker:*Tags", "sagemaker:*TrainingJob", "sagemaker:*TrainingJobs", "sagemaker:*TransformJob", "sagemaker:*TransformJobs", "sagemaker:*Trial", "sagemaker:*TrialComponent", "sagemaker:*TrialComponents", "sagemaker:*Trials", "sagemaker:*Workteam", "sagemaker:*Workteams" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "sagemaker:*FlowDefinition" ], "Resource": "*", "Condition": { "StringEqualsIfExists": { "sagemaker:WorkteamType": [ "private-crowd", "vendor-crowd" ] } } }, { "Effect": "Allow", "Action": [ "application-autoscaling:DeleteScalingPolicy", "application-autoscaling:DeleteScheduledAction", "application-autoscaling:DeregisterScalableTarget", "application-autoscaling:DescribeScalableTargets", "application-autoscaling:DescribeScalingActivities", "application-autoscaling:DescribeScalingPolicies", "application-autoscaling:DescribeScheduledActions", "application-autoscaling:PutScalingPolicy", "application-autoscaling:PutScheduledAction", "application-autoscaling:RegisterScalableTarget", "aws-marketplace:ViewSubscriptions", "cloudwatch:DeleteAlarms", "cloudwatch:DescribeAlarms", "cloudwatch:GetMetricData", "cloudwatch:GetMetricStatistics", "cloudwatch:ListMetrics", "cloudwatch:PutMetricAlarm", "cloudwatch:PutMetricData", "codecommit:BatchGetRepositories", "codecommit:CreateRepository", "codecommit:GetRepository", "codecommit:ListBranches", "codecommit:ListRepositories", "cognito-idp:AdminAddUserToGroup", "cognito-idp:AdminCreateUser", "cognito-idp:AdminDeleteUser", "cognito-idp:AdminDisableUser", "cognito-idp:AdminEnableUser", "cognito-idp:AdminRemoveUserFromGroup", "cognito-idp:CreateGroup", "cognito-idp:CreateUserPool", "cognito-idp:CreateUserPoolClient", "cognito-idp:CreateUserPoolDomain", "cognito-idp:DescribeUserPool", "cognito-idp:DescribeUserPoolClient", "cognito-idp:ListGroups", "cognito-idp:ListIdentityProviders", "cognito-idp:ListUserPoolClients", "cognito-idp:ListUserPools", "cognito-idp:ListUsers", "cognito-idp:ListUsersInGroup", "cognito-idp:UpdateUserPool", "cognito-idp:UpdateUserPoolClient", "ec2:CreateNetworkInterface", "ec2:CreateNetworkInterfacePermission", "ec2:CreateVpcEndpoint", "ec2:DeleteNetworkInterface", "ec2:DeleteNetworkInterfacePermission", "ec2:DescribeDhcpOptions", "ec2:DescribeNetworkInterfaces", "ec2:DescribeRouteTables", "ec2:DescribeSecurityGroups", "ec2:DescribeSubnets", "ec2:DescribeVpcEndpoints", "ec2:DescribeVpcs", "ecr:BatchCheckLayerAvailability", "ecr:BatchGetImage", "ecr:CreateRepository", "ecr:Describe*", "ecr:GetAuthorizationToken", "ecr:GetDownloadUrlForLayer", "elastic-inference:Connect", "elasticfilesystem:DescribeFileSystems", "elasticfilesystem:DescribeMountTargets", "fsx:DescribeFileSystems", "glue:CreateJob", "glue:DeleteJob", "glue:GetJob", "glue:GetJobRun", "glue:GetJobRuns", "glue:GetJobs", "glue:ResetJobBookmark", "glue:StartJobRun", "glue:UpdateJob", "groundtruthlabeling:*", "iam:ListRoles", "kms:DescribeKey", "kms:ListAliases", "lambda:ListFunctions", "logs:CreateLogGroup", "logs:CreateLogStream", "logs:DescribeLogGroups", "logs:DescribeLogStreams", "logs:GetLogEvents", "logs:PutLogEvents", "sns:ListTopics" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "logs:CreateLogDelivery", "logs:DeleteLogDelivery", "logs:DescribeResourcePolicies", "logs:GetLogDelivery", "logs:ListLogDeliveries", "logs:PutResourcePolicy", "logs:UpdateLogDelivery" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "ecr:SetRepositoryPolicy", "ecr:CompleteLayerUpload", "ecr:BatchDeleteImage", "ecr:UploadLayerPart", "ecr:DeleteRepositoryPolicy", "ecr:InitiateLayerUpload", "ecr:DeleteRepository", "ecr:PutImage" ], "Resource": "arn:aws:ecr:*:*:repository/*sagemaker*" }, { "Effect": "Allow", "Action": [ "codecommit:GitPull", "codecommit:GitPush" ], "Resource": [ "arn:aws:codecommit:*:*:*sagemaker*", "arn:aws:codecommit:*:*:*SageMaker*", "arn:aws:codecommit:*:*:*Sagemaker*" ] }, { "Effect": "Allow", "Action": [ "secretsmanager:ListSecrets" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "secretsmanager:DescribeSecret", "secretsmanager:GetSecretValue", "secretsmanager:CreateSecret" ], "Resource": [ "arn:aws:secretsmanager:*:*:secret:AmazonSageMaker-*" ] }, { "Effect": "Allow", "Action": [ "secretsmanager:DescribeSecret", "secretsmanager:GetSecretValue" ], "Resource": "*", "Condition": { "StringEquals": { "secretsmanager:ResourceTag/SageMaker": "true" } } }, { "Effect": "Allow", "Action": [ "robomaker:CreateSimulationApplication", "robomaker:DescribeSimulationApplication", "robomaker:DeleteSimulationApplication" ], "Resource": [ "*" ] }, { "Effect": "Allow", "Action": [ "robomaker:CreateSimulationJob", "robomaker:DescribeSimulationJob", "robomaker:CancelSimulationJob" ], "Resource": [ "*" ] }, { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject", "s3:DeleteObject", "s3:AbortMultipartUpload", "s3:GetBucketCors", "s3:PutBucketCors" ], "Resource": [ "arn:aws:s3:::*SageMaker*", "arn:aws:s3:::*Sagemaker*", "arn:aws:s3:::*sagemaker*", "arn:aws:s3:::*aws-glue*" ] }, { "Effect": "Allow", "Action": [ "s3:CreateBucket", "s3:GetBucketLocation", "s3:ListBucket", "s3:ListAllMyBuckets" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "s3:GetObject" ], "Resource": "*", "Condition": { "StringEqualsIgnoreCase": { "s3:ExistingObjectTag/SageMaker": "true" } } }, { "Effect": "Allow", "Action": [ "lambda:InvokeFunction" ], "Resource": [ "arn:aws:lambda:*:*:function:*SageMaker*", "arn:aws:lambda:*:*:function:*sagemaker*", "arn:aws:lambda:*:*:function:*Sagemaker*", "arn:aws:lambda:*:*:function:*LabelingFunction*" ] }, { "Action": "iam:CreateServiceLinkedRole", "Effect": "Allow", "Resource": "arn:aws:iam::*:role/aws-service-role/sagemaker.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_SageMakerEndpoint", "Condition": { "StringLike": { "iam:AWSServiceName": "sagemaker.application-autoscaling.amazonaws.com" } } }, { "Effect": "Allow", "Action": "iam:CreateServiceLinkedRole", "Resource": "*", "Condition": { "StringEquals": { "iam:AWSServiceName": "robomaker.amazonaws.com" } } }, { "Effect": "Allow", "Action": [ "sns:Subscribe", "sns:CreateTopic" ], "Resource": [ "arn:aws:sns:*:*:*SageMaker*", "arn:aws:sns:*:*:*Sagemaker*", "arn:aws:sns:*:*:*sagemaker*" ] }, { "Effect": "Allow", "Action": [ "iam:PassRole" ], "Resource": "arn:aws:iam::*:role/*", "Condition": { "StringEquals": { "iam:PassedToService": [ "sagemaker.amazonaws.com", "glue.amazonaws.com", "robomaker.amazonaws.com", "states.amazonaws.com" ] } } } ] }

允许用户查看他们自己的权限

此示例显示您可以如何创建策略,以便允许 IAM 用户查看附加到其用户身份的内联和托管策略。此策略包括在控制台上完成此操作或者以编程方式使用 AWS CLI 或 AWS API 所需的权限。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "ViewOwnUserInfo", "Effect": "Allow", "Action": [ "iam:GetUserPolicy", "iam:ListGroupsForUser", "iam:ListAttachedUserPolicies", "iam:ListUserPolicies", "iam:GetUser" ], "Resource": ["arn:aws-cn:iam::*:user/${aws:username}"] }, { "Sid": "NavigateInConsole", "Effect": "Allow", "Action": [ "iam:GetGroupPolicy", "iam:GetPolicyVersion", "iam:GetPolicy", "iam:ListAttachedGroupPolicies", "iam:ListGroupPolicies", "iam:ListPolicyVersions", "iam:ListPolicies", "iam:ListUsers" ], "Resource": "*" } ] }

用条件键控制 SageMaker 资源的创建

通过控制细粒度访问,可以使用特定于 SageMaker 的条件键来创建 SageMaker 资源。有关在 IAM 策略中使用条件键的信息,请参阅 IAM 用户指南 中的 IAM JSON 策略元素:条件

的条件键以及相关 API SageMaker 操作和指向相关文档的链接列在 的 的 条件键IAM 用户指南中。

以下示例显示如何使用 SageMaker 条件键来控制访问。

使用文件系统条件键控制对 SageMaker 资源的访问

SageMaker 训练提供了安全的基础设施供训练算法在其中运行,但在某些情况下,您可能需要增加防御深度。例如,您可以最大程度地降低在算法中运行不受信任的代码的风险,或者您在组织中具有特定的安全性要求。对于这些场景,您可以在 IAM 策略的 Condition 元素中使用特定于服务的条件键,以将用户范围缩小到特定文件系统、目录、访问模式(读写,只读)和安全组。

将 IAM 用户限制为特定目录和访问模式

下面的策略将 IAM 用户对 EFS 文件系统的 /sagemaker/xgboost-dm/train/sagemaker/xgboost-dm/validation 目录的访问限制为 ro(只读)访问模式:

注意

当允许目录时,训练算法也可以访问其所有子目录。POSIX 权限会被忽略。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AccessToElasticFileSystem", "Effect": "Allow", "Action": [ "sagemaker:CreateTrainingJob", "sagemaker:CreateHyperParameterTuningJob" ], "Resource": "*", "Condition": { "StringEquals": { "sagemaker:FileSystemId": "fs-12345678", "sagemaker:FileSystemAccessMode": "ro", "sagemaker:FileSystemType": "EFS", "sagemaker:FileSystemDirectoryPath": "/sagemaker/xgboost-dm/train" } } }, { "Sid": "AccessToElasticFileSystemValidation", "Effect": "Allow", "Action": [ "sagemaker:CreateTrainingJob", "sagemaker:CreateHyperParameterTuningJob" ], "Resource": "*", "Condition": { "StringEquals": { "sagemaker:FileSystemId": "fs-12345678", "sagemaker:FileSystemAccessMode": "ro", "sagemaker:FileSystemType": "EFS", "sagemaker:FileSystemDirectoryPath": "/sagemaker/xgboost-dm/validation" } } } ] }

将 IAM 用户限制为特定文件系统

要防止使用用户空间客户端的恶意算法直接访问您账户中的任何文件系统,您可以通过允许来自特定安全组的入口来限制网络流量。在以下示例中,IAM 用户只能使用指定的安全组访问文件系统:

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AccessToLustreFileSystem", "Effect": "Allow", "Action": [ "sagemaker:CreateTrainingJob", "sagemaker:CreateHyperParameterTuningJob" ], "Resource": "*", "Condition": { "StringEquals": { "sagemaker:FileSystemId": "fs-12345678", "sagemaker:FileSystemAccessMode": "ro", "sagemaker:FileSystemType": "FSxLustre", "sagemaker:FileSystemDirectoryPath": "/fsx/sagemaker/xgboost/train" }, "ForAllValues:StringEquals": { "sagemaker:VpcSecurityGroupIds": [ "sg-12345678" ] } } } ] }

虽然上述示例可以将算法限制为特定文件系统,但它不会阻止算法使用用户空间客户端访问该文件系统中的任何目录。要缓解这种情况,您可以:

  • 确保文件系统仅包含您信任的 IAM 用户要访问的数据

  • 创建一个 IAM 角色,限制您的 IAM 用户使用已批准的 ECR 存储库中的算法启动训练作业

有关如何在 SageMaker 中使用角色的更多信息,请参阅 SageMaker 角色

限制对特定 VPC 的训练

限制 AWS 用户从 Amazon VPC 中创建训练作业。在 VPC 中创建训练作业时,您可以使用 VPC 流日志来监控进出训练集群的所有流量。有关使用 VPC 流日志的信息,请参阅 https://docs.amazonaws.cn/AmazonVPC/latest/UserGuide/flow-logs.html 用户指南中的 Amazon Virtual Private CloudVPC 流日志

以下策略强制由IAMCreateTrainingJob从 VPC 中调用 的 用户创建训练作业:

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowFromVpc", "Effect": "Allow", "Action": [ "sagemaker:CreateTrainingJob", "sagemaker:CreateHyperParameterTuningJob" ], "Resource": "*", "Condition": { "ForAllValues:StringEquals": { "sagemaker:VpcSubnets": ["subnet-a1234"], "sagemaker:VpcSecurityGroupIds": ["sg12345", "sg-67890"] }, "Null": { "sagemaker:VpcSubnets": "false", "sagemaker:VpcSecurityGroupIds": "false" } } } ] }

限制对 Ground Truth 标记作业和 Amazon A2I 人工审查工作流的人力类型的访问

Amazon SageMaker Ground Truth 和 Amazon Augmented AI 工作组属于以下三种人力类型之一:公有(带 Amazon Mechanical Turk)、专用和供应商。要使用这些类型之一或工作组 ARN 限制 IAM 用户对特定工作组的访问,请使用 sagemaker:WorkteamType 和/或 sagemaker:WorkteamArn 条件键。对于 sagemaker:WorkteamType 条件键,请使用字符串条件运算符。对于 sagemaker:WorkteamArn 条件键,请使用 Amazon 资源名称 (ARN) 条件运算符。如果用户尝试通过受限制的工作组来创建标记作业,那么 SageMaker 将返回访问拒绝错误。

以下策略演示了将 sagemaker:WorkteamTypesagemaker:WorkteamArn 条件键与适当的条件运算符和有效条件值结合使用的不同方法。

以下示例使用 sagemaker:WorkteamType 条件键和 StringEquals 条件运算符一起限制对公有工作组的访问。它接受以下格式的条件值:workforcetype-crowd,其中 workforcetype 可以等于 publicprivatevendor

{ "Version": "2012-10-17", "Statement": [ { "Sid": "RestrictWorkteamType", "Effect": "Deny", "Action": "sagemaker:CreateLabelingJob", "Resource": "*", "Condition": { "StringEquals": { "sagemaker:WorkteamType": "public-crowd" } } } ] }

以下策略演示如何使用 sagemaker:WorkteamArn 条件键限制对公有工作组的访问。第一个策略演示如何将该条件键与工作组 ARN 的 IAM 有效正则表达式变量和 ArnLike 条件运算符一起使用。第二个策略演示如何将该条件键与 ArnEquals 条件运算符和工作组 ARN 一起使用。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "RestrictWorkteamType", "Effect": "Deny", "Action": "sagemaker:CreateLabelingJob", "Resource": "*", "Condition": { "ArnLike": { "sagemaker:WorkteamArn": "arn:aws:sagemaker:*:*:workteam/public-crowd/*" } } } ] }
{ "Version": "2012-10-17", "Statement": [ { "Sid": "RestrictWorkteamType", "Effect": "Deny", "Action": "sagemaker:CreateLabelingJob", "Resource": "*", "Condition": { "ArnEquals": { "sagemaker:WorkteamArn": "arn:aws:sagemaker:us-west-2:394669845002:workteam/public-crowd/default" } } } ] }

强制加密输入数据

以下策略限制 IAM 用户在使用 AWS KMS 条件键创建训练、超参数调整和标记作业时指定用于加密输入数据的 sagemaker:VolumeKmsKey 键:

{ "Version": "2012-10-17", "Statement": [ { "Sid": "EnforceEncryption", "Effect": "Allow", "Action": [ "sagemaker:CreateTrainingJob", "sagemaker:CreateHyperParameterTuningJob", "sagemaker:CreateLabelingJob", "sagemaker:CreateFlowDefiniton" ], "Resource": "*", "Condition": { "ArnEquals": { "sagemaker:VolumeKmsKey": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" } } } ] }

强制加密笔记本实例存储卷

以下策略限制 IAM 用户在使用 AWS KMS 条件键创建或更新笔记本实例时指定用于加密附加存储卷的 sagemaker:VolumeKmsKey 键:

{ "Version": "2012-10-17", "Statement": [ { "Sid": "EnforceEncryption", "Effect": "Allow", "Action": [ "sagemaker:CreateNotebookInstance" ], "Resource": "*", "Condition": { "ArnLike": { "sagemaker:VolumeKmsKey": "*key/volume-kms-key-12345" } } } ] }

为训练作业强制进行网络隔离

以下策略限制 IAM 用户在使用 sagemaker:NetworkIsolation 条件键创建训练作业时启用网络隔离:

{ "Version": "2012-10-17", "Statement": [ { "Sid": "EnforceIsolation", "Effect": "Allow", "Action": [ "sagemaker:CreateTrainingJob", "sagemaker:CreateHyperParameterTuningJob" ], "Resource": "*", "Condition": { "Bool": { "sagemaker:NetworkIsolation": "true" } } } ] }

强制为训练作业实施特定实例类型

以下策略限制 IAM 用户在使用 sagemaker:InstanceTypes 条件键创建训练作业时使用特定实例类型:

{ "Version": "2012-10-17", "Statement": [ { "Sid": "EnforceInstanceType", "Effect": "Allow", "Action": [ "sagemaker:CreateTrainingJob", "sagemaker:CreateHyperParameterTuningJob" ], "Resource": "*", "Condition": { "ForAllValues:StringLike": { "sagemaker:InstanceTypes": ["ml.c5.*"] } } } ] }

强制为训练作业实施特定的 EI 加速器

当创建或更新笔记本实例以及通过使用 IAM 条件键创建终端节点配置时,以下策略限制 sagemaker:AcceleratorTypes 用户使用特定的 Elastic Inference (EI) 加速器(如果提供了加速器):

{ "Version": "2012-10-17", "Statement": [ { "Sid": "EnforceAcceleratorType", "Effect": "Allow", "Action": [ "sagemaker:CreateNotebookInstance", "sagemaker:UpdateNotebookInstance", "sagemaker:CreateEndpointConfig" ], "Resource": "*", "Condition": { "ForAllValues:StringEquals": { "sagemaker:AcceleratorTypes": ["ml.eia1.medium"], } } } ] }

在创建笔记本实例时强制禁用 Internet 访问和根访问

您可以禁用对笔记本实例的 Internet 访问和根访问,以帮助提高它们的安全性。有关控制对笔记本实例的根访问权限的信息,请参阅控制对 SageMaker 笔记本实例的根访问。有关禁用笔记本电脑实例的 Internet 访问的信息,请参阅将笔记本实例连接到 VPC 中的资源

以下策略要求 IAM 用户在创建实例时禁用网络访问权限,或在创建或更新笔记本实例时禁用根访问权限。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "LockDownCreateNotebookInstance", "Effect": "Allow", "Action": [ "sagemaker:CreateNotebookInstance" ], "Resource": "*", "Condition": { "StringEquals": { "sagemaker:DirectInternetAccess": "Disabled", "sagemaker:RootAccess": "Disabled" }, "Null": { "sagemaker:VpcSubnets": "false", "sagemaker:VpcSecurityGroupIds": "false" } } }, { "Sid": "LockDownUpdateNotebookInstance", "Effect": "Allow", "Action": [ "sagemaker:UpdateNotebookInstance" ], "Resource": "*", "Condition": { "StringEquals": { "sagemaker:RootAccess": "Disabled" } } } ] }

使用基于身份的策略控制对 SageMaker API 的访问

要控制对 SageMaker API 调用以及 SageMaker 托管终端节点调用的访问,请使用基于身份的 IAM 策略。

将 SageMaker API 和运行时访问限制为来自您的 VPC 的调用

如果在您的 VPC 中设置了接口终端节点,VPC 外部的个人仍然可以通过 Internet 连接到 SageMaker API 和运行时,除非您附加一个 IAM 策略以将对来自 VPC 的调用的访问限制为仅有权访问您的 SageMaker 资源的所有用户和组。有关为 SageMaker API 和运行时创建 VPC 接口终端节点的信息,请参阅通过 VPC 接口终端节点连接到 SageMaker

重要

如果您应用类似于以下内容之一的 IAM 策略,则用户无法通过控制台访问指定的 SageMaker API。

要将访问限制为仅限从您 VPC 中进行的连接,请创建 AWS Identity and Access Management 策略,将访问限制为仅允许来自您 VPC 中调用。然后,将该策略添加到用于访问 AWS Identity and Access Management API 或运行时的每个 SageMaker 用户、组或角色中。

注意

此策略只允许连接到创建接口终端节点的子网中的调用方。

{ "Id": "api-example-1", "Version": "2012-10-17", "Statement": [ { "Sid": "Enable API Access", "Effect": "Allow", "Action": [ "sagemaker:*" ], "Resource": "*", "Condition": { "StringEquals": { "aws:SourceVpc": "vpc-111bbaaa" } } } ] }

如果要将 API 访问限制为仅使用接口终端节点进行的调用,请使用 aws:SourceVpce 条件键而不是 aws:SourceVpc

{ "Id": "api-example-1", "Version": "2012-10-17", "Statement": [ { "Sid": "Enable API Access", "Effect": "Allow", "Action": [ "sagemaker:CreatePresignedNotebookInstanceUrl" ], "Resource": "*", "Condition": { "ForAllValues:StringEquals": { "aws:sourceVpce": [ "vpce-111bbccc", "vpce-111bbddd" ] } } } ] }

通过 IP 地址限制对 SageMaker API 和运行时调用的访问

要仅允许从指定的列表中的 IP 地址访问 SageMaker API 和运行时调用,请为用于访问该 API 或运行时的每个 IAM 用户、组或角色附加一个 AWS Identity and Access Management 策略以拒绝对该 API 的访问,除非调用来自列表中的 IP 地址。有关创建 IAM 策略的信息,请参阅 https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_create.html 用户指南 中的AWS Identity and Access Management创建 IAM 策略。要指定您希望可以访问 API 调用的 IP 地址的列表,请使用 IpAddress 条件运算符和 aws:SourceIP 条件上下文键。有关IAM条件运算符的信息,请参阅 https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html 用户指南 中的 AWS Identity and Access ManagementIAM JSON 策略元素:条件运算符。有关 IAM 条件上下文键的更多信息,请参阅 AWS 全局条件上下文键

例如,以下策略CreateTrainingJob仅允许从范围 192.0.2.0-192.0.2.255203.0.113.0- 203.0.113.255中的 IP 地址访问 :

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sagemaker:CreateTrainingJob", "Resource": "*", "Condition": { "IpAddress": { "aws:SourceIp": [ "192.0.2.0/24", "203.0.113.0/24" ] } } } ] }

按 IP 地址限制对笔记本实例的访问

要仅允许从您指定的列表中的 IP 地址访问笔记本实例,请将拒绝访问 的 IAM 策略CreatePresignedNotebookInstanceUrl(除非调用来自列表中的 IP 地址)附加到用于访问笔记本实例的每个AWS Identity and Access Management用户、组或角色。有关创建 IAM 策略的信息,请参阅 https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_create.html 用户指南 中的AWS Identity and Access Management创建 IAM 策略。要指定您希望可以访问笔记本实例的 IP 地址列表,请使用 IpAddress 条件运算符和 aws:SourceIP 条件上下文键。有关IAM条件运算符的信息,请参阅 https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html 用户指南 中的 AWS Identity and Access ManagementIAM JSON 策略元素:条件运算符。有关 IAM 条件上下文键的更多信息,请参阅 AWS 全局条件上下文键

例如,以下策略仅允许从范围 192.0.2.0-192.0.2.255203.0.113.0-203.0.113.255 之间的 IP 地址访问笔记本实例:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sagemaker:CreatePresignedNotebookInstanceUrl", "Resource": "*", "Condition": { "IpAddress": { "aws:SourceIp": [ "192.0.2.0/24", "203.0.113.0/24" ] } } } ] }

该策略限制对 CreatePresignedNotebookInstanceUrl 的调用以及调用返回的 URL 的访问。该策略还限制在控制台中打开笔记本实例的访问权限,并针对尝试连接到笔记本实例的每个 HTTP 请求和 WebSocket 框架强制执行。

注意

通过 VPC 接口终端节点连接到 SageMaker 时,不兼容使用此方法来按 IP 地址筛选。有关在通过 VPC 接口终端节点连接时限制对笔记本实例访问的信息,请参阅通过 VPC 接口终端节点连接到笔记本实例

通过使用标签控制对 SageMaker 资源的访问权限

通过将标签附加到资源并指定在 SageMaker 策略中指定 ResourceTag 条件,控制对 IAM 资源组的访问权限。

注意

基于标签的策略无法限制以下 API 调用:

  • ListAlgorithms

  • ListCodeRepositories

  • ListCompilationJobs

  • ListEndpointConfigs

  • ListEndpoints

  • ListFlowDefinitions

  • ListHumanTaskUis

  • ListHyperparameterTuningJobs

  • ListLabelingJobs

  • ListLabelingJobsForWorkteam

  • ListModelPackages

  • ListModels

  • ListNotebookInstanceLifecycleConfigs

  • ListNotebookInstances

  • ListSubscribedWorkteams

  • ListTags

  • ListProcessingJobs

  • ListTrainingJobs

  • ListTrainingJobsForHyperParameterTuningJob

  • ListTransformJobs

  • ListWorkteams

  • 搜索

例如,假设您在 IAM 账户中定义了两个不同的 DevTeam1 组,分别名为 DevTeam2 和 AWS。假设您已创建了 10 个笔记本实例,其中 5 个用于一个项目,还有 5 个用于第二个项目。您希望允许 DevTeam1 的成员在用于第一个项目的笔记本实例上进行 API 调用,DevTeam2 的成员在用于第二个项目的笔记本实例上进行 API 调用。

控制对 API 调用的访问(示例)

  1. 将具有键 Project 和值 A 的标签添加到用于第一个项目的笔记本实例。有关向 SageMaker 资源添加标签的更多信息,请参阅 AddTags

  2. 将具有键 Project 和值 B 的标签添加到用于第二个项目的笔记本实例。

  3. 创建具有 IAM 条件的 ResourceTag 策略,拒绝对用于第二个项目的笔记本实例的访问,并将该策略附加到 DevTeam1。以下策略示例拒绝具有键为 Project 且值为 B 的标签的任何笔记本实例上的所有 API 调用:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sagemaker:*", "Resource": "*" }, { "Effect": "Deny", "Action": "sagemaker:*", "Resource": "*", "Condition": { "StringEquals": { "sagemaker:ResourceTag/Project": "B" } } }, { "Effect": "Deny", "Action": [ "sagemaker:AddTags", "sagemaker:DeleteTags" ], "Resource": "*" } ] }

    有关创建 IAM 策略并将其附加到 身份的信息,请参阅 https://docs.amazonaws.cn/IAM/latest/UserGuide/access_controlling.html 用户指南 中的使用 策略AWS Identity and Access Management控制访问。

  4. 创建具有 IAM 条件的 ResourceTag 策略,拒绝对用于第一个项目的笔记本实例的访问,并将该策略附加到 DevTeam2。以下策略示例拒绝具有键为 Project 且值为 A 的标签的任何笔记本实例上的所有 API 调用:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "*", "Resource": "*" }, { "Effect": "Deny", "Action": "sagemaker:*", "Resource": "*", "Condition": { "StringEquals": { "sagemaker:ResourceTag/Project": "A" } } }, { "Effect": "Deny", "Action": [ "sagemaker:AddTags", "sagemaker:DeleteTags" ], "Resource": "*" } ] }

要求 API 调用存在或不存在标签

RequestTag 策略中,使用 IAM 条件键要求存在或不存在特定标签或特定标签值。例如,如果您希望要求由 IAM 组的任意成员创建的所有终端节点具有键为 environment 和值为 dev 的标签,请创建如下策略:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "*", "Resource": "*" }, { "Effect": "Deny", "Action": "sagemaker:CreateEndpoint", "Resource": "arn:aws:sagemaker:*:*:endpoint/*", "Condition": { "StringNotEquals": { "aws:RequestTag/environment": "dev" } } } ] }

将标签与超参数优化作业结合使用

在创建优化作业时,您可以通过在调用 Tags时将标签指定为 参数来向超参数优化作业添加标签CreateHyperParameterTuningJob。如果这样做,您为超参数优化作业指定的标签还将添加到该超参数优化作业启动的所有训练作业。

如果您通过调用 AddTags 将标签添加到超参数优化作业,则您添加的标签还将添加到在您调用 AddTags 之后超参数优化作业启动的所有训练作业,但不添加到您在调用 AddTags 之前超参数优化作业启动的训练作业。同样,当您通过调用 DeleteTags 从超参数优化作业中删除标签时,这些标签不会从该超参数优化作业之前启动的训练作业中删除。因此,与训练作业关联的标签,可能与启动这些作业的超参数优化作业的相关联标签不同步。如果您使用标签来控制对超参数优化作业及其所启动训练作业的访问权限,则可能希望确保标签同步。要确保训练作业的关联标签与启动这些作业的超参数优化作业的关联标签保持同步,请首先为超参数优化作业调用 ListTrainingJobsForHyperParameterTuningJob,用于获取超参数优化作业所启动的训练作业的列表。然后,为超参数优化作业以及训练作业列表中的各个训练作业调用 AddTagsDeleteTags,用于为所有对象添加或删除相同的一组标签。以下 Python 示例演示了此操作:

tuning_job_arn = smclient.describe_hyper_parameter_tuning_job(HyperParameterTuningJobName='MyTuningJob')['HyperParameterTuningJobArn'] smclient.add_tags(ResourceArn=tuning_job_arn, Tags=[{'Key':'Env', 'Value':'Dev'}]) training_jobs = smclient.list_training_jobs_for_hyper_parameter_tuning_job( HyperParameterTuningJobName='MyTuningJob')['TrainingJobSummaries'] for training_job in training_jobs: time.sleep(1) # Wait for 1 second between calls to avoid being throttled smclient.add_tags(ResourceArn=training_job['TrainingJobArn'], Tags=[{'Key':'Env', 'Value':'Dev'}])