【问题标题】:AWS S3 IAM policy to limit to single sub folderAWS S3 IAM 策略限制为单个子文件夹
【发布时间】:2021-02-25 14:53:03
【问题描述】:

场景:我有一个简单的 S3 存储桶,多个用户将向其上传文件。每个用户都应该上传到一个特定的文件夹,并且只有那个文件夹 - 除此之外没有子文件夹。在该文件夹中,他们可以上传任何他们想要的东西。我有一个 IAM 策略,目前仅限于该用户文件夹,但允许他们指定我不想要的子文件夹。

当前 IAM 政策 JSON,仅限于顶级文件夹:

{
    "Version": "2012-10-17",
    "Statement": [{
        "Sid": "VisualEditor2",
        "Effect": "Allow",
        "Action": [
            "s3:PutObject",
            "s3:GetObjectTagging"
        ],
        "Resource": "arn:aws:s3:::[MY_BUCKET]/[MY_FOLDER]/*"
    }]
}

提议的 IAM 策略 JSON,我希望将 PutObject 进一步限制在指定的文件夹上,但这似乎不允许上传任何对象?:

{
    "Version": "2012-10-17",
    "Statement": [{
        "Sid": "VisualEditor2",
        "Effect": "Allow",
        "Action": [
            "s3:PutObject",
            "s3:GetObjectTagging"
        ],
        "Resource": "arn:aws:s3:::[MY_BUCKET]/[MY_FOLDER]/*",
        "Condition": {
            "StringEquals": {
                "s3:prefix": [
                    "",
                    "[MY_FOLDER]/"
                ],
                "s3:delimiter": [
                    "/"
                ]
            }
        }
    }]
}

预期结果

  • 允许 arn:aws:s3:::[MY_BUCKET]/[MY_FOLDER]/[MY_FILE].csv
  • 允许 arn:aws:s3:::[MY_BUCKET]/[MY_FOLDER]/[MY_FILE].parquet
  • 允许 arn:aws:s3:::[MY_BUCKET]/[MY_FOLDER]/[MY_FILE].txt
  • 拒绝 arn:aws:s3:::[MY_BUCKET]/[MY_FOLDER]/[MY_FOLDER1]/[MY FOLDER2]/[MY_FILE].txt
  • 拒绝 arn:aws:s3:::[MY_BUCKET]/[MY_FOLDER]/[MY_FOLDER1]/[MY_FILE].txt
  • 拒绝 arn:aws:s3:::[MY_BUCKET]/[MY_FOLDER]/[...N 文件夹]/[MY_FILE].txt

【问题讨论】:

  • 如果您允许上传到特定前缀,例如users/gbeaven/* 那么你不能阻止上传到下面的“文件夹”,例如users/gbeaven/dogs/snoopy.png,至少不使用 IAM 或存储桶策略。
  • @jarmod 你将如何完成我想要做的事情?我觉得不应该这么复杂。我的代码取决于密钥的第一个“文件夹”。如果用户不小心使用多个密钥上传,它将抛出代码。话虽如此,使用 IAM 策略而不是代码来处理验证似乎是谨慎的。
  • 您不能在 IAM 或 S3 存储桶策略 afaik 中执行此操作,因此如果您授予 IAM 用户 fred 上传到 users/fred/* 的权限,那么 fred 可以在此创建任何内容。您所能做的就是对其做出反应,例如通过触发移动文件或删除文件或其他方式的 Lambda 函数。除了让这些用户不受限制地访问 S3 前缀之外,您还有另一个选择是向他们提供预签名 URL。然后指定他们可以上传到的密钥(但这可能不切实际,除非您的用户通过您控制的应用程序与 S3 进行交互)。
  • 也许值得理解为什么您不想让您的用户创建他们自己的“子文件夹”并在他们分配的前缀下管理他们自己的文件层次结构?为什么这对您的用例来说是个问题?
  • 因为在我们的用例中用户不需要子文件夹。用户应将文件加载到数据载入存储桶中的“他们的”文件夹中,此时 Lambda 脚本会触发并将数据分类/放置在我们的数据湖中。如果用户总是放置在正确的位置,我不需要处理代码中的任何用户错误。如果用户确实不小心加载了多个文件夹,而无法限制为 1 个子文件夹并向用户抛出“拒绝访问”错误,则文件将静默加载,但将由代码处理。看起来很直观,这可以通过 IAM 策略来处理。

标签: amazon-web-services amazon-s3 permissions amazon-iam


【解决方案1】:

Amazon S3 中没有文件系统中的“文件夹”。您所看到的文件夹实际上只是文件名的前缀。 Amazon S3 的工作方式是,您可以限制对特定前缀的访问,但不能限制在下面创建其他前缀。

但是,您可以利用 Amazon S3 事件和 Lambda 函数来实现您的要求。该过程可能如下所示:

1.用户在 Amazon S3 中存储文件

2. Amazon S3 fires an event notification,包含元数据,包括对象键(代表文件名)和前缀(代表文件夹 )。

3. Lambda 函数triggered by the S3 Event 并通过以下方式处理元数据:

  • 在允许的前缀(表示“子文件夹”)之后检查文件名是否有后续斜杠 (/)
  • 如果创建的文件包含后续斜杠,则删除该文件

【讨论】:

  • 对,这就是我目前正在做的事情,但这会“静默”地处理上传的文件,即使它们通过 CLI 加载不正确。是的,我可以设置 SNS 警报,但这似乎是创可贴上的创可贴。对我来说,政策只处理前缀是没有意义的。
  • 如果您缺少特定功能,请使用 AWS 管理控制台中的反馈功能(在右下角的每个页面上)向服务团队发送功能请求。 AWS 90% 的功能都是基于实际的客户请求。谁知道呢,也许有办法实现你所需要的。
猜你喜欢
  • 2016-06-26
  • 2014-01-25
  • 2012-11-23
  • 2019-11-06
  • 1970-01-01
  • 2019-07-07
  • 2021-09-27
  • 2018-11-02
  • 1970-01-01
相关资源
最近更新 更多