繁体   English   中英

允许用户仅上传到一个 S3 存储桶

[英]Allow User to Only Upload to one S3 Bucket

我看过其他类似的问题,但我不知道如何做到这一点。

我有一个阻止所有公共访问的 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:::*"
        }
    ]
}

问题是某些权限仅适用于非特定资源

这是 json 的配置,我相信它有效。 如果人们看到它并发现有问题,请发表评论并告诉我——我才刚刚开始使用 AWS!

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

这里有几个问题:

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

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

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

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

如果操作不支持资源级权限,则策略中的该语句必须在 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/*"
        }
    ]
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM