Ключи шифрования. Сервис KMS
Кратко:
- Шифрование данных помогает сохранить их конфиденциальность и целостность.
- Современные криптографические алгоритмы обеспечивают надежную защиту информации.
- Длина ключа влияет на силу защиты, чем длиннее ключ, тем лучше защита.
- Симметричные и асимметричные алгоритмы используются для шифрования данных.
- Хранение ключей является уязвимым местом систем защиты, основанных на шифровании.
- Схема envelope encryption используется для защиты ключей шифрования.
- Сервис KMS может быть использован для управления ключами шифрования и шифрования данных.
- KMS может быть использован в различных сценариях, включая шифрование данных с помощью утилиты yc и в пользовательских приложениях.
Ключи шифрования. Сервис KMS
Чтобы сохранить чувствительную информацию закрытой от тех, для кого она не предназначена, нужно прежде всего грамотно настроить к ней доступ. Следующим эшелоном защиты является шифрование хранящихся и передаваемых данных. Это поможет сохранить их конфиденциальность и целостность, даже если в вашу систему кто-то несанкционированно проник.
Современные криптографические алгоритмы позволяют надёжно защитить информацию. Чтобы расшифровать похищенные данные, злоумышленнику потребуются мощные суперкомпьютеры и годы работы. Для шифрования в этих алгоритмах используется ключ — последовательность сгенерированных случайным образом символов. Чем длиннее ключ, тем сильнее защита.
Существуют симметричные и асимметричные алгоритмы шифрования. В симметричных данные шифруются и расшифровываются одним и тем же ключом. Асимметричные методы построены на использовании двух ключей: открытого и закрытого (секретного). Открытый ключ нужен для шифрования, а закрытый — для расшифрования. Данные устойчивы к атакам методом перебора, если они зашифрованы с использованием ключа длиной не менее 128 бит для симметричных алгоритмов и не менее 1024 бит для асимметричных. Сами алгоритмы при этом, естественно, должны быть современными и актуальными.
На надёжность защиты влияет не только длина ключа. Важно и то, где и как хранятся ключи. Это считается одним из наиболее уязвимых мест систем защиты, основанных на шифровании. Ведь если скомпрометирован ключ, то скомпрометированными оказываются и зашифрованные им данные. Злоумышленник сможет не только прочитать их, но и незаметно изменить нужным ему образом. Это приводит к необходимости решения практической задачи: как хранить ключи безопасно?
Предположим, что у нас есть единое хранилище данных, к которому обращаются несколько сервисов. Для защиты данных мы используем симметричную криптографию (она намного быстрее и требует меньше вычислительных ресурсов). Это значит, что у каждого сервиса должен быть доступ к ключу шифрования.
Хранить ключ в открытом виде на всех серверах, где запущены сервисы, рискованно. Если злоумышленник получит доступ хотя бы к одному из них, он сможет отыскать ключ в настройках, что скомпрометирует всю систему. Более надёжный вариант — зашифровать ключ шифрования данных DEK (Data Encryption Key) c помощью ещё одного ключа KEK (Key Encryption Key). Теперь даже если злоумышленник и найдёт на взломанном сервере зашифрованный ключ DEK, то расшифровать данные в хранилище он сможет далеко не сразу. Подобная схема защиты называется envelope encryption.
Чтобы использовать такую схему, нам придётся решить две проблемы: где хранить ключ KEK, чтобы минимизировать вероятность его компрометации, и как безопасно пользоваться открытой версией ключа DEK.
Одно из возможных решений — вынести криптографический модуль на отдельную защищённую машину, которая будет отвечать за шифрование и расшифрование всего трафика. Но это далеко не всегда оптимально. Причина в том, что так мы обеспечиваем конфиденциальность и целостность данных за счёт их доступности. Система с этим модулем не является отказоустойчивой — если сервер, на котором развёрнут криптографический модуль, выйдет из строя, то и система перестанет работать. Более того, такая система может масштабироваться только вертикально, то есть путем увеличения мощностей единственного сервера. Следовательно, мы получим проблемы с производительностью, если понадобится шифровать большие потоки данных.
Второй вариант — использовать специальный сервис KMS, который:
- надёжно хранит ключ KEK и никуда его не передаёт;
- после получения запроса раскодирует зашифрованный ключ DEK и отправляет его пользователю.
В общем виде схему работы этого сервиса можно изобразить следующим образом.

