Amazon S3 ACL для доступа только для чтения и однократной записи

Я занимаюсь разработкой веб-приложения, и в настоящее время у меня есть следующий ACL, назначенный учетной записи AWS, которую он использует для доступа к своим данным:

{
  "Statement": [
    {
      "Sid": "xxxxxxxxx", // don't know if this is supposed to be confidential
      "Action": [
        "s3:*"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::cdn.crayze.com/*"
      ]
    }
  ]
}

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

Из документации видно, что я хочу разрешить только следующие действия: s3:GetObject а также s3:PutObject, но я специально хочу, чтобы учетная запись могла только создавать объекты, которые еще не существуют - т.е. запрос PUT для существующего объекта должен быть отклонен. Это возможно?

3 ответа

Решение

Это невозможно в Amazon S3, как вы, вероятно, предполагали; однако вы можете обойти это ограничение, используя Versioning, который позволяет хранить несколько вариантов объекта в одной корзине и был разработан с учетом следующих вариантов использования:

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

Также есть пара часто задаваемых вопросов, например:

  • Что такое версия? - Управление версиями позволяет сохранять, извлекать и восстанавливать каждую версию каждого объекта, хранящегося в корзине Amazon S3. Как только вы включите управление версиями для корзины, Amazon S3 сохраняет существующие объекты каждый раз, когда вы выполняете над ними операции PUT, POST, COPY или DELETE. По умолчанию запросы GET извлекают самую последнюю написанную версию. Более старые версии перезаписанного или удаленного объекта можно получить, указав версию в запросе.

  • Почему я должен использовать Versioning? - Amazon S3 предоставляет клиентам высоконадежную инфраструктуру хранения. Управление версиями обеспечивает дополнительный уровень защиты, предоставляя средства восстановления, когда клиенты случайно перезаписывают или удаляют объекты. Это позволяет легко восстанавливаться после непреднамеренных действий пользователя и сбоев приложений. Вы также можете использовать управление версиями для хранения и архивирования данных. [акцент мой]

  • Как управление версиями защищает меня от случайного удаления моих объектов? - Когда пользователь выполняет операцию DELETE над объектом, последующие запросы по умолчанию больше не будут извлекать объект. Однако все версии этого объекта будут по-прежнему сохраняться в вашем хранилище Amazon S3 и могут быть восстановлены или восстановлены. Только владелец корзины Amazon S3 может навсегда удалить версию. [акцент мой]

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

Возможность удаления версий MFA, которая использует многофакторную аутентификацию, может использоваться для обеспечения дополнительного уровня безопасности. [...] Если вы включите Управление версиями с помощью MFA Delete в корзине Amazon S3, для окончательного удаления версии объекта требуются две формы аутентификации: учетные данные вашей учетной записи AWS, действительный шестизначный код и серийный номер из аутентификации. устройство в вашем физическом владении. [...]

Теперь вы можете сделать это с помощью S3 Object Lock. Это настройка для каждого сегмента, и она позволяет вам установить один из двух видов блокировок WORM.

  • "срок хранения" - не может быть изменен
  • "юридическое удержание" - может быть изменено владельцем ведра в любое время

https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lock.html

Если это случайная перезапись, которую вы пытаетесь избежать, и ваши бизнес-требования допускают кратковременное несоответствие, вы можете выполнить откат в функции Lambda:

  1. Сделайте это политикой, что "нет новых объектов с таким же именем". Большую часть времени это не произойдет. Для обеспечения этого:
  2. Прослушайте S3: события PutObject в лямбда-функции AWS.
  3. Когда событие запускается, проверьте, присутствует ли более одной версии.
  4. Если имеется более одной версии, удалите все, кроме самой новой.
  5. Уведомить загрузчика о том, что произошло (полезно иметь оригинальный загрузчик в x-amz-meta-* объекта. Больше информации здесь).

Изменить: применимо, если вы пришли сюда из этого вопроса.

Блокировки объектов работают только в сегментах с версиями. Если вы не можете включить управление версиями для своей корзины, но допускаете кратковременные несоответствия, при которых предполагается, что файлы существуют, в то время как УДАЛЕНИЕ их все еще находится в работе (S3 является согласованным только в конечном итоге), возможно, это может привести к периодической ошибке PUT-after-DELETE, если используется в замкнутом цикле или, наоборот, последовательные PUT, которые периодически ложно успешны, то следующее решение может быть подходящим.

Учитывая путь к объекту, прочтите заголовок Content-Length объекта (из метаданных, запрос HeadObject). Записывайте объект только в том случае, если запрос выполнен успешно и, если применимо, если длина больше нуля.

Да, невозможно создать такую ​​политику, в которой вы даете разрешение на размещение только для новых объектов (не существует на s3).

Я разработчик Bucket Explorer. Вы можете попробовать Bucket Explorer, который делает версию двумя способами. 1. Управление версиями Amazon S3, если оно включено в Bucket. 2. Это собственное управление версиями Bcuket Explorer, когда в Bucket отключено управление версиями Amazon S3.

Вы также можете попробовать Bucket Explorer Team Edition, если хотите предоставить конкретный доступ своему другу или клиенту.

Другие вопросы по тегам