Что такое пространства имён

Пространства имён (namespaces) в Stronghold позволяют разделить один сервер на несколько изолированных логических областей. Каждое пространство имён работает как отдельный виртуальный Stronghold со своими собственными:

  • политиками (policies);
  • путями монтирования (mount paths);
  • секретами;
  • методами аутентификации (auth methods);
  • токенами и сессиями.

Все пространства имён управляются одним экземпляром Stronghold и образуют иерархию с корневым пространством root.

Основные свойства

Пространства имён обладают следующими свойствами:

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

Для обращения к нужному пространству имён:

  • в CLI используйте параметр -namespace=<NAMESPACE_PATH>;
  • в REST API передавайте заголовок X-Vault-Namespace: <NAMESPACE_PATH>.

В командах на этой странице используются плейсхолдеры:

  • <NAMESPACE_PATH> — полный путь пространства имён, например ns1/ns2;
  • <PARENT_NAMESPACE> — абсолютный путь родительского пространства имён;
  • <NEW_NAMESPACE> — имя создаваемого пространства имён;
  • <NAMESPACE> — имя пространства имён относительно родительского;
  • <UNLOCK_KEY> — значение unlock_key, полученное при блокировке пространства имён.

Создание пространства имён

Для создания нового пространства имён нужны права чтения и записи на путь /namespaces в текущем пространстве имён.

Имя нового пространства не должно пересекаться с уже существующими путями. После создания к нему можно обращаться как по полному пути в иерархии.

Через CLI

Чтобы создать пространство имён, выполните команду:

  • Stronghold в DP
  • Stronghold в Linux
d8 stronghold namespace create -namespace=<PARENT_NAMESPACE> -custom-metadata=key="value" <NEW_NAMESPACE>
stronghold namespace create -namespace=<PARENT_NAMESPACE> -custom-metadata=key="value" <NEW_NAMESPACE>

Пример ответа:

Key                Value
---                -----
custom_metadata    map[key:value]
id                 c88b1992-d9d3-4160-8283-77163a4e7fae
path               <NEW_NAMESPACE>/

Параметры:

  • -namespace — абсолютный путь родительского пространства, в котором будет создано новое пространство; если параметр не указан, пространство создаётся в root;
  • -custom-metadata — произвольные метаданные пространства имён в формате key=value.

Через REST API

Чтобы создать пространство имён, отправьте POST-запрос к sys/namespaces:

curl --header "X-Vault-Token: $STRONGHOLD_TOKEN" --header "X-Vault-Namespace: <PARENT_NAMESPACE>" --request POST --data @payload.json $STRONGHOLD_ADDR/v1/sys/namespaces/<NEW_NAMESPACE> | jq -r ".data"

Параметры:

  • X-Vault-Namespace — абсолютный путь родительского пространства, в котором создаётся новое вложенное пространство;
  • payload.json — JSON с описанием метаданных пространства имён.

Чтение и список пространств имён

Чтение через CLI

Чтобы прочитать свойства пространства имён, выполните команду:

  • Stronghold в DP
  • Stronghold в Linux
d8 stronghold namespace lookup -namespace=<PARENT_NAMESPACE> <NAMESPACE>
stronghold namespace lookup -namespace=<PARENT_NAMESPACE> <NAMESPACE>

Пример ответа:

Key                Value
---                -----
custom_metadata    map[key:value]
id                 c88b1992-d9d3-4160-8283-77163a4e7fae
path               <NAMESPACE>/

Чтение через REST API

Чтобы прочитать свойства пространства имён, отправьте GET-запрос к sys/namespaces:

curl --header "X-Vault-Token: $STRONGHOLD_TOKEN" --header "X-Vault-Namespace: <PARENT_NAMESPACE>" --request GET $STRONGHOLD_ADDR/v1/sys/namespaces/<NAMESPACE>

Список через CLI

Чтобы получить список дочерних пространств имён, выполните команду:

  • Stronghold в DP
  • Stronghold в Linux
d8 stronghold namespace list -namespace=<PARENT_NAMESPACE>
stronghold namespace list -namespace=<PARENT_NAMESPACE>

Пример ответа:

Keys
----
ns1/
ns2/

Список через REST API

Чтобы получить список дочерних пространств имён, отправьте LIST-запрос к sys/namespaces:

curl --header "X-Vault-Token: $STRONGHOLD_TOKEN" --header "X-Vault-Namespace: <PARENT_NAMESPACE>" --request LIST $STRONGHOLD_ADDR/v1/sys/namespaces

Удаление пространства имён

Через CLI

Чтобы удалить пространство имён, выполните команду:

  • Stronghold в DP
  • Stronghold в Linux
d8 stronghold namespace delete -namespace=<PARENT_NAMESPACE> <NAMESPACE>
stronghold namespace delete -namespace=<PARENT_NAMESPACE> <NAMESPACE>

Параметр -namespace задаёт родительское пространство, в котором находится удаляемое пространство. Если параметр не указан, удаление выполняется из root.

Через REST API

