Доступ к домену S3 BucketDenied

Доступ к домену S3 BucketDenied

Здравствуйте, у меня возникла проблема. Я получаю сообщение AccessDenied в моем домене.

Я загружаю свой сайт в AWS S3 Bucket, делаю его общедоступным, создаю статическую страницу, но при доступе через свой domain.com/mypage получаю сообщение об отказе в доступе.

Из aws mydomain.s3.amazonaws.com/mypage работает нормально.

DNS моего домена настроены следующим образом

;; ANSWER SECTION:
mydomain.com. 2101 IN CNAME mydomain.s3.amazonaws.com.
mydomain.s3.amazonaws.com. 41342 IN CNAME s3-1-w.amazonaws.com.
s3-1-w.amazonaws.com.   219 IN  CNAME   s3-w.us-east-1.amazonaws.com.
s3-w.us-east-1.amazonaws.com. 3 IN  A   52.217.69.36

Есть ли какие-нибудь советы по решению этой проблемы?

решение1

Этоиз документации поддержки Amazon:

Краткое описание:

Для устранения ошибок Access Denied определите, является ли доменное имя вашего дистрибутива конечной точкой веб-сайта S3 или конечной точкой API REST S3. Выполните следующие действия, чтобы определить тип конечной точки:

  1. Откройте консоль CloudFront.
  2. Выберите дистрибутив CloudFront, а затем выберите «Настройки дистрибутива».
  3. Выберите вкладку «Происхождения» и «Группы происхождения».
  4. Выберите вкладку «Происхождения» и «Группы происхождения».

Проверьте доменное имя в полях «Имя исходного домена» и «Путь», а затем определите тип конечной точки на основе формата доменного имени.

Конечные точки REST API используют следующий формат:

DOC-EXAMPLE-BUCKET.s3.amazonaws.com

Примечание: Обязательно следуйте правилам именования контейнеров Amazon S3.

Конечные точки веб-сайта используют следующий формат:

DOC-EXAMPLE-BUCKET.s3-website-us-east-1.amazonaws.com

Примечание: В зависимости от региона AWS формат конечной точки может использовать формат тире (s3-website-Region) или формат точек (s3-website.Region).

Если ваш дистрибутив использует конечную точку REST API, см. статью Я использую конечную точку S3 REST API в качестве источника моего дистрибутива CloudFront.Почему я получаю ошибку 403 «Отказано в доступе»?

Если ваш дистрибутив использует конечную точку веб-сайта, проверьте следующие требования, чтобы избежать ошибок «Отказано в доступе»:

  1. Объекты в ведре должны быть общедоступны.
  2. Объекты в корзине не могут быть зашифрованы с помощью AWS Key Management Service (AWS KMS).
  3. Политика контейнера должна разрешать доступ к s3:GetObject.
  4. Если политика корзины предоставляет публичный доступ на чтение, то учетная запись AWS, владеющая корзиной, должна также владеть объектом. 5. Запрошенные объекты должны существовать в корзине.
  5. Для контейнера необходимо отключить публичный доступ к Amazon S3 Block.
  6. Если включен параметр «Оплачивает запрашивающая сторона», то запрос должен включать параметр «Запрос-плательщик».
  7. Если вы используете заголовок Referer для ограничения доступа из CloudFront к вашему источнику S3, проверьте пользовательский заголовок.

Примечание: Если вы не хотите разрешать публичный (анонимный) доступ к вашим объектам S3, затем измените конфигурацию, чтобы использовать конечную точку S3 REST API в качестве источника вашего распространения. Затем настройте свое распространение и контейнер S3 для ограничения доступа с помощью идентификатора доступа к источнику (OAI). Инструкции см. в разделе Использование конечной точки REST API в качестве источника с ограниченным доступом с помощью OAI в разделе Как использовать CloudFront для обслуживания статического веб-сайта, размещенного на Amazon S3?

Разрешение

Объекты в ведре должны быть общедоступны.

Распределение с использованием конечной точки веб-сайта поддерживает только общедоступный контент. Чтобы определить, является ли объект в вашем контейнере S3 общедоступным, откройте URL-адрес объекта в веб-браузере. Или вы можете запустить команду curl на URL-адресе.

Ниже приведен пример URL-адреса объекта S3:

http://DOC-EXAMPLE-BUCKET.s3-website-us-east-1.amazonaws.com/index.html

Если веб-браузер или команда curl возвращает ошибку «Отказано в доступе», то объект не является общедоступным.

Разрешите публичный доступ на чтение к объекту одним из следующих способов:

  1. Создайте политику контейнера, которая разрешает публичный доступ на чтение для всех объектов в контейнере.
  2. Используйте консоль Amazon S3, чтобы разрешить публичный доступ на чтение объекта.
  3. Объекты в корзине не могут быть зашифрованы с помощью AWS KMS
  4. Распределения CloudFront не поддерживают объекты, зашифрованные AWS KMS. Вам необходимо удалить шифрование KMS из объектов S3, которые вы хотите обслуживать с помощью распределения.

Примечание: Вместо использования шифрования AWS KMS используйте AES-256 для шифрования ваших объектов.