Зашифрованный ключ DEK хранится на диске рядом с зашифрованными данными (шифртекстом). Открытый ключ DEK не сохраняется на жёсткий диск на сервере пользователя, а находится в оперативной памяти. Для его надёжной защиты можно применять дополнительные ухищрения, например замаскировать с другим случайным блоком памяти. Всё это усложняет получение ключа DEK для злоумышленника и значительно затрудняет атаку на ключ KEK.
Важно! Открытый ключ DEK должен использоваться только во время выполнения операций шифрования и расшифрования данных, а после завершения этих операций его нужно сразу уничтожить.
На этом принципе работы построен сервис управления ключами Yandex KMS (Key Management Service). Давайте рассмотрим, для чего он предназначен, подробнее.
Прежде всего KMS нужен для того, чтобы генерировать ключи шифрования. Сделать это можно через консоль управления, с помощью CLI, а также REST или gRPC API. Сервис поддерживает симметричное шифрование с алгоритмами AES-128, AES-192 и AES-256 (число в названии алгоритма обозначает длину ключа в битах).
У созданного в сервисе ключа есть следующие параметры:
- идентификатор — уникален в рамках всего Yandex Cloud и используется для работы с ключами с помощью SDK, API и CLI;
- название — может быть не уникально и используется для работы с ключами с помощью CLI (только если в каталоге есть лишь один ключ с таким названием);
- используемый алгоритм шифрования;
- период ротации — промежуток времени между автоматической сменой ключа;
- статус — состояние ключа (
Creating
,Active
илиInactive
).
Чтобы сделать защиту более надёжной, срок действия ключа ограничивают. После истечения этого срока сервис автоматически создаст новую версию ключа, то есть новый ключ с такими же параметрами (отличаться будут лишь ID версий). Этот процесс называется ротацией ключа. Ротировать ключи можно и вручную.

Версия ключа, созданная при ротации, становится основной (
Primary
) и по умолчанию используется для операций шифрования. Шифровать данные можно и с помощью любой другой активной версии, указав её ID
в запросе. Старые версии ключа используются для расшифровки данных, которые были зашифрованы с их помощью.Для всех версий ключа, кроме основной, можно настроить время удаления. Когда версия ключа удалена, расшифровать данные, зашифрованные с её помощью, невозможно. Поэтому сервис удаляет версию ключа не сразу, а через определённое время (по умолчанию это два дня). Когда ключ находится в статусе
Scheduled for Destruction
(запланирован к удалению), воспользоваться им для расшифровки данных уже нельзя. Процесс удаления можно отменить. Кроме того, чтобы избежать потери данных, ключ можно защитить от удаления, выбрав параметр Защита от удаления.С помощью KMS можно шифровать и расшифровывать данные. Если эти операции выполняются на стороне сервиса, то объём данных не может превышать 32 килобайта. Это обусловлено необходимостью ограничить нагрузку на сервис, чтобы обеспечить его высокую производительность. В качестве шифруемых данных могут выступать, например, секреты или сессионные ключи шифрования, что может быть использовано в пользовательских приложениях. Шифрование и расшифрование выполняются с помощью методов encrypt и decrypt REST API.
Если нужно шифровать большие объёмы данных, то сервис можно использовать по схеме envelope encryption. Ограничений на объём шифруемых данных в этом случае нет, поскольку операции шифрования и расшифрования выполняются в основном на стороне пользователя.
Шифрование происходит следующим образом.
- Пользователь самостоятельно генерирует ключ DEK и шифрует им данные на своей машине.
- Пользователь направляет в KMS запрос
encrypt
на шифрование DEK. - Ключ KMS, которым выполняется шифрование DEK, выступает в роли ключа KEK.
- Сервис возвращает зашифрованный DEK.
- Пользователь сохраняет зашифрованный DEK рядом с шифртекстом и уничтожает незашифрованный DEK.
Для расшифрования пользователь считывает зашифрованный DEK, выполняет запрос к KMS на его расшифровку, получает от сервиса расшифрованный DEK и расшифровывает с его помощью данные. После использования расшифрованный DEK нужно уничтожить.
Сервис KMS используют в следующих сценариях:
- для шифрования данных с помощью утилиты
yc
(CLI); - в пользовательских приложениях через REST или gRPC API;
- для шифрования данных в объектном хранилище;
- для защиты секретов при использовании сервиса управления кластерами Kubernetes.
На следующем уроке вы потренируетесь использовать сервис KMS, чтобы управлять ключами и шифровать данные.