Модуль доступен только в Deckhouse Enterprise Edition.

Системные требования

Поскольку профиль использования хранилища секретов у каждого клиента различен, эти рекомендации должны служить лишь отправной точкой. Все требования к ресурсам прямо пропорциональны операциям, выполняемым кластером Stronghold.

Следует рассмотреть два основных типа кластеров согласно их назначению:

  • Небольшие кластеры. Подходят для большинства начальных развертываний или для сред разработки и тестирования.
  • Большие кластеры. Производственные среды с постоянно высокой рабочей нагрузкой. Это может быть большое количество транзакций, большое количество секретов или комбинация того и другого.
Небольшой кластер Большой кластер
Процессор 4-8 ядер 8-16 ядер
Память 8-16 Гб 16-32 Гб
Дисковый ввод-вывод 3000+ оп/с 3000+ оп/с
Дисковый ввод-вывод 70+ Мб/с 200+ Мб/с

В зависимости от прогнозируемого количества и типа операций следует отталкиваться от следующих требований:

4 ядра 16 ядер
Авторизация (получение токена) до 20 оп/с до 100 оп/с
Чтение ключа до 1кБ до 500 оп/с до 7000 оп/с
Запись ключа до 30 оп/с до 150 оп/с

Установка и включение Deckhouse Stronghold

Термины и определения

Термин Определение
Инлет Способ поступления входящего трафика.
Бэкенд Внутренняя часть, которая находится на сервере и скрыта от пользователей.
Модуль Средство логического разделения программного обеспечения на блока, каждый из которых выполняет определенную задачу.
Механизм секретов Хранилище ключей-значений, используемое для хранения произвольных секретов.

Для работы с Deckhouse Stronghold необходимо выполнить установку Deckhouse Kubernetes Platform. Процесс установки Deckhouse Kubernetes Platform описан по ссылке.

После того, как Deckhouse Kubernetes Platform установлен, необходимо включить модуль Deckhouse Stronghold.

Примените ModuleConfigдля включения модуля:

apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
  name: stronghold
spec:
  enabled: true

или выполните команду:

kubectl -n d8-system exec deploy/deckhouse -c deckhouse -it -- deckhouse-controller module enable stronghold

По умолчанию, модуль запускается в режиме Automatic с инлетом Ingress. В текущей версии, другие режимы и инлеты не предусмотрены.

Если установка Deckhouse Kubernetes Platform выполнена в закрытом окружении, то с помощью секции параметров https можно настроить использование SSL-сертификатов..

Также Deckhouse Stronghold можно включить в веб-интерфейсе администратора Deckhouse Kubernetes Platform, для этого выберите модуль stronghold, как показано на рисунке ниже:

Включение Deckhouse Stronghold в интерфейсе администратора Deckhouse Kubernetes Platform

Рисунок - 1. Интерфейс администратора Deckhouse Kubernetes Platform.

Доступ к Deckhouse Stronghold осуществляется через инлеты. В данный момент доступен один инлет - Ingress. Адрес веб-интерфейса Stronghold формируется следующим образом: в шаблоне publicDomainTemplate глобального параметра конфигурации Deckhouse ключ %s заменяется на stronghold.

Например, если publicDomainTemplate установлен как %s-kube.company.my, веб-интерфейс Stronghold будет доступен по адресу stronghold-kube.company.my.

Получение токенов доступа

