Как загрузить веб-сайт через s3 с предварительно подписанным URL

#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-адрес для этого файла. Таким образом, нам не нужно вводить какие-либо политики корзины для других файлов, не являющихся индексными.