Настройка Vault Agent Templates

Thank you for reading this post, don't forget to subscribe!

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

Настройка Vault Server

На сто­роне сер­ве­ра мы созда­дим тесто­вый сек­рет (ключ-зна­че­ние), поли­ти­ку досту­па к дан­но­му сек­ре­ту и роль, кото­рая будет при­вя­за­на к создан­ной поли­ти­ке. Рас­смот­рим про­цесс по шагам.

1. Раз­ре­ша­ем меха­низм kv (key-value):

vault secrets enable -path=secret/ kv

Созда­ем секрет:

vault kv put secret/applications/myapp/db login=db_user password=db_password

* в дан­ном при­ме­ре мы созда­ли 2 запи­си по пути secret/applications/myapp/db — login со зна­че­ни­ем db_user и password с db_password.

Посмот­реть добав­лен­ные стро­ки мож­но командой:

vault kv get secret/applications/myapp/db

2. Созда­ем поли­ти­ку досту­па к секрету:

vault policy write pl-agent-app-test - << EOF
path "secret/data/applications/myapp/*" {
capabilities = ["read"]
}
path "secret/metadata/applications/myapp/*" {
capabilities = ["list"]
}
EOF

* в дан­ном при­ме­ре мы раз­ре­ша­ем чте­ние всех эле­мен­тов внут­ри secret/applications/myapp.

3. Созда­ем роль:

vault write -f auth/approle/role/agent-app-test policies="pl-agent-app-test"

* обра­ти­те вни­ма­ние, что мы при­вя­за­ли нашу роль к ранее создан­ной поли­ти­ке pl-agent-app-test.

Смот­рим иден­ти­фи­ка­тор роли:

vault read auth/approle/role/agent-app-test/role-id

При­мер ответа:

Сохра­ня­ем role_id — он нам нужен для настрой­ки агента.

Созда­ем сек­рет secret-id:

vault write -f auth/approle/role/agent-app-test/secret-id

Мы долж­ны уви­деть что-то на подобие:

Сохра­ня­ем secret_id — он нам нужен для настрой­ки агента.

Установка и запуск Vault Agent

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

Нам нуж­ны будут неко­то­рые пакеты.

а) для Ubuntu / Debian:

apt-get install wget unzip

б) для CentOS / Red Hat:

yum install wget unzip

После пере­хо­дим на стра­ни­цу загруз­ки Vault и в раз­де­ле «Release Information» копи­ру­ем ссыл­ку на бинар­ник для под­хо­дя­щей опе­ра­ци­он­ной систе­мы, например:

* в дан­ном при­ме­ре мы копи­ру­ем ссыл­ку на архив под систе­му Linux x64.

Исполь­зуя ссыл­ку, загру­жа­ем на ком­пью­тер архив:

wget https://releases.hashicorp.com/vault/1.7.2/vault_1.7.2_linux_amd64.zip

Рас­па­ко­вы­ва­ем ска­чан­ный архив:

unzip vault_*.zip -d /usr/bin/

* рас­па­ков­ка выпол­ня­ет­ся в ката­лог /usr/bin.

Созда­ем ката­лог для хра­не­ния кон­фи­гу­ра­ции vault:

mkdir -p /etc/vault/templates

Созда­дим кон­фи­гу­ра­ци­он­ный файл:

vi /etc/vault/vault.conf

* где обра­ща­ем вни­ма­ние на опции:

  • address — адрес до сер­ве­ра Vault.
  • destination — путь до фай­ла, где будут сохра­не­ны резуль­та­ты обра­бот­ки шаблона.

Созда­ем файлы.

а) Ранее полу­чен­ный иден­ти­фи­ка­тор роли (role_id):

vi /etc/vault/roleid

ffe4397a-f660-e513-f007-c45c0353badf

б) Сек­рет для роли (ранее полу­чен­ный secret_id):

vi /etc/vault/secretid

91318b1c-de35-546a-9c5a-2d434b6365aa

в) Шаб­лон:

vi /etc/vault/templates/template.ctmpl

* где:

  • secret/applications/myapp/db — путь, по кото­ро­му мы сохра­ни­ли наши секреты.
  • .Data.data.login — кон­струк­ция для извле­че­ния зна­че­ния клю­ча login.
  • .Data.data.password — кон­струк­ция для извле­че­ния зна­че­ния клю­ча password.

Запус­ка­ем агента:

vault agent -config /etc/vault/vault.conf

На экране мы долж­ны уви­деть что-то на подобие:

