Skip to main content

Методы аутентификации в HashiCorp Vault

Методы аутентификации: Данные методы представляют собой компоненты в системе Vault, которые осуществляют аутентификацию и отвечают за назначение пользователю соответствующих прав и набора политик. Чаще всего Vault делегирует администрирование и принятие решений по аутентификации какому-либо настроенному внешнему методу аутентификации (например, AWS, GCP, GitHub, Kubernetes и т.д.). Наличие нескольких методов аутентификации позволяет вам использовать тот метод аутентификации, который наиболее подходит для вашего варианта использования Vault в вашей организации. Таким образом, каждый метод аутентификации имеет определенный вариант использования. Например, разработчикам проще всего использовать метод аутентификации GitHub, но для конечных серверов рекомендуется использовать метод AppRole. Прежде чем клиент сможет взаимодействовать с Vault в полной мере, он должен пройти аутентификацию с использованием одного из существующих методов аутентификации. При аутентификации генерируется специальный токен. Этот токен, концептуально, аналогичен идентификатору сеанса в веб-сайте. К токену может быть прикреплена политика, которая отображается во время аутентификации. Перейдем к более подробному ознакомлению с некоторыми методами аутентификации в Vault.

Аутентификация с помощью Token: Однако прежде, чем мы приступим, стоит немного пройтись по тому, как вообще устроены токены в Vault и какую функцию они выполняют. Итак, токен – это основной метод аутентификации в Vault. Токены можно использовать как напрямую, так и посредством использования методов аутентификации для динамического создания токенов на основе внешних прав. В первой части, когда мы устанавливали и запускали Vault, вы, вероятно, могли заметить, что сервер выводит изначальный корневой токен с бесконечным временем жизни. Это первый метод аутентификации для Vault. Это также единственный метод аутентификации, который нельзя отключить. Как указано в концепции об аутентификации, все внешние механизмы аутентификации, такие как GitHub, сопоставляются с динамически создаваемыми токенами. Эти токены имеют все те же свойства, что и обычные токены, созданные вручную. В Vault токены соответствуют информации. Наиболее важная информация, сопоставленная с токеном, представляет собой набор из одной или нескольких прикрепленных политик. Эти политики контролируют, что разрешено или запрещено делать держателю токена в Vault. Другая сопоставленная информация включает метаданные, которые можно просмотреть и добавить в журнал аудита, как, например, время создания, время последнего обновления и т. д.:

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

Исходный корневой токен, созданный во время инициализации оператора хранилища. Такой токен не имеет срока действия.
Использование другого корневого токена. Корневой токен с истекающим сроком действия не может создать корневой токен, срок действия которого никогда не истечет.
С помощью vault operator generate-root с разрешением кворума держателей Unseal Key.

Корневые токены полезны при разработке, но в производственной среде их следует тщательно охранять. Фактически, Vault рекомендует использовать корневые токены только для достаточной первоначальной настройки (обычно для настройки методов и политик аутентификации, необходимых для того, чтобы администраторы могли получать более ограниченные токены) или в чрезвычайных ситуациях, после решения которых такой токен должен быть сразу же отозван. Если необходим новый корневой токен, для его создания на лету можно использовать команду vault operator generate-root, упомянутая ранее, и связанную с ней конечную точку API. Вообще, начиная с Vault версии 1.0, существует два типа токенов: сервисные токены и пакетные токены. Рассмотрим каждый из типов токенов более подробно:

Service Tokens: Сервисные токены представляют собой тот тип токена, который пользователи обычно называют «обычными» токенами Vault. Они поддерживают все функции, такие как продление, отзыв, создание дочерних токенов и многое другое.
Batch Tokens: Пакетные токены представляют собой зашифрованные BLOB-объекты, содержащие достаточно информации, которую можно использовать для действий в Vault, но для их отслеживания не требуется место на диске. В результате чего они являются чрезвычайно легкими и масштабируемыми, но лишены большинства функций сервисных токенов.

