Поддерживает ли Amazon S3 HTTP-запрос с базовой аутентификацией
Я хотел бы создать учетную запись Amazon S3, создать ведро, загрузить некоторые данные и что эти данные будут доступны с использованием HTTP GET с базовой аутентификацией.
Я знаю, что есть несколько способов получить аутентификацию S3 (строка запроса и т.д.), но я хотел бы иметь возможность предоставить простую схему имени пользователя и пароля для аутентификации.
Возможно ли это?
Ответы
Ответ 1
Теперь это возможно с использованием CloudFront и Lambda @Edge (обычно доступно с июля 2017 года в регионе us-east-1).
- Создайте ведро S3
- Установите дистрибутив CloudFront перед корзиной, ограничив доступ к корзине так, чтобы только CloudFront мог получить к ней доступ напрямую
- Создайте лямбда-функцию, которая будет имитировать рукопожатие Basic HTTP Auth с браузером. Присвойте его поведению CloudFront
Viewer Request
.
Вот лямбда-функция: https://gist.github.com/lmakarov/e5984ec16a76548ff2b278c06027f1a4
Вот статья с более подробной информацией: https://medium.com/@lmakarov/serverless-password-protecting-a-static-website-in-an-aws-s3-bucket-bfaaa01b8666
Ответ 2
Вы можете разработать его самостоятельно как веб-приложение или часть существующего приложения. Он будет использовать HTTP-запросы, извлекать их компонент URI, преобразовывать его в имя объекта S3 и использовать getObject() для получения своего содержимого (используя один из доступных SDK S3, например AWS Java SDK).
В противном случае вы можете попробовать размещенное решение - s3auth.com (я разработчик). Это проект с открытым исходным кодом, и вы можете увидеть, как этот механизм реализован внутри, в одном из его основных классов. HTTP-запрос обрабатывается службой, а затем повторно транслируется во внутреннюю схему аутентификации Amazon S3:
![]()
Эта диаграмма архитектуры объясняет, как реализован проект. Изображение PNG загружается из корзины Amazon S3 maven.s3auth.com
, которая не может быть прочитана анонимно. Полный URL этого изображения
http://s3auth:[email protected]/texry/packages.png
Проверьте также эту статью: Базовая аутентификация HTTP для S3 Buckets
Ответ 3
Складывая несколько сервисов AWS, вы можете достичь чего-то близкого к базовой HTTP-авторизации.
- Создайте статический сайт s3.
- Создайте CloudFront Distribution для обслуживания статического сайта s3 (используйте URL-адрес статического сайта, а не имя корзины)
- Используйте AWS WAF для создания правила, которое разрешает запросы только с правильным заголовком HTTP-авторизации. Это будет правило совпадения содержимого заголовка авторизации.
- Используйте Route53 для маршрутизации пользовательского домена в CloudFront Distribution
Теперь у вас должен быть статический сайт, доступ к которому возможен только с правильным именем пользователя и паролем.
ПРИМЕЧАНИЕ:, используя эту настройку, вам не будут предложены ваши учетные данные, поскольку запрос блокируется с запретом 403 вместо 401 Несанкционированным.
ПРИМЕЧАНИЕ.. Вы можете создать дистрибутив CloudFront перед ведром s3 напрямую, но вы не сможете по умолчанию загружать файл корневого индекса в подпапки.
Ответ 4
Короткий ответ - нет, не используя базовый auth. Но вот способ, который фактически совпадает с базовым auth, и это легко, чем другие перечисленные решения. Я считаю, что это безопасно, но я точно не знаю.
Вы можете установить условия на ведрах s3, которые соответствуют заголовкам запроса. В качестве примера вы можете использовать заголовки useragent
и referer
как нечто эквивалентное имени пользователя и паролю в базовом auth. Обычно пользовательским агентом является браузер, а ОС (например, Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0)
, а референт - предыдущая веб-страница.
Вот пример политики вектора s3, который позволяет помещать объекты и получать объекты, сопоставляя useragent и referer (изменение примечания: BUCKETNAME
, USERNAME
, PASSWORD
, AWS_REGION
и FILENAME
до ваши данные):
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "allow-username-and-password-access",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": [
"s3:PutObject",
"s3:GetObject"
],
"Resource": "arn:aws:s3:::BUCKETNAME/*",
"Condition": {
"StringEquals": {
"aws:UserAgent": "USERNAME",
"aws:Referer": "PASSWORD"
}
}
}
]
}
Чтобы поместить ресурс в ведро, вы можете использовать такой запрос на завивки (изменение примечания: BUCKETNAME
, USERNAME
, PASSWORD
, AWS_REGION
и FILENAME
):
curl --user-agent USERNAME --referer PASSWORD --upload-file "FILENAME" --request PUT "https://s3-AWS_REGION.amazonaws.com/BUCKETNAME/FILENAME"
Чтобы использовать этот ресурс, вы можете использовать что-то вроде этого:
curl --user-agent USERNAME --referer PASSWORD "https://s3-AWS_REGION.amazonaws.com/BUCKETNAME/FILENAME" > FILENAME
Еще раз, я считаю, что это безопасно, поскольку useragent и referer должны быть зашифрованы, если вы используете https, но, пожалуйста, скажите мне, нет ли этого.
Ответ 5
Нет, это невозможно.
Вы должны соответствовать API проверки подлинности амазонок
Ознакомьтесь с некоторыми из оберток, перечисленных здесь.
Ответ 6
Я сам пытался найти решение этой проблемы. В этом сообщении перечислены все. Цитирование строк:
Я искал месяцы для решения добавить базовую HTTP-аутентификацию в ведра S3 на Amazon. Существуют варианты, связанные с предварительно подписанными URL-адресами (только для одного объекта), с использованием стороннего бесплатного или коммерческого сервиса (проблемы конфиденциальности), вращения EC2/Heroku/и т.д. с промежуточным программным обеспечением для запросов прокси (сложный, а не серверный), используя переадресация страниц и политики ведра (не безопасно).
Решение для политики ведра:
Я лично пробовал это, и мне кажется, что это абсолютно безопасно (если у вас нет способа обойти политики aws bucket). Для этого требуется только ведро s3. Простота реализации. Основная идея:
- Ограничить доступ ко всему сайту, за исключением разрешенного доступа к файлу входа и секретному файлу.
- Файл записи secure.html, который принимает вход пользователя для пароля и перенаправляет его в секретный файл
- секретный файл thisisasecret, который перенаправляется на главный файл (index.html), на котором размещается реальный контент сайта.
- Основной файл main.html, который разрешает доступ к запросам, полученным с того же сайта.
- Весь другой контент, такой как css, js файлы, будет ограничен политикой bucket, которая позволит им обслуживаться, если запрос возник из вашего URL-адреса в bucket.
Использование aws Lambda @Edge: Для этого решения требуется s3, aws lambda и aws cloudfront. Основная идея:
- Создайте файл secure.html. Создайте текстовые поля для ввода основных учетных данных от пользователя здесь. Этот файл должен быть общедоступным и должен вызывать функцию лямбда.
- При настройке облачного режима создайте поведение, в котором говорится: "Если вы хотите достичь index.html, вам нужно сделать это с помощью подписанного URL".
- Как и выше, создайте политику ведра, чтобы разрешить доступ к файлам js, css и т.д., только когда источником является ваш URL-адрес вашего ведра.
Ответ 7
Я из AdroitLogic. О связанной статье показано, как UltraESB может быть размещен между вашим клиентом и Amazon S3 для аутентификации ваших запросов. При необходимости он может создать услугу "прокси", которая будет принимать базовую аутентификацию от вашего клиента и отправить учетные данные, как ожидает Amazon S3. Это можно сделать тривиально и скрыть любую сложность для вашего клиента.
Ответ 8
Посмотрите на мой ответ здесь, в этом несколько связанном вопросе.
Вопрос заключался в том, чтобы получить СПИСОК объектов-контейнеров без необходимости аутентификации S3. Таким образом, из вашего вопроса мой ответ на самом деле не объясняет ваш запрос на Http-request with basic username/password authentication
а скорее дает возможность сделать корзину приватной и при этом получать данные, зная identity-pool (ID)
и Amazon Resource Name (ARN)
(которое вы можете считать похожим на имя пользователя и пароль). Конечно, чтобы получить (ID) и (ARN), вы должны выполнить некоторые настройки на главных страницах AWS, как описано в моем 17- шаговом ответе здесь... - а также, это не является частью GET- запрос, а скорее в рамках AWSS3, которые предоставляет Amazon. Я надеюсь, это все еще дает вам больше возможностей для вашего вопроса;)