Search code examples
permissionsamazon-s3authorizationamazon-web-servicesgroup-policy

Granular policy document permissions in AWS


I want to be able to allow users created through IAM to be able to view one specific bucket in the management console. Furthermore, I want to restrict it to a folder within the bucket, such that the permissions would be:

S3 Console access for my-bucket/folder/*

How would I do this using the policy generator? I currently have:

{
   "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:*",
      "Resource": "*"
    }
  ]
}

However, when I modify the Resource location -- arn:aws:s3:::my-bucket/folder -- it prevents the user from being able to use the console at all. Is this possible to do and what do I need to do to be able to fix this?


Solution

  • The policy for this reminded me of doing an Euler apporximation, but this is how I did it (with comments to explain):

    {
      "Statement": [
    {             // first, allow unlimited access for S3
      "Effect": "Allow",  
      "Action": "s3:*",
      "Resource": "*"
    },
    {             // second, deny access to all buckets except for the particular bucket
      "Action": [
        "s3:*"
      ],
      "Effect": "Deny",
      "Resource": [
        list-of-my-other-buckets
      ]
    },
    {             // third, since we've already given * permissions, the bucket has full 
                  // permissions, and we need to restrcit all the permissions we don't want to give
      "Action": [
        "s3:AbortMultipartUpload",
        "s3:CreateBucket",
        "s3:DeleteBucket",
        "s3:DeleteObject",
        "s3:DeleteObjectVersion",
        "s3:GetBucketAcl",
        "s3:GetBucketNotification",
        "s3:GetBucketPolicy",
        "s3:GetBucketRequestPayment",
        "s3:GetObjectAcl",
        "s3:GetObjectVersion",
        "s3:GetObjectVersionAcl",
        "s3:PutBucketAcl",
        "s3:PutBucketNotification",
        "s3:PutBucketPolicy",
        "s3:PutBucketRequestPayment",
        "s3:PutBucketVersioning",
        "s3:PutObjectAcl",
        "s3:PutObjectVersionAcl"
      ],      
      "Effect": "Deny",
      "Resource": [
        "arn:aws:s3:::my-bucket/*"
              ]
            }
        ]
    }