Перейти к содержанию

▍Vault

Docker Logo

Установка и настройка Vault в docker

Vault — хранилище для паролей и любых других секретных данных, которые нежелательно хранить где-то в файлах, репозиториях или иных легкодоступных вариантах. Данные хранятся в формате ключ-значение (Key-Value). Доступ к этим данным осуществляются с помощью API.

Будем использования Traefik в качестве обратного прокси для маршрутизации трафика внутрь Docker контейнеров. Базовую конфигурацию Traefik можно посмотреть здесь.

Compose для Vault

version: '3.3'

services:
   vault:
        image: vault
        container_name: vault
        restart: always
        command: vault server -config=/vault/config/vault.json
        environment:
          - VAULT_ADDR=http://0.0.0.0:8200
          - VAULT_API_ADDR=http://0.0.0.0:8200
          - VAULT_ADDRESS=http://0.0.0.0:8200
        volumes:
          - $DIR_CONF/vault:/vault
          - $DIR_CONF/vault/file:/vault/file
        cap_add:
          - IPC_LOCK
        labels:
          - "traefik.enable=true"
          - "traefik.http.routers.vault.rule=Host(`vault.example.ru`)"
          - "traefik.http.routers.vault.entrypoints=https"
          - "traefik.http.routers.vault.tls=true"
          - "traefik.http.routers.vault.middlewares=WhitelistHome"
          - "traefik.http.services.vault.loadbalancer.server.port=8200"
          - "com.centurylinklabs.watchtower.enable=true"

Содержимое конфига vault.json:

{
  "listener":  {
    "tcp":  {
      "address":  "0.0.0.0:8200",
      "tls_disable":  "true"
    }
  },
  "backend": {
    "file": {
      "path": "/vault/file"
    }
  },
  "default_lease_ttl": "168h",
  "max_lease_ttl": "0h",
  "api_addr": "http://0.0.0.0:8200"
}

После запуска docker-compose up -d, проинициализируем оператора:

$ docker exec -it vault vault operator init
Unseal Key 1: ключ 1
Unseal Key 2: ключ 2
Unseal Key 3: ключ 3
Unseal Key 4: ключ 4
Unseal Key 5: ключ 5

Initial Root Token: рутовый ключ

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.

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

docker exec -it vault vault operator unseal <unseal key 1>
docker exec -it vault vault operator unseal <unseal key 2>
docker exec -it vault vault operator unseal <unseal key 3>

Логинимся под root’ом, указав вместо значение рутового токена, выданого командой operator init:

$ docker exec -it vault vault login <root token>
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                <root token>
token_accessor       ....................
token_duration       ∞
token_renewable      false
token_policies       ["root"]
identity_policies    []
policies             ["root"]

Активируем KV движок:

$ docker exec -it vault vault secrets enable -version=1 -path=secret kv
Success! Enabled the kv secrets engine at: secret/

Теперь мы можем писать:

$ docker exec -it vault vault kv put secret/foo bar=test
Success! Data written to: secret/foo

и читать данные из secret:

$ docker exec -it vault vault kv get --format=json secret/foo
{
  "request_id": "ee30c700-b909-b73d-e8e5-18a1e31882c0",
  "lease_id": "",
  "lease_duration": 604800,
  "renewable": false,
  "data": {
    "bar": "test"
  },
  "warnings": null
}

Всё, теперь можно обращаться к хранилищу по http, получать или сохранять секретные данные.

$ curl -H "X-Vault-Token: <root token>" -X GET https://vault.example.ru/v1/secret/foo -s | jq
{
  "request_id": "f6180aa6-8285-c66e-a6c2-87e746601fae",
  "lease_id": "",
  "renewable": false,
  "lease_duration": 604800,
  "data": {
    "bar": "test"
  },
  "wrap_info": null,
  "warnings": null,
  "auth": null
}

Более подробная документация по API Vault’а находится на сайте проекта — https://www.vaultproject.io/api-docs .

К началу