Обычно, когда держатель токена создает новый токен, такой токен становится дочерним токеном. В свою очередь, если этот дочерний токен породит ещё один токен, то уже тот токен станет дочерним токеном для только что созданного токена. Когда родительский токен отзывают, все его дочерние токены также аннулируются. Это гарантирует, что пользователь не сможет избежать отзыва токена, просто создав бесконечное дерево дочерних токенов. Часто такое поведение нежелательно, поэтому пользователи с соответствующим доступом могут создавать бесхозные токены. У таких токенов нет родителя – они являются корнем для собственного дерева токенов. Эти бесхозные токены могут быть созданы одним из следующих способов:

Через доступ на запись к конечной точке auth/token/create-orphan.
Имея sudo или root-доступ к auth/token/create и устанавливая для параметра no_parent значение true.
Через роли хранилища токенов.
Войдя в систему с помощью любого другого метода аутентификации.

Примечание: Пользователи с соответствующими правами также могут использовать конечную точку auth/token/revoke-orphan, которая отменяет данный токен, однако при этом все дочерние токены продолжат свою работу, став бесхозными. Данный метод стоит использовать с крайней осторожностью.

Итак, как вам уже известно, метод аутентификации посредством токена встроен в Vault и автоматически доступен по пути /auth/token. Если выполнить вот такую команду:

vault auth list
Path        Type       Accessor                 Description
----        ----       --------                 -----------
token/      token      auth_token_ed139e53      token based credentials

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

vault login
Token (will be hidden):
WARNING! The VAULT_TOKEN environment variable is set! This takes precedence over the value set by this command. To use the value set by this command, unset the VAULT_TOKEN environment variable or set it to the token displayed below.

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.GtiNt0B0AOrgMH9zdTMrGwA8
token_accessor      Rl0NmTmxXBfRS2wANmG8ZuJg
token_duration      ∞
token_renewable     false
token_policies      ["root"]
identity_policies   []
policies            ["root"]

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

Usage: vault token <subcommand> [options] [args]

This command groups subcommands for interacting with tokens. Users can create, lookup, renew, and revoke tokens.

Please see the individual subcommand help for detailed usage information.

Subcommands:
   capabilities   Print capabilities of a token on a path
   create         Create a new token
   lookup         Display information about a token
   renew          Renew a token lease
   revoke         Revoke a token and its children

Теперь давайте создадим дочерний токен на основе корневого. Сделать это можно с помощью следующей команды:

vault token create
Key                 Value
---                 -----
token               hvs.i2rhRxBVGS14bUTM0i2fwg8C
token_accessor      5tLgv5pGJKVpx1bZA6hnaTQc
token_duration      ∞
token_renewable     false
token_policies      ["root"]
identity_policies   []
policies            ["root"]

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

vault token revoke hvs.i2rhRxBVGS14bUTM0i2fwg8C

Success! Revoked token (if it existed)

И несколько видоизменим команду для его повторного создания:

vault token create -policy=default
Key                 Value
---                 -----
token               hvs.CAESIPZuIZ6i3om5kzu0jY8kRyIw2de4A7K6uMG4yliZpknbGh4KHGh2cy5QN2wxcDN4VmJyc3Bqa3U3dmM4dTJZVlQ
token_accessor      vP6R3UBCQl2PRv4v01OHPIE8
token_duration      768h
token_renewable     true
token_policies      ["default"]
identity_policies   []
policies            ["default"]

Длина нашего токена была изменена, поскольку к нему была добавлена политика Default. Сейчас это не столь важно и в будущем мы отдельно затронем тему политик в Vault. Пока что стоит знать, что эта политика доступа в Vault по умолчанию. Она не предоставляет полные права, но кое-что всё же можно будет сделать. Также стоит обратить внимание на то, что время жизни токена изменилось. Теперь оно составляет 768 часов, что равно примерно одному месяцу. Если мы хотим явным образом указать желаемое время жизни для того или иного токена, необходимо выполнить следующую команду:

