Transit: шифрование как сервис

Как зашифровать данные приложения, ни разу не дав приложению сам ключ шифрования.

Transit engine — движок «шифрование как сервис»: приложение присылает открытый текст и получает шифртекст (и обратно), при этом ключ шифрования никогда не покидает Vault и сами данные в Vault не хранятся.

Часто нужно шифровать чувствительные поля в своей БД (номера карт, персональные данные). Наивный путь — раздать приложениям ключ шифрования, но тогда ключ расползается и его кража раскрывает всё. Transit убирает ключ из приложения: шифрование делает Vault.

Создание ключа и шифрование

vault secrets enable transit
vault write -f transit/keys/orders

Шифрование: открытый текст передаётся в base64, в ответ — шифртекст:

vault write transit/encrypt/orders \
  plaintext=$(echo -n "4111-1111-1111-1111" | base64)
{
  "data": {
    "ciphertext": "vault:v1:abCD12xyz..."
  }
}

Префикс vault:v1: — это версия ключа, которым зашифровано. Приложение хранит у себя только этот шифртекст; расшифровать его без Vault невозможно.

Расшифровка

vault write transit/decrypt/orders \
  ciphertext="vault:v1:abCD12xyz..."

В ответ — plaintext в base64, который приложение декодирует. Ключ при этом так и не покинул Vault.

Зачем это нужно

СвойствоЧто даёт
ключ не покидает Vaultкража БД и кода приложения не раскрывает данные
Vault не хранит данныешифрует «на лету», не становясь хранилищем карт
централизованный аудиткаждое шифрование/расшифровка в audit-логе
ротация ключасмена ключа без перешифровки данных приложением

Ротация ключа и rewrap

Transit умеет версионировать ключи. Ротация создаёт новую версию, и новые данные шифруются ей, а старый шифртекст остаётся читаемым старой версией:

vault write -f transit/keys/orders/rotate

Чтобы перевести старый шифртекст на новую версию ключа без раскрытия открытого текста приложению, есть rewrap — Vault перешифровывает на месте.

Как работает под капотом

Transit держит ключи внутри барьера Vault. На запрос encrypt он берёт текущую версию ключа, шифрует данные аутентифицированным шифрованием (AEAD) и возвращает шифртекст с меткой версии. На decrypt он по метке vX выбирает нужную версию ключа. Приложение оперирует только шифртекстами и вызовами API — криптография целиком на стороне Vault. Это снимает с разработчиков ответственность за правильную реализацию шифрования.

Частые ошибки

  • Слать сырой текст без base64 — API ждёт base64 в поле plaintext.
  • Хранить открытый текст «на всякий случай» рядом с шифртекстом — теряется весь смысл.
  • Удалять старые версии ключа до rewrap старого шифртекста — он станет нечитаемым.
  • Считать transit хранилищем — он не хранит данные, только шифрует.

Итог

  • Transit шифрует/расшифровывает данные, не отдавая ключ и не храня сами данные.
  • Кража БД и кода не раскрывает данные: ключ остаётся внутри Vault.
  • Ключи версионируются; ротация и rewrap позволяют менять ключ без участия приложения.
Проверьте себя
1. В чём ключевое преимущество transit engine?
AОн хранит зашифрованные данные за вас
BОн шифрует/расшифровывает, не отдавая ключ приложению — ключ не покидает Vault
CОн ускоряет БД
DОн генерирует пароли
2. Что означает префикс vault:v1: в шифртексте transit?
AВерсию API
BВерсию ключа, которым зашифрованы данные
CДлину шифртекста
DИмя движка
3. Зачем нужна операция rewrap?
AУдалить ключ
BПеревести старый шифртекст на новую версию ключа без раскрытия открытого текста приложению
CСменить алгоритм хеширования
DЗашифровать без base64