#amazon-web-services #amazon-s3
Вопрос:
Я хотел бы заблокировать публичный доступ к моему веб-приложению, обслуживаемому через S3, и разрешить загрузку веб-сайта только по предварительно подписанному URL-адресу. Для этого я разрешил статический хостинг сайтов в S3 и разрешил публичное чтение для всех объектов. Это позволило мне загрузить общедоступный веб-сайт. Затем я добавил политику, запрещающую доступ к index.html:
{
"Version": "2008-10-17",
"Id": "PolicyForPublicWebsiteContent",
"Statement": [
{
"Sid": "PublicReadGetObject",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::web-portal/*"
},
{
"Sid": "PrivateReadGetObject",
"Effect": "Deny",
"Principal": {
"AWS": "*"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::web-portal/index.html"
}
]
}
После этого я сгенерировал предварительно подписанный URL-адрес для index.html страница с помощью sdk.
const url = s3.getSignedUrl('getObject', {
Bucket: 'web-portal',
Key: 'index.html',
Expires: signedUrlExpireSeconds
})
Однако мне отказывают в доступе, когда я пытаюсь получить доступ к URL-адресу, предоставленному с помощью SDK.
Я предполагаю, что это происходит, когда я добавил политику запрета в index.html. Я был бы очень обязан узнать, как правильно реализовать такую функцию в aws s3.
Комментарии:
1. «статический хостинг сайтов в S3» требует, чтобы ваш веб-сайт был общедоступным. Вы не можете изменить это с помощью URL-адресов, подписанных s3. Таким образом, можете ли вы на самом деле объяснить, что вы пытаетесь сделать?
2. Это сайт с ограниченным доступом для сбора некоторой информации от пользователя, и ссылка должна работать всего несколько минут и должна загружать сайт без каких-либо логинов или ограничений. Поэтому я хотел бы предоставить предварительно подписанный URL-адрес с серверной части и отправить пользователя по этому предварительно подписанному URL-адресу. Я могу сделать это, добавив случайный ключ в качестве параметра запроса и отказавшись от загрузки страницы с помощью программного кода. Тем не менее, я пытался выяснить, можно ли полностью обработать эту функцию с помощью самого AWS S3.
3. Не могли бы вы разделить свой веб-сайт на две группы или папки? Затем вы сделали бы одно ведро общедоступным как статический веб-сайт, а во втором у вас было бы только index.html как частное лицо.
4. Привет @marcin, я смог решить эту проблему, удалив политику запрета на index.html, и добавьте политику открытого доступа для чтения к остальным файлам, таким как .js и .css. Поэтому index.html не был в списке разрешенных или запрещенных по умолчанию. Следовательно, я не мог загрузить сайт публично, однако, когда я получаю подписанный URL на index.html Я смог получить доступ к index.html и загрузите остальную часть страницы.
5. Рад это слышать. Вы можете ответить на свой собственный вопрос и принять его также для дальнейшего использования.
Ответ №1:
Это было решено только путем добавления политики, разрешающей публичный доступ к другим файлам (js, css), и без добавления какой-либо политики (Разрешить/Запретить) в index.html.
Для меня все остальные мои файлы мы разместили в папке под названием static. Поэтому я добавил политику, разрешающую публичный доступ к этой папке.
{
"Version": "2008-10-17",
"Id": "PolicyForPublicWebsiteContent",
"Statement": [
{
"Sid": "PublicReadGetObject",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::web-portal/static/*"
}
]
}
После добавления вышеуказанной политики вы не сможете получить доступ к index.html страница через браузер. Однако вы можете получить доступ к index.html если у вас есть предварительно подписанный URL-адрес. Поскольку другие необходимые файлы находятся в открытом доступе, index.html смог загрузить остальное.
Я полагаю, что то же самое можно сделать, если мы сможем архивировать весь веб-сайт. Таким образом, все файлы будут находиться в одной папке zip. Затем укажите предварительно подписанный URL-адрес для этого файла. Таким образом, нам не нужно вводить какие-либо политики корзины для других файлов, не являющихся индексными.