vault token create -policy=default -period=100h
Key                 Value
---                 -----
token               hvs.CAESIO3-prlzLywGxXMYzX-FjUgkVucLwPu5M7o5Dnl9jDuxGh4KHGh2cy5hcVNzdjJ5UHdTMHZLVUJIZjlkaDVRNks
token_accessor      m0nohVowhqNjvhFozJiBI4Fh
token_duration      100h
token_renewable     true
token_policies      ["default"]
identity_policies   []
policies            ["default"]

Однако, если мы попытаемся превысить данное значение, то получим предупреждение о том, что это невозможно, поскольку max_ttl равен 768 часам, что является значением по умолчанию:

WARNING! The following warnings were returned from Vault:

 * period of "1000h" exceeded the effective max_ttl of "768h"; period value is capped accordingly

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

max_lease_ttl = "10000h"
default_lease_ttl = "72h"

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

ui = true

max_lease_ttl = "10000h"
default_lease_ttl = "72h"

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"
}

Далее потребуется перезапуск Vault с помощью systemctl, а также его распаковка с помощью ключей Unseal. Параметр default_lease_ttl говорит о том, что теперь срок жизни каждого не корневого токена, который будет создан, равен 72 часам по умолчанию, а максимальное время жизни не должно превышать значение, которое будет выше 10000 часов. Исходя из этого попробуем создать новый токен с временем жизни в 2000 часов:

vault token create -policy=default -period=2000h
Key                 Value
---                 -----
token               hvs.CAESIE5bHFZ75fx5J9osMf-fH68PyhCrNaNRQTqQKekPqbuzGh4KHGh2cy5taThjblpJZFJiZzBMczV4V3ZRWExjMWc
token_accessor      e5It0ZzDDr1AG6alhi8RhAaW
token_duration      2000h
token_renewable     true
token_policies      ["default"]
identity_policies   []
policies            ["default"]

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

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

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

vault token create -policy=default -ttl=2000h
Key                 Value
---                 -----
token               hvs.CAESIK_gjn69bbG3dOFzZLkqMRMbiyZVqP81sgBc0DGLuNHZGh4KHGh2cy5FOU9xUlBnSmlETklRYkJ3bmtWVFBCQW8
token_accessor      W6pcAIWyS9rcvUNnhqFLRIxo
token_duration      2000h
token_renewable     true
token_policies      ["default"]
identity_policies   []
policies            ["default"]

Не вникая в детали результат кажется одни и тем же, но суть в том, что пользователь с правами root имеет возможность создавать периодические токены. На момент выпуска TTL периодического токена будет равен настроенному периоду. При каждом продлении TTL будет сбрасываться обратно на этот настроенный период, и пока токен успешно продлевается в течение каждого из этих периодов времени, срок его действия никогда не истечет. За исключением корневых токенов, в настоящее время это единственный способ иметь неограниченный срок действия токена в Vault. Это полезно для долго работающих служб, которые не могут обрабатывать повторное создание токена. Итак, вот мы создали токен с временем жизни в 2000 часов. Попробуем зайти, указав его:

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.CAESIE5bHFZ75fx5J9osMf-fH68PyhCrNaNRQTqQKekPqbuzGh4KHGh2cy5taThjblpJZFJiZzBMczV4V3ZRWExjMWc
token_accessor      e5It0ZzDDr1AG6alhi8RhAaW
token_duration      1995h26m29s
token_renewable     true
token_policies      ["default"]
identity_policies   []
policies            ["default"]

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

Error listing secrets engines: Error making API request.

URL: GET https://vault.kitezh.online:443/v1/sys/mounts
Code: 403. Errors:

* 1 error occurred:
       * permission denied

Зато в политику Default прописано взаимодействие с cubbyhole (подсистема секретов KV по умолчанию), что позволяет нам создать новый секрет, что мы, собственно, и сделаем:

vault kv put cubbyhole/test host=localhost
vault kv get cubbyhole/test
==== Data ====
Key    Value
---    -----
host   localhost

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

vault token create -policy=default -period=1000h -orphan
Key                 Value
---                 -----
token               hvs.CAESIA-Gau19WwmUX9y8KMxWEqgRk4bfe_KcU6AX7vmJsV9MGh4KHGh2cy5CdWQxaTJ2SFVBazNpZTNYUmlwYWpKMXo
token_accessor      i7gngmkBlVuWEI4P7sxuYgcD
token_duration      1000h
token_renewable     true
token_policies      ["default"]
identity_policies   []
policies            ["default"]

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

