KMS
Key Management Service (KMS) - сервис для генерации симметричных ключей шифрования в формате AES. Используется три разных длины ключа. 128, 192 и 256 бит.
Главная единица, с которой работает сервис - это ключ. Кроме длины ключа есть ещё важный параметр - период ротации. Это время, в течение которого ключ валиден. И он используется для шифрования данных. Период ротации может быть равен неделе, месяцу, сезону и году. Но также, можно выставить и своё значение.
Зачем же нужна ротация? Всё просто. Если ключ будет скомпрометирован, то будет подвержена расшифровке только часть данных.
Ключ можно создать с защитой от удаления. Это необходимо, для сохранности ключа.
Данный сервис плотно интегрирован с сервисом mk8s. И используется в нём для шифрования секретной информации. Например, OAUTH токенов.
export FOLDER=$(yc config get folder-id) yc kms symmetric-key create \ --folder-id $FOLDER \ --name k8s-key \ --labels cam=k8s \ --description "k8s symmetric key" \ --default-algorithm aes-256 \ --deletion-protection \ --rotation-period 24h \ --async
Здесь период ротации выставлен в 24 часа и длина ключа равна 256 битам.
export KMS=$(yc kms symmetric-key get k8s-key --format json | jq -r ".id")
Чтобы удалить ключ с включенной защитой от удаления эту защиту необходимо отключить.
yc kms symmetric-key update \ --folder-id $FOLDER \ --name k8s-key \ --no-deletion-protection \ --async
С помощью сервиса можно зашифровать и расшифровать данные, например, файл.
export KMS=$(yc kms symmetric-key get k8s-key --format json | jq -r ".id") touch testfile && echo -n 'Hello, world!' > testfile yc kms symmetric-crypto encrypt \ --folder-id $FOLDER \ --id $KMS \ --plaintext-file testfile \ --aad-context-file aadfile \ --ciphertext-file ciphertestfile cat ciphertestfile ^@^@^@^A^@^@^@^Tabj4tb1csth2rehv1hss^@^@^@^PÓ<97>Ðý|ÆLùösñ^H3¿<88>í^@^@^@^L<99><92><84>£X<97> ^F<^NóG¯f}x^AZÛ+dRfPX<93>ªÈ+@("W+<86>wë<98>pt^H yc kms symmetric-crypto decrypt \ --folder-id $FOLDER \ --id $KMS \ --plaintext-file testfile2 \ --aad-context-file aadfile \ --ciphertext-file ciphertestfile
yc kms symmetric-key list +----------------------+---------+----------------------+-------------------+---------------------+--------+ | ID | NAME | PRIMARY VERSION ID | DEFAULT ALGORITHM | CREATED AT | STATUS | +----------------------+---------+----------------------+-------------------+---------------------+--------+ | abjesk4gh0vo91lm3ia6 | k8s-key | abj4tb1csth2rehv1hss | AES_256 | 2022-06-03 08:37:33 | ACTIVE | +----------------------+---------+----------------------+-------------------+---------------------+--------+
yc kms symmetric-key get $KMS id: abjesk4gh0vo91lm3ia6 folder_id:$FOLDER created_at: "2022-06-03T08:37:33Z" name: k8s-key description: k8s symmetric key status: ACTIVE primary_version: id: abj4tb1csth2rehv1hss key_id: abjesk4gh0vo91lm3ia6 status: ACTIVE algorithm: AES_256 created_at: "2022-09-12T06:14:18Z" primary: true default_algorithm: AES_256 rotated_at: "2022-09-12T06:14:18Z" rotation_period: 86400s deletion_protection: true
yc kms symmetric-key list-operations $KMS +----------------------+---------------------+----------------------+---------------------+--------+----------------------+ | ID | CREATED AT | CREATED BY | MODIFIED AT | STATUS | DESCRIPTION | +----------------------+---------------------+----------------------+---------------------+--------+----------------------+ | abjf93erjd86d02kkac0 | 2022-10-02 18:43:23 | $USER | 2022-10-02 18:43:23 | DONE | update key | | abj83a3gviv0pv40acft | 2022-06-03 08:37:33 | $USER | 2022-06-03 08:37:33 | DONE | create symmetric key | +----------------------+---------------------+----------------------+---------------------+--------+----------------------+
yc kms symmetric-key list-versions $KMS yc kms symmetric-key rotate $KMS yc kms symmetric-key delete $KMS
Полезные ссылки.
Создание ключа: https://cloud.yandex.ru/docs/kms/operations/key
Шифрование, симметричные ключи и AAD контекст: https://cloud.yandex.ru/docs/kms/concepts/encryption#add-context
Шифрование и расшифровка данных: https://cloud.yandex.ru/docs/kms/tutorials/encrypt/cli-api
Про шифрование секретов в k8s: https://cloud.yandex.ru/docs/kms/tutorials/k8s