2013-09-24 3 views
1

У меня есть сайт, который обслуживает наш контент от Amazon S3. В настоящее время я могу читать и записывать данные на S3 просто отлично с моего веб-сервера/веб-сайта. Разрешение ACL в порядке - у меня есть полные разрешения для веб-сайта, и вы просто читаете разрешения для общественности.S3 Bucket Policy for hotlinking предотвращает запись

Затем я добавил политику ведомости S3 для предотвращения хотлинкинга. Ниже вы можете ознакомиться с политикой S3.

Эта политика хорошо работает - за исключением одной проблемы - теперь она предотвращает запросы на запись файла с моего веб-сервера. Таким образом, хотя мой общедоступный веб-сайт прекрасно обслуживает контент, когда я пытаюсь выполнять операции с файлами или каталогами, например, загружать изображения или перемещать изображения (или каталоги), теперь я получаю сообщение об ошибке «Доступ запрещен». (моим сервером веб-приложений, который является Railo/Coldfusion)

Я не уверен, почему это происходит? Первоначально я думал, что это может быть связано с тем, что запросы на чтение/запись файлов между моим веб-сервером и S3 поступали через мой IP-адрес, а не в мое доменное имя. Но даже после добавления моего IP-кода ошибки сохраняются.

Если я удалю политику, все будет хорошо работать.

Кто-нибудь знает, что вызывает это или что мне здесь не хватает? Спасибо

 { 
    "Version": "2008-10-17", 
    "Statement": [ 
    { 
     "Sid": "Allowinmydomains", 
     "Effect": "Allow", 
     "Principal": { 
     "AWS": "*" 
     }, 
     "Action": "s3:GetObject", 
     "Resource": "arn:aws:s3:::cdn.babeswithbraces.com/*", 
     "Condition": { 
     "StringLike": { 
      "aws:Referer": [ 
      "http://www.babeswithbraces.com/*", 
      "http://babeswithbraces.com/*", 
      "http://64.244.61.40/*" 
      ] 
     } 
     } 
    }, 
    { 
     "Sid": "Givenotaccessifrefererisnomysites", 
     "Effect": "Deny", 
     "Principal": { 
     "AWS": "*" 
     }, 
     "Action": "s3:GetObject", 
     "Resource": "arn:aws:s3:::cdn.babeswithbraces.com/*", 
     "Condition": { 
     "StringNotLike": { 
      "aws:Referer": [ 
      "http://www.babeswithbraces.com/*", 
      "http://babeswithbraces.com/*", 
      "http://64.244.61.40/*" 
      ] 
     } 
     } 
    } 
    ] 
} 
+0

Что делать, если вы положили запрет до разрешения или полностью удалили блок «StringNotLike»/second policy? Первое условие «StringLike» должно работать, чтобы заблокировать любой запрос, не входящий в ваш домен, сам по себе. – Brian

+0

@Brian: Перемещение их вокруг ничего не делает. Удаление блока StringNotLike позволяет выполнять все запросы, делая таким образом предотвращение хотлинкинга недействительным. Я также где-то читал, что у вас должны быть блокировки «Разрешить» и «Запретить», чтобы сделать это эффективным, как это происходит, когда они находятся. – Cheeky

ответ

2

Когда вы используете политики ведра, отказ всегда отменяет грант. Поскольку вы отказываетесь от доступа к GetObject из политики вашего ведра для всех учетных записей (включая пользователей, прошедших проверку подлинности), которые не соответствуют вашему списку рефереров, ваше приложение производит ошибки Access denied.

По умолчанию объекты в S3 имеют свои ACL, установленные как частные. Если это имеет место с вашим ведром, тогда вам не нужно иметь правила Allow и Deny в политике вашего ведра. Достаточно иметь условие Allow, которое предоставляет анонимным пользователям, которые соответствуют некоторым конкретным реферерам, разрешение доступа к объектам в ведре.

В упомянутом выше случае, ваша политика Ковш должен выглядеть следующим образом:

{ 
    "Id": "Policy1380565362112", 
    "Statement": [ 
    { 
     "Sid": "Stmt1380565360133", 
     "Action": [ 
     "s3:GetObject" 
     ], 
     "Effect": "Allow", 
     "Resource": "arn:aws:s3:::cdn.babeswithbraces.com/*", 
     "Condition": { 
     "StringLike": { 
      "aws:Referer": [ 
      "http://www.babeswithbraces.com/*", 
      "http://babeswithbraces.com/*", 
      "http://64.244.61.40/*" 
      ] 
     } 
     }, 
     "Principal": { 
     "AWS": [ 
      "*" 
     ] 
     } 
    } 
    ] 
} 

Если объект списки ACL уже позволяют доступ общественности вы можете либо удалить эти списки управления доступом, чтобы сделать объекты частные по умолчанию или включить Deny правило в политике вашего ведра и измените запросы, отправляемые на S3 из вашего приложения, чтобы включить ожидаемый заголовок реферера. В настоящее время нет способа иметь правило Deny в политике вашего ведра, которое влияет только на анонимные запросы.

+0

Большое спасибо - ваше объяснение действительно помогло. Основная проблема здесь заключалась в том, что мои разрешения ACL были настроены так, чтобы разрешить публичные чтения для этой папки. Как вы сказали, как только я убрал эти права доступа к ACL, а затем добавил политику «разрешить», он отлично работал. – Cheeky

+0

Добро пожаловать! – dcro