vault token lookup hvs.CAESIA-Gau19WwmUX9y8KMxWEqgRk4bfe_KcU6AX7vmJsV9MGh4KHGh2cy5CdWQxaTJ2SFVBazNpZTNYUmlwYWpKMXo
Key                Value
---                -----
accessor           i7gngmkBlVuWEI4P7sxuYgcD
creation_time      1694103352
creation_ttl       1000h
display_name       token
entity_id          n/a
expire_time        2023-10-19T08:15:52.393554517Z
explicit_max_ttl   0s
id                 hvs.CAESIA-Gau19WwmUX9y8KMxWEqgRk4bfe_KcU6AX7vmJsV9MGh4KHGh2cy5CdWQxaTJ2SFVBazNpZTNYUmlwYWpKMXo
issue_time         2023-09-07T16:15:52.393560728Z
meta               <nil>
num_uses           0
orphan             true
path               auth/token/create
period             1000h
policies           [default]
renewable          true
ttl                999h58m27s
type               service

Среди прочих атрибутов можно найти тот же orphan, который равен значению true, что говорит о том, что данный токен является бесхозным. Здесь также указано время жизни токена, его тип, дата создания, идентификатор и т.д. Иногда очень полезно получить такую информацию. Теперь давайте вернемся к токену, который был создан с временем жизни в 2000 часов. Сейчас его время жизни сократилось, о чем свидетельствует вывод ниже:

vault token lookup hvs.CAESIE5bHFZ75fx5J9osMf-fH68PyhCrNaNRQTqQKekPqbuzGh4KHGh2cy5taThjblpJZFJiZzBMczV4V3ZRWExjMWc
Key                Value
---                -----
accessor           e5It0ZzDDr1AG6alhi8RhAaW
creation_time      1694085020
creation_ttl       2000h
display_name       token
entity_id          n/a
expire_time        2023-11-29T19:10:20.139700548Z
explicit_max_ttl   0s
id                 hvs.CAESIE5bHFZ75fx5J9osMf-fH68PyhCrNaNRQTqQKekPqbuzGh4KHGh2cy5taThjblpJZFJiZzBMczV4V3ZRWExjMWc
issue_time         2023-09-07T11:10:20.139707874Z
meta               <nil>
num_uses           0
orphan             false
path               auth/token/create
period             2000h
policies           [default]
renewable          true
ttl                1994h45m32s
type               service

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

vault token renew hvs.CAESIE5bHFZ75fx5J9osMf-fH68PyhCrNaNRQTqQKekPqbuzGh4KHGh2cy5taThjblpJZFJiZzBMczV4V3ZRWExjMWc
Key                 Value
---                 -----
token               hvs.CAESIE5bHFZ75fx5J9osMf-fH68PyhCrNaNRQTqQKekPqbuzGh4KHGh2cy5taThjblpJZFJiZzBMczV4V3ZRWExjMWc
token_accessor      e5It0ZzDDr1AG6alhi8RhAaW
token_duration      2000h
token_renewable     true
token_policies      ["default"]
identity_policies   []
policies            ["default"]

И ещё один важный момент по поводу токенов. При создании токенов также создается и возвращается средство доступа к токену. Этот метод доступа представляет собой значение, которое действует как ссылка на токен и может использоваться только для выполнения ограниченного ряда действий, среди которых обновление токена, его отзыв, а также просмотр доступности токена. Существует множество полезных рабочих процессов, связанных с методами доступа к токенам. Например, служба, которая создает токены от имени другой службы (планировщик Nomad), может хранить метод доступа, связанный с определенным идентификатором задания. Когда задание завершается, метод доступа можно использовать для мгновенного отзыва токена, предоставленного заданию, и всех арендованных учетных данных, что ограничивает вероятность того, что потенциальный злоумышленник обнаружит и использует их. И, наконец, единственный способ составить список токенов – это использовать следующую команду:

