You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法在Amazon SageMaker Canvas中限制S3文件夹访问权限

问题解决:SageMaker Studio/Canvas 限制用户访问指定S3组织文件夹

问题背景

开发的多组织应用中,需要限制用户仅访问各自组织对应的S3文件夹(bucket-name/ULID,ULID为组织ID),但配置基于aws:PrincipalTag/org_id的S3权限策略后,用户在SageMaker Studio/Canvas中访问目标文件夹时出现权限错误,仅当ListBucket的prefix设为*时才能正常访问(但会暴露所有内容)。

核心原因

  1. SageMaker的权限执行主体:Studio/Canvas实际通过SageMaker执行角色而非IAM用户直接访问S3,若仅给IAM用户打org_id标签,执行角色会话无法继承该标签,导致策略中的变量${aws:PrincipalTag/org_id}为空。
  2. Canvas的S3访问模式:Canvas浏览S3时会先请求根目录列表,原策略仅允许org_id/*的前缀,无法匹配根目录访问请求,触发权限拦截。

解决方案

步骤1:配置SageMaker执行角色的会话标签传递

确保执行角色能继承IAM用户的org_id标签:

  • 进入SageMaker控制台,打开对应Domain的User Settings
  • 编辑目标User Profile,在Session Tags中添加标签:
    • 键:org_id
    • 值:${aws:PrincipalTag/org_id}
  • 保存配置,重启Studio会话使标签生效。

步骤2:修正ListBucket策略

调整策略适配Canvas的根目录访问需求,允许用户看到自己的组织文件夹:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowListOrgFolderAndRootNavigation",
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::my-bucket-name",
            "Condition": {
                "StringLike": {
                    "s3:prefix": [
                        "",
                        "${aws:PrincipalTag/org_id}/",
                        "${aws:PrincipalTag/org_id}/*"
                    ]
                },
                "StringEqualsIfExists": {
                    "s3:delimiter": "/"
                }
            }
        }
    ]
}
  • 空prefix允许根目录列表,但通过delimiter: "/"限制仅显示根目录下的“文件夹”前缀
  • 同时覆盖org_id/和org_id/*,确保进入组织文件夹后能浏览内部内容

步骤3:修正对象操作策略

确保策略覆盖组织文件夹本身及内部所有对象,并附加到SageMaker执行角色(而非IAM用户):

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowObjectOperationsInOrgFolder",
            "Action": [
                "s3:PutObject",
                "s3:ListMultipartUploadParts",
                "s3:GetObject",
                "s3:DeleteObject",
                "s3:AbortMultipartUpload",
                "s3:GetObjectVersion"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::my-bucket-name/${aws:PrincipalTag/org_id}",
                "arn:aws:s3:::my-bucket-name/${aws:PrincipalTag/org_id}/*"
            ]
        }
    ]
}
  • 添加arn:aws:s3:::my-bucket-name/${aws:PrincipalTag/org_id}确保能访问文件夹元数据
  • 补充s3:GetObjectVersion适配Canvas可能的版本控制需求

步骤4:补充必要的基础权限

在自定义的SageMaker权限策略中添加S3基础操作,避免Canvas因缺少权限报错:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:GetBucketLocation",
            "Resource": "arn:aws:s3:::my-bucket-name"
        }
    ]
}

验证方法

  1. 使用目标用户身份启动SageMaker Studio/Canvas
  2. 尝试导入数据,选择对应S3存储桶
  3. 确认仅能看到自己组织的文件夹,且可正常上传、查看、删除文件夹内的文件

内容的提问来源于stack exchange,提问作者Wasyn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 05:25:14