SSE-C (Server-Side Encryption with Customer-Provided Keys) — это метод шифрования данных в хранилище S3, при котором ключи шифрования предоставляются клиентом. В отличие от стандартного серверного шифрования, где ключами управляет провайдер, здесь контроль полностью остается на стороне пользователя.
Принцип работы SSE-C
SSE-C работает следующим образом:
- при загрузке объекта в бакет пользователь передает собственный ключ шифрования через специальный набор HTTP-заголовков в запросе к хранилищу;
- S3 использует этот ключ, чтобы зашифровать данные;
- ключ не сохраняется на стороне хранилища S3 — он используется только во время обработки запроса. Вместо самого ключа сервис хранит его SHA-256 HMAC, который создается при загрузке. Это значение используется для проверки ключа при последующих обращениях;
- для чтения объекта пользователь должен предоставить тот же самый ключ. Если ключ не совпадает с исходным, S3 не сможет расшифровать данные и вернет ошибку.
Обратите внимание
Ключ должен быть предоставлен для каждой операции чтения или записи с объектом. Потеря ключа означает потерю доступа к данным. Вы не сможете получить доступ к объекту без корректного ключа.
Поддерживаемые операции
PutObject— загрузка нового объекта с шифрованием SSE-C;GetObject— скачивание зашифрованного объекта в случае предоставления корректного ключа;HeadObject— получение метаданных объекта в случае предоставления корректного ключа;CopyObject— копирование объекта в пределах бакета или между бакетами. Параметры шифрования необходимо указывать как для исходного объекта, так и для целевого;CreateMultipartUpload— инициализация загрузки части объекта;UploadPart— загрузка части объекта;UploadPartCopy— копирование части объекта в рамках multipart-загрузки.
Обратите внимание
Для UploadPart и UploadPartCopy должны использоваться те же параметры шифрования, что и для CreateMultipartUpload. Если CreateMultipartUpload выполнен с SSE-C, все части должны использовать те же параметры шифрования. Если CreateMultipartUpload выполнен без SSE-C, все части передаются без шифрования.
Заголовки для SSE-C
Для работы SSE-C в HTTP-запросах используются следующие заголовки:
x-amz-server-side-encryption-customer-algorithm— алгоритм шифрования. Поддерживается только AES256;x-amz-server-side-encryption-customer-key— ключ шифрования в формате Base64;x-amz-server-side-encryption-customer-key-MD5— MD5-хеш ключа в формате Base64.
Как сгенерировать ключ шифрования и MD5-хеш
-
1
Сгенерируйте ключ длиной 32 байта и сохраните его в файле ssec.key с помощью команды:
openssl rand -out ssec.key 32 -
2
Закодируйте ваш ключ в формате base64 и экспортируйте его как переменную:
key=$(cat ssec.key | base64) -
3
Сгенерируйте 128-битный MD5-хеш ключа шифрования в кодировке base64 и экспортировать его как переменную среды:
key_md5=$(openssl dgst -md5 -binary ssec.key | base64)
Обратите внимание
Если вы потеряете ключ шифрования, доступ к зашифрованным с его помощью данным также будет потерян. Вы не сможете выполнять GET-операции с зашифрованными объектами без соответствующего ключа.
Примеры запросов в AWS CLI
- Загрузка объекта с шифрованием:
aws s3api put-object \
--bucket <your-bucket-name> \
--key <your-object-key> \
--body <path/to/your/file> \
--sse-customer-algorithm AES256 \
--sse-customer-key $key \
--sse-customer-key-md5 $key_md5
- Скачивание зашифрованного объекта:
aws s3api get-object \
--bucket <your-bucket-name> \
--key <your-object-key> \
<local-destination-file> \
--sse-customer-algorithm AES256 \
--sse-customer-key $key \
--sse-customer-key-md5 $key_md5
- Получение метаданных объекта:
aws s3api head-object \
--bucket <your-bucket-name> \
--key <your-object-key> \
--sse-customer-algorithm AES256 \
--sse-customer-key $key \
--sse-customer-key-md5 $key_md5
- Копирование объекта с шифрованием SSE-C:
aws s3api copy-object \
--bucket <your-bucket-name> \
--copy-source <your-bucket-name>/<your-source-object-key> \
--key <your-destination-object-key> \
--sse-customer-algorithm AES256 \
--sse-customer-key $key \
--sse-customer-key-md5 $key_md5 \
--copy-source-sse-customer-algorithm AES256 \
--copy-source-sse-customer-key $key \
--copy-source-sse-customer-key-md5 $key_md5
- Инициализация загрузки в рамках multipart-загрузки:
aws s3api create-multipart-upload \
--bucket <your-bucket-name> \
--key <your-object-key> \
--sse-customer-algorithm AES256 \
--sse-customer-key $key \
--sse-customer-key-md5 $key_md5
Этот запрос вернет UploadId, который используется при загрузке частей файла.
- Загрузка части объекта в рамках multipart-загрузки:
aws s3api upload-part \
--bucket <your-bucket-name> \
--key <your-object-key> \
--part-number 1 \
--body <path/to/part1> \
--upload-id <your-upload-id> \
--sse-customer-algorithm AES256 \
--sse-customer-key $key \
--sse-customer-key-md5 $key_md5
- Копирование части объекта в рамках multipart-загрузки:
aws s3api upload-part-copy \
--bucket <your-bucket-name> \
--key <your-object-key> \
--part-number 1 \
--upload-id <your-upload-id> \
--copy-source <source-bucket>/<source-object-key> \
--copy-source-sse-customer-algorithm AES256 \
--copy-source-sse-customer-key $key \
--copy-source-sse-customer-key-md5 $key_md5 \
--sse-customer-algorithm AES256 \
--sse-customer-key $key \
--sse-customer-key-md5 $key_md5