Сильное шифрование сервера для ведра S3

Я хочу установить политику байтов S3, чтобы все запросы на загрузку в это ведро использовали шифрование на стороне сервера, даже если оно не указано в заголовке запроса.

Я видел этот пост (Проблемы с сервером на стороне сервера Amazon S3), где кому-то удалось установить политику ведра, которая отрицает все запросы на отправку, которые не укажите шифрование на стороне сервера, но я не хочу отрицать, я хочу, чтобы puts был успешным, но использовал шифрование на стороне сервера.

Моя проблема заключается в потоковой передаче вывода из EMR в мой ведро S3, я не контролирую код, который выполняет запросы, и мне кажется, что шифрование на стороне сервера должно быть указано для каждого запроса.

Ответ 1

Amazon только что выпустила новые функции для обеспечения этого, упростив

Вывод из docs при настройке.

Обратите внимание, что любые политики выходящего вектора будут оцениваться до любых настроек шифрования в bucket

Amazon S3 оценивает и применяет политики вектора перед применением ведра настройки шифрования. Даже если вы включите параметры шифрования ведра, ваши запросы PUT без информации шифрования будут отклонены, если у вас есть политики ведра, чтобы отклонить такие запросы PUT. Проверьте свои ведро и изменить его, если требуется

Ответ 2

IMHO Невозможно автоматически сообщить Amazon S3 о включении SSE для каждого запроса PUT. Итак, я бы исследовал следующее:

  • напишите script, которые перечисляют ваше ведро

  • для каждого объекта, получить метаданные

  • Если SSE не включен, используйте API PUT COPY (http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectCOPY.html), чтобы добавить SSE "(...) При копировании объекта вы можете сохранить большинство метаданных (по умолчанию) или указать новые метаданные (...)"

  • Если операция PUT выполнена успешно, используйте API-интерфейс DELETE для удаления исходного объекта

Затем запустите это script почасово или ежедневно, в зависимости от ваших бизнес-требований. Вы можете использовать S3 API в Python (http://boto.readthedocs.org/en/latest/ref/s3.html), чтобы упростить запись script.

Если это решение "изменить-после-записи" недействительно для вас, вы можете работать на разных уровнях (согласовано с ответом Хулио выше)

  • используйте прокси-сервер между вашим клиентом API и S3 API (например, обратный прокси-сервер на вашем сайте) и настройте его для добавления HTTP-заголовка SSE для каждого запроса PUT/POST. Разработчик должен пройти через прокси и не иметь права выдавать запросы на конечные точки API S3

  • напишите библиотеку обертки, чтобы автоматически добавить метаданные SSE и обязать разработчика использовать вашу библиотеку поверх SDK.

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

Себ

Ответ 3

S3 не будет выполнять это автоматически, вам придется создать обходной путь. Я бы предложил передавать запросы через прокси-сервер, который бы "обогатил" их добавлением правильного заголовка. Для этого я попробую (по порядку):

1- обогащение содержимого Apache Camel

2- NGXINX/HTTPD mod_proxy

3- Пользовательский код

Я уверен, что для этого тоже очень умный ruby ​​http lib:)

Ответ 4

Я использую этот быстрый bash script для шифрования всего ведра.

#!/bin/bash

bucket=$1

echo "Encrypting Bucket: ${bucket}"
echo "---------------------------------"

# Bail if no Bucket Name Specified:
if [[ -z $1 ]]
then
  echo "Usage: ./encrypt_bucket.sh <bucket_name>"
  exit 1
fi

# Just so control-c will work and not keep trying to loop through:
trap "echo Stopping Encryption!; exit 1" SIGINT SIGTERM

function get_file_list() {
  file_list=$(aws s3 ls --summarize --recursive s3://${bucket} | awk '{print $NF}' | grep -v Total)
  num_files=$(aws s3 ls --summarize --recursive s3://${bucket} | grep "Total Objects:" |awk '{print $3}')
}

function s3cp() {
  aws s3 cp --sse s3://${bucket}/$1 s3://${bucket}/$1
}


get_file_list

num=0


for i in ${file_list}
 do
   num=$(( $num + 1 ))
   echo "Encrypting File: ${num} of ${num_files}"
   echo "_________________"
   s3cp ${i}
   echo ""
 done

Ответ 5

Вы можете использовать AWS Lambda, который устанавливает шифрование AES256 на стороне сервера для каждого объекта, затронутого операцией PUT. Проверьте https://github.com/eleven41/aws-lambda-encrypt-s3-objects. Я не пробовал, но выглядел точно так, как вы хотите.