Система управления ключами Google: дешифрование данных после ротации ключей
контекст
Я следую инструкциям GCP по хранению секретов в хранилище. KMS используется для шифрования файлов перед загрузкой в Storage Bucket.
Поскольку шифрование данных происходит вне хранилища Google, я немного запутался с одним аспектом ротации ключей.
сценарий
Давайте рассмотрим конкретный сценарий:
- На 2017-01-01 создаю брелок и ключ
A
(что на самом делеA_ver1
потому что ключи версированы). Кроме того, политика ротации ключей настроена так, чтобы запускать ротацию ежегодно. - 2017-01-15 я запускаю команду для шифрования
some_file.txt
сA_ver1
:curl -s -X POST "https://cloudkms.googleapis.com/v1/projects/my-project/<...>" \ -d "{\"plaintext\":\"<...SOME_FILE_CONTENT...>\"}" \ -H "Authorization:Bearer $(gcloud auth application-default print-access-token)" \ -H "Content-Type:application/json"
, - Я немедленно сохраняю результат шифрования в Storage Bucket как
some_file.txt.encrypted
, - Я ничего не делаю, и в 2018-01-01 происходит поворот ключа. Как я понимаю,
A_ver1
отключается,A_ver2
генерируется и активируется.Эти два события происходят почти одновременно. - На 2018-06 -01 я понимаю, что мне нужно расшифровать
some_file.txt.encrypted
, Я загружаю файл, затем пытаюсь запустить команду для дешифрования файла, используяA_ver2
...
Вопросы
Вопрос 1: Что произойдет, когда я попытаюсь расшифровать файл с A_ver2
если он был зашифрован с более ранней версией A_ver1
?
Вопрос 2: Если не удалось расшифровать, что я должен делать в первую очередь, чтобы предотвратить это?
2 ответа
В вашем сценарии описание вращения на шаге 4 не совсем верно. Когда вы поворачиваете CryptoKey, генерируется новый CryptoKeyVersion, который становится основной версией CryptoKey, но со старой версией ничего не происходит. То есть для вашего сценария A_ver1
все еще включен, но другая активная версия A_ver2
является основной версией.
Чтобы ответить на ваши вопросы,
Вопрос 1: Когда вы пытаетесь расшифровать файл, вам не нужно указывать CryptoKeyVersion, только CryptoKey; сервис подберет для вас правильную версию. Если вы попытаетесь расшифровать файл, который был зашифрован с помощью CryptoKeyVersion, который теперь отключен (или уничтожен), то вызов расшифровки завершится неудачно.
Вопрос 2: Это зависит от того, что вы оптимизируете. Если вы используете ротацию, чтобы попытаться ограничить объем данных, зашифрованных, например, какой-либо одной версией, вы можете не захотеть отключать старые версии и хранить их в течение длительного периода времени. Возможно, вы захотите отключить только ключевые версии, а не только большое количество версий. В этом случае вы можете отследить, какую версию ключа вы использовали для определенного фрагмента данных, и повторно зашифровать все затронутые данные.
Старые версии не отключаются автоматически при вращении.
Вопрос 1: Когда вы расшифровываете с определенной CryptoKey, сервер выбирает правильную версию (упомянутую в документе Расшифровать). Пока версия не отключена, она все еще может использоваться.
Вопрос 2: В вашем конкретном сценарии дешифрование не завершится неудачей из-за использования старой версии.
Ротация ключей упоминала поведение, которое вы ожидаете, и поскольку в нем отмечается, что реализация стратегии, которая перекодирует данные с новыми версиями и отключает старые, может быть сложной.
Пожалуйста, дайте мне знать, если у вас есть другие вопросы.