Введение в Убежище

1. Обзор

В этом руководстве мы рассмотрим Vault от Hashicorp - популярный инструмент, используемый для безопасного управления конфиденциальной информацией в современных архитектурах приложений .

Основные темы, которые мы рассмотрим, включают в себя:

  • Какую проблему пытается решить Vault?

  • Архитектура и основные концепции Vault

  • Настройка простой тестовой среды

  • Взаимодействие с Vault с помощью инструмента командной строки

2. Проблема с конфиденциальной информацией

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

  • Большинству приложений необходим доступ к конфиденциальным данным для правильной работы ** . Например, приложение электронной коммерции может иметь имя пользователя/пароль, сконфигурированное где-то для подключения к своей базе данных. Также могут потребоваться ключи API для интеграции с другими поставщиками услуг, такими как платежные шлюзы, логистика и другие деловые партнеры.

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

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

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

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

При таком способе шифрования достигается только «ложное» чувство безопасности.

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

Так что мы можем сделать? Давай Убежище это!

3. Что такое Убежище?

Hashicorp Vault решает проблему управления конфиденциальной информацией - secret на языке Vault. «Управление» в этом контексте означает, что Vault контролирует все аспекты конфиденциальной информации : ее генерацию, хранение, использование и, что не менее важно, его отзыв.

Hashicorp предлагает две версии Vault. Версия с открытым исходным кодом, используемая в этой статье, бесплатна даже в коммерческих средах. Также доступна платная версия, которая включает техническую поддержку на различных SLA и дополнительные функции, такие как поддержка HSM (Hardware Security Module)

3.1. Архитектура

Архитектура Убежища обманчиво проста. Его основными компонентами являются:

  • Постоянный бэкэнд - хранилище для всех секретов

  • Сервер API, который обрабатывает клиентские запросы и выполняет операции на

секреты ** Количество __secret движков, __one для каждого типа поддерживаемого секрета

тип

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

  • Нашим приложениям больше не нужно их хранить - просто спросите Vault

когда нужно и откажитесь ** Мы можем использовать недолговечные секреты, тем самым ограничивая «окно

возможность », где злоумышленник может использовать украденный секрет

Vault шифрует все данные с помощью ключа шифрования перед записью в хранилище. Этот ключ шифрования шифруется еще одним ключом - главным ключом, который используется только при запуске.

Ключевым моментом реализации Vault является то, что он не хранит главный ключ на сервере. Это означает, что даже Vault не может получить доступ к сохраненным данным после запуска. В этот момент экземпляр Vault, как говорят, находится в «запечатанном» состоянии.

Позже мы рассмотрим шаги, необходимые для генерации мастер-ключа и распечатывания экземпляра Vault.

После распечатки Vault будет готов принимать запросы API. Эти запросы, конечно, нуждаются в аутентификации, что подводит нас к тому, как Vault аутентифицирует клиентов и решает, что они могут или не могут делать.

3.2. Аутентификация

  • Чтобы получить доступ к секретам в Vault, клиент должен аутентифицировать себя, используя один из поддерживаемых методов ** . В простейшем методе используются токены, которые представляют собой просто строки, отправляемые при каждом запросе API с использованием специального заголовка HTTP.

При первоначальной установке Vault автоматически генерирует «корневой токен».

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

Vault также поддерживает другие механизмы аутентификации, такие как LDAP, JWT, TLS Certificates и другие. Все эти механизмы основаны на базовом механизме токенов: после того, как Vault проверит наш клиент, он предоставит токен, который мы затем сможем использовать для доступа к другим API.

Токены имеют несколько свойств, связанных с ними. Основными свойствами являются:

  • Набор связанных Policies (см. Следующий раздел)

  • Время жить

  • Может ли это быть возобновлено

  • Максимальное количество использования

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

Обратное неверно: мы можем - и обычно делаем - создаем дочерний токен с ограничительной политикой. Еще один ключевой момент в этих отношениях:

  • Когда мы аннулируем токен, все дочерние токены и их потомки также становятся недействительными ** .

