Установка HashiCorp Vault в Kubernetes (локально, через Helm)

Что такое Vault?

Vault — это инструмент от HashiCorp для безопасного хранения, управления и контроля доступа к секретам, таким как:

  • логины и пароли
  • токены API
  • сертификаты
  • ключи шифрования
  • временные учётные данные для облаков или баз данных

Vault позволяет:

  • выдавать временные токены доступа к системам
  • централизовать управление всеми секретами
  • автоматически ротацировать пароли и ключи
  • использовать гибкую систему policy и RBAC

Vault особенно хорош в микросервисной и Kubernetes-инфраструктуре:

  • поды могут безопасно запрашивать секреты (через Vault Agent или API)
  • доступ к секретам выдается строго по policy и ролям
  • интеграция с Kubernetes, AWS, GCP и другими провайдерами

Почему Vault лучше, чем .env файлы или Kubernetes Secrets

  • K8s Secrets не шифруются по умолчанию (только Base64)
  • Они не имеют политики жизни (TTL, revoke)
  • Vault поддерживает централизованное логирование, аудит и контроль
  • Vault умеет ротацию секретов и dynamic credentials

Общая задача

  • Установить Vault в Kubernetes-кластере
  • Работать без Web UI
  • Всё только через CLI/API
  • Учёт прокси, портов, NodePort, firewall

Пререквизиты

  • Kubernetes кластер работает (kubeadm, без Ingress)
  • helm >= 3.0
  • kubectl конфиг настроен
  • Vault CLI (ручная установка, т.к. Homebrew его больше не ставит)

Vault CLI (macOS arm):

curl -LO https://releases.hashicorp.com/vault/1.19.1/vault_1.19.1_darwin_arm64.zip
unzip vault_1.19.1_darwin_arm64.zip
chmod +x vault
sudo mv vault /usr/local/bin/

Конфиг vault-values.yaml

global:
  enabled: true
  tlsDisable: true

server:
  ha:
    enabled: false
  standalone:
    enabled: true
  dataStorage:
    enabled: true
    size: 2Gi

  ui:
    enabled: false

  service:
    type: ClusterIP

  extraEnvironmentVars:
    VAULT_LOG_LEVEL: debug
    VAULT_UI: "false"

  readinessProbe:
    enabled: false
  livenessProbe:
    enabled: false

Helm install (с прокси)

Если HashiCorp блокирует страну, нужен прокси:

export https_proxy=http://127.0.0.1:7890
export http_proxy=http://127.0.0.1:7890
export all_proxy=socks5://127.0.0.1:7890

Добавить repo

helm repo add hashicorp https://helm.releases.hashicorp.com
helm repo update

Установка Vault:

helm install vault hashicorp/vault \
  --namespace vault --create-namespace \
  -f vault-values.yaml

Важно: PVC и Pending

По умолчанию Vault создаёт PersistentVolumeClaim.

Варианты решения:

  1. Отключить dataStorage.enabled: false (тогда Vault работает в RAM)
  2. Установить local-path-provisioner:
kubectl apply -f https://raw.githubusercontent.com/rancher/local-path-provisioner/master/deploy/local-path-storage.yaml
kubectl patch storageclass local-path -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'

Инициализация Vault

kubectl -n vault exec -ti vault-0 -- /bin/sh
vault operator init

Сохрани Unseal Keys (3+)

Сохрани Root Token

Unseal:

vault operator unseal <key1>
vault operator unseal <key2>
vault operator unseal <key3>

CLI-доступ

Через port-forward (если нужно локально):

kubectl -n vault port-forward svc/vault 8200:8200
export VAULT_ADDR=http://127.0.0.1:8200

Через NodePort (если временно нужен доступ снаружи):

  1. Узнай IP ноды Vault:
kubectl -n vault get pod -o wide
  1. Убедись, что на этой ноде порт слушает:
ss -tuln | grep 32000

Если нет — kube-proxy не пробросил, pod находится на другой ноде.

Web UI: запрещен

  • UI отключен во имя безопасности
  • Vault доступен только из подов
  • Все операции через CLI/API

Готово для:

  • vault secrets enable kv-v2
  • vault kv put secret/myapp/config username=admin password=hunter2
  • vault auth enable kubernetes
  • и дальше по политикам, ролям, JWT и ServiceAccount

Заключение

Это реалистичный, CLI-ориентированный старт Vault-сетапа. Без веб-гламура, но зато контролируемо, безопасно и в стиле SRE. Используйте его как фундамент для построения production-инфраструктуры с безопасным управлением секретами.