Поддерживает ли Amazon S3 HTTP-запрос с базовой аутентификацией - PullRequest
45 голосов
/ 22 июня 2010

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

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

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

Ответы [ 8 ]

33 голосов
/ 31 августа 2017

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

  1. Создание корзины S3
  2. Настройка aРаспределение CloudFront перед корзиной ограничивает доступ к корзине, так что только CloudFront может получить к ней прямой доступ
  3. Создайте функцию Lambda, которая будет имитировать рукопожатие Basic HTTP Auth с браузером.Присвойте его поведению CloudFront Viewer Request.

Вот функция Lambda: https://gist.github.com/lmakarov/e5984ec16a76548ff2b278c06027f1a4

Вот статья с более подробной информацией: https://medium.com/@lmakarov/serverless-password-protecting-a-static-website-in-an-aws-s3-bucket-bfaaa01b8666

21 голосов
/ 26 августа 2012

Вы можете разработать его самостоятельно как веб-приложение или часть существующего приложения.Он будет использовать HTTP-запросы, получить их URI-компонент, преобразовать его в имя объекта S3 и использовать getObject () для получения его содержимого (используя один из доступных SDK S3, например AWS Java SDK ).

В противном случае вы можете попробовать размещенное решение - s3auth.com (я разработчик).Это проект с открытым исходным кодом, и вы можете увидеть, как этот механизм реализован внутри, в одном из его основных классов .HTTP-запрос обрабатывается службой и затем повторно транслируется во внутреннюю схему аутентификации Amazon S3:

http://s3auth:s3auth@maven.s3auth.com/texry/packages.png

Эта диаграмма архитектуры объясняет, как реализуется проект.Изображение PNG загружается из корзины Amazon S3 maven.s3auth.com, которая не может быть прочитана анонимно.Полный URL этого изображения:

http://s3auth:s3auth@maven.s3auth.com/texry/packages.png

. Проверьте также эту статью: Базовая аутентификация HTTP для S3 Buckets

13 голосов
/ 31 мая 2016

Многоуровневое использование нескольких сервисов AWS позволяет достичь чего-то близкого к базовой авторизации HTTP.

  1. Создание статического сайта s3.
  2. Создание дистрибутива CloudFront для обслуживания статического сайта s3 (используйте статический URL сайта, а не имя сегмента)
  3. Используйте AWS WAF для создания правила, которое разрешает запросы только с правильным заголовком http Authorization.Это будет правило совпадения для содержимого заголовка авторизации.
  4. Используйте Route53 для маршрутизации пользовательского домена в дистрибутив CloudFront

Теперь у вас должен быть статический сайт, который можетДоступ только с правильным именем пользователя и паролем.

ПРИМЕЧАНИЕ: при использовании этой настройки вам не будет предложено ввести ваши учетные данные, так как запрос заблокирован с помощью 403 Forbidden вместо 401 Unauthorized .

ПРИМЕЧАНИЕ: Вы можете создать дистрибутив CloudFront непосредственно перед корзиной s3, но по умолчанию вы не сможете использовать rootиндексный файл в подпапках.

11 голосов
/ 29 сентября 2017

Краткий ответ - нет, не используется базовая аутентификация.Но вот способ, который по сути такой же, как базовая аутентификация, и это проще, чем другие перечисленные решения.Я считаю, что это безопасно, но я точно не знаю.

Вы можете установить условия для блоков s3, которые соответствуют заголовкам в запросе.Например, вы можете использовать заголовки useragent и referer как нечто, эквивалентное имени пользователя и паролю в базовой аутентификации.Обычно useragent - это браузер и ОС (например, Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0), а referer - предыдущая веб-страница.

Вот пример политики s3 bucket, которая позволяет размещать объекты и получать объекты путем сопоставления useragent, иреферер (примечание изменить: 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"
                }
            }
        }
    ]
}

Чтобы поместить ресурс в корзину, вы можете использоватьзапрос curl вроде этого (примечание изменено: 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, но, пожалуйста, сообщите мне, если это не так.

9 голосов
/ 24 июня 2010

Нет, это невозможно. Вы должны соответствовать API аутентификации Amazons

Проверьте некоторые из перечисленных упаковщиков здесь .

2 голосов
/ 03 октября 2017

Я сам пытался найти решение этой проблемы. Этот пост перечислил их всех.Цитируя строки:

Я месяцами искал решение для добавления базовой HTTP-аутентификации в корзины S3 на Amazon.Существуют варианты, включающие предварительно подписанные URL-адреса (только для одного объекта), использование сторонних бесплатных или коммерческих услуг (вопросы конфиденциальности), раскрутка EC2 / Heroku / и т. Д.с промежуточным программным обеспечением для запросов прокси (сложным и не безсерверным), используя перенаправления страниц и политики корзины (небезопасно).

Решение политик корзины: У меня естьлично попробовал это, и мне кажется, что это совершенно безопасно (если у вас нет способа обойти политики aws bucket).Для работы требуется только ведро s3.Прост в реализации.Основная идея:

  1. Ограничить доступ ко всему сайту, кроме как разрешить публичный доступ к файлу ввода и секретному файлу.
  2. Файл ввода secure.html , который принимаетпользовательский ввод для пароля и перенаправления в секретный файл
  3. секретный файл thisisasecret , который перенаправляет в основной файл (index.html), в котором размещается реальное содержимое сайта
  4. MainФайл main.html , который разрешает доступ только к запросам, исходящим с того же сайта.
  5. Весь другой контент, такой как файлы css, js, будет ограничен политикой сегмента, которая разрешит их обработку, еслизапрос был получен с вашего URL-адреса корзины.

Использование aws Lambda @ Edge: Для этого решения требуются s3, aws lambda и aws cloudfront.Основная идея:

  1. Создать secure.html .Создать текстовые поля для ввода основных учетных данных от пользователя здесь.Этот файл должен быть общедоступным и должен вызывать лямбда-функцию.
  2. При настройке cloudfront создайте поведение, которое говорит: «Если вы хотите получить доступ к index.html, вам нужно сделать это через подписанный URL».
  3. Как и выше, создайте политику сегмента, чтобы разрешить доступ к файлам js, css и т. Д., Только когда origin является вашим URL сегмента.
0 голосов
/ 05 марта 2018

Посмотрите на мой ответ здесь в этом несколько связанном вопросе.

Вопрос заключался в том, чтобы получить LIST-объект-контейнер без обязательной аутентификации S3.Таким образом, из вашего вопроса, мой ответ на самом деле не объясняет ваш запрос для Http-request with basic username/password authentication, но скорее дает возможность сделать контейнер приватным и по-прежнему получать его данные, зная identity-pool (ID) и Amazon Resource Name (ARN) (которые вы можете считать похожимиимя пользователя и пароль).Конечно, чтобы получить (ID) и (ARN), вам нужно выполнить некоторые настройки на главных страницах AWS , как описано в моем 17-шаговом ответе здесь ... - а также, этоне часть GET-запроса, а скорее в рамках AWSS3, которые предоставляет Amazon.Я надеюсь, это все еще дает вам больше возможностей для вашего вопроса;)

0 голосов
/ 18 февраля 2011

Я из AdroitLogic.Что касается связанной статьи, она показывает, как UltraESB может быть размещен между вашим клиентом и Amazon S3 для аутентификации ваших запросов.При необходимости он может создать службу «прокси», которая будет принимать базовую аутентификацию от вашего клиента и отправлять учетные данные так, как ожидает Amazon S3.Это можно сделать тривиальным способом, и это скроет любую сложность для вашего клиента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...