Введение в HashiCorp Vault и его установка на OpenSUSE (Часть 1)
ЛЕТОПИСЕЦ КИТЕЖ-ГРАДА
Введение: Данная статья, как и в случае с Jenkins, открывает ещё один цикл, в котором речь пойдет о таком программном обеспечении, как Vault от компании HashiCorp. Конкретно в этой части мы поговорим о том, что собой представляет Vault, вкратце рассмотрим его архитектуру, а также произведем установку данного ПО на дистрибутив OpenSUSE.
Архитектура Vault: Vault – это система управления секретами и шифрованием на основе идентификации. Секрет в контексте Vault может представлять собой всё то, о чём не должны знать посторонние лица и это также то, что вы хотите строго контролировать (ключи шифрования API, пароли и сертификаты, и т.д.). Секреты можно надежно хранить и управлять ими, используя для доступа как пользовательский интерфейс Vault, так и интерфейс командной строки. Также можно воспользоваться HTTP API. Современная система требует доступа к множеству секретов, поэтому добавление смены ключей, безопасного хранилища и подробных журналов аудита практически невозможно без специального решения. Здесь в дело и вступает Vault. После входа он проверяет и авторизует клиента (пользователей, компьютеры, приложения), прежде чем предоставить им доступ к секретам/сохраненным конфиденциальным данным:

В основном Vault работает с токенами, при этом каждый токен связан с политикой клиента. Каждая политика основана на путях, и правила политики ограничивают как действия, так и доступ к путям для каждого клиента. С помощью Vault вы можете создавать токены вручную и назначать их своим клиентам или же клиенты могут авторизоваться и получить токен самостоятельно. Основной рабочий процесс Vault состоит из четырех этапов:
Authenticate: Аутентификация в Vault представляет собой процесс, посредством которого клиент предоставляет информацию, которую Vault использует, чтобы определить, являются ли они теми, за кого себя выдают. Как только клиент проходит аутентификацию с помощью метода аутентификации, токен генерируется и связывается с политикой.
Validation: Vault проверяет клиента на соответствие сторонним доверенным источникам, таким как Github, LDAP, AppRole и т. д.
Authorize: Клиент сопоставляется с политикой безопасности Vault. Эта политика представляет собой набор правил, определяющих, к каким сегментам API клиент имеет доступ с помощью своего токена. Политики используют декларативный способ предоставления или запрещения доступа к определенным путям и операциям в Vault.
Access: Vault предоставляет доступ к секретам, ключам и возможностям шифрования, выдавая токен на основе политик, связанных с клиентом. Затем клиент может использовать свой токен Vault для будущих операций.
На рисунке ниже изображен основной рабочий процесс описанных этапов:

В целом Vault обладает множеством отдельных компонентов. Например, уровень шифрования Vault, называемый барьером, отвечает за шифрование и расшифровку данных Vault. Когда сервер Vault запускают, он записывает данные в своё хранилище. Поскольку серверная часть хранилища находится за пределами барьера, она считается ненадежной, поэтому Vault шифрует данные перед их отправкой в серверную часть хранилища. Этот механизм гарантирует, что если злоумышленник попытается получить доступ к серверной части хранилища, данные не будут скомпрометированы, поскольку они остаются зашифрованными до тех пор, пока Vault не расшифрует их. Во время запуска Vault тот находится как бы в запечатанном (или заархивированном) состоянии. Прежде чем начать выполнять какие-либо операции с Vault, его необходимо разархивировать. Это возможно путем предоставления ключей для распаковки, которые создаются при инициализации Vault. Во время инициализации также генерируется ключ шифрования, который используется для защиты всех данных Vault. Эти ключи защищены корневым ключом, который хранится вместе со всеми другими данными в Vault, но зашифрован иным механизмом: ключом разархивирования. По умолчанию Vault применяет совместное использование секрета Шамира для разделения ключа по разархивированию на настроенное количество осколков (Key Shares или Unseal Keys). Точное количество осколков требуется для восстановления ключа по разархивированию, который после используется уже для расшифровки корневого ключа хранилища. Ниже представлена схема компонентов Vault:

