Что такое HashiCorp Vault?

HashiCorp Vault — это инструмент для безопасного управления секретами, токенами, паролями, сертификатами и другими конфиденциальными данными. Vault предоставляет централизованное хранилище с детальным контролем доступа, аудитом и шифрованием данных.

Ключевые возможности Vault

  • Безопасное хранение секретов — шифрование и контроль доступа к конфиденциальным данным
  • Dynamic secrets — генерация временных учетных данных с автоматическим истечением
  • Encryption as a Service — API для шифрования и расшифровки данных
  • Identity-based access — интеграция с системами идентификации и авторизации
  • Audit logging — полный аудит всех операций доступа к секретам
  • Secret rotation — автоматическая ротация паролей и ключей
  • PKI управление — выпуск и управление сертификатами

Установка Vault

 1# Установка через пакетный менеджер
 2# Ubuntu/Debian
 3curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add -
 4sudo apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main"
 5sudo apt-get update && sudo apt-get install vault
 6
 7# CentOS/RHEL
 8sudo yum install -y yum-utils
 9sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
10sudo yum -y install vault
11
12# Или скачать бинарник
13wget https://releases.hashicorp.com/vault/1.15.0/vault_1.15.0_linux_amd64.zip
14unzip vault_1.15.0_linux_amd64.zip
15sudo mv vault /usr/local/bin/

Запуск Vault в dev режиме

1# Запуск development сервера
2vault server -dev
3
4# В другом терминале
5export VAULT_ADDR='http://127.0.0.1:8200'
6export VAULT_TOKEN="hvs.example-token"
7
8# Проверка статуса
9vault status

Базовые операции с секретами

 1# Запись секрета
 2vault kv put secret/myapp username=admin password=secret123
 3
 4# Чтение секрета
 5vault kv get secret/myapp
 6
 7# Получение в JSON формате
 8vault kv get -format=json secret/myapp
 9
10# Удаление секрета
11vault kv delete secret/myapp

Конфигурация Vault для production

 1# vault.hcl
 2storage "consul" {
 3  address = "127.0.0.1:8500"
 4  path    = "vault/"
 5}
 6
 7listener "tcp" {
 8  address     = "0.0.0.0:8200"
 9  tls_cert_file = "/path/to/cert.pem"
10  tls_key_file  = "/path/to/key.pem"
11}
12
13seal "awskms" {
14  region     = "us-east-1"
15  kms_key_id = "alias/vault-key"
16}
17
18ui = true
19log_level = "INFO"
20cluster_name = "vault-cluster"

Инициализация и распечатка Vault

 1# Инициализация Vault
 2vault operator init
 3
 4# Распечатка Vault (требуется несколько ключей)
 5vault operator unseal <unseal-key-1>
 6vault operator unseal <unseal-key-2>
 7vault operator unseal <unseal-key-3>
 8
 9# Аутентификация
10vault auth <root-token>

Настройка аутентификации

 1# Включение LDAP аутентификации
 2vault auth enable ldap
 3
 4# Настройка LDAP
 5vault write auth/ldap/config \
 6    url="ldap://ldap.example.com" \
 7    userdn="ou=Users,dc=example,dc=com" \
 8    groupdn="ou=Groups,dc=example,dc=com" \
 9    userattr=uid \
10    groupattr=cn
11
12# Включение Kubernetes аутентификации
13vault auth enable kubernetes
14
15# Настройка Kubernetes auth
16vault write auth/kubernetes/config \
17    token_reviewer_jwt="<service-account-jwt>" \
18    kubernetes_host="https://kubernetes.example.com" \
19    kubernetes_ca_cert=@ca.crt

Dynamic Secrets для базы данных

 1# Включение database secrets engine
 2vault secrets enable database
 3
 4# Настройка подключения к PostgreSQL
 5vault write database/config/my-postgresql-database \
 6    plugin_name=postgresql-database-plugin \
 7    connection_url="postgresql://{{username}}:{{password}}@localhost:5432/postgres" \
 8    allowed_roles="my-role" \
 9    username="vault" \
