Меню Закрыть

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

Рассмотрим управление секретами на движке ключ-значение из командной строки на примере абстрактного сайта example.com.

Про установку и первоначальную настройку vault можно прочитать в заметке Установка и настройка Hashicorp Vault

После инициализации Vault выведет ключи для разблокировки и ключ для доступа (Initial Root Token)

$ vault operator init
Unseal 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