3.3. полисы

  • Политики точно определяют, к каким секретам клиент может получить доступ и какие операции он может выполнять с ними Давайте посмотрим, как выглядит простая политика:

path "secret/accounting" {
    capabilities =["read"]}

Здесь мы использовали синтаксис HCL (язык конфигурации Hashicorp) для определения нашей политики. Vault также поддерживает JSON для этой цели, но мы будем придерживаться HCL в наших примерах, поскольку его легче читать.

  • Политики в Vault «по умолчанию запрещены» ** . Токен, прикрепленный к этому примеру политики, получит доступ к секретам, хранящимся в secret/accounting , и ничего больше. Во время создания токен может быть присоединен к нескольким политикам. Это очень полезно, поскольку позволяет нам создавать и тестировать меньшие политики, а затем применять их по мере необходимости.

Другим важным аспектом политики является то, что они используют ленивую оценку. Это означает, что мы можем обновить данную политику, и все токены будут затронуты немедленно.

Политики, описанные до сих пор, также называются политиками списка контроля доступа или политиками ACL. Vault также поддерживает два дополнительных типа политик: политики EGP и RGP. Они доступны только в платных версиях и расширяют основной синтаксис политики с поддержкой Sentinel .

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

Более подробную информацию о синтаксисе политики можно найти в документации Vault .

4. Секретные типы

Хранилище поддерживает целый ряд различных типов секретов, которые предназначены для разных вариантов использования:

  • Key-Value: простые статические пары ключ-значение

  • Динамически генерируемые учетные данные : генерируется Vault по запросу

клиентом ** Cryptographic keys : Используется для выполнения криптографических функций с

данные клиента

Каждый секретный тип определяется следующими атрибутами:

  • Mount point, , который определяет его префикс REST API

  • Набор операций, предоставляемых через соответствующий API

  • Набор параметров конфигурации

Заданный секретный экземпляр доступен через path , во многом как дерево каталогов в файловой системе. Первый компонент этого пути соответствует mount point , где расположены все секреты этого типа .

Например, строка _secret/my-application соответствует пути, по которому мы можем найти пары ключ-значение для my-application_ .

4.1. Секреты Ключ-Значение

  • Секреты Key-Value - это, как следует из названия, простые пары в списке доступных по заданному пути ** . Например, мы можем сохранить пару foo = bar по пути /secret/my-application.

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

Хранилище поддерживает три вида секретов Key-Value:

  • __Не версионные пары ключей, где обновления заменяют существующие значения

  • Versioned Key-Pairs, которые сохраняют до настраиваемого количества старых

версии ** Cubbyhole , специальный тип не версионных пар ключей, значения которых

ограничены данным токеном access (подробнее об этом позже).

Секреты Key-Value статичны по своей природе, поэтому с ними не связано понятие истечения срока действия. Основным вариантом использования этого типа секрета является хранение учетных данных для доступа к внешним системам, таким как ключи API.

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

4.2. Динамически генерируемые секреты

  • Динамические секреты генерируются на лету Vault по запросу приложения ** . Vault поддерживает несколько типов динамических секретов, в том числе следующие:

  • Учетные данные базы данных

  • SSH Ключевые пары

  • X.509 Сертификаты

  • Учетные данные AWS

  • Учетные записи службы Google Cloud

  • Учетные записи Active Directory

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

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

Давайте возьмем секретный движок базы данных в качестве примера. Во-первых, мы должны сконфигурировать Vault со всеми сведениями о подключениях к пользовательской базе данных, включая учетные данные ранее существовавшего пользователя с правами администратора для создания новых пользователей.

Затем мы создаем одну или несколько ролей (роли Vault, а не роли базы данных), содержащие фактические операторы SQL, используемые для создания нового пользователя. Они обычно включают не только оператор создания пользователя, но также все необходимые операторы grant , необходимые для доступа к объектам схемы (таблицам, представлениям и т. Д.).

  • Когда клиент получает доступ к соответствующему API, Vault создаст нового временного пользователя в базе данных, используя предоставленные операторы, и вернет его учетные данные ** . Затем клиент может использовать эти учетные данные для доступа к базе данных в течение периода, определенного атрибутом времени жизни запрошенной роли.

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

