Amazon s3: настройки «Блокировать публичный доступ», чтобы разрешить публичное чтение приватной записи с подписанным URL - PullRequest
2 голосов
/ 08 июля 2019

enter image description here Я хочу загружать изображения через подписанные URL-адреса.Изображения должны иметь только публичный доступ для чтения.Я запутался в том, какие настройки мне нужно включить или отключить.

Если я отключу все настройки «Блокировать публичный доступ», он будет работать как положено.Меня беспокоит то, что AWS рекомендует включить эти разрешения.На рисунке показаны настройки, о которых я упоминал.

  const s3 = new aws.S3();
  const s3Params = {
    Bucket: process.env.S3_BUCKET,
    Key: fileName,
    Expires: 60,
    ContentType: fileType,
    ACL: 'private'
  };

Когда я установил «ACL» на «private», я могу загрузить изображение на стороне клиента с подписанным URL, но если я использую «public-»читать ", я получаю доступ запрещен.Я также попытался добавить

{
  "Version":"2012-10-17",
  "Statement":[
    {
      "Sid":"AddPerm",
      "Effect":"Allow",
      "Principal": "*",
      "Action":["s3:GetObject"],
      "Resource":["arn:aws:s3:::myapp/*"]
    }
  ]
}

в настройку «Bucket Policy», чтобы получить публичный доступ для чтения, но я снова получаю доступ отказано из-за настроек публичного доступа.

Что будет наиболеебезопасный способ иметь публичное чтение, частный доступ на запись?Я использую S3 непреднамеренным способом?Предполагается ли использовать сервис CloudFront для публичного предоставления этих изображений?

1 Ответ

2 голосов
/ 08 июля 2019

S3 block public access - это просто еще один уровень защиты, основной целью которого является предотвращение случайного предоставления вам общего доступа к ведру / объектам.

Сообщения access-denied, которые вы испытываете, связаны с упомянутой функцией S3 block public access, которая не позволяет вам устанавливать публичный доступ к вашему ведру / объектам (именно то, что вы пытаетесь сделать).

Если ваш вариант использования требует публичного доступа к объектам S3, и вы знаете, что делаете, то вы можете / должны отключить эту функцию (или, по крайней мере, некоторые из подопций в зависимости от того, как вы собираетесь предоставлять доступ). ). Примером может служить общедоступный веб-сайт, размещенный на S3, который явно требует, чтобы вы разрешали публичное чтение.

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

Если предполагается, что каждый объект должен быть общедоступным для чтения, то самый простой способ сделать это - использовать политику корзины - ту, которую вы включили в свой пост.

{
  "Version":"2012-10-17",
  "Statement":[
    {
      "Sid":"AddPerm",
      "Effect":"Allow",
      "Principal": "*",
      "Action":["s3:GetObject"],
      "Resource":["arn:aws:s3:::myapp/*"]
    }
  ]
}

Если только некоторые объекты должны быть общедоступными, у вас есть несколько вариантов.

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

Второй вариант - создать отдельные папки в одной корзине, где одна папка может содержать конфиденциальные данные, а другая папка может содержать публичные данные. Затем вы можете снова использовать политику корзины и добавить доступ на чтение только к определенной папке.

"Resource":["arn:aws:s3:::myapp/public/*"]

Третий вариант - использовать объектные ACL вместо Bucket Policies. Вы должны использовать эту опцию, когда нет четкого различия между загружаемыми объектами, и вы хотите, чтобы тот, кто загружает объект, решал, должен ли объект быть публичным или нет. Если вам не нужно выбирать между общедоступным и частным режимом для каждого случая объекта, вам следует избегать этого варианта, так как им сложнее всего управлять, а самым простым - не отслеживать, что происходит с вашими объектами.

Только одна последняя заметка. Если вы используете Bucket Policies для предоставления публичного доступа на чтение ваших объектов, вам не нужно указывать ACL в s3params.

И ответить на ваши вопросы:

Am I using S3 is an unintended way?

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

Am I suppose to use the CloudFront service to serve these images publicly?

CloudFront предоставляет вам некоторые полезные функции, такие как дополнительная защита и кэширование на краях сети AWS, но использовать его определенно не обязательно, и, поскольку это не бесплатный сервис, я бы посоветовал ознакомиться с ним, прежде чем выбрать используйте его, чтобы не тратить свои ресурсы (деньги) бессмысленно.

...