Amazon SageMaker 基于身份的策略示例 - Amazon SageMaker

Amazon SageMaker 基于身份的策略示例

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

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

策略最佳实践

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

  • AWS 托管策略及转向最低权限许可入门 - 要开始向用户和工作负载授予权限,请使用 AWS 托管策略来为许多常见使用场景授予权限。您可以在 AWS 账户 中找到这些策略。我们建议通过定义特定于您的使用场景的 AWS 客户管理型策略来进一步减少权限。有关更多信息,请参阅《IAM 用户指南》中的 AWS 托管式策略工作职能的 AWS 托管式策略

  • 应用最低权限 – 在使用 IAM policy 设置权限时,请仅授予执行任务所需的权限。为此,您可以定义在特定条件下可以对特定资源执行的操作,也称为最低权限许可。有关使用 IAM 应用权限的更多信息,请参阅《IAM 用户指南》中的 IAM 中的策略和权限

  • 使用 IAM policy 中的条件进一步限制访问权限 – 您可以向策略添加条件来限制对操作和资源的访问。例如,您可以编写策略条件来指定必须使用 SSL 发送所有请求。如果通过特定 AWS 服务(例如 AWS CloudFormation)使用服务操作,您还可以使用条件来授予对服务操作的访问权限。有关更多信息,请参阅《IAM 用户指南》中的 IAM JSON 策略元素:条件

  • 使用 IAM Access Analyzer 验证您的 IAM policy,以确保权限的安全性和功能性 – IAM Access Analyzer 会验证新策略和现有策略,以确保策略符合 IAM policy语言 (JSON) 和 IAM 最佳实践。IAM Access Analyzer 提供 100 多项策略检查和可操作的建议,以帮助您制定安全且功能性强的策略。有关更多信息,请参阅《IAM 用户指南》中的 IAM Access Analyzer 策略验证

  • Require multi-factor authentication(MFA)[需要多重身份验证(MFA)] – 如果您所处的场景要求您的 AWS 账户 中有 IAM 用户或根用户,请启用 MFA 来提高安全性。若要在调用 API 操作时需要 MFA,请将 MFA 条件添加到您的策略中。有关更多信息,请参阅《IAM 用户指南》中的 配置受 MFA 保护的 API 访问

有关 IAM 中的最佳实践的更多信息,请参阅《IAM 用户指南》中的 IAM 中的安全最佳实践

使用 SageMaker 控制台

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

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

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

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

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

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

{ "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": "AccessAwsMarketplaceSubscriptions", "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: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 策略元素:条件

《IAM 用户指南》中的 SageMaker 的条件键中列出了条件键和相关 API 操作,以及相关文档的链接。

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

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

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

将 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" } } } ] }

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

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

{ "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 角色,限制您的用户使用已批准的 ECR 存储库中的算法启动训练作业

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

限制对特定 VPC 的训练

限制 AWS 用户从 Amazon VPC 中创建训练作业。在 VPC 中创建训练作业时,您可以使用 VPC 流日志来监控进出训练集群的所有流量。有关使用 VPC 流日志的信息,请参阅《Amazon Virtual Private Cloud 用户指南》中的 VPC 流日志

以下策略强制由 VPC 内部调用 CreateTrainingJob 的用户创建训练作业:

{ "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 限制用户对特定工作团队的访问,请使用 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" } } } ] }

强制加密输入数据

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

{ "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" } } } ] }

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

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

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

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

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

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

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

以下策略限制用户在使用 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 加速器

当创建或更新笔记本实例以及通过使用 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 中的笔记本实例连接到外部资源

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

