允许写入存储桶而不是从存储桶读取的S3策略是否可能?

时间:2017-03-14 05:47:01

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

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

3 个答案:

答案 0 :(得分:3)

当然可以。例如,当sync命令与--delete开关一起使用时,我通常使用此只写策略将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/*"
            ]
        }
    ]
}

答案 1 :(得分: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 :(得分:1)

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