【问题标题】:Allow User to Only Upload to one S3 Bucket允许用户仅上传到一个 S3 存储桶
【发布时间】:2022-01-08 04:45:59
【问题描述】:

我看过其他类似的问题,但我不知道该怎么做。

我有一个 S3 存储桶,所有公共访问都被阻止,并且该存储桶已打开服务器端加密。

我想创建一个用户组,其权限允许特定用户查看列出的存储桶(但不能查看其他用户)并上传,但不能下载、删除或该存储桶中的任何其他内容。

我有一个具有如下权限的用户组:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:CreateAccessPoint",
                "s3:PutAnalyticsConfiguration",
                "s3:PutAccelerateConfiguration",
                "s3:PutAccessPointConfigurationForObjectLambda",
                "s3:DeleteObjectVersion",
                "s3:RestoreObject",
                "s3:DeleteAccessPoint",
                "s3:CreateBucket",
                "s3:ListBucket",
                "s3:DeleteAccessPointForObjectLambda",
                "s3:ReplicateObject",
                "s3:PutEncryptionConfiguration",
                "s3:DeleteBucketWebsite",
                "s3:AbortMultipartUpload",
                "s3:PutLifecycleConfiguration",
                "s3:UpdateJobPriority",
                "s3:CreateMultiRegionAccessPoint",
                "s3:PutBucketVersioning",
                "s3:PutObjectAcl",
                "s3:PutIntelligentTieringConfiguration",
                "s3:PutMetricsConfiguration",
                "s3:PutBucketOwnershipControls",
                "s3:PutReplicationConfiguration",
                "s3:DeleteMultiRegionAccessPoint",
                "s3:PutObjectLegalHold",
                "s3:UpdateJobStatus",
                "s3:PutBucketCORS",
                "s3:PutInventoryConfiguration",
                "s3:PutObject",
                "s3:PutBucketNotification",
                "s3:DeleteStorageLensConfiguration",
                "s3:PutBucketWebsite",
                "s3:PutBucketRequestPayment",
                "s3:PutObjectRetention",
                "s3:PutBucketLogging",
                "s3:CreateAccessPointForObjectLambda",
                "s3:PutBucketObjectLockConfiguration",
                "s3:ReplicateDelete"
            ],
            "Resource": "arn:aws:s3:::my-bucket"
        }
    ]
}

我使用可视化编辑器创建了它,这对我来说似乎有点过头了,但是,即使我已将用户分配到该用户组,我仍然无法将文件上传到该存储桶或查看登录后列出的存储桶那个用户。

我做错了什么?

///编辑///

这是我标记为正确的答案专门针对的版本:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "s3:ListAllMyBuckets",
            "Resource": "*"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketPublicAccessBlock",
                "s3:GetBucketPolicyStatus",
                "s3:PutObject",
                "s3:GetObjectAcl",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:DeleteObject",
                "s3:GetBucketAcl",
                "s3:GetBucketLocation",
                "s3:PutObjectAcl"
            ],
            "Resource": [
                "arn:aws:s3:::my-bucket",
                "arn:aws:s3:::my-bucket/*"
            ]
        },
        {
            "Sid": "VisualEditor2",
            "Effect": "Allow",
            "Action": [
                "s3:GetAccountPublicAccessBlock",
                "s3:ListAccessPoints"
            ],
            "Resource": "arn:aws:s3:::*"
        }
    ]
}

【问题讨论】:

  • 您希望“允许特定用户查看列出的存储桶(但不能查看其他用户)”——但是,ListBuckets 命令将列出每个 存储桶。您可能可以跳过授予他们此权限,因为他们应该知道分配给他们的存储桶的名称。

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


【解决方案1】:

这里有几个问题:

  1. 您正在混合存储桶级和对象级操作
  2. 在某些情况下,您使用的资源 ARN 不正确
  3. 您的政策过于宽松

操作的问题在于,一些操作与存储桶相关,一些操作与对象相关,而其他操作与资源类型完全无关。每当您在 same 资源语句中同时包含存储桶 ARN(例如 "arn:aws:s3:::my-bucket""arn:aws:s3:::*")和对象 ARN(例如 "arn:aws:s3:::my-bucket/*")时,您可能做错了。

您可以查看bucket and object operations 的示例,还可以查看actions defined by S3 列表以及与这些操作相关的相应资源类型。您的策略应将存储桶操作应用于存储桶资源 ARN,并将对象操作应用于对象资源 ARN,理想情况下不应混合使用它们(实际上,很大程度上就像您在编辑的示例中所做的那样,这很好)。是的,对存储桶 ARN 和通配符对象 ARN 执行诸如允许 "s3:Get*" 之类的操作很诱人,但这是不正确的,而且是一个令人头疼的维护问题。

例如,您将看到 ListAccessPoints 没有关联的资源类型。您已指出 "arn:aws:s3:::*" 不正确并且不会授予任何内容(它需要改为 "*")。为什么需要"*"?根据documentation

如果操作不支持资源级权限,则策略中的该语句必须在 Resource 元素中使用通配符 (*)。

在我看来,这对 AWS 来说有点不幸,也是一个值得商榷的选择。

如果您想要一个允许列出所有存储桶、列出特定存储桶中的对象以及上传到同一个存储桶的 IAM 策略,但仅此而已,那么我将从:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:ListAllMyBuckets",
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation"
            ],
            "Resource": "arn:aws:s3:::my-bucket"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": "arn:aws:s3:::my-bucket/*"
        }
    ]
}

现在,您可能会在实践中发现这还不够,必须添加额外的操作(我不知道您的客户在做什么),但我希望这是一个很好的起点。

【讨论】:

    猜你喜欢
    • 2013-10-25
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2014-04-05
    • 2017-04-19
    • 2019-08-26
    • 2018-07-12
    相关资源
    最近更新 更多