Способы получения токенов доступа:

  • Root-токен из секрета stronghold-keys пространства имен kubernetes d8-stronghold. Пример команды получения root-токена:

    kubectl -n d8-stronghold get secret stronghold-keys -o json | jq -r .data.rootToken | base64 -d
    
  • Токен доступа с полными правами через UI Deckhouse Admin.

  • Токен доступа с полными правами через CLI.

    • Создайте статического пользователя и группу в Deckhouse Kubernetes Platform, или настройте аутентификацию через внешние системы (OIDC-провайдеров).

    • Добавьте пользователя в список администраторов Deckhouse Stronghold, используя параметр management.administrators.

    • Авторизуйтесь с помощью vault login, выполнив следующие команды (укажите актуальный адрес в VAULT_ADDR):

      При аутентификации через внешние системы:

      export VAULT_ADDR=https://stronghold.demo.mydomain.tld/
      vault login -method=oidc -path=oidc_deckhouse
      

      При аутентификации через статического пользователя, выполните:

      export VAULT_ADDR=https://stronghold.demo.mydomain.tld/
      vault login
      

      Пример результата представлен ниже:

      Waiting for OIDC authentication to complete...
      WARNING! The VAULT_TOKEN environment variable is set! The value of this
      variable will take precedence; if this is unwanted please unset VAULT_TOKEN or
      update its value accordingly.
      
      Success! You are now authenticated. The token information displayed below
      is already stored in the token helper. You do NOT need to run "vault login"
      again. Future Vault requests will automatically use this token.
      
      Key                  Value
      ---                  -----
      token                hvs.CAESIKdnfsKJAfkP5zP3JDgOB_9PAvXSOf_Zle1ntGTsKC1UGh4KHGh2cy5jSWlXdG9BRm5uUWdUUzRIdHlMYXVwN2I
      token_accessor       z6VXjAi6F3vjaclHu99FLOcr
      token_duration       768h
      token_renewable      true
      token_policies       ["default"]
      identity_policies    ["admin"]
      policies             ["admin" "default"]
      token_meta_role      deckhouse_dex_authenticated
      

Полные права токена доступа подразумевают подключение политики deckhouse_administrators следующего вида: path "*" { capabilities = ["create", "read", "update", "delete", "list", "patch", "sudo"]}. Политика deckhouse_administrators автоматически подключается пользователям, перечисленным в списке администраторов Deckhouse Stronghold (параметр management.administrators). Пользователям не входящим в список администраторов подключается политика default.

Получив токен, выполните следующие команды, которые позволят работать с хранилищем:

export VAULT_TOKEN=hvs.CAESIPaA9shwUt9XIlvlu9FWhr6DyMgnP77bChDmb0mff6OcGh4KHGh2cy5maMz0UWgwdkZlMXlteENlUlhqNUlVeHg`
export VAULT_ADDR=https://stronghold.demo.mydomain.tld/

Механизм секретов

Включение механизма секретов

Необходимо включить механизм секретов KV на пути kv. Каждый путь полностью изолирован и не может взаимодействовать с другими путями. Например, механизм KV-секретов, включенный в foo, не может взаимодействовать с механизмом KV-секретов, включенным в bar.

vault secrets enable -path=kv kv
Success! Enabled the kv secrets engine at: kv/

Путь, по которому включен механизм секретов, по умолчанию равен имени механизма секретов. Таким образом, следующая команда эквивалентна выполнению приведенной выше команды.

vault secrets enable kv

Выполнение этой команды приведет к ошибке path is already in use at kv/.

Чтобы проверить успешность операции и получить дополнительные сведения о механизме управления секретами, используйте команду vault secrets list:

vault secrets list
Path Type Accessor Description
---- ---- -------- -----------
cubbyhole/ cubbyhole cubbyhole_78189996 per-token private secret storage
identity/ identity identity_ac07951e identity store
kv/ kv kv_15087625 n/a
secret/ kv kv_4b990c45 key/value secret storage
sys/ system system_adff0898 system endpoints used for control, policy and debugging

Это подтверждает наличие на сервере Deckhouse Stronghold пяти активных механизмов управления секретами. Можно увидеть тип такого механизма, соответствующий путь и необязательное описание (или «n/a», если оно не указано). При выполнении вышеуказанной команды с флагом -detailed становится доступной информация о версии KV системы управления секретами, а также многое другое.

Путь sys/ соответствует бэкенду системы. Эти пути взаимодействуют с основной системой Stronghold и не являются обязательными для новичков.

Потратьте несколько минут на чтение и запись некоторых данных в новый KV-механизм управления секретами, расположенный по адресу kv/. Ниже приведены несколько примеров для старта.

Для создания секретов используйте команду kv put.

vault kv put kv/hello target=world
Success! Data written to: kv/hello

Для чтения секретов, хранящихся в пути kv/hello, используйте команду kv get, как представлено на примере:

vault kv get kv/hello
===== Data =====
Key Value
--- -----
target world

Создайте секреты по пути kv/my-secret, как представлено на примере:

vault kv put kv/my-secret value="s3c(eT"
Success! Data written to: kv/my-secret

Читайте секреты по пути kv/my-secret, как представлено на примере:

vault kv get kv/my-secret
==== Data ====
Key Value
--- -----
value s3c(eT

Удалите секреты по адресу kv/my-secret, как представлено на примере:

vault kv delete kv/my-secret
Success! Data deleted (if it existed) at: kv/my-secret

Перечислиту существующие ключи на пути kv, как представлено на примере:

vault kv list kv/
Keys
----
hello

Отключение механизма секретов

Если необходимость в механизме управления секретами отпадает, его можно отключить. При отключении такого механизма все секреты удаляются, а соответствующие данные и настройки Deckhouse Stronghold уничтожаются.

vault secrets disable kv/
Success! Disabled the secrets engine (if it existed) at: kv/

Обратите внимание, вышеприведенная команда принимает в качестве аргумента путь к механизму управления секретами, а не тип механизма управления секретами. Любые попытки маршрутизации данных по исходному пути привели бы к ошибке, однако теперь по этому пути может быть включен другой механизм управления секретами.

Управление секретами

Механизм секретов Key/Value - это универсальное хранилище ключевых значений, используемое для хранения произвольных секретов в пределах настроенного физического хранилища Deckhouse Stronghold.

Секреты, записанные в Deckhouse Stronghold, шифруются и затем записываются во внутреннее хранилище. Внутренний механизм хранения данных не имеет доступа к незашифрованным значениям и не обладает средствами, необходимыми для их расшифровки без использования Deckhouse Stronghold.

Механизм секретов ключ/значение имеет версии 1 и 2. Разница в том, что v2 обеспечивает версионность секретов, а v1 - нет.

Для взаимодействия с механизмом секретов K/V используйте команду vault kv <подкоманда> [options] [args].

Доступные подкоманды перечислены в следующей таблице:

Подкоманда kv v1 kv v2 Описание
delete x x Удаление версий секретов, хранящихся в K/V
destroy x Постоянное удаление одной или нескольких версий секретов
enable-versioning x Включение версионности для существующего хранилища K/V v1
get x x Получение данных
list x x Перечислить данные или секреты
metadata x Взаимодействие с хранилищем ключей-значений Stronghold патч
patch x Обновление секретов без перезаписи существующих секретов
put x x Установка или обновление секретов (при этом происходит замена существующих секретов)
rollback x Откат к предыдущей версии секретов
undelete x Восстановление удаленной версии секретов

Получение справки по командам

Взаимодействовать с механизмом секретов ключ/значение можно с помощью команды vault kv.

Получите справку по команде:

vault kv -help
Usage: vault kv <subcommand> [options] [args]
This command has subcommands for interacting with Stronghold's key-value
store. Here are some simple examples, and more detailed examples are
available in the subcommands or the documentation.
Create or update the key named "foo" in the "secret" mount with the value
"bar=baz":
$ vault kv put -mount=secret foo bar=baz
Read this value back:
$ vault kv get -mount=secret foo
Get metadata for the key:
$ vault kv metadata get -mount=secret foo
Get a specific version of the key:
$ vault kv get -mount=secret -version=1 foo
The deprecated path-like syntax can also be used, but this should be avoided
for KV v2, as the fact that it is not actually the full API path to
the secret (secret/data/foo) can cause confusion:
$ vault kv get secret/foo
Please see the individual subcommand help for detailed usage information.
Subcommands:
delete Deletes versions in the KV store
destroy Permanently removes one or more versions in the KV store
enable-versioning Turns on versioning for a KV store
get Retrieves data from the KV store
list List data or secrets
metadata Interact with Stronghold's Key-Value storage
patch Sets or updates data in the KV store without overwriting
put Sets or updates data in the KV store
rollback Rolls back to a previous version of data
undelete Undeletes versions in the KV store

Записывание секрета

Перед началом работы ознакомьтесь со справкой по команде:

vault kv put -help

В справке приведены примеры команд, а также необязательные параметры, которые можно использовать.

Запишите ключ-значение secret в путь hello, с ключом foo и значением world, используя команду vault kv put против пути mount path secret, на котором установлен механизм управления секретами KV v2. Эта команда создаст новую версию секрета и заменит все ранее существовавшие данные по указанному пути, если они существуют.

vault kv put -mount=secret hello foo=world
== Secret Path ==
secret/data/hello
======= Metadata =======
Key Value
--- -----
created_time 2022-06-15T19:36:54.389113Z
custom_metadata <nil>
deletion_time n/a
destroyed false
version 1

Важно, чтобы путь монтирования к механизму секретов KV v2 был указан с параметром -mount=secret, иначе данный пример не будет работать. Путь монтирования secret (который был автоматически задан при запуске сервера Deckhouse Stronghold в режиме -dev) - это место, где можно читать и записывать произвольные секреты.

С помощью kv put можно записывать несколько фрагментов данных.

vault kv put -mount=secret hello foo=world excited=yes
== Secret Path ==
secret/data/hello
======= Metadata =======
Key Value
--- -----
created_time 2022-06-15T19:49:06.761365Z
custom_metadata <nil>
deletion_time n/a
destroyed false
version 2

Обратите внимание, что версия теперь равна 2. В примерах этого руководства для отправки секретов в Stronghold используется ввод <ключ>=<значение>. Однако отправка данных в составе команды CLI часто попадает в историю оболочки в незашифрованном виде.

Чтение секрета

Cекреты могут быть получены с помощью vault kv get.

vault kv get -mount=secret hello
== Secret Path ==
secret/data/hello
======= Metadata =======
Key Value
--- -----
created_time 2022-01-15T01:40:09.888293Z
custom_metadata <nil>
deletion_time n/a
destroyed false
version 2
===== Data =====
Key Value
--- -----
excited yes
foo world

Deckhouse Stronghold возвращает последнюю версию (в данном случае версию 2) секретов по адресу secret/hello.

Чтобы вывести только значение заданного поля, используйте флаг -field=<имя_ключа>.

vault kv get -mount=secret -field=excited hello
yes

Необязательный JSON-вывод может быть очень полезен для скриптов. Например, с помощью jq можно получить значение извлеченного секрета:

vault kv get -mount=secret -format=json hello | jq -r .data.data.excited
yes

Удаление секрета

Удалить секрет можно с помощью команды vault kv delete.

vault kv delete -mount=secret hello
Success! Data deleted (if it existed) at: secret/data/hello

Для проверки, попробуйте прочитать секрет, который только что удалили:

vault kv get -mount=secret hello
== Secret Path ==
secret/data/hello
======= Metadata =======
Key Value
--- -----
created_time 2022-01-15T01:40:09.888293Z
custom_metadata <nil>
deletion_time 2022-01-15T01:40:41.786995Z
destroyed false
version 2

На выходе отображаются только метаданные со временем удаления (deletion_time). Сами данные после удаления недоступны. Обратите внимание, что параметр destroyed со значением false указывает на возможность восстановления удаленных данных, если удаление произошло случайно.

vault kv undelete -mount=secret -versions=2 hello
Success! Data written to: secret/undelete/hello

Теперь данные восстановлены, как представлен на примере:

vault kv get -mount=secret hello
======= Metadata =======
Key Value
--- -----
created_time 2022-01-15T01:40:09.888293Z
custom_metadata <nil>
deletion_time n/a
destroyed false
version 2
===== Data =====
Key Value
--- -----
excited yes
foo world

Настройка параметров высокой доступности

Если используется одна мастер нода (не рекомендуется для продуктивных сред), то Deckhouse Stronghold работает в неотказоустойчивом режиме.

Высокая доступность обеспечивается автоматически, если количество мастер-узлов кластера Deckhouse Kubernetes Platform составляет три и более.