4.3. Криптографические ключи

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

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

В настоящее время существует только один движок этого типа: движок Transit .

Этот механизм поддерживает популярные типы ключей, такие как RSA и ECDSA, а также поддерживает Convergent Encryption. При использовании этого режима заданное значение открытого текста всегда приводит к одному и тому же результату шифрованного текста, что очень полезно в некоторых приложениях.

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

5. Настройка хранилища

В этом разделе мы создадим локальную тестовую среду, чтобы протестировать возможности Vault.

Развертывание Vault простое: просто download the package , которое соответствует нашей операционной системе и извлекает его исполняемый файл ( __vault or vault.exe __on Windows) в некоторый каталог в нашей переменной PATH.

  • Этот исполняемый файл содержит сервер, а также является стандартным клиентом ** .

There также имеется официальное изображение Docker , но мы не будем здесь его освещать.

Vault поддерживает режим development , который подходит для быстрого тестирования и привыкания к инструменту командной строки, но он слишком упрощен для реальных случаев использования: все данные теряются при перезапуске, а доступ к API использует простой HTTP .

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

5.1. Запуск сервера Vault

Vault использует файл конфигурации в формате HCL или JSON. Следующий файл определяет всю конфигурацию, необходимую для запуска нашего сервера с использованием файлового хранилища и самозаверяющего сертификата:

storage "file" {
  path = "./vault-data"
}
listener "tcp" {
  address = "127.0.0.1:8200"
  tls__cert__file = "./src/test/vault-config/localhost.cert"
  tls__key__file = "./src/test/vault-config/localhost.key"
}

Теперь давайте запустим Vault. Откройте командную оболочку, перейдите в каталог, содержащий наш файл конфигурации, и выполните эту команду:

$ vault server -config ./vault-test.hcl

Vault запустится и покажет несколько сообщений инициализации. Они будут включать его версию, некоторые сведения о конфигурации и адрес, по которому доступен API. Вот и все - наш сервер Vault запущен и работает.

5.2. Инициализация хранилища

Наш сервер Vault сейчас работает, но поскольку это его первый запуск, нам нужно его инициализировать.

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

$ export VAULT__ADDR=https://localhost:8200
$ export VAULT__CACERT=./src/test/vault-config/localhost.cert
$ vault operator init

Здесь мы определили несколько переменных среды, поэтому нам не нужно каждый раз передавать их в Vault в качестве параметров:

  • VAULT ADDR__: базовый URI, где наш сервер API будет обслуживать запросы

  • VAULT CACERT__: путь к открытому ключу сертификата нашего сервера

В нашем случае мы используем VAULT CACERT__, чтобы мы могли использовать HTTPS для доступа к API Vault. Нам это нужно, потому что мы используем самозаверяющие сертификаты.

Это не было бы необходимо для производственных сред, где мы обычно имеем доступ к сертификатам, подписанным CA.

После выполнения вышеуказанной команды мы должны увидеть сообщение, подобное этому:

Unseal Key 1: <key share 1 value>
Unseal Key 2: <key share 2 value>
Unseal Key 3: <key share 3 value>
Unseal Key 4: <key share 4 value>
Unseal Key 5: <key share 5 value>

Initial Root Token: <root token value>

... more messages omitted

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

Также обратите внимание на root токен , так как он понадобится нам позже.

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

$ export VAULT__TOKEN=<root token value> (Unix/Linux)

Давайте посмотрим состояние нашего сервера теперь, когда мы его инициализировали, с помощью следующей команды:

$ vault status
Key                Value
---                -----
Seal Type          shamir
Sealed             true
Total Shares       5
Threshold          3
Unseal Progress    0/3
Unseal Nonce       n/a
Version            0.10.4
HA Enabled         false

Мы видим, что Убежище все еще запечатано. Мы также можем следить за прогрессом распечатки: «0/3» означает, что Vault нужны три акции, но пока нет ни одной. Давайте двигаться вперед и обеспечить его нашими акциями.

5.3. Убежище Unseal

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