Чтобы проверить, зашифрован ли объект в вашем контейнере с помощью KMS, используйте один из следующих способов:

Используйте консоль Amazon S3 для просмотра свойств объекта. Просмотрите диалоговое окно Шифрование. Если выбрано AWS-KMS, то объект зашифрован KMS. Запустите команду head-object с помощью интерфейса командной строки AWS (AWS CLI). Если команда возвращает ServerSideEncryption как aws:kms, то объект зашифрован KMS. Примечание. Если при выполнении команд AWS CLI возникают ошибки, убедитесь, что вы используете самую последнюю версию AWS CLI. Чтобы изменить параметры шифрования объекта с помощью консоли Amazon S3, см. раздел Как добавить шифрование к объекту S3?

Чтобы изменить настройки шифрования объекта с помощьюAWS CLI, сначала проверьте, что у контейнера объекта нет шифрования по умолчанию. Если у контейнера нет шифрования по умолчанию, выполните следующую команду, чтобы удалить шифрование объекта, скопировав объект поверх себя:

aws s3 cp s3://DOC-EXAMPLE-BUCKET/index.html s3://DOC-EXAMPLE-BUCKET/index.html

Предупреждение: Копирование объекта поверх самого себя удаляет настройки для storage-class и
website-redirect-location. Чтобы сохранить эти настройки в новом объекте, обязательно явно укажите значения storage-class или website-redirect-location в запросе на копирование.

Политика контейнера должна разрешать доступ к s3:GetObject. Чтобы использовать дистрибутив с конечной точкой веб-сайта S3, ваша политика контейнера не должна содержать оператора deny, который блокирует публичный доступ на чтение к действию s3:GetObject.

Даже если у вас есть явное выражение allow для s3:GetObject в вашей политике bucket, убедитесь, что нет конфликтующего явного выражения deny. Явное выражение deny всегда переопределяет явное выражение allow.

Чтобы просмотреть политику контейнера для s3:GetObject, выполните следующие действия:

  1. Откройте контейнер S3 из консоли Amazon S3.

  2. Выберите вкладку «Разрешения».

  3. Выберите политику Bucket.

  4. Проверьте политику контейнера на наличие операторов с «Action»: «s3:GetObject» или «Action»: «s3:*».

Следующий пример политики содержит явное разрешающее утверждение для публичного доступа к s3:GetObject. Однако есть также явное запрещающее утверждение для s3:GetObject, которое блокирует доступ, если запрос не исходит от определенного Amazon Virtual Private Cloud (Amazon VPC).

{
    "Version": "2008-10-17",
    "Id": "PolicyForCloudFrontPrivateContent",
    "Statement": [
        {
            "Sid": "Allow-OAI-Access-To-Bucket",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity EAF5XXXXXXXXX"
            },
            "Action": "s3:GetObject",
            "Resource": [
                "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
            ]
        },
        {
            "Sid": "Allow-Public-Access-To-Bucket",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": [
                "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
            ]
        },
        {
            "Sid": "Access-to-specific-VPCE-only",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": [
                "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
            ],
            "Condition": {
                "StringNotEquals": {
                    "aws:sourceVpce": "vpce-1a2b3c4d"
                }
            }
        }
    ]
  }
  1. Измените политику контейнера, чтобы удалить или отредактировать операторы, которые блокируют публичный доступ на чтение к s3:GetObject.

Примечание: CloudFront кэширует результаты ошибки Access Denied на время, указанное в минимальном TTL кэширования ошибок. Значение по умолчанию — одна минута. После удаления оператора deny из политики bucket, вы можете запустить недействительность в вашем дистрибутиве, чтобы удалить объект из кэша.

Если политика bucket предоставляет публичный доступ на чтение, то учетная запись AWS, которой принадлежит bucket, также должна владеть объектом. Чтобы политика bucket разрешала публичный доступ на чтение к объектам, учетная запись AWS, которой принадлежит bucket, также должна владеть объектами. Корзина или объект принадлежат учетной записи удостоверения AWS Identity and Access Management (IAM), которая создала корзину или объект.

Примечание: Требование владения объектом применяется к публичному доступу на чтение, предоставленному политикой контейнера. Оно не применяется к публичному доступу на чтение, предоставленному списком управления доступом (ACL) объекта.

Чтобы проверить, имеют ли контейнер и объекты одного и того же владельца, выполните следующие действия:

  1. Выполните эту команду AWS CLI, чтобы получить канонический идентификатор S3 владельца контейнера:
aws s3api list-buckets --query Owner.ID
  1. Выполните эту команду, чтобы получить канонический идентификатор S3 владельца объекта:

Примечание: в этом примере показан один объект, но вы можете использовать команду list для проверки нескольких объектов.

aws s3api list-objects --bucket DOC-EXAMPLE-BUCKET --prefix index.html
  1. Если канонические идентификаторы не совпадают, то у контейнера и объекта разные владельцы.

Примечание: Вы также можете использовать консоль Amazon S3 для проверки владельцев корзины и объектов. Владельцы находятся на вкладке «Разрешения» соответствующего корзины или объекта.