10    password="mypassword"
11
12# Создание роли
13vault write database/roles/my-role \
14    db_name=my-postgresql-database \
15    creation_statements="CREATE ROLE \"{{name}}\" WITH LOGIN PASSWORD '{{password}}' VALID UNTIL '{{expiration}}'; \
16        GRANT SELECT ON ALL TABLES IN SCHEMA public TO \"{{name}}\";" \
17    default_ttl="1h" \
18    max_ttl="24h"
19
20# Получение динамических credentials
21vault read database/creds/my-role

PKI Engine для сертификатов

 1# Включение PKI engine
 2vault secrets enable pki
 3
 4# Настройка TTL
 5vault secrets tune -max-lease-ttl=87600h pki
 6
 7# Генерация root CA
 8vault write -field=certificate pki/root/generate/internal \
 9    common_name="example.com" \
10    ttl=87600h > CA_cert.crt
11
12# Создание роли
13vault write pki/roles/example-dot-com \
14    allowed_domains="example.com" \
15    allow_subdomains=true \
16    max_ttl="720h"
17
18# Выпуск сертификата
19vault write pki/issue/example-dot-com common_name="test.example.com"

Интеграция с приложениями

 1# Python клиент
 2import hvac
 3
 4# Подключение к Vault
 5client = hvac.Client(url='https://vault.example.com:8200')
 6client.token = 'your-vault-token'
 7
 8# Чтение секрета
 9response = client.secrets.kv.v2.read_secret_version(path='myapp')
10username = response['data']['data']['username']
11password = response['data']['data']['password']
12
13# Запись секрета
14client.secrets.kv.v2.create_or_update_secret(
15    path='myapp',
16    secret=dict(username='admin', password='newpass')
17)

Vault Agent для автоматической аутентификации

 1# vault-agent.hcl
 2exit_after_auth = true
 3pid_file = "./pidfile"
 4
 5auto_auth {
 6  method "kubernetes" {
 7    mount_path = "auth/kubernetes"
 8    config = {
 9      role = "demo"
10    }
11  }
12
13  sink "file" {
14    config = {
15      path = "/home/vault/.vault-token"
16    }
17  }
18}
19
20template {
21  source      = "/etc/vault/db.tpl"
22  destination = "/etc/app/db.conf"
23}

Сценарии использования Vault

  • Централизованное управление секретами — замена переменных окружения и config файлов
  • Database credentials rotation — автоматическая смена паролей БД
  • PKI и управление сертификатами — выпуск и ротация SSL сертификатов
  • API ключи и токены — безопасное хранение и распределение API ключей
  • Шифрование данных — encryption as a service для приложений
  • CI/CD интеграция — безопасное получение секретов в пайплайнах

Когда НЕ использовать Vault

  • Простые проекты без критичных секретов
  • Команды без DevOps экспертизы для администрирования
  • Ограниченные ресурсы для поддержки инфраструктуры
  • Legacy системы без возможности API интеграции
  • Очень маленькие команды с простыми требованиями

Альтернативы Vault

  • AWS Secrets Manager — управляемый сервис от AWS
  • Azure Key Vault — решение от Microsoft Azure
  • Google Secret Manager — сервис от Google Cloud
  • CyberArk — enterprise решение для больших организаций
  • Kubernetes Secrets — встроенные секреты Kubernetes
  • Doppler — современная платформа управления секретами

Best Practices

  • Используй короткие TTL для dynamic secrets
  • Настрой audit logging для всех операций
  • Используй auto-unseal в production
  • Реплицируй Vault для высокой доступности
  • Ограничивай доступ через политики и роли
  • Регулярно ротируй unseal ключи

FAQ

Сложно ли настроить Vault?

Базовая настройка простая, но production-ready конфигурация требует понимания принципов безопасности и инфраструктуры. Рекомендуется изучить документацию и best practices.

Можно ли интегрировать Vault с CI/CD?

Да, Vault отлично интегрируется с Jenkins, GitLab CI, GitHub Actions и другими CI/CD системами через API или специальные плагины.

Как обеспечить высокую доступность Vault?

Используй кластерную конфигурацию с несколькими узлами, настрой репликацию данных и используй load balancer для распределения нагрузки.