2021-05-28T15:34:50.594+0300 [INFO]  auth.handler: renewed auth token
[INFO] (runner) rendered "/etc/vault/templates/template.ctmpl" => "/etc/vault/templates/render.txt"

Это зна­чит, что агент полу­чил дан­ные и внес их в файл /etc/vault/templates/render.txt соглас­но шаблону.

Остав­ля­ем рабо­тать аген­та и созда­ем допол­ни­тель­ное под­клю­че­ние к сер­ве­ру по SSH. Смот­рим содер­жи­мое фай­ла сфор­ми­ро­ван­но­го файла:

cat /etc/vault/templates/render.txt

Мы долж­ны увидеть:

login: db_user
passwd: db_password

* мы долж­ны уви­деть наши логин и пароль, кото­рые мы занес­ли в Vault.

Теперь пере­хо­дим к сер­ве­ру Vault и меня­ем секрет:

vault kv put secret/applications/myapp/db login=db_user password=db_password2

Ждем око­ло 5 минут — агент дол­жен выве­сти на экран сообщение:

[INFO] (runner) rendered "/etc/vault/templates/template.ctmpl" => "/etc/vault/templates/render.txt"

А содер­жи­мое фай­ла /etc/vault/templates/render.txt долж­но изме­нить­ся. Агент рабо­та­ет. Идем дальше.

Автоматический запуск

Настро­им запуск наше­го аген­та в каче­стве сервиса.

Откры­ва­ем на редак­ти­ро­ва­ние кон­фи­гу­ра­ци­он­ный файл для агента:

vi /etc/vault/vault.conf

Ком­мен­ти­ру­ем строку:

#pid_file = "./pidfile"

* для сер­ви­са мы созда­дим свой путь до pid-файла.

Созда­ем новый юнит в systemd:

vi /usr/lib/systemd/system/vault-agent.service

Пере­чи­ты­ва­ем кон­фи­гу­ра­цию systemd:

systemctl daemon-reload

Стар­ту­ем сервис:

systemctl start vault-agent

Про­ве­ря­ем, что он работает:

systemctl status vault-agent

Раз­ре­ша­ем его автозапуск:

systemctl enable vault-agent

Попро­бу­ем про­ве­рить, что наш агент рабо­та­ет. На сер­ве­ре Vault меня­ем секрет:

vault kv put secret/applications/myapp/db login=db_user password=db_password3

При­мер­но, через 30 секунд, проверяем:

cat /etc/vault/templates/render.txt

Дан­ные долж­ны обновиться.

Выполнение команд

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

Настройка Vault Server

На сто­роне сер­ве­ра нам нуж­но создать сек­рет. Для это­го выпол­ня­ем команду:

vault kv put secret/servers/myserver/ssh login=test_user password=password_1

Смот­рим содержимое:

vault kv get secret/servers/myserver/ssh

Рас­ши­рим пра­ва ранее создан­ной нами политике:

* раз­ре­ша­ем чте­ние сек­ре­тов по пути secret/servers/myserver и secret/metadata/servers/myserver.

Мы гото­вы про­дол­жить. Пере­хо­дим на агента.

Настройка агента

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

useradd test_user

Откро­ем на редак­ти­ро­ва­ние наш кон­фи­гу­ра­ци­он­ный файл:

vi /etc/vault/vault.conf

Доба­вим в конец:

* где:

  • create_dest_dirs — создать авто­ма­ти­че­ски ката­лог destination, если его нет.
  • source — путь до исход­но­го шаб­лон-фай­ла, на осно­ве кото­ро­го будет созда­вать­ся файл destination.
  • destination — путь до конеч­но­го фай­ла, кото­рый будет сфор­ми­ро­ван на осно­ве source.
  • command — коман­да, кото­рая долж­на быть выпол­не­на, если изме­нил­ся destination.

Откро­ем файл шаблона:

vi /etc/vault/templates/passwd.ctmpl

Пере­за­пу­стим агента:

systemctl restart vault-agent

Проверка

Теперь на сто­роне сер­ве­ра попро­бу­ем поме­нять пароль для учет­ной запи­си, кото­рая хра­нит­ся в Vault:

vault kv put secret/servers/myserver/ssh login=test_user password=password_2

На кли­ен­те в логе мы долж­ны уви­деть строку:

[INFO] (runner) rendered "/etc/vault/templates/passwd.ctmpl" => "/scripts/passwd.sh"

Changing password for user test_user.
passwd: all authentication tokens updated successfully.

Мож­но попро­бо­вать зай­ти под учет­ной запи­сью test_user с паро­лем password_2.