Содержание

Vault

Защищать, хранить и строго контролировать доступ к защищенным ключам, паролям, сертификатам, ключам шифрования для защиты конфиденциальных данных с помощью пользовательского интерфейса, CLI или HTTP API.

Команды

https://www.vaultproject.io/docs/commands/

Политика

Пример создания политики на чтение всего пути devtest:

  1. Создать конфигурационный файл политики policy_devtest.hcl:
    path "devtest/*" {
      capabilities = ["read"]
    }
  2. Записать политику в vault:
    vault policy write devtest policy_devtest.hcl

https://www.vaultproject.io/docs/commands/policy/

Токен

Пример создания токена для политик devtest и devprod:

vault token create -period=24h -no-default-policy -display-name=dev -policy=devtest -policy=devprod

https://www.vaultproject.io/docs/commands/token/

API auth/token

Создать токен:

curl --header "X-Vault-Token: ..." --request POST --data '{"display_name":"devread", "no_default_policy": true,  "policies":["devprod", "devtest"], "period":"768h"}' http://vault.domain.com:8201/v1/auth/token/create

Посмотреть информацию о текущем токене (указан в –header):

curl --header "X-Vault-Token: ..." http://vault.domain.com:8201/v1/auth/token/lookup-self

Отозвать текущий токен (указан в –header):

curl --header "X-Vault-Token: ..." --request POST http://vault.domain.com:8201/v1/auth/token/revoke-self

https://www.vaultproject.io/api-docs/auth/token

API auth/ldap

Посмотреть текущую конфигурацию LDAP:

curl -H "X-Vault-Token:s...."  http://vault.domain.com:8200/v1/auth/ldap/config | jq

Посмотреть текущий список пользователей LDAP:

curl -H "X-Vault-Token:s...." --request LIST  http://vault.domain.com:8200/v1/auth/ldap/users | jq

Посмотреть пользователя l.login:

curl -H "X-Vault-Token:s...."  http://vault.domain.com:8200/v1/auth/ldap/users/l.login | jq

Обновить/задать политики («dev,ис») пользователю l.login:

curl -H "X-Vault-Token:s...." --request POST --data '{"policies":"dev,ИС"}' http://vault.domain.com:8200/v1/auth/ldap/users/l.login

https://www.vaultproject.io/api-docs/auth/ldap

API auth/jwt

Посмотреть текущую конфигурацию JWT:

curl -H "X-Vault-Token: s...." http://vault.domain.com:8200/v1/auth/jwt/config

Создать роль project_id_12 для giltab:

curl -H "X-Vault-Token: s...." --request POST --data '{"role_type": "jwt", "policies": ["devtest"], "token_no_default_policy":"true", "token_explicit_max_ttl": 60, "user_claim": "user_login", "bound_claims": {"project_id": "12", "ref": "master", "ref_type": "branch"} }' http://vault.domain.com:8200/v1/auth/jwt/role/project_id_12

Посмотреть список ролей:

curl --header "X-Vault-Token: s...." --request LIST http://vault.domain.com:8200/v1/auth/jwt/role

Удалить роль project_id_12:

curl --header "X-Vault-Token: s...." --request DELETE http://vault.domain.com:8200/v1/auth/jwt/role/project_id_12

https://www.vaultproject.io/api-docs/auth/jwt

KV

Получить данные хранилища devtest/foms-service:

Docker

Пример запуска в режиме сервера, в /data/docker/vault/vault_config находится конфигурационный файл local.hcl:

listener "tcp" {
    address = "0.0.0.0:8200"
    tls_disable = 1
}

storage "file" {
    path = "/vault/file"
}

api_addr = "http://vault.domain.com:8200"
ui = true
max_lease_ttl: "10h
default_lease_ttl: "10h"
docker run -d -p8200:8200 --cap-add=IPC_LOCK \
 -v /data/docker/vault/vault_config:/vault/config \
 -v /data/docker/vault/vault_file:/vault/file \
 -v /data/docker/vault/vault_logs:/vault/logs \
 -e VAULT_ADDR=http://127.0.0.1:8200 --name vault vault server

При первом запуске инициализируем хранилище:

docker exec vault vault operator init > /data/docker/vault/init.file

Распаковать/Unseal

docker exec vault vault operator unseal "`awk -F": " '/Unseal Key 1/ { print $2 }' /data/docker/vault/init.file`"
docker exec vault vault operator unseal "`awk -F": " '/Unseal Key 2/ { print $2 }' /data/docker/vault/init.file`"
docker exec vault vault operator unseal "`awk -F": " '/Unseal Key 3/ { print $2 }' /data/docker/vault/init.file`"

raft

docker-compose.yaml

docker-compose.yaml

version: '3.8'

volumes:
  vault:

services:
  vault:
    image: vault
    command:
      - server
    environment:
      VAULT_ADDR: 'http://127.0.0.1:8200'
      VAULT_API_ADDR: 'http://127.0.0.1:8200'
      VAULT_CLUSTER_ADDR: 'http://vault1.domain.com:8200'
      VAULT_LOCAL_CONFIG: |-
        {
          "backend": {
            "raft": {
              "node_id": "vault",
              "path": "/vault"
            }
          },
          "listener": {
            "tcp": {
              "address":"0.0.0.0:8200",
              "tls_disable":1
            }
          },
          "default_lease_ttl": "168h",
          "max_lease_ttl": "720h",
          "ui": true,
          "disable_mlock": true
        }
    ports:
      - 8200:8200
    volumes:
      - vault:/vault
    deploy:
      replicas: 1
      resources:
        limits:
          memory: 128m
    cap_add:
      - IPC_LOCK

Запустить в swarm и инициализировать:

docker stack deploy --compose-file docker-compose.yaml vault
CONTAINER=$(docker ps -q -f name=vault_vault)
docker exec $CONTAINER vault operator init | tee init.raft.file
for key in {1..3}; do docker exec $CONTAINER vault operator unseal "$(awk -F": " "/Unseal Key ${key}/ { print \$2 }" init.raft.file)"; done

Подключить к кластеру ноду:

docker stack deploy --compose-file docker-compose.yaml vault
CONTAINER=$(docker ps -q -f name=vault_vault)
docker exec $CONTAINER vault operator raft join http://vault1.domain.com:8200
for key in {1..3}; do docker exec $CONTAINER vault operator unseal "$(awk -F": " "/Unseal Key ${key}/ { print \$2 }" init.raft.file)"; done

Ссылки

https://www.vaultproject.io/
https://hub.docker.com/_/vault
https://learn.hashicorp.com/vault/#getting-started
https://devopscube.com/setup-hashicorp-vault-beginners-guide/