2016-08-17 3 views
2

Я пытаюсь предоставить общий доступ к ведром с использованием политики веток S3, а также разрешая конкретный доступ к роли с помощью политики ролей. Роль используется функцией Lambda для обработки объектов в ведре. Он останавливается при первом препятствии - он не может получить что-либо с префиксом «входящий /», даже если он разрешен в политике ролей и явно не запрещен в политике ведра.S3 Bucket Policy и IAM Role Conflicting

Роль политики:

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
     { 
      "Sid": "AllowBucketPut", 
      "Effect": "Allow", 
      "Action": [ 
       "s3:PutObject" 
      ], 
      "Resource": "arn:aws:s3:::bucket-name/*" 
     }, 
     { 
      "Sid": "AllowIncomingGetDelete", 
      "Effect": "Allow", 
      "Action": [ 
       "s3:GetObject", 
       "s3:DeleteObject" 
      ], 
      "Resource": "arn:aws:s3:::bucket-name", 
      "Condition": { 
       "StringLike": { 
        "s3:prefix": "incoming/*" 
       } 
      } 
     } 
    ] 
} 

Примечание: Я также попытался удалить состояние и изменение ресурса в «ARN: AWS: s3 ::: ковшового имя/входящий *», который, казалось, только изменить то, как симулятор политики вел себя. Другое примечание: GET из ведра с префиксом «входящий/*» работает в симуляторе, просто не на практике.

Я не удалял никаких утверждений в политике ниже, поскольку я не уверен, что может быть актуальным. IP-адреса опущены.

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
     { 
      "Sid": "AllowPublicList", 
      "Effect": "Allow", 
      "Principal": { 
       "AWS": "*" 
      }, 
      "Action": "s3:ListBucket", 
      "Resource": "arn:aws:s3:::bucket-name", 
      "Condition": { 
       "StringLike": { 
        "s3:prefix": "public*" 
       } 
      } 
     }, 
     { 
      "Sid": "AllowPublicGet", 
      "Effect": "Allow", 
      "Principal": { 
       "AWS": "*" 
      }, 
      "Action": "s3:GetObject", 
      "Resource": "arn:aws:s3:::bucket-name/public*" 
     }, 
     { 
      "Sid": "AllowPrivateList", 
      "Effect": "Allow", 
      "Principal": { 
       "AWS": "*" 
      }, 
      "Action": "s3:ListBucket", 
      "Resource": "arn:aws:s3:::bucket-name", 
      "Condition": { 
       "StringLike": { 
        "s3:prefix": "private*" 
       }, 
       "IpAddress": { 
        "aws:SourceIp": [ 
         "..." 
        ] 
       } 
      } 
     }, 
     { 
      "Sid": "AllowPrivateGet", 
      "Effect": "Allow", 
      "Principal": { 
       "AWS": "*" 
      }, 
      "Action": "s3:GetObject", 
      "Resource": "arn:aws:s3:::bucket-name/private*", 
      "Condition": { 
       "IpAddress": { 
        "aws:SourceIp": [ 
         "..." 
        ] 
       } 
      } 
     }, 
     { 
      "Sid": "AllowIncomingPut", 
      "Effect": "Allow", 
      "Principal": { 
       "AWS": "*" 
      }, 
      "Action": "s3:PutObject", 
      "Resource": "arn:aws:s3:::bucket-name/incoming*", 
      "Condition": { 
       "IpAddress": { 
        "aws:SourceIp": [ 
         "..." 
        ] 
       } 
      } 
     } 
    ] 
} 

Извинения за стену текста.

Я не понимаю, почему моя роль не может получить объекты с префиксом «входящий /».

Функция Lambda получает 403 Access Denied при выполнении следующих действий:

S3.download_file(bucket, key, localfile) 

ответ

0

Вы можете попробовать добавить формулировку ниже в политику ведра?

{ 
     "Sid": "AllowIncomingGet", 
     "Effect": "Allow", 
     "Principal": { 
      "AWS": "*" 
     }, 
     "Action": "s3:GetObject", 
     "Resource": "arn:aws:s3:::bucket-name/incoming/*", 
     "Condition": { 
      "IpAddress": { 
       "aws:SourceIp": [ 
        "..." 
       ] 
      } 
     } 
    } 
4

Согласно документации (http://docs.aws.amazon.com/AmazonS3/latest/dev/amazon-s3-policy-keys.html), то s3:prefix условия относится только к s3:ListBucket API, чтобы заставить звонящему указать префикс на операции ListBucket. Он, похоже, не применяется к вызову API GetObject.

Из-за этого, ваш Allow на GetObject с условием s3:prefix == ... не будет соответствовать либо GET (Object) запросы (поскольку эти запросы не содержат ключ политики! «S3: префикс»), так что вы не эффективно разрешая эти запросы в политике ролей. Поскольку вы, похоже, не разрешаете этот запрос в политике ведра, и нет никаких утверждений Deny в любом месте, ваш код лямбда находится в , неявно отклоненный.

Вместо этого вы должны использовать Resource, как уже упоминалось, вы пробовали симулятор политики: "Resource": "arn:aws:s3:::bucket-name/incoming/*".

Кроме того, у вас может возникнуть причина указывать политики точно так же, как и вы, но это кажется немного необычным - обычно элемент "Resource" в связанных с S3 политиках, когда вы хотите описать префикс, будет что-то вроде ...incoming/*, а не только ...incoming*. Это может помешать неожиданным результатам. Например, скажем, у вас есть «папка» под названием incoming/, а позже вы создаете папку с именем incoming-top-secret/. Как вы написали политику, вы должны предоставить доступ к этим префиксам! Но опять же - не зная точно детали вашей среды, трудно сказать, что вам действительно нужно. Просто хотел удостовериться, что вы (и кто-то еще читающий это) осознает эту тонкую (но важную) деталь!

Это все, о чем я могу думать, основываясь на описании, которое вы дали. Если вы попробуете эти изменения и все еще не сработаете, обновите свой вопрос в соответствии с новыми политиками, которые вы пробовали.Удачи!

+0

Большое спасибо за разъяснение. как упоминалось в сообщении, я получаю то же поведение, указывающее ресурс, как вы описываете. Я разобрался с проблемой ... sortof. Я обновлю, когда вернусь на работу. – unclemeat

Смежные вопросы