Подтвердить что ты не робот

Поддерживает ли Amazon S3 HTTP-запрос с базовой аутентификацией

Я хотел бы создать учетную запись Amazon S3, создать ведро, загрузить некоторые данные и что эти данные будут доступны с использованием HTTP GET с базовой аутентификацией.

Я знаю, что есть несколько способов получить аутентификацию S3 (строка запроса и т.д.), но я хотел бы иметь возможность предоставить простую схему имени пользователя и пароля для аутентификации.

Возможно ли это?

4b9b3361

Ответ 1

Теперь это возможно с использованием CloudFront и Lambda @Edge (обычно доступно с июля 2017 года в регионе us-east-1).

  1. Создайте ведро S3
  2. Установите дистрибутив CloudFront перед корзиной, ограничив доступ к корзине так, чтобы только CloudFront мог получить к ней доступ напрямую
  3. Создайте лямбда-функцию, которая будет имитировать рукопожатие 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, но, пожалуйста, скажите мне, нет ли этого.

Ответ 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. Я надеюсь, это все еще дает вам больше возможностей для вашего вопроса;)