# HashiCorp Vault Self-hosted менеджер секретов с шифрованием, аудитом и fine-grained политиками доступа. ## Установка ```bash # Standalone (по умолчанию, 1 Pod) make addon-vault # HA (3 Pods с Raft, нужны минимум 3 ноды) make addon-vault ARGS="-e vault_mode=ha" # С авто-unseal через k8s Secret (homelab/dev) make addon-vault ARGS="-e vault_auto_unseal_type=k8s" # С AWS KMS авто-unseal (production) make addon-vault ARGS="-e vault_auto_unseal_type=aws -e vault_aws_kms_region=us-east-1 -e vault_aws_kms_key_id=..." # С Ingress make addon-vault ARGS="-e vault_ingress_enabled=true -e vault_ingress_host=vault.example.com" ``` ## Первичная инициализация (ручной режим) После установки Vault нужно инициализировать (только один раз): ```bash # Инициализация (генерирует unseal keys + root token) kubectl exec -n vault vault-0 -- vault operator init \ -key-shares=5 \ -key-threshold=3 # ВАЖНО: сохрани 5 unseal keys и root token в надёжное место! # Пример вывода: # Unseal Key 1: abc... # Unseal Key 2: def... # ... # Initial Root Token: hvs.xxxxx # Unseal (нужно подать 3 из 5 ключей) kubectl exec -n vault vault-0 -- vault operator unseal kubectl exec -n vault vault-0 -- vault operator unseal kubectl exec -n vault vault-0 -- vault operator unseal # Проверка kubectl exec -n vault vault-0 -- vault status ``` ## Авто-unseal режимы ### k8s Secret (homelab, не для production) ```bash make addon-vault ARGS="-e vault_auto_unseal_type=k8s" ``` Vault автоматически инициализируется и unseal keys сохраняются в k8s Secret `vault-unseal-keys`. Unsealer Deployment следит за состоянием и unseals при перезапуске. **Получить root token:** ```bash kubectl get secret vault-unseal-keys -n vault \ -o jsonpath='{.data.root_token}' | base64 -d ``` ### AWS KMS (production) ```yaml # group_vars/all/addons.yml vault_auto_unseal_type: "aws" vault_aws_kms_region: "us-east-1" vault_aws_kms_key_id: "arn:aws:kms:us-east-1:..." # group_vars/all/vault.yml vault_aws_kms_access_key: "AKIAIOSFODNN7EXAMPLE" vault_aws_kms_secret_key: "wJalrXUtnFEMI/K7MDENG/..." ``` ### Transit Seal (через другой Vault) ```yaml vault_auto_unseal_type: "transit" vault_transit_address: "https://vault-primary.example.com" vault_transit_key_name: "autounseal" # vault.yml: vault_transit_seal_token: "hvs.CAESIxxxxxx" ``` ## Работа с секретами ### CLI (локально через port-forward) ```bash # Port-forward kubectl port-forward -n vault svc/vault 8200:8200 & # Авторизация export VAULT_ADDR=http://localhost:8200 vault login # Включить KV v2 engine vault secrets enable -path=secret kv-v2 # Записать секрет vault kv put secret/myapp/config \ db_password="supersecret" \ api_key="abc123" # Прочитать секрет vault kv get secret/myapp/config vault kv get -field=db_password secret/myapp/config ``` ### CLI (из пода в кластере) ```bash kubectl exec -n vault vault-0 -- env VAULT_ADDR=http://localhost:8200 \ vault kv put secret/myapp/config db_password="supersecret" ``` ## Kubernetes Auth Method Позволяет подам авторизоваться через их ServiceAccount токен: ```bash # Включить kubernetes auth vault auth enable kubernetes # Настроить vault write auth/kubernetes/config \ kubernetes_host="https://kubernetes.default.svc.cluster.local:443" # Создать политику доступа vault policy write myapp-policy - <