【问题标题】:S3 policy to allow to write to a bucket but not to read from it, is it possible?S3 策略允许写入存储桶但不允许读取存储桶,这可能吗?
【发布时间】:2020-01-05 05:57:20
【问题描述】:

是否可以只允许用户对存储桶进行写入操作而没有读取权限? 目标是让我的所有 EC2 实例将每个实例写入不同的存储桶,而不是让它们读取任何其他存储桶。我的所有实例都使用相同的 IAM 角色运行。

【问题讨论】:

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


    【解决方案1】:

    这当然是可能的。例如,当使用带有--delete 开关的sync 命令时,我通常使用此只写 策略将EC2 实例备份到S3:

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "s3:ListBucket"
                ],
                "Resource": [
                    "arn:aws:s3:::bucket-name"
                ]
            },
            {
                "Effect": "Allow",
                "Action": [
                    "s3:PutObject",
                    "s3:DeleteObject",
                    "s3:AbortMultipartUpload",
                    "s3:ListMultipartUploadParts",
                    "s3:ListBucketMultipartUploads"
                ],
                "Resource": [
                    "arn:aws:s3:::bucket-name/*"
                ]
            }
        ]
    }
    

    【讨论】:

    • 嗯...它几乎只写。 :)
    【解决方案2】:

    是的。您当然可以为角色分配允许PutObject 而无需任何其他操作的策略(例如ListBucketsGetObject)。

    选项 1:存储桶的只写权限

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

    您可以使用相同的存储桶,但使用它们的实例 ID 作为目录名称(例如 s3://my-bucket/i-abcd1234/foo.txt),以避免文件名冲突,而不是为每个实例提供自己的存储桶。

    选项 2:子目录中的完全权限

    您甚至可以更进一步,授予他们对 Amazon S3 存储桶的完全访问权限,但仅限于他们自己的子目录中。

    角色将被分配此策略:

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "AllowSubdirectory",
                "Effect": "Allow",
                "Action": [
                    "s3:*"
                ],
                "Resource": [
                    "arn:aws:s3:::my-bucket/${aws:userid}/*"
                ]
            }
        ]
    }
    

    在这种情况下,aws:userid policy variable 将等于 role-id:ec2-instance-id。因此,EC2 实例将能够在与其角色和实例 ID 匹配的子目录(也称为密钥前缀)中执行任何操作。

    例如:

    aws s3 cp foo s3://my-bucket/AROAJCLCJNQ3333ZQLZTW:i-055f66ea41fb4438e/foo
    

    role-id可以通过aws iam get-role --role-name rolename获取。

    该方法保证每个实例只能使用桶内自己的子目录。但是,它无法列出存储桶的内容,因为这是存储桶级别的权限。

    另见:Granting access to S3 resources based on role name

    【讨论】:

    • 我喜欢选项 2,但我想知道我是否可以为其他用户(比如 root 用户)添加完全访问权限,以便它能够完全访问所有子目录并能够删除它们?
    • 当然。上述策略将添加到分配给 EC2 实例的角色中。您可以为用户或角色分配单独的权限,然后它们将读取创建的那些文件。请注意,不需要存储桶策略,因为我们将权限分配给角色和用户,而不是存储桶本身。
    【解决方案3】:

    请注意,上述解决方案是正确的,但使用 PutObject Action 您还可以覆盖现有对象 (source)。我不知道为什么您需要这种类型的访问的确切情况,但是如果您想使用它来创建备份,我会添加一些额外的步骤以最大程度地减少覆盖对象的风险。我会创建一个单独的进程(例如 Lambda)来将所有对象从该存储桶复制到另一个安全的存储桶,客户端根本无权访问。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-28
      • 2019-10-06
      • 1970-01-01
      • 2021-06-28
      • 2016-03-17
      • 1970-01-01
      • 2018-05-21
      • 2013-10-25
      相关资源
      最近更新 更多