Чтобы изменить владельца объекта на владельца контейнера, выполните следующие действия:

  1. Из учетной записи владельца объекта выполните эту команду, чтобы получить разрешения ACL, назначенные объекту:
aws s3api get-object-acl --bucket DOC-EXAMPLE-BUCKET --key object-name
  1. Если у объекта есть разрешения ACL bucket-owner-full-control, перейдите к шагу № 3. Если у объекта нет разрешений ACL bucket-owner-full-control, выполните эту команду из учетной записи владельца объекта:
aws s3api put-object-acl --bucket DOC-EXAMPLE-BUCKET --key object-name --acl bucket-owner-full-control
  1. Из учетной записи владельца контейнера выполните эту команду, чтобы изменить владельца объекта, скопировав объект поверх себя:
aws s3 cp s3://DOC-EXAMPLE-BUCKET/index.html s3://DOC-EXAMPLE-BUCKET/index.html

Запрошенные объекты должны существовать в корзине.Если у пользователя нет разрешений s3:ListBucket, то он получает ошибки Access Denied для отсутствующих объектов вместо ошибок 404 Not Found. Запустите команду head-object AWS CLI, чтобы проверить, существует ли объект в корзине.

Примечание: Убедитесь, что запрос объекта, отправленный в CloudFront, точно соответствует имени объекта S3. Имена объектов S3 чувствительны к регистру. Если запрос не имеет правильного имени объекта, то Amazon S3 отвечает так, как будто объект отсутствует. Чтобы определить, какой объект CloudFront запрашивает из Amazon S3, используйте ведение журнала доступа к серверу.

Если объект существует в контейнере, то ошибка «Отказано в доступе» не возникает. маскировка ошибки 404 Not Found. Проверьте другие требования к конфигурации, чтобы устранить ошибку «Отказано в доступе».

Если объект отсутствует в контейнере, то возникает ошибка «Отказано в доступе». маскировка ошибки 404 Not Found. Решите проблему, связанную с пропавшим предметом.

Примечание: Включение публичного доступа s3:ListBucket не является лучшей практикой безопасности. Включение публичного доступа s3:ListBucket позволяет пользователям видеть и перечислять все объекты в контейнере. Это открывает пользователям метаданные объекта (например, ключ и размер), даже если у них нет разрешений на загрузку объекта.

Для контейнера необходимо отключить публичный доступ к Amazon S3 Block.Убедитесь, что к корзине не применены настройки Amazon S3 Block Public Access. Эти настройки могут переопределять разрешения, разрешающие публичный доступ для чтения. Настройки Amazon S3 Block Public Access могут применяться к отдельным корзинам или аккаунтам AWS.

Если Requester Pays включен, то запрос должен включать параметр request-payer. Если Requester Pays включен для бакета, то анонимный доступ к бакету не разрешен. Пользователи из других аккаунтов должны указывать параметр request-payer при отправке запросов в бакет. В противном случае эти пользователи получат ошибку Access Denied.

Если вы используете заголовок Referer для ограничения доступа из CloudFront к вашему источнику S3, проверьте пользовательский заголовок. Если вы используете заголовок Referer для ограничения доступа из CloudFront к вашему источнику конечной точки веб-сайта S3, проверьте секретное значение или токен, установленный в политике контейнера S3. Затем подтвердите, что секретное значение или токен соответствуют значению в пользовательском заголовке источника CloudFront.

Если вы используете явное выражение deny в политике bucket, то подтвердите, что есть также выражение allow, которое предоставляет доступ на основе заголовка Referer. Вы не можете предоставить доступ только с явным выражением deny.

Например, следующая политика контейнера предоставляет доступ к источнику S3, когда запрос содержит строку "aws:Referer":"MY_SECRET_TOKEN_CONFIGURED_ON_CLOUDFRONT_ORIGIN_CUSTOM_HEADER":

{
  "Version":"2012-10-17",
  "Id":"http referer policy example",
  "Statement":[
    {
      "Sid":"Allow get requests originating from my CloudFront with referer header",
      "Effect":"Allow",
      "Principal":"*",
      "Action":"s3:GetObject",
      "Resource":"arn:aws:s3:::DOC-EXAMPLE-BUCKET/*",
      "Condition":{
        "StringLike":{"aws:Referer":"MY_SECRET_TOKEN_CONFIGURED_ON_CLOUDFRONT_ORIGIN_CUSTOM_HEADER"}
      }
    }
  ]
}

В этом примере политики контейнера пользовательский заголовок источника CloudFront должен быть следующим:

  • Заголовок: Реферер
  • Ценить:MY_SECRET_TOKEN_CONFIGURED_ON_CLOUDFRONT_ORIGIN_CUSTOM_HEADER

Примечание: Пример политики контейнера предоставляет публичный (анонимный) доступ к контейнеру, поскольку Principal является подстановочным значением ("Principal":"*"). Однако из-за оператора условия доступ к источнику S3 предоставляется только в том случае, если запрос включает заголовок Referer и значение заголовка соответствует значению в политике контейнера.

Связанный контент