Интеграция Saltstack и Vault

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

https://docs.saltstack.com/en/latest/ref/modules/all/salt.modules.vault.html

https://support.saltstack.com/Third-party_Solutions/HashiCorp/Quick_Guide_to_Vault_Integration

https://medium.com/@aratik711/saltstack-and-vault-integration-20eeb2e7ec9c

https://backbeat.tech/blog/secure-servers-with-saltstack-and-vault-part-2/

Интеграция предполагает множество вариантов, в которых не так-то просто разобраться.

Я предлагаю сосредоточиться на общей картине, поэтому нарисовал следующее:

 

 Я пока использую довольно старую версию saltstack - 2017.7.8, поэтому работа saltstack и vault идет только через токены.

UPDATE: с версии 2018 (или 2019)  salt master теперь от себя (т.е. со своим токеном) не делает запросы для pillar.get, все запросы теперь идут с токенами миниона. В свою очередь это выливается в существенно более медленную работу стейтов, если для рендеринга пилларов надо много раз сходить в vault (мы об это больно наступили -  в версии 2017 поместив много пилларов в vault, смигрировав на 2019 версию, после этого стейты начали работать оочень медленно(~3 мин вместо ~20сек) )

Условно для себя я выделяю 3 текущих способа взаимодействия saltstack и vault:

  1.  Конфигурирование политик vault из saltstack
  2. Чтение/изменение секретов из salt
  3.  Подключение ext_pillar с данными, взятыми из vault

Данные 3 ситуации и попытался изобразить на картинке.

 1. Приведу минимальный стейт-файл states/base/vault/policies.sls для конфигурирования политик:

{# master only generate tokens with different policies for salt minions #}
policy_saltstack_master:
  vault.policy_present:
    - name: policy_saltstack_master
    - rules: |
        path "auth/token/*" {
          capabilities = ["create", "update", "delete", "sudo"]
        }

policy_saltstack_minion:
  vault.policy_present:
    - name: policy_saltstack_minion
    - rules: |
        path "sys/policy/*" {
          capabilities = ["create", "read", "update", "list"]
        }
 

Cоздаем токен с политикой для salt master, с помощью которого будем генерировать токены для произвольных политик. В частности, будут генерироваться токены для минионов, которые смогут конфигурировать политики в vault.

Изначально данные политики необходимо создать руками (vault policy write), а только потом уже перенести в соответствующий стейт. После этого уже можем добавлять/изменять политики через saltstack.

Кусок конфига мастера:

    vault:
      url: https://vault.test.ru
      auth:
        method: token
        token: "s.d5...B7p"
      policies:
        - policy_saltstack_minion
    peer_run:
      '.*':
        - vault.generate_token

 

2. Читать и изменять секреты из vault - тут ничего необычного, все согласно документации, работает схоже с п.1

3. salt, pillar, vault: из отличий - к vault "ходит"  сам salt master, а не минионы как в предыдущих случаях. Подключение ext_pillar - судя по всему, организовать вложенные пиллары из vault не получится.

 

Please publish modules in offcanvas position.