Можно указать как количество Key Shares, так и количество Unseal Keys. Технику Шамира также можно отключить, а корневой ключ использовать непосредственно для разархивирования. Как только Vault получает ключ шифрования, он расшифровывает данные в серверной части хранилища и переходит в распакованное состояние. После этого Vault загружает настроенные устройства аудита, методы аутентификации и механизмы секретов:

Когда клиент впервые подключается к Vault, ему необходимо пройти аутентификацию. Vault предоставляет настраиваемые методы аутентификации и обеспечивает гибкость используемого механизма аутентификации. Для операторов могут использоваться такие механизмы, как имя пользователя и пароль или GitHub, а приложения могут использовать открытые/закрытые ключи или токены для аутентификации. Запрос на проверку подлинности, проходящий через ядро, и метод проверки подлинности, определяют, является ли запрос действительным, после чего возвращается список связанных политик. Политики – это просто именованное правило ACL. Например, встроенная политика «root» разрешает доступ ко всем ресурсам. Вы можете создать любое количество именованных политик с точным контролем путей. Хранилище работает в режиме разрешенного доступа, что означает, что действие не разрешено, если доступ не предоставлен явным образом через политику. Поскольку с пользователем может быть связано несколько политик, действия разрешены тогда, когда это разрешено политикой. Политики хранятся и управляются внутренним хранилищем политик. На это внутреннее хранилище влияет серверная часть системы, которая всегда монтируется в sys/. После прохождения аутентификации создается новый клиентский токен, которым управляет хранилище токенов. Этот клиентский токен используется для будущих запросов. Такой метод похож на файл cookie, отправляемый веб-сайтом при входе пользователя в систему. В зависимости от конфигурации метода аутентификации клиентский токен может иметь связанную с ним аренду, и может потребоваться периодическое обновление, чтобы избежать аннулирования. Политики также используются для авторизации запроса клиента. Затем запрос направляется механизму секретов, который обрабатывается в зависимости от его типа. Когда механизм секретов возвращает секрет, ядро регистрирует его в диспетчере истечения срока действия и прикрепляет идентификатор аренды. Клиенты используют идентификатор аренды для обновления или отзыва своего секрета. Менеджер истечения срока действия автоматически аннулирует секрет, если клиент допускает истечение срока аренды. Ядро регистрирует запросы и ответы брокеру аудита, распределяя запросы по всем настроенным устройствам аудита. Вне потока запросов ядро выполняет определенные фоновые действия. Управление арендой имеет решающее значение, позволяя автоматически отзывать просроченные клиентские токены или секреты. Кроме того, Vault обрабатывает определенные случаи частичного сбоя, используя ведение журнала с упреждающей записью с диспетчером отката. Оно управляется в ядре и невидимо для пользователя.
Запуск Vault в режиме Development: Итак, перейдем к непосредственной установке самого Vault. Только хотелось бы отметить, что все представленные команды будут выполнены на дистрибутиве OpenSUSE Tumblweed, который является Rolling Release (так уж сложилось на момент написания статьи). Но все шаги с полной идентичностью могут быть выполнены на любой другой версии дистрибутива OpenSUSE Leap, который, напоминаю, является версией Stable. Сам Vault будет установлен с помощью предварительно собранного бинарного файла, поскольку компания HashiCorp не поддерживает официальный репозиторий для установки данного ПО с помощью пакетного менеджера zypper. Итак, для установки необходимо доставить несколько дополнительных пакетов (если они отсутствуют в системе) и скачать соответствующий файл, который можно найти вот по этой ссылке – https://developer.hashicorp.com/vault/downloads:
sudo zypper install -y wget unzip
wget https://releases.hashicorp.com/vault/1.13.3/vault_1.13.3_linux_amd64.zip
unzip vault_1.13.3_linux_amd64.zip
sudo mv vault /usr/bin/
Как вы могли заметить, на момент написания данной статьи актуальная версия Vault – 1.13.3. Чтобы убедиться в этом, можно выполнить следующую команду:
vault version
Vault v1.13.3 (3bedf816cbf851656ae9e6bd65dd4a67a9ddff5e), built 2023-06-06T18:12:37Z
А чтобы вывести весь доступный список команд используйте:
vault --help
Usage: vault <command> [args] Common commands: read Read data and retrieves secrets write Write data, configuration, and secrets delete Delete secrets and configuration list List data or secrets login Authenticate locally agent Start a Vault agent server Start a Vault server status Print seal and HA status unwrap Unwrap a wrapped secret Other commands: audit Interact with audit devices auth Interact with auth methods debug Runs the debug command events kv Interact with Vault's Key-Value storage lease Interact with leases monitor Stream log messages from a Vault server namespace Interact with namespaces operator Perform operator-specific tasks patch Patch data, configuration, and secrets path-help Retrieve API help for paths pki Interact with Vault's PKI Secrets Engine plugin Interact with Vault plugins and catalog policy Interact with policies print Prints runtime configurations secrets Interact with secrets engines ssh Initiate an SSH session token Interact with tokens transform Interact with Vault's Transform Secrets Engine transit Interact with Vault's Transit Secrets Engine version-history Prints the version history of the target Vault server
Далее необходимо запустить сам Vault и тут у нас есть несколько вариантов того, как это можно сделать на начальном этапе. Одним из вариантов является запуск Vault в режиме -dev. Vault, работая в данном режиме, не нуждается в дополнительных настройках, а CLI уже аутентифицирован для связи с ним. Это упрощает как эксперименты с Vault, так и сам процесс запуска, для последующего взаимодействия. Такой вариант хорошо подойдет для тех, кто, руководствуясь данной статьей, хочет лишь посмотреть, что собой представляет Vault. По сути флаг -dev просто сокращает многие настройки до небезопасных значений по умолчанию. Однако НИКОГДА не запускайте сервер в режиме -dev в Production среде. Это максимально небезопасно и при таком подходе данные будут теряться при каждом перезапуске (поскольку они хранятся в памяти). И как уже упоминалось ранее, данный режим был создан исключительно для разработки и экспериментов. Некоторые свойства сервера в режиме -dev можно переопределить с помощью флагов командной строки или путем указания файла конфигурации. Vault в режиме -dev обладает следующими возможностями по умолчанию:
Initialized and Unsealed: Vault уже инициализирован и распакован. Вам не нужно использовать команду vault operator unseal. Он сразу будет готов к использованию.
In-memory Storage: Все данные Vault хранятся в памяти. Сервер Vault не требует никаких прав доступа к файлам.
Bound to Local Address without TLS: Vault способен прослушивать 127.0.0.1:8200 (адрес сервера по умолчанию) без использования TLS.
Automatically Authenticated: Vault хранит токен корневого доступа, поэтому использование CLI для подключения к хранилищу доступно сразу. Если вы получаете доступ к Vault через API, вам необходимо пройти аутентификацию с помощью полученного ранее токена.
Single Unseal Key: Vault проходит этап инициализации с помощью одного ключа для распаковки. Хранилище уже разархивировано, но если вы хотите поэкспериментировать с архивированием/разархивированием, то для этого потребуется всего один ключ.
Key Value Store Mounted: Движок секретов KV версии 2 смонтирован в файле secret/. Имейте в виду, что есть различия с KV версии 1. Если вы хотите использовать версию 1, используйте флаг -dev-kv-v1.
Итак, давайте запустим Vault в режиме -dev. Для этого необходимо выполнить следующую команду:
vault server -dev
==> Vault server configuration: Api Address: http://127.0.0.1:8200 Cgo: disabled Cluster Address: https://127.0.0.1:8201 Go Version: go1.20.3 Listener 1: tcp (addr: "127.0.0.1:8200", cluster address: "127.0.0.1:8201", max_request_duration: "1m30s", max_request_size: "33554432", tls: "disabled") Log Level: Mlock: supported: true, enabled: false Recovery Mode: false Storage: inmem Version: Vault v1.13.2, built 2023-04-25T13:02:50Z Version Sha: b9b773f1628260423e6cc9745531fd903cae853f ==> Vault server started! Log data will stream in below: 2023-06-20T19:59:07.649+0300 [INFO] proxy environment: http_proxy="" https_proxy="" no_proxy="" 2023-06-20T19:59:07.650+0300 [WARN] no `api_addr` value specified in config or in VAULT_API_ADDR; falling back to detection if possible, but this value should be manually set 2023-06-20T19:59:07.650+0300 [INFO] core: Initializing version history cache for core 2023-06-20T19:59:07.651+0300 [INFO] core: security barrier not initialized 2023-06-20T19:59:07.651+0300 [INFO] core: security barrier initialized: stored=1 shares=1 threshold=1 2023-06-20T19:59:07.651+0300 [INFO] core: post-unseal setup starting 2023-06-20T19:59:07.668+0300 [INFO] core: loaded wrapping token key 2023-06-20T19:59:07.668+0300 [INFO] core: successfully setup plugin catalog: plugin-directory="" 2023-06-20T19:59:07.668+0300 [INFO] core: no mounts; adding default mount table 2023-06-20T19:59:07.670+0300 [INFO] core: successfully mounted: type=cubbyhole version="v1.13.2+builtin.vault" path=cubbyhole/ namespace="ID: root. Path: " 2023-06-20T19:59:07.670+0300 [INFO] core: successfully mounted: type=system version="v1.13.2+builtin.vault" path=sys/ namespace="ID: root. Path: " 2023-06-20T19:59:07.671+0300 [INFO] core: successfully mounted: type=identity version="v1.13.2+builtin.vault" path=identity/ namespace="ID: root. Path: " 2023-06-20T19:59:07.672+0300 [INFO] core: successfully mounted: type=token version="v1.13.2+builtin.vault" path=token/ namespace="ID: root. Path: " 2023-06-20T19:59:07.672+0300 [INFO] rollback: starting rollback manager 2023-06-20T19:59:07.673+0300 [INFO] core: restoring leases 2023-06-20T19:59:07.676+0300 [INFO] identity: entities restored 2023-06-20T19:59:07.676+0300 [INFO] identity: groups restored 2023-06-20T19:59:07.676+0300 [INFO] core: Recorded vault version: vault version=1.13.2 upgrade time="2023-06-20 16:59:07.676688685 +0000 UTC" build date=2023-04-25T13:02:50Z 2023-06-20T19:59:07.678+0300 [INFO] expiration: lease restore complete 2023-06-20T19:59:08.161+0300 [INFO] core: post-unseal setup complete 2023-06-20T19:59:08.162+0300 [INFO] core: root token generated 2023-06-20T19:59:08.162+0300 [INFO] core: pre-seal teardown starting 2023-06-20T19:59:08.162+0300 [INFO] rollback: stopping rollback manager 2023-06-20T19:59:08.162+0300 [INFO] core: pre-seal teardown complete 2023-06-20T19:59:08.162+0300 [INFO] core.cluster-listener.tcp: starting listener: listener_address=127.0.0.1:8201 2023-06-20T19:59:08.162+0300 [INFO] core.cluster-listener: serving cluster requests: cluster_listen_address=127.0.0.1:8201 2023-06-20T19:59:08.162+0300 [INFO] core: post-unseal setup starting 2023-06-20T19:59:08.163+0300 [INFO] core: loaded wrapping token key 2023-06-20T19:59:08.163+0300 [INFO] core: successfully setup plugin catalog: plugin-directory="" 2023-06-20T19:59:08.163+0300 [INFO] core: successfully mounted: type=system version="v1.13.2+builtin.vault" path=sys/ namespace="ID: root. Path: " 2023-06-20T19:59:08.163+0300 [INFO] core: successfully mounted: type=identity version="v1.13.2+builtin.vault" path=identity/ namespace="ID: root. Path: " 2023-06-20T19:59:08.163+0300 [INFO] core: successfully mounted: type=cubbyhole version="v1.13.2+builtin.vault" path=cubbyhole/ namespace="ID: root. Path: " 2023-06-20T19:59:08.164+0300 [INFO] core: successfully mounted: type=token version="v1.13.2+builtin.vault" path=token/ namespace="ID: root. Path: " 2023-06-20T19:59:08.165+0300 [INFO] core: restoring leases 2023-06-20T19:59:08.165+0300 [INFO] rollback: starting rollback manager 2023-06-20T19:59:08.165+0300 [INFO] expiration: lease restore complete 2023-06-20T19:59:08.165+0300 [INFO] identity: entities restored 2023-06-20T19:59:08.165+0300 [INFO] identity: groups restored 2023-06-20T19:59:08.166+0300 [INFO] core: post-unseal setup complete 2023-06-20T19:59:08.166+0300 [INFO] core: vault is unsealed 2023-06-20T19:59:08.169+0300 [INFO] core: successful mount: namespace="" path=secret/ type=kv version="" WARNING! dev mode is enabled! In this mode, Vault runs entirely in-memory and starts unsealed with a single unseal key. The root token is already authenticated to the CLI, so you can immediately begin using Vault. You may need to set the following environment variables: $ export VAULT_ADDR='http://127.0.0.1:8200' The unseal key and root token are displayed below in case you want to seal/unseal the Vault or re-authenticate. Unseal Key: aVcXjHfqh65SuXZWGo5+p7u0tT9Tq6723M0KmzWxrvE= Root Token: hvs.lbaAI3NfugcrEBJw2Nk4ddqW Development mode should NOT be used in production installations!
Если внимательно ознакомиться с выводом выше, то мы увидим, что Vault сообщает нам о том, что данный сервер запущен в режиме -dev. Также уже был пройден процесс распаковки и инициализации. Чтобы убедиться в этом, можно выполнить команду vault status, однако на текущем этапе она не сработает, поскольку мы, в качестве переменной, не определили адрес, к которому можно было бы обратиться. Сам Vault нам также об этом говорит. Не прерывая работу -dev режима, откройте ещё один терминал и выполните следующую команду:
export VAULT_ADDR='http://127.0.0.1:8200'
После этого попробуем выполнить проверку доступности Vault ещё раз:
vault status
Key Value
--- -----
Seal Type shamir
Initialized true
Sealed false
Total Shares 1
Threshold 1
Version 1.13.2
Build Date 2023-04-25T13:02:50Z
Storage Type inmem
Cluster Name vault-cluster-55f08ad5
Cluster ID 089fcdad-2533-c867-8a79-3d03d428c0aa
HA Enabled false
В выводе выше также содержится некоторая дополнительная информация. В данном случае мы видим, что Vault был инициализирован, распакован, обладает одним Shares, и т.д. Это всё, что необходимо для того, чтобы Vault успешно заработал. Теперь его можно использовать для создания секретов, политик и т.д., однако это тема будущих статей. Единственное, что я добавил бы прямо сейчас, так это возможность работы на 0.0.0.0. Потому что у меня, например, инстанс, на котором запущен Vault, находится в GCP. И без особых ухищрений по типу туннелей я не могу обратиться к нему напрямую. Так что давайте изменим данный параметр. В общем случае команда будет выглядеть следующим образом:
vault server -dev -dev-listen-address="0.0.0.0:8200"
И не забываем, что после выполнения представленной выше команды необходимо будет переопределить адрес сервера в переменной:
export VAULT_ADDR='http://0.0.0.0:8200'
vault status
Key Value --- ----- Seal Type shamir Initialized true Sealed false Total Shares 1 Threshold 1 Version 1.13.2 Build Date 2023-04-25T13:02:50Z Storage Type inmem Cluster Name vault-cluster-53d77ee3 Cluster ID 87b293b1-1033-850e-8378-f7f3c7f0dae7 HA Enabled false
Далее можно попытаться открыть Web-страницу в браузере, обратившись к IP-адресу или доменному имени того сервера, где был запущен сам Vault:

На рисунке выше видно, что для входа необходимо ввести токен. Сам токен присутствует прямо в выводе запуска Vault. В нашем случае это токен вида hvs.lbaAI3NfugcrEBJw2Nk4ddqW, который был показан ранее. Скопируем и вставим его в поле, а после нажмем на Sign In:

Мануальная установка Vault: Далее рассмотрим более правильный вариант того, как должен быть запущен сервер Vault, с минимальными настройками для работы. Всё также будет использоваться бинарный файл, расположенный по пути /usr/bin/vault. После необходимо создать директорию, в которой будет храниться конфигурационный файл. Сам файл назовем config.hcl:
sudo mkdir /etc/vault
sudo touch /etc/vault/config.hcl
К конфигурационному файлу мы ещё вернемся, а пока необходимо получить сертификаты, так как Vault, скажем так, в Production режиме без них работать не будет (вообще может, но для этого необходимо принудительно выключить tls, что не совсем правильно, раз уж речь идет о Production). В качестве сертификатов будет использоваться Let's Encrypt. Для этого понадобится публичный домен и IP-адрес сервера. Вам необязательно иметь публичный адрес сервера для успешного запуска, однако подразумевается, что если вы будете запускать Vault в закрытом периметре, то вы сможете подвязать домен и соответствующий сертификат. Итак, в моём случае мне необходимо получить сертификат от Let's Encrypt. Для этого выполним следующий ряд команд:
sudo zypper install -y certbot
sudo certbot certonly --standalone -d vault.kitezh.online
Successfully received certificate. Certificate is saved at: /etc/letsencrypt/live/vault.kitezh.online/fullchain.pem Key is saved at: /etc/letsencrypt/live/vault.kitezh.online/privkey.pem This certificate expires on 2023-09-18. These files will be updated when the certificate renews.
После того как сертификат был получен, вернемся к конфигурационному файлу. Откройте его по пути /etc/vault/config.hcl, если вы повторяли за мной и вставьте следующее содержимое:
ui = true
storage "file" {
path = "/etc/vault/data"
}
listener "tcp" {
address = "0.0.0.0:443"
tls_cert_file = "/etc/letsencrypt/live/vault.kitezh.online/fullchain.pem"
tls_key_file = "/etc/letsencrypt/live/vault.kitezh.online/privkey.pem"
tls_disable = "false"
}
Давайте разберемся из чего же состоит данный конфигурационный файл. UI, равное true, означает, что по умолчанию, при запуске Vault, он также будет доступен через браузер. Секция storage настраивает серверную часть хранилища, которая представляет собой место для долговременного хранения информации Vault. Существует множество различных бэкендов (так называются места хранения данных в терминологии Vault) для хранения, где каждый обладает своим рядом уникальных параметров. Я буду использовать вариант file, поскольку в таком случае серверная часть хранилища файловой системы будет хранить данные Vault, используя стандартную структуру каталогов. Вообще это самый простой вариант использования при условии, что мы всё-таки хотим запустить Vault в Production режиме. Такой вариант приемлем, когда мы точно знаем, что у нас будет использоваться один сервер Vault, а такие вещи, как отказоустойчивость и скалирование не находятся на первом месте. Секция listener определяет список параметров, которые необходимы для запуска и последующего поддержания сервера Vault в рабочем состоянии. По сути это информация о том, на каком адресе и порту будет работать Vault.
Примечание: Больше параметров, которые можно использовать в конфигурационном файле, можно найти по следующей ссылке – https://developer.hashicorp.com/vault/docs/configuration.
Сохраним представленный выше конфигурационный файл. Немного позже мы ещё вернёмся к нему, а пока что создадим ещё один конфигурационный файл, уже для запуска Vault с помощью systemd:
sudo vim /etc/systemd/system/vault.service
[Unit] Description=Vault Documentation=https://vault.io [Service] ExecStart=/usr/bin/vault server -config=/etc/vault/config.hcl ExecReload=/bin/kill -HUP $MAINPID LimitNOFILE=65536 [Install] WantedBy=multi-user.target
Тут всё просто. Указываем бинарный файл для запуска сервера с параметром -config, который ссылается на конфигурационный файл Vault, расположенный по пути /etc/vault/config.hcl (в моём случае).
Примечание: Это самый примитивный конфигурационный файл Systemd, необходимый для запуска Vault. На той же Ubuntu, если Vault устанавливать с помощью пакетного менеджера apt, то по умолчанию данный юнит уже будет создан, а его содержимое будет выражено следующим образом:
[Unit] Description="HashiCorp Vault - A tool for managing secrets" Documentation=https://developer.hashicorp.com/vault/docs Requires=network-online.target After=network-online.target ConditionFileNotEmpty=/etc/vault.d/vault.hcl StartLimitIntervalSec=60 StartLimitBurst=3 [Service] Type=notify EnvironmentFile=/etc/vault.d/vault.env User=vault Group=vault ProtectSystem=full ProtectHome=read-only PrivateTmp=yes PrivateDevices=yes SecureBits=keep-caps AmbientCapabilities=CAP_IPC_LOCK CapabilityBoundingSet=CAP_SYSLOG CAP_IPC_LOCK NoNewPrivileges=yes ExecStart=/usr/bin/vault server -config=/etc/vault.d/vault.hcl ExecReload=/bin/kill --signal HUP $MAINPID KillMode=process KillSignal=SIGINT Restart=on-failure RestartSec=5 TimeoutStopSec=30 LimitNOFILE=65536 LimitMEMLOCK=infinity [Install] WantedBy=multi-user.target
Далее осуществляем перезапуск демона и пробуем запустить сам Vault. Для этого понадобятся следующие команды:
sudo systemctl daemon-reload
sudo systemctl enable vault
sudo systemctl start vault
sudo systemctl status vault
● vault.service - Vault Loaded: loaded (/etc/systemd/system/vault.service; enabled; vendor preset: disabled) Active: active (running) since Tue 2023-06-20 20:18:08 UTC; 6s ago Docs: https://vault.io Main PID: 7648 (vault) Tasks: 7 (limit: 2283) CGroup: /system.slice/vault.service └─ 7648 /usr/bin/vault server -config=/etc/vault/config.hcl
Теперь попробуем вывести информацию о состоянии Vault:
vault status
Error checking seal status: Get "https://127.0.0.1:8200/v1/sys/seal-status": dial tcp 127.0.0.1:8200: connect: connection refused
Почему в моём случае была получена данная ошибка? Дело в том, что ранее, когда мы запускали Vault в режиме -dev, переменная VAULT_ADDR была определена со значением 127.0.0.1:8200. Однако сейчас Vault работает на 0.0.0.0, а к IP-адресу сервера была назначена А-запись с доменными именем vault.kitezh.online, поэтому и обращаться мы должны соответствующим образом:
export VAULT_ADDR="https://vault.kitezh.online:443"
vault status
Key Value --- ----- Seal Type shamir Initialized false Sealed true Total Shares 0 Threshold 0 Unseal Progress 0/0 Unseal Nonce n/a Version 1.13.3 Build Date 2023-06-06T18:12:37Z Storage Type file HA Enabled false
Примечание: К слову, если переменная ни коем образом не была определена, то сообщение об ошибке будет равнозначно тому, что было получено выше.
Другое дело. Теперь можно работать с Vault через командную строку, однако он всё ещё не был инициализирован. Исправим данный факт с помощью следующей команды:
vault operator init
Unseal Key 1: ICRju9MYAsqJWbMH/kpsLgiTP+xMe6fU7Cd8A8BX4cGb Unseal Key 2: m5LEy0j3Gw/OpI+rvu2qG2N3tp4LQrtuf9FYPmMwoydM Unseal Key 3: tc+iV4hPXiuWHKwv9o4WhIfzmUU4DBE8SJcLut2ABx1R Unseal Key 4: 1FOuvwDhL2KwscoW/B9o13fGOq+qnRTM/ZCcftlQdrxA Unseal Key 5: RNxJyqsWHHDSn1Wp4ig3HU8w6vYnjI3BDBcj9aBgJI7s Initial Root Token: hvs.Xj38SRgFMsFZI6E7nGKifxTo Vault initialized with 5 key shares and a key threshold of 3. Please securely distribute the key shares printed above. When the Vault is re-sealed, restarted, or stopped, you must supply at least 3 of these keys to unseal it before it can start servicing requests. Vault does not store the generated root key. Without at least 3 keys to reconstruct the root key, Vault will remain permanently sealed! It is possible to generate new unseal keys, provided you have a quorum of existing unseal keys shares. See "vault operator rekey" for more information.
Сообщение выше говорит о том, что Vault был инициализирован, но ещё не распакован. В этом нам помогут ключи Unseal, полученные ранее. Их необходимо обязательно где-нибудь сохранить, как и корневой токен, поскольку в случае потери очень трудно всё это будет восстановить. Теперь, чтобы распаковать Vault в моём случае, необходимо выполнить следующую последовательность команд:
vault operator unseal ICRju9MYAsqJWbMH/kpsLgiTP+xMe6fU7Cd8A8BX4cGb
vault operator unseal tc+iV4hPXiuWHKwv9o4WhIfzmUU4DBE8SJcLut2ABx1R
vault operator unseal RNxJyqsWHHDSn1Wp4ig3HU8w6vYnjI3BDBcj9aBgJI7s
Key Value --- ----- Seal Type shamir Initialized true Sealed true Total Shares 5 Threshold 3 Unseal Progress 1/3 Unseal Nonce 44744a4b-d90a-4e04-ec0e-fb0fbb87b352 Version 1.13.3 Build Date 2023-06-06T18:12:37Z Storage Type file HA Enabled false Key Value --- ----- Seal Type shamir Initialized true Sealed true Total Shares 5 Threshold 3 Unseal Progress 2/3 Unseal Nonce 44744a4b-d90a-4e04-ec0e-fb0fbb87b352 Version 1.13.3 Build Date 2023-06-06T18:12:37Z Storage Type file HA Enabled false Key Value --- ----- Seal Type shamir Initialized true Sealed false Total Shares 5 Threshold 3 Version 1.13.3 Build Date 2023-06-06T18:12:37Z Storage Type file Cluster Name vault-cluster-bb708744 Cluster ID c6b54357-295a-5b62-cf6b-469872c4872c HA Enabled false
Понятно, что с помощью дополнительных параметров можно было изменить как число Unseal Key, так и количество, необходимое для разархивирования Vault, однако в сценарии по умолчанию оно будет выглядеть именно так. Осталось только осуществить вход по токену и всё:
vault login
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.Xj38SRgFMsFZI6E7nGKifxTo token_accessor uz7mHBEQOzKVESEHl0N3toxT token_duration ∞ token_renewable false token_policies ["root"] identity_policies [] policies ["root"]
Дальнейшие действия, связанные с командной строкой Vault выходят за пределы повествования этой статьи. Так что об остальных возможностях Vault мы поговорим уже в следующий раз, однако несколько хитростей я всё же хотел бы отметить. Во-первых, чтобы постоянно не создавать себе переменную с адресом Vault, можно просто добавить команду в .bashrc:
echo export VAULT_ADDR="https://vault.kitezh.online:443" >> ~/.bashrc
Теперь, при следующем входе, эта переменная уже будет определена в системе. Также хотелось бы отметить, как можно добавить автодополнение для команд Vault. Сперва необходимо выполнить вот такую команду:
vault -autocomplete-install
Это установит автодополнение в систему. После чего нужно будет это самое автодополнение включить с помощью уже следующей команды:
complete -C /usr/bin/vault vault
Теперь, если начать использовать TAB после команды vault, то слова автоматически будут подставляться, в зависимости от введенных вами слов. Забыл добавить, что Web-версия также доступна по ссылке и всё это работает в режиме TLS:

В заключении хотелось бы вернуться к конфигурационному файлу Vault. Если вы всё же хотите запустить Vault в нормальном режиме, но у вас нет возможности использовать TLS, то в таком случае удалите строки с сертификатами и ключами, а в параметре tls_disable поставьте значение true:
ui = true
storage "file" {
path = "/etc/vault/data"
}
listener "tcp" {
address = "0.0.0.0:8200"
tls_disable = "true"
}
Послесловие: К слову, вы также можете использовать любой другой порт или вообще запустить Vault на локальном узле (127.0.0.1), а после, в качестве прокси-сервера, настроить Nginx. Я от данного варианта отказался потому, что эта статья, в первую очередь, направлена на ознакомление с самим Vault. Без каких-либо привязок к сторонним инструментам. Хотя на практике использование того же Nginx, Traefik или любого другого балансировщика нагрузки является предпочтительным вариантом. Но всё это тема для будущих статей. Сюда же можно добавить и случай с местом хранения данных. В этой статье мною был использован вариант file, поскольку он является самым простым и доступным, но когда речь пойдет HA, мы затронем и протокол Raft, и Consul. И как уже было сказано ранее, это первая статья из ещё одного цикла, который будет посвящен работе с Vault. Уже в следующей части мы более подробно рассмотрим то, как взаимодействовать с секретами. На этом всё.