Чтобы удалить пространство имён, отправьте DELETE-запрос к sys/namespaces:

curl --header "X-Vault-Token: $STRONGHOLD_TOKEN" --header "X-Vault-Namespace: <PARENT_NAMESPACE>" --request DELETE $STRONGHOLD_ADDR/v1/sys/namespaces/<NAMESPACE>

Блокировка API пространства имён

Namespace API Lock позволяет временно запретить все API-запросы к выбранному пространству имён и ко всем его дочерним пространствам.

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

Блокировка через CLI

Заблокировать текущее пространство имён и все дочерние:

  • Stronghold в DP
  • Stronghold в Linux
d8 stronghold namespace lock
stronghold namespace lock

Заблокировать конкретное дочернее пространство, например ns1/ns2/:

  • Stronghold в DP
  • Stronghold в Linux
d8 stronghold namespace lock ns1/ns2
stronghold namespace lock ns1/ns2

Пример ответа:

Key            Value
---            -----
unlock_key     7Hk3xQ9mR2pN5vL8wY4tZa

Сохраните значение unlock_key. Оно потребуется для разблокировки, если операция выполняется не root-токеном.

Блокировка через REST API

Заблокировать пространство имён <NAMESPACE> из корневого пространства:

curl --header "X-Vault-Token: $STRONGHOLD_TOKEN" --request POST $STRONGHOLD_ADDR/v1/sys/namespaces/api-lock/lock/<NAMESPACE> | jq -r ".data"

Заблокировать текущее пространство имён, определяемое заголовком X-Vault-Namespace:

curl --header "X-Vault-Token: $STRONGHOLD_TOKEN" --header "X-Vault-Namespace: <NAMESPACE>" --request POST $STRONGHOLD_ADDR/v1/sys/namespaces/api-lock/lock | jq -r ".data"

Пример ответа:

{
  "unlock_key": "7Hk3xQ9mR2pN5vL8wY4tZa"
}

Разблокировка через CLI

Разблокировать текущее пространство имён с помощью ключа:

  • Stronghold в DP
  • Stronghold в Linux
d8 stronghold namespace unlock -unlock-key=<UNLOCK_KEY>
stronghold namespace unlock -unlock-key=<UNLOCK_KEY>

Разблокировать текущее пространство имён с помощью root-токена:

  • Stronghold в DP
  • Stronghold в Linux
d8 stronghold namespace unlock
stronghold namespace unlock

Разблокировать конкретное дочернее пространство:

  • Stronghold в DP
  • Stronghold в Linux
d8 stronghold namespace unlock -unlock-key=<UNLOCK_KEY> ns1/ns2
stronghold namespace unlock -unlock-key=<UNLOCK_KEY> ns1/ns2

Разблокировка через REST API

С использованием unlock_key:

curl --header "X-Vault-Token: $STRONGHOLD_TOKEN" --request POST --data '{"unlock_key": "<UNLOCK_KEY>"}' $STRONGHOLD_ADDR/v1/sys/namespaces/api-lock/unlock/<NAMESPACE>

С использованием root-токена:

curl --header "X-Vault-Token: $STRONGHOLD_ROOT_TOKEN" --request POST $STRONGHOLD_ADDR/v1/sys/namespaces/api-lock/unlock/<NAMESPACE>

Параметры API блокировки

Эндпоинты блокировки и разблокировки принимают следующие параметры:

ПараметрТипОбязательныйОписание
<NAMESPACE>stringНетПуть пространства имён для блокировки или разблокировки. Если не указан, операция применяется к текущему пространству, определяемому заголовком X-Vault-Namespace.
unlock_keystringНетКлюч разблокировки, полученный при блокировке. Обязателен при разблокировке, если токен не является root-токеном.

Пример блокировки и разблокировки

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

  • Stronghold в DP
  • Stronghold в Linux
# Создайте пространство имён.
d8 stronghold namespace create production

# Заблокируйте его.
d8 stronghold namespace lock production
# Key            Value
# ---            -----
# unlock_key     7Hk3xQ9mR2pN5vL8wY4tZa

# Любые запросы к production теперь заблокированы.
d8 stronghold secrets list -namespace=production
# Error: API access to this namespace has been locked by an administrator...

# Разблокируйте его с помощью ключа.
d8 stronghold namespace unlock -unlock-key=7Hk3xQ9mR2pN5vL8wY4tZa production

# Доступ восстановлен.
d8 stronghold secrets list -namespace=production
# Создайте пространство имён.
stronghold namespace create production

# Заблокируйте его.
stronghold namespace lock production
# Key            Value
# ---            -----
# unlock_key     7Hk3xQ9mR2pN5vL8wY4tZa

# Любые запросы к production теперь заблокированы.
stronghold secrets list -namespace=production
# Error: API access to this namespace has been locked by an administrator...

# Разблокируйте его с помощью ключа.
stronghold namespace unlock -unlock-key=7Hk3xQ9mR2pN5vL8wY4tZa production

# Доступ восстановлен.
stronghold secrets list -namespace=production

Дополнительные ресурсы