YC K8s KMS NLB ALB Lockbox DNS CL CR
October 2, 2022

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