$ vault operator unseal <key share 1 value>
$ vault operator unseal <key share 2 value>
$ vault operator unseal <key share 3 value>

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

Key             Value
---             -----
Seal Type       shamir
Sealed          false
... other properties omitted

В этом случае свойство «Sealed» имеет значение «false», что означает, что Vault готов принимать команды.

6. Тестирование Vault

В этом разделе мы протестируем нашу настройку Vault, используя два поддерживаемых типа секрета: ключ/значение и база данных. Мы также покажем, как создавать новые токены с конкретными политиками, прикрепленными к ним.

6.1. Использование секретов ключ/значение

Во-первых, давайте сохраним секретные пары ключ-значение и прочитаем их обратно. Предполагая, что командная оболочка, используемая для инициализации Vault, все еще открыта, мы используем следующую команду для сохранения этих пар по пути secret/fakebank :

$ vault kv put secret/fakebank api__key=abc1234 api__secret=1a2b3c4d

Теперь мы можем восстановить эти пары в любое время с помощью следующей команды:

$ vault kv get secret/fakebank
======= Data =======
Key           Value
---           -----
api__key       abc1234
api__secret    1a2b3c4d

Этот простой тест показывает нам, что Vault работает как надо. Теперь мы можем протестировать некоторые дополнительные функции.

6.2. Создание новых токенов

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

Давайте создадим новый токен, который мы можем использовать так же, как корневой токен, но срок его действия истекает через минуту

$ vault token create -ttl 1m
Key                  Value
---                  -----
token                <token value>
token__accessor       <token accessor value>
token__duration       1m
token__renewable      true
token__policies      ["root"]identity__policies   []policies            ["root"]----

Давайте проверим этот токен, используя его для чтения пар ключ/значение, которые мы создали ранее:

[source,bash,gutter:,true]

$ export VAULT TOKEN=<token value> $ vault kv get secret/fakebank ======= Data ======= Key Value --- ----- api key abc1234 api__secret 1a2b3c4d

Если мы подождем минуту и ​​попробуем повторить эту команду, мы получим сообщение об ошибке:

[source,bash,gutter:,true]

$ vault kv get secret/fakebank Error making API request.

  • permission denied

Сообщение указывает, что наш токен больше не действителен, чего мы и ожидали.

[[testing__policies]]

====  6.3. Политика тестирования

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

Например, давайте определим политику, которая разрешает доступ только на чтение к пути __secret/fakebank__, который мы использовали ранее:

[source,bash,gutter:,true]

$ cat > sample-policy.hcl <<EOF path "secret/fakebank" { capabilities =["read"]} EOF $ export VAULT__TOKEN=<root token> $ vault policy write fakebank-ro ./sample-policy.hcl Success! Uploaded policy: fakebank-ro

Теперь мы создадим токен с этой политикой с помощью следующей команды:

[source,bash,gutter:,true]

$ export VAULT TOKEN=<root token> $ vault token create -policy=fakebank-ro Key Value --- ----- token <token value> token accessor <token accessor value> token duration 768h token renewable true token policies ["default" "fakebank-ro"]identity policies []policies ["default" "fakebank-ro"]----

Как мы делали раньше, давайте прочитаем наши секретные значения, используя этот токен:

$ export VAULT__TOKEN=<token value>
$ vault kv get secret/fakebank
======= Data =======
Key           Value
---           -----
api__key       abc1234
api__secret    1a2b3c4d

Все идет нормально. Мы можем читать данные, как и ожидалось. Давайте посмотрим, что произойдет, когда мы попытаемся обновить этот секрет:

$ vault kv put secret/fakebank api__key=foo api__secret=bar
Error writing data to secret/fakebank: Error making API request.

URL: PUT https://127.0.0.1:8200/v1/secret/fakebank
Code: 403. Errors:

**  permission denied

Поскольку наша политика явно не разрешает запись, Vault возвращает код состояния 403 - Доступ запрещен.

6.4. Использование динамических учетных данных базы данных