vault list auth/token/accessors
Keys
----
1tI7ndiGjFcx9Mz42vZqfeNM
3utxC8j0hJIz66PKBftLul21
9SWBDgdgwdHzPgjfxp6OaXqA
9muBUCGWEaDlwMqGWlvbcTxp
CpCigFH5vMJnvRMw877btufs
CtaAsJYsq4pRzYOQ5hJ9fliL
EKuI5cF0VgQ0NDexNErrzcuu
EYcE79Z5vWSuOAbZJrPWKeSN
Fm8YdWEiRttuaDIGWHQmaXVy
GlSFG0ribgBl8DBpVKuvGpQ7
JtXlDuoBdCYASeoOmeCXD4Sp
N74X1yCHWslseEYBFhP7Q7ly
Rl0NmTmxXBfRS2wANmG8ZuJg
W6pcAIWyS9rcvUNnhqFLRIxo
ZCCpODQxQVeMonNh7ICumX1u
bJkn55AAZ6CYbCLEe57DRYge

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

vault list -format json auth/token/accessors | jq -r .[] | xargs -I '{}' vault token lookup -format json -accessor '{}' | jq -r 'select(.data.policies | any(. == "root"))'

На этом рассмотрение как аутентификации с помощью токенов, так и работу с ними в целом можно завершить. Далее перейдем к ознакомлению с ещё одним методом аутентификации в Vault.

Аутентификация с помощью метода Userpass: Метод аутентификации Userpass позволяет пользователям проходить аутентификацию в Vault, используя для этого комбинацию из имени пользователя и пароля. Комбинации, состоящие из имени пользователя и пароля настраиваются непосредственно для метода аутентификации с использованием userpass/. Данный метод не может считывать имена пользователей и пароли из внешнего источника. Этот метод также преобразует все отправленные имена пользователей в нижний регистр. Например, Opengrad и opengrad – это одна и та же запись. Метод аутентификации должен быть настроен заранее, прежде чем пользователь или сервис сможет пройти аутентификацию. Чтобы начать работу с методом Userpass, его необходимо включить. Сделать это можно с помощью следующей команды:

vault auth enable userpass

Success! Enabled userpass auth method at: userpass/

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

vault write auth/userpass/users/admin password=test policies=default

Success! Data written to: auth/userpass/users/admin

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

vault login -method userpass username=admin
Password (will be hidden):
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.CAESIGlMqHkNT7VfdRFOpZpIjPtYDu7w61975AK4_p9QIwZaGh4KHGh2cy5CRTdMNnZWUDcwamZHY0NBd0FPOElxQm0
token_accessor        PJEetJzUCpeZuffrD3aS46IR
token_duration        24h
token_renewable       true
token_policies        ["default"]
identity_policies     []
policies              ["default"]
token_meta_username   admin

Таким же образом мы можем войти и в веб-панель Vault:

К слову, необязательно использовать название Userpass при активации метода аутентификации. Можно указать собственное имя, задав его в виде пути. Выглядеть это будет вот так:

vault auth enable -path=opengrad userpass

Success! Enabled userpass auth method at: opengrad/

vault auth list
Path        Type       Accessor                 Description
----        ----       --------                 -----------
opengrad/   userpass   auth_userpass_ad238c9f   n/a
token/      token      auth_token_ed139e53      token based credentials
userpass/   userpass   auth_userpass_033fce13   n/a

Создадим ещё одного пользователя уже в подсистеме opengrad/:

vault write auth/opengrad/users/opengrad-user password=test policies=default

Success! Data written to: auth/opengrad/users/opengrad-user

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

vault login -method userpass -path=opengrad username=opengrad-user
Password (will be hidden):
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.CAESIA32R9pXp0BXn206ASG8sk0UGaConph3XoMoYwLAo2gIGh4KHGh2cy5JaVFPRnJWUTRIZEhlSXFGMVRIbmcya0o
token_accessor        4oyfplsj4RraBrPkqp4C40He
token_duration        24h
token_renewable       true
token_policies        ["default"]
identity_policies     []
policies              ["default"]
token_meta_username   opengrad-user

