首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >只允许用户上传到一个S3桶

只允许用户上传到一个S3桶
EN

Stack Overflow用户
提问于 2021-12-01 15:22:38
回答 1查看 192关注 0票数 0

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

我有一个S3桶,所有的公共访问都被封锁了,存储桶打开了服务器端加密。

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

我有一个用户组,其权限如下:

代码语言:javascript
复制
{
    "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"
        }
    ]
}

我用Visual创建了它,这对我来说似乎太过了,然而,即使我将用户分配给那个用户组,我仍然无法将一个文件上传到那个桶中,或者看到列出的桶一旦注册为该用户。

我做错了什么?

//编辑//

这是我标记为正确的答案中特别提到的版本:

代码语言:javascript
复制
{
    "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:::*"
        }
    ]
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-01 20:14:37

这里有几个问题:

  1. 您正在混合桶级和对象级操作。
  2. 在某些情况下,您使用的资源ARNs不正确。
  3. 你的政策过分放任了。

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

您可以看到桶和对象操作的示例,还可以看到与这些操作相关的具有相应资源类型的S3定义的操作列表。您的策略应该将桶操作应用于存储资源ARN,将对象操作应用于对象资源ARN,理想情况下不应该将它们混合(实际上,这与您在编辑的示例中所做的基本相同)。是的,允许"s3:Get*"同时针对桶ARN和通配符对象ARN这样的操作是很有诱惑力的,但这是不正确的,而且是维护上的麻烦。

例如,您将看到ListAccessPoints没有关联的资源类型。您已经指出了"arn:aws:s3:::*",这是不正确的,将不授予任何(它需要成为"*")。为什么它需要是"*"?根据文档

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

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

如果您想要一个IAM策略,允许列出所有桶,列出特定桶中的对象,然后上传到相同的桶中,但没有其他内容,那么首先我将:

代码语言:javascript
复制
{
    "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/*"
        }
    ]
}

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70186814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档