SSE-KMS — метод шифрования данных с использованием криптографического ключа, управляемого сервисом Key Management.
SSE-KMS в Object Storage реализован согласно методу Envelope Encryption: для каждого объекта используются уникальные KMS-ключи шифрования (DEK), а в базе данных сохраняется зашифрованная версия этих ключей.
При шифровании данных (PutObject, CreateMultipartUpload, CopyObject) Object Storage обращается в Key Management с запросом на генерацию ключа — GenerateDataKey. В ответ Object Storage получает две версии ключа:
Зашифрованную — сохраняется в базе данных Object Storage для последующего доступа.
В открытом виде — используется для шифрования и дешифрования данных. После выполнения операции удаляется из памяти Object Storage.
В целях безопасности ключ недоступен в открытом виде даже пользователю-владельцу, а в оперативной памяти Object Storage он существует только на время выполнения конкретного запроса.
При дешифровании данных (GetObject, HeadObject, UploadPart, UploadPartCopy, CopyObject) Object Storage обращается в Key Management с запросом Decrypt и сохраненной для этого объекта зашифрованной версией ключа. В ответ Object Storage получает ключ в открытом виде, который использует для дешифрования данных.
Ключ для дешифрования ключа (KEK) хранится только в Key Management и не доступен извне.
Если пользователь не является владельцем KMS-ключа или не имеет нужных прав на него, то даже при наличии разрешения на доступ к самому объекту в Object Storage открыть зашифрованные данные не получится.
Для управления ключами пользователю должна быть назначена одна из сервисных ролей: sckm.admin или sckm.user.
Если ключ был удален из Key Management, все данные, зашифрованные с его помощью, станут недоступны.
Чтобы зашифровать данные в Object Storage с использованием KMS-ключей:
Для шифрования SSE-KMS Object Storage поддерживает только симметричные KMS-ключи.
В Key Management сгенерируйте симметричный KMS-ключ и получите его идентификатор.
При загрузке объекта в бакет укажите идентификатор и способ шифрования 'aws:kms'.
Object Storage автоматически зашифрует данные с помощью ключа в открытом виде соответствующим алгоритмом: AES-128, AES-192 или AES-256.
Объект будет храниться в Object Storage в зашифрованном виде.
Ключи поддерживаются следующими операциями:
Для использования SSE-KMS укажите в запросе следующие заголовки:
x-amz-server-side-encryption-aws-kms-key-id: {kmsKeyID} — идентификатор ключа KMS, который нужно использовать для шифрования загружаемых данных.
x-amz-server-side-encryption: aws:kms — запрос SSE-KMS в REST API для добавления объектов в Object Storage.
x-amz-server-side-encryption-context — необязательный заголовок в формате закодированной в base64 JSON-строки. Содержит пары ключ:значение и позволяет добавить генерируемому KMS Data-ключу дополнительную информацию для увеличения степени его уникальности.
Загрузка объекта с шифрованием:
aws s3api put-object --bucket amzn-s3-demo-bucket --key example-object-key --server-side-encryption aws:kms --ssekms-key-id example-key-id --body filepath
Копирование незашифрованного объекта с включением шифрования копии:
aws s3api copy-object --bucket amzn-s3-destination-bucket --key example-destination-object-key --copy-source amzn-s3-source-bucket/source-example-object-key --server-side-encryption aws:kms --ssekms-key-id example-key-id