Сильное шифрование сервера для ведра 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. Я не пробовал, но выглядел точно так, как вы хотите.