Рассмотрим управление секретами на движке ключ-значение из командной строки на примере абстрактного сайта example.com.
Про установку и первоначальную настройку vault можно прочитать в заметке Установка и настройка Hashicorp Vault
После инициализации Vault выведет ключи для разблокировки и ключ для доступа (Initial Root Token)
$ vault operator initUnseal Key 1: x26BAGHHGKLQfX7EWkniO9Vm5Az0nGcVrzAkJhcykEe5
Unseal Key 2: S9FYGYz7ZEGGFfVcS7SQZlLO4XAXLX2gjLsOpCn/Xsjz
Unseal Key 3: ++2diNLZCXQYMrQ25WF+DN21ywgCqXMOYVcpOwjdrNgb
Unseal Key 4: 6m+4n3/3CIv4y70pyavvgD8Y+bx+TNFow/gQVoGm9Ljm
Unseal Key 5: eT8IJfDsUEiusKHRFB2P1EZtYGOttCRyTD90q+DuWfZ4
Initial Root Token: hvs.8rsmk76uxdDFFxFiZqOhfiPQ
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 login token=hvs.8rsmk76uxdDFFxFiZqOhfiPQСоздадим движок websites с типом KV версии 2
$ vault secrets enable -path=websites/ kv-v2Просмотрим имеющиеся хранилища
$ vault secrets list
Path Type Accessor Description
---- ---- -------- -----------
cubbyhole/ cubbyhole cubbyhole_b11f45a5 per-token private secret storage
identity/ identity identity_0c2e7173 identity store
sys/ system system_db7b6b37 system endpoints used for control, policy and debugging
websites/ kv kv_9a24d96d n/aДобавим в движок websites новую запись, например, логин и пароль базы данных
$ vault kv put -mount websites example.com db_user=example db_pass=example_passwordПосмотрим, что получилось
$ vault kv get -mount websites example.com
====== Secret Path ======
websites/data/example.com
======= Metadata =======
Key Value
--- -----
created_time 2026-03-21T08:51:06.052591061Z
custom_metadata <nil>
deletion_time n/a
destroyed false
version 1
===== Data =====
Key Value
--- -----
db_pass example_password
db_user example
Через командную имеем возможность генерировать пароли автоматически, например, утилитой pwgen, которую при необходимости можно установить командой
$ sudo apt install pwgen$ vault kv patch -mount websites example.com db_pass="$(pwgen 20 1)"Обратите внимание, что команда put полностью обновляет секрет, удаляя все имеющиеся данные и сохраняя только переданные ей ключи. Для обновления существующих ключей или добавления новых необходимо использовать команду patch
$ vault kv patch -mount websites example.com app_secret=$(pwgen 20 1 | md5sum | awk '{ print $1 }')
====== Secret Path ======
websites/data/example.com
======= Metadata =======
Key Value
--- -----
created_time 2026-03-21T09:02:51.177476705Z
custom_metadata <nil>
deletion_time n/a
destroyed false
version 6
$ vault kv get -mount websites example.com
====== Secret Path ======
websites/data/example.com
======= Metadata =======
Key Value
--- -----
created_time 2026-03-21T09:02:51.177476705Z
custom_metadata <nil>
deletion_time n/a
destroyed false
version 6
======= Data =======
Key Value
--- -----
app_secret b24b8f493088610be8902beeb0f8f771
db_pass eiy6eWaepaeYeecohsh1
db_user exampleУдалить версию секрета можно двумя командами: delete и destroy. После удаления версии секрета командой delete ее можно восстановить. Команда destroy полностью удаляет версию секрета, без возможности его восстановления
$ vault kv delete -mount websites example.com
Success! Data deleted (if it existed) at: websites/data/example.com
$ vault kv list -mount=websites
Keys
----
example.comЗапись существует, но последних данных в ней нет
$ vault kv get -mount websites example.com
====== Secret Path ======
websites/data/example.com
======= Metadata =======
Key Value
--- -----
created_time 2026-03-21T09:17:32.051902245Z
custom_metadata <nil>
deletion_time 2026-03-21T13:20:00.427637316Z
destroyed false
version 10
Чтобы узнать последнюю версию секретов, воспользуемся командой metadata
$ vault kv metadata get -mount websites example.com
======= Metadata Path =======
websites/metadata/example.com
========== Metadata ==========
Key Value
--- -----
cas_required false
created_time 2026-03-21T08:51:06.052591061Z
current_version 10
custom_metadata <nil>
delete_version_after 0s
last_updated_by map[actor:root client_id:0DHqvq2D77kL2/JTPSZkTMJbkFVmUu0TzMi0jiXcFy8= operation:delete]
max_versions 0
oldest_version 1
updated_time 2026-03-21T09:17:32.051902245Z
====== Version 1 ======
Key Value
--- -----
created_by {"actor":"root","client_id":"0DHqvq2D77kL2/JTPSZkTMJbkFVmUu0TzMi0jiXcFy8=","operation":"create"}
created_time 2026-03-21T08:51:06.052591061Z
deleted_by <nil>
deletion_time n/a
destroyed false
..............
===== Version 10 =====
Key Value
--- -----
created_by {"actor":"root","client_id":"0DHqvq2D77kL2/JTPSZkTMJbkFVmUu0TzMi0jiXcFy8=","operation":"update"}
created_time 2026-03-21T09:17:32.051902245Z
deleted_by {"actor":"root","client_id":"0DHqvq2D77kL2/JTPSZkTMJbkFVmUu0TzMi0jiXcFy8=","operation":"delete"}
deletion_time 2026-03-21T09:25:57.648995411Z
destroyed false
$ vault kv undelete -mount websites -versions=10 example.com
Success! Data written to: websites/undelete/example.com$ vault kv get -mount websites example.com
====== Secret Path ======
websites/data/example.com
======= Metadata =======
Key Value
--- -----
created_time 2026-03-21T09:17:32.051902245Z
custom_metadata <nil>
deletion_time n/a
destroyed false
version 10
======= Data =======
Key Value
--- -----
app_secret b24b8f493088610be8902beeb0f8f771
db_pass eiy6eWaepaeYeecohsh1
db_user example
Команда destroy безвозвратно удаляет указанную версию
$vault kv destroy -mount websites -versions=10 example.com
Success! Data written to: websites/destroy/example.com$ vault kv metadata get -mount websites example.com
======= Metadata Path =======
websites/metadata/example.com
========== Metadata ==========
Key Value
--- -----
cas_required false
created_time 2026-03-21T08:51:06.052591061Z
current_version 10
custom_metadata <nil>
delete_version_after 0s
last_updated_by map[actor:root client_id:0DHqvq2D77kL2/JTPSZkTMJbkFVmUu0TzMi0jiXcFy8= operation:update]
max_versions 0
oldest_version 1
updated_time 2026-03-21T09:17:32.051902245Z
====== Version 1 ======
Key Value
--- -----
created_by {"actor":"root","client_id":"0DHqvq2D77kL2/JTPSZkTMJbkFVmUu0TzMi0jiXcFy8=","operation":"create"}
created_time 2026-03-21T08:51:06.052591061Z
deleted_by <nil>
deletion_time n/a
destroyed false
.....
====== Version 9 ======
Key Value
--- -----
created_by {"actor":"root","client_id":"0DHqvq2D77kL2/JTPSZkTMJbkFVmUu0TzMi0jiXcFy8=","operation":"update"}
created_time 2026-03-21T09:16:56.265868825Z
deleted_by <nil>
deletion_time n/a
destroyed false
===== Version 10 =====
Key Value
--- -----
created_by {"actor":"root","client_id":"0DHqvq2D77kL2/JTPSZkTMJbkFVmUu0TzMi0jiXcFy8=","operation":"update"}
created_time 2026-03-21T09:17:32.051902245Z
deleted_by <nil>
deletion_time n/a
destroyed true
Полное удаление секрета осуществляется командой
$ vault kv metadata delete -mount websites example.com
Success! Data deleted (if it existed) at: websites/metadata/example.com$ vault kv list -mount=websites
No value found at websites/metadata