▍Vault¶
Установка и настройка 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’ом, указав вместо
$ 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/
Теперь мы можем писать:
и читать данные из 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 .