Допустим, я создаю клон Dropbox: Filebox. Я храню все свои пользовательские файлы на S3 и использую Cloudfront в качестве CDN.
Итак, у меня есть ограниченная корзина S3 (files.filebox.com
) с политикой корзины, которая позволяет s3:GetObject
использовать только удостоверение Origin Access, которое я создал через Cloudfront. Это заставляет все запросы «файла» проходить через Cloudfront и запрещает кому-либо доступ к файлу через URL-адреса S3.
Политика корзины для files.filebox.com
{
"Version": "2008-10-17",
"Id": "AllowCloudfrontGet",
"Statement": [
{
"Sid": "AllowCloudFrontGet",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity XXXXXXXXXXXX"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::files.filebox.com/*"
}
]
}
Неожиданное поведение
Скажем, для простоты я храню все файлы с готовым ACL public-read
.
Так что этот URL должен работать:https://files.filebox.com/<userID>/some-file.txt
Но это должно привести к 403: https://s3.amazonaws.com/files.filebox.com/<userID>/some-file.txt
Но я вижу противоположные результаты. URL-адрес S3 работает нормально, но URL-адрес files.filebox.com
, который проходит через Cloudfront, выдает ошибку MissingKey
.
URL-адрес files.filebox.com
действительно работает, но только если я подписываю URL-адрес, даже для объектов, имеющих ACL public-read
.
Вопросы
Учитывая, что политика корзины разрешает только s3:GetObject
для OAI CF, не должен ли URL-адрес S3 завершаться с ошибкой 403, даже если объект имеет ACL-список public-read
?
Я не могу найти никакой информации. об этом в документации, кроме расплывчатых формулировок, которые, по-видимому, указывают на то, что сегмент с ограниченным доступом должен 403 для любых запросов, которые не проходят через Cloudfront.
Когда я устанавливаю для ACL объекта значение public-read
, не устраняет ли это необходимость подписывать URL-адрес Cloudfront даже в сегменте с ограниченным доступом?
Нужно ли мне добавить еще один Statement
в политику сегмента, который разрешает неподписанным URL-адресам доступ к объектам public-read
?
Я пытался это сделать, но это не сработало. Я даже не знаю, как написать Statement
вот так...
Как мне действительно отклонить любые запросы, поступающие через URL-адреса S3?
Я хочу выдавать ошибку 403 для любых запросов которые проходят через URL-адреса S3, даже для объектов с ACL public-read
.