Как Cloudfront может распространять ключ AWS KMS для получения зашифрованного изображения S3 в покое?

Я хотел бы использовать AWS Server Side Encryption (SSE) со службой управления ключами AWS (KMS) для шифрования данных в состоянии покоя в S3. (См. Этот пост в блоге AWS с подробным описанием SSE-KMS.)

Однако у меня также есть требование использовать предопределенные URL-адреса Cloudfront.

Как настроить дистрибутив Cloudfront для использования ключа в AWS KMS для дешифрования и использования объектов S3, зашифрованных в покое?

( Эта проблема с Boto3, похоже, от кого-то, кто ищет те же ответы, что и я, но безрезультатно).

3 ответа

Раньше это было невозможно, потому что CloudFront не поддерживал его и потому что (как я уже упоминал в комментариях к ответу Джона - который был на правильном пути) не было возможности развернуть собственное решение с Lambda@Edge, потому чтоX-Amz-Cf-Id заголовок запроса - сгенерированный на задней стороне CloudFront и видимый только для S3, а не для вызова триггера - сделает недействительной любую подпись, которую вы пытались добавить к запросу внутри триггера Lambda@Edge, потому что подписание всех X-Amz-* заголовки обязательны.

Но X-Amz-Cf-Id значение заголовка теперь предоставляется триггерной функции Lambda@Edge в структуре события - не с другими заголовками запроса, а как простой строковый атрибут - в event.Records[0].cf.config.requestId.

Имея это значение под рукой, вы можете использовать учетные данные роли выполнения и встроенный SDK в среде Lambda@Edge для генерации подписи и добавления необходимых заголовков (включая Authorization заголовок с производным идентификатором учетных данных и недавно созданной подписью) к запросу.

В этой настройке не используется идентификатор доступа к источнику (OAI), поскольку роль выполнения IAM триггера Lambda@Edge используется вместо OAI, чтобы убедить S3 в том, что запрос авторизован.

Ахраф Сук опубликовал официальный пост в блоге AWS, в котором от начала до конца объясняется решение.

https://aws.amazon.com/blogs/networking-and-content-delivery/serving-sse-kms-encrypted-content-from-s3-using-cloudfront/

Используйте S3 Предопределенные URL. В этой статье AWS обсуждается, как генерировать URL-адреса с использованием Java, но это легко перенести на другой язык.

Шифрование на стороне сервера с сервисом управления ключами AWS (SSE-KMS)

У нас работает следующая установка:

В своем приложении создайте подписанный URL-адрес, который Cloudfront сможет проверить (https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-signed-urls.html).

Вместо использования OAI вы создаете функцию запроса источника [с защитой электронной почты] в соответствии с:[email protected][с защитой электронной почты] ограничено 1 МБ, это относится только к содержимому, сгенерированному (или измененному, если вы включаете тело) лямбда-функцией.[электронная почта защищена]https://aws.amazon.com/blogs/networking-and-content-delivery/serving-sse-kms-encrypted-content-from- s3-использование облачного фронта/

Обратите внимание, что если ваше ведро содержит '.' (наши сделали), в коде JS есть ошибка, которую можно смягчить с помощью чего-то вроде:

      // Infer the region from the host header
// const region = options.host.split('.')[2];

const hostArr = options.host.split('.');
const region = hostArr [hostArr.length - 3];

Наконец, мы добавили исходный ответ , чтобы смыть заголовки, которые мы не хотим раскрывать. Esp X-Amz-Server-Side-Encryption-Aws-Kms-Key-Id, который включает идентификатор учетной записи AWS.

Наконец, я хотел бы прокомментировать приведенное выше заявление/комментарий о том, что тело ответа При использовании функции выше ответ от источника S3 не имеет такого ограничения, мы обслуживаем объекты >> 1 МБ (обычно 100+ МБ).

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