{ "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 中调用。然后,将该策略添加到用于访问 SageMaker API 或运行时的每个 AWS Identity and Access Management 用户、组或角色中。

注意

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

{ "Id": "api-example-1", "Version": "2012-10-17", "Statement": [ { "Sid": "EnableAPIAccess", "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": "EnableAPIAccess", "Effect": "Allow", "Action": [ "sagemaker:CreatePresignedNotebookInstanceUrl" ], "Resource": "*", "Condition": { "StringEquals": { "aws:sourceVpce": [ "vpce-111bbccc", "vpce-111bbddd" ] } } } ] }

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

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

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

{ "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 地址访问笔记本实例,请为用于访问该笔记本实例的每个 AWS Identity and Access Management 用户、组或角色附加一个 IAM 策略以拒绝对 CreatePresignedNotebookInstanceUrl 的访问,除非调用来自列表中的 IP 地址。有关如何创建 IAM 策略的信息,请参阅《AWS Identity and Access Management 用户指南》中的创建 IAM 策略。要指定您希望可以访问笔记本实例的 IP 地址列表,请使用 IpAddress 条件运算符和 aws:SourceIP 条件上下文键。有关 IAM 条件运算符的信息,请参阅《AWS Identity and Access Management 用户指南》中的 IAM 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 资源的访问权限

在 IAM 策略中指定标签,以控制对 SageMaker 资源组的访问权限。使用标签实施基于属性的访问权限控制 (ABAC)。使用标签有助于将资源访问权限划分给特定用户组。您可以让一个团队访问一组资源,让另一个团队访问另一组资源。您可以在 IAM 策略中提供 ResourceTag 条件,为每个组提供访问权限。

注意

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

  • DeleteImageVersion

  • DescribeImageVersion

  • ListAlgorithms

  • ListCodeRepositories

  • ListCompilationJobs

  • ListEndpointConfigs

  • ListEndpoints

  • ListFlowDefinitions

  • ListHumanTaskUis

  • ListHyperparameterTuningJobs

  • ListLabelingJobs

  • ListLabelingJobsForWorkteam

  • ListModelPackages

  • ListModels

  • ListNotebookInstanceLifecycleConfigs

  • ListNotebookInstances

  • ListSubscribedWorkteams

  • ListTags

  • ListProcessingJobs

  • ListTrainingJobs

  • ListTrainingJobsForHyperParameterTuningJob

  • ListTransformJobs

  • ListWorkteams

  • Search

一个简单的示例可帮助您了解如何使用标签来划分资源。假设您在 AWS 账户中定义了两个不同的 IAM 组,分别名为 DevTeam1DevTeam2。您还创建了 10 个笔记本实例。您将在一个项目中使用 5 个笔记本实例。将在第二个项目中使用另外 5 个笔记本实例。您可以为 DevTeam1 提供对用于第一个项目的笔记本实例进行 API 调用的权限。您可以让 DevTeam2 对第二个项目使用的笔记本实例进行 API 调用。

以下过程提供了一个简单示例,可帮助您理解添加标签的概念。您可以用它来实施上一段中描述的解决方案。

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

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

  3. 创建具有 ResourceTag 条件的 IAM 策略,拒绝对用于第二个项目的笔记本实例的访问,并将该策略附加到 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 策略并将其附加到身份的信息,请参阅《AWS Identity and Access Management 用户指南》中的使用策略控制访问权限

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

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

提供在创建 SageMaker 资源时为其添加标签的权限

有许多 Amazon SageMaker 操作允许您的用户在创建资源时指定标签。使用资源标签来实施基于属性的访问权限控制 (ABAC)。使用标签有助于将资源访问权限划分给特定用户组。您可以让一个团队访问一组资源,让另一个团队访问另一组资源。您可以在 IAM 策略中提供 ResourceTag 条件,为每个组提供访问权限。

您必须授予用户访问权限,让他们使用这些权限来创建资源。对于需要创建处理作业的用户,您必须在策略中向他们授予 sagemaker:CreateProcessingJob 访问权限。如果您的用户要为他们创建的资源添加标签,则您还必须授予标记权限。

重要

您只能向用户授予向他们创建的资源添加标签的权限。他们无法为已创建的资源添加标签。

以下是无法为其提供资源以添加标签的操作:

  • DeleteImageVersion

  • DescribeImageVersion

  • ListAlgorithms

  • ListCodeRepositories

  • ListCompilationJobs

  • ListEndpointConfigs

  • ListEndpoints

  • ListFlowDefinitions

  • ListHumanTaskUis

  • ListHyperparameterTuningJobs

  • ListLabelingJobs

  • ListLabelingJobsForWorkteam

  • ListModelPackages

  • ListModels

  • ListNotebookInstanceLifecycleConfigs

  • ListNotebookInstances

  • ListSubscribedWorkteams

  • ListTags

  • ListProcessingJobs

  • ListTrainingJobs

  • ListTrainingJobsForHyperParameterTuningJob

  • ListTransformJobs

  • ListWorkteams

  • Search

您可以控制对用户可以标记的操作或他们可以使用的标签的访问权限。您可以为以下使用案例指定权限:

  • 添加对使用任何操作创建的资源进行标记的权限,以及使用任何标签的权限

  • 添加对使用特定操作创建的资源进行标记的权限,以及使用任何标签的权限

  • 添加对使用任何操作创建的资源进行标记的权限,以及使用特定标签的权限

  • 添加对使用特定操作创建的资源进行标记的权限,以及使用特定标签的权限

Permissions for any operation and any tag

将以下语句添加到 IAM 策略中,以授予您的用户为任何操作添加任何标签的权限。

{ "Statement": [ { "Effect": "Allow", "Action": [ "sagemaker:Create*" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "sagemaker:AddTags" ], "Resource": "arn:aws:sagemaker:region:account:*/*", "Condition": { "Null": { "sagemaker:TaggingAction" : "false" } } } ] }
Permissions for a specific operation with specific tags

以下语句授予用户向使用 CreateModel 操作创建的资源添加 cc123 标签的权限。您可以根据自己的需要修改该语句,并将其添加到附加到用户角色的 IAM 策略中。

{ "Statement": [ { "Effect": "Allow", "Action": [ "sagemaker:CreateModel" ], "Resource": "*", "Condition": { "StringEquals": { "aws:RequestTag/cost-center": [ "cc123" ] }, "ForAnyValue:StringEquals": { "aws:TagKeys": [ "purpose" ] } } }, { "Effect": "Allow", "Action": [ "sagemaker:AddTags" ], "Resource": "arn:aws:sagemaker:region:account:*/*", "Condition": { "Null": { "sagemaker:TaggingAction" : "false" } } } ] }
Permissions for a specific operation and any tag

以下语句授予用户向使用 CreateModel 操作创建的资源添加任何标签的权限。

{ "Statement": [ { "Effect": "Allow", "Action": [ "sagemaker:CreateModel" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "sagemaker:AddTags" ], "Resource": "arn:aws:sagemaker:region:account:model/*", "Condition": { "String": { "sagemaker:TaggingAction" : [ "CreateModel" ] } } } ] }