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 позволяют менять ключ без участия приложения.