Это же касается и входа через веб-панель в Vault:

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

vault delete auth/opengrad/users/opengrad-user

Success! Data deleted at: auth/opengrad/users/opengrad-user

Аутентификация с помощью метода AppRole: Метод аутентификации AppRole позволяет узлам или приложениям проходить аутентификацию с использованием ролей, определенных в Vault. Открытый дизайн AppRole позволяет использовать разнообразный набор процессов и конфигураций для обработки большого количества приложений. Такой метод аутентификации ориентирован на автоматизированные рабочие процессы (узлы и службы) и менее полезен для людей. AppRole представляет собой набор политик и ограничений для входа, которые необходимо выполнить для получения токена с соответствующими правами. Область применения может быть как узкой, так и широкой по желанию. AppRole может быть создана для конкретного узла или даже для конкретного пользователя на этом узле, или для службы, распределенной по узлам. Учетные данные, необходимые для успешного входа в систему, зависят от ограничений, установленных для AppRole. Путь по умолчанию – /approle. Если этот метод аутентификации был включен по другому пути, укажите вместо него auth/<your_path>/login. Чтобы начать работу с методом AppRole, его необходимо включить. Сделать это можно с помощью следующей команды:

vault auth enable approle

Success! Enabled approle auth method at: approle/

Чтобы создать роль, используйте данную команду (параметры опциональны):

vault write auth/approle/role/my-role secret_id_ttl=10m token_num_uses=10 token_ttl=20m token_max_ttl=30m secret_id_num_uses=40

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

vault read auth/approle/role/my-role/role-id
Key       Value
---       -----
role_id   7a50fcd5-2f36-d80c-7c11-d81ab552f2a6

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

vault write -f auth/approle/role/my-role/secret-id
Key                  Value
---                  -----
secret_id            f4d43c52-e30d-a73b-0554-42de1f3ea4a6
secret_id_accessor   faaf7dca-c029-7de3-179b-04215ecf03e0
secret_id_num_uses   40
secret_id_ttl        10m

Теперь рассмотрим такие понятия, как Secret ID и Role ID более подробно:

Role ID: Это идентификатор, который выбирает AppRole, по которому оцениваются другие учетные данные. При использовании данного метода аутентификации Role ID всегда является обязательным аргументом. По умолчанию Role ID представляет собой уникальный UUID, который позволяет ему служить вторичным секретом для другой учетной информации. Однако ему могут быть присвоены определенные значения, чтобы соответствовать внутренней информации клиента (например, доменному имени клиента).
Secret ID: Это учетные данные, которые по умолчанию требуются для любого входа в систему и такие данные всегда должны оставаться секретными. Secret ID можно создавать для AppRole либо путем генерации 128-битного чисто случайного UUID самой ролью (режим Pull), либо с помощью определенных настраиваемых значений (режим Push). Подобно токенам, Secret ID имеют такие свойства, как лимит использования, TTL и срок действия.

Если Secret ID, используемый для входа в систему, извлекается из AppRole, он работает в режиме запроса. Если клиент устанавливает пользовательский Secret ID для AppRole, это называется режимом Push. Режим Push имитирует поведение устаревшего метода аутентификации App ID, однако в большинстве случаев режим Pull является лучшим подходом. Причина в том, что режим Push требует, чтобы какая-то другая система имела информацию о полном наборе учетных данных клиента (Role ID и Secret ID) для создания записи, даже если затем они распространятся по разным путям. Однако в режиме Pull, даже несмотря на то, что Role ID должен быть известен клиенту для распространения, Secret ID может оставаться конфиденциальным для всех сторон, за исключением конечного клиента, проходящего проверку подлинности, с помощью переноса ответов. Режим Push доступен для обеспечения совместимости рабочего процесса App ID, что в некоторых конкретных случаях предпочтительнее, но в большинстве случаев режим Pull более безопасен, поэтому предпочтение отдают именно ему. Более подробно об этом можно узнать в документации Vault.

Список используемых источников