В качестве последнего примера в этой статье давайте используем секретный механизм базы данных Vault для создания динамических учетных данных. Здесь мы предполагаем, что у нас есть сервер MySQL, доступный локально, и что мы можем получить к нему доступ с правами root. Мы также будем использовать очень простую схему, состоящую из одной таблицы - account .

Сценарий SQL, используемый для создания этой схемы и привилегированного пользователя, доступен здесь.

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

$ vault secrets enable database
Success! Enabled the database secrets engine at: database/----

Теперь мы создадим ресурс конфигурации базы данных:

[source,bash,gutter:,true]

$ vault write database/config/mysql-fakebank \ plugin name=mysql-legacy-database-plugin \ connection url="{{username}}:{{password}}@tcp(127.0.0.1:3306)/fakebank" \ allowed__roles="** " \ username="fakebank-admin" \ password="Sup&rSecre7!"

Префикс пути __database/config__ - это место, где должны храниться все конфигурации базы данных. Мы выбираем имя __mysql-fakebank__, чтобы мы могли легко определить, к какой базе данных относится данная конфигурация. Что касается ключей конфигурации:

**  __plugin__name: __ Определяет, какой плагин базы данных будет использоваться.

доступные имена плагинов описаны в
https://www.vaultproject.io/docs/secrets/databases/index.html[Vault's
документы]**  __connection__url__: это шаблон, используемый плагином, когда

подключение к базе данных. Обратите внимание на \ {\ {имя пользователя}} и \ {\ {пароль}}
шаблонные заполнители. При подключении к базе данных Vault будет
заменить эти заполнители на фактические значения
**  __allowed__roles__: Определите, какие роли Vault (обсуждаемые далее) можно использовать

эта конфигурация. В нашем случае мы используем «** », поэтому он доступен для всех
роли
**  __username

выполнять операции с базой данных, такие как создание нового пользователя и отзыв его привилегий

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

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

[source,actionscript3,gutter:,true]

$ vault write database/roles/fakebank-accounts-ro \ db name=mysql-fakebank \ creation statements="CREATE USER '{{name}}'@'%' IDENTIFIED BY '{{password}}';GRANT SELECT ON fakebank.** TO '{{name}}'@'%';"

Механизм базы данных определяет префикс пути ____database/role ____ как место для хранения ролей. __fakebank-accounts-ro__ - это имя роли, которое мы позже будем использовать при создании динамических учетных данных. Мы также поставляем следующие ключи:

**  __db__name__: имя существующей конфигурации базы данных. Соответствует

последняя часть пути, которую мы использовали при создании конфигурации
ресурс
**  __creation__statements: __ Список шаблонов операторов SQL, которые Vault

будет использовать для создания нового пользователя

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

[source,bash,gutter:,true]

$ vault read database/creds/fakebank-accounts-ro Key Value --- ----- lease id database/creds/fakebank-accounts-ro/0c0a8bef-761a-2ef2-2fed-4ee4a4a076e4 lease duration 1h lease__renewable true password <password> username <username>

Префикс __database/creds__ используется для генерации учетных данных для доступных ролей. Поскольку мы использовали ____fakebank-account-ro ____role, возвращаемое имя пользователя/пароль будет ограничено операциями __select__.

Мы можем проверить это, подключившись к базе данных, используя предоставленные учетные данные, а затем выполнив несколько команд SQL:

[source,bash,gutter:,true]

$ mysql -h 127.0.0.1 -u <username> -p fakebank Enter password: MySQL[fakebank]> select ** from account; …​ omitted for brevity 2 rows in set (0.00 sec) MySQL[fakebank]> delete from account; ERROR 1142 (42000): DELETE command denied to user 'v-fake-9xoSKPkj1'@'localhost' for table 'account'

**  Мы видим, что первый __select__ успешно завершен, но мы не смогли выполнить оператор __delete__ ** . Наконец, если мы подождем один час и попытаемся подключиться с использованием тех же учетных данных, мы больше не сможем подключиться к базе данных. Vault автоматически отозвал все привилегии этого пользователя

===  7. Заключение

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

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

В следующей статье будет рассмотрен очень конкретный вариант использования Vault: **  Использование его в контексте приложения Spring Boot **  Оставайтесь в курсе!