Инструменты безопасности помогают компаниям поддерживать отказоустойчивость и управляемость своих сервисов, работающих в том числе и в контейнерах. Одно из таких решений — разработка нашей компании Deckhouse Stronghold. Оно позволяет эффективно управлять жизненным циклом так называемых секретов — различных конфиденциальных данных (токенов, паролей, SSH-ключей, сертификатов, ключей API и т. д.), которые используются при взаимодействии пользователей, приложений и сервисов в Kubernetes (и не только).
Иными словами, Deckhouse Stronghold — это хранилище секретов, которое, как и известный многим HashiCorp Vault, обеспечивает их безопасность. Для этого Stronghold шифрует все данные секретным ключом. Однако в таком случае мы сталкиваемся с проблемой курицы и яйца: где хранить секретный ключ от хранилища секретов?
В этой статье разберём существующие практики хранения ключей шифрования, рассмотрим их плюсы и минусы, а также расскажем о способе распечатывания хранилища (auto unseal), который мы разработали и используем
Практики хранения ключей
Существует несколько подходов к хранению ключей шифрования:
- Офлайн-хранилище. Предполагает хранение ключей шифрования в изолированной, не подключенной к сети среде.
- Kubernetes Secrets. Представляет собой объект Kubernetes, который позволяет хранить ключ шифрования в кластере.
- Transit Vault. Используется для защиты данных при передаче, предоставляя API для шифрования. Подходит для приложений, которым требуется шифровать данные перед сохранением в базу данных или другую систему хранения, позволяя при этом избежать хранения ключей в явном виде.
- KMS-сервисы облачных операторов. Используются для хранения ключей в облачных приложениях и сервисах, таких как AWS, Google Cloud, Microsoft Azure и других.
Каждый из вышеперечисленных способов имеет значительные недостатки. Так, в офлайн-хранилище отсутствует возможность перезапускать хранилище секретов, например, после сбоя серверов или для обновления версии. Также он не избавляет от необходимости вводить пароль вручную с бумажки. Делать перезапуск хранилища позволяют остальные практики — Kubernetes Secrets, Transit Vault и KMS. Однако в них появляются другие проблемы, связанные с безопасностью (например, при хранении unseal-ключа в Kubernetes Secrets его может прочитать пользователь, имеющий доступ к API; при использовании Transit Vault возникают вопросы, как сделать его отказоустойчивым и где хранить секрет для доступа к самому Transit Vault) или необходимостью привязываться к какому-либо KMS-сервису (vendor lock-in). Последнее особенно актуально для инфраструктуры, работающей в закрытом окружении, где KMS-сервисы могут отсутствовать.
Чтобы решить эти проблемы, в Deckhouse Stronghold мы реализовали свой собственный способ распечатывания хранилища. Его принцип действия заключается в том, что любой активный узел в кластере обнаруживает и автоматически распечатывает остальные узлы при условии, что у них валидный сертификат.
Как работает автоматическое распечатывание (auto unseal) в Stronghold
При активации Stronghold происходит инициализация хранилища, шифрование ключей шифрования (PGP) и их сохранение в секрете для использования пользователями. Эти unseal-ключи остаются в памяти Stronghold, и при запуске узлов происходит их автоматическое распечатывание. Если один или несколько узлов перезагружаются, соседние активные узлы распечатывают вновь запущенные.
Пока хотя бы один узел остаётся активным, все новые узлы будут распечатаны. Это похоже на то, как работают и другие механизмы auto unseal, которые зависят от доступности KMS, Transit Vault или любого другого решения, способного расшифровать ключ. В нашем случае эту роль выполняет соседний узел кластера.
Что делать, если все узлы неактивны
Если вдруг случилось так, что все узлы оказались выключены, тогда ключ шифрования будет удалён из памяти Stronghold. При последующем включении узлов достаточно будет вручную распечатать один из них, после чего он распечатает остальные.
В данном случае, в отличие от вариантов с Transit Vault или KMS, всё ещё остаётся возможность провести ручное распечатывание без каких-либо проблем.
Если все узлы кластера отключаются одновременно, auto unseal не происходит, так как нет доступного ключа. В этой ситуации пользователи должны использовать свои приватные PGP-ключи для расшифровки ключей распечатывания и ручного распечатывания первого узла, после чего он сможет распечатать остальные.
Если высокий уровень приватности и секретности не требуется, можно не шифровать ключи с помощью PGP. В этом случае запуск и распечатывание Stronghold происходят даже после полного отключения и последующего включения кластера.
Преимущества auto unseal в Stronghold
Реализованный нами способ распечатывания хранилища позволяет обновлять компоненты без ручного вмешательства пользователя, а также автоматически восстанавливать кластеры при перезапуске узлов. При этом ключ для распечатывания хранилища находится только в памяти Stronghold, что обеспечивает его максимальную безопасность.