Home » Как безопасно управлять секретами с HashiCorp Vault на Ubuntu 24
Как безопасно управлять секретами с HashiCorp Vault на Ubuntu 24

Как безопасно управлять секретами с HashiCorp Vault на Ubuntu 24

Хранение секретов в plain text, переменных окружения или конфигах — это как оставлять ключи от квартиры под ковриком. Рано или поздно кто-то найдёт их и воспользуется. HashiCorp Vault — это как сейф в банке для всех ваших паролей, API-ключей и сертификатов. Мы разберём, как правильно настроить и использовать Vault на Ubuntu 24, чтобы ваши секреты были в безопасности, а доступ к ним был удобным и контролируемым.

Что такое HashiCorp Vault и зачем он нужен

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

  • Централизованное хранение — все секреты в одном месте
  • Аудит и логирование — кто, когда и что запрашивал
  • Динамические секреты — автоматическое создание и отзыв доступов
  • Шифрование — все данные зашифрованы как в покое, так и в движении
  • Политики доступа — гранулярное управление правами

Установка и первоначальная настройка

Для начала нужен сервер с Ubuntu 24. Если у вас его нет, можете заказать VPS или выделенный сервер.

Устанавливаем Vault через официальный репозиторий HashiCorp:

curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add -
sudo apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main"
sudo apt update && sudo apt install vault

Создаём пользователя для Vault:

sudo useradd --system --home /etc/vault.d --shell /bin/false vault

Настраиваем структуру каталогов:

sudo mkdir -p /opt/vault/data
sudo mkdir -p /opt/vault/logs
sudo mkdir -p /etc/vault.d
sudo chown -R vault:vault /opt/vault
sudo chown -R vault:vault /etc/vault.d

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

Создаём основной конфигурационный файл:

sudo tee /etc/vault.d/vault.hcl > /dev/null <

Важно: В продакшене обязательно включите TLS и используйте более надёжное хранилище, например Consul или PostgreSQL.

Создание systemd сервиса

Создаём файл сервиса для автоматического запуска:

sudo tee /etc/systemd/system/vault.service > /dev/null <

Запускаем и включаем сервис:

sudo systemctl daemon-reload
sudo systemctl enable vault
sudo systemctl start vault
sudo systemctl status vault

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

Устанавливаем переменную окружения для адреса Vault:

export VAULT_ADDR='http://127.0.0.1:8200'
echo 'export VAULT_ADDR="http://127.0.0.1:8200"' >> ~/.bashrc

Инициализируем Vault:

vault operator init

Команда выдаст 5 unseal keys и root token. Обязательно сохраните их в безопасном месте! Они понадобятся для “распечатывания” Vault после каждого перезапуска.

Распечатываем Vault (нужно ввести 3 разных ключа):

vault operator unseal
vault operator unseal
vault operator unseal

Авторизуемся с root token:

vault auth <root_token>

Базовая работа с секретами

Включаем Key-Value движок секретов:

vault secrets enable -path=secret kv-v2

Создаём секрет:

vault kv put secret/myapp/db username=admin password=supersecret123 host=localhost port=5432

Читаем секрет:

vault kv get secret/myapp/db
vault kv get -field=password secret/myapp/db

Создаём новую версию секрета:

vault kv put secret/myapp/db username=admin password=newsecret456 host=localhost port=5432

Просматриваем историю версий:

vault kv metadata get secret/myapp/db

Управление доступом и политики

Создаём политику для разработчиков:

vault policy write dev-policy - <

Включаем userpass аутентификацию:

vault auth enable userpass

Создаём пользователя:

vault write auth/userpass/users/developer password=devpass123 policies=dev-policy

Проверяем аутентификацию:

vault auth -method=userpass username=developer password=devpass123

Динамические секреты для баз данных

Одна из самых мощных функций Vault — создание временных учётных записей для баз данных. Настроим это для PostgreSQL:

vault secrets enable database

Конфигурируем подключение к PostgreSQL:

vault write database/config/my-postgresql-database \
    plugin_name=postgresql-database-plugin \
    connection_url="postgresql://{{username}}:{{password}}@localhost:5432/postgres?sslmode=disable" \
    allowed_roles="my-role" \
    username="postgres" \
    password="rootpassword"

Создаём роль для временных пользователей:

vault write database/roles/my-role \
    db_name=my-postgresql-database \
    creation_statements="CREATE ROLE \"{{name}}\" WITH LOGIN PASSWORD '{{password}}' VALID UNTIL '{{expiration}}'; \
        GRANT SELECT ON ALL TABLES IN SCHEMA public TO \"{{name}}\";" \
    default_ttl="1h" \
    max_ttl="24h"

Получаем временные учётные данные:

vault read database/creds/my-role

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

Пример использования Vault в Python-приложении:

import hvac

# Подключение к Vault
client = hvac.Client(url='http://127.0.0.1:8200')

# Аутентификация
client.auth.userpass.login(username='developer', password='devpass123')

# Получение секрета
secret = client.secrets.kv.v2.read_secret_version(path='dev/myapp')
db_password = secret['data']['data']['password']

# Использование в приложении
print(f"Database password: {db_password}")

Для bash-скриптов:

#!/bin/bash
export VAULT_ADDR='http://127.0.0.1:8200'

# Аутентификация
vault auth -method=userpass username=developer password=devpass123

# Получение секрета
DB_PASSWORD=$(vault kv get -field=password secret/dev/myapp)

# Использование в скрипте
psql -h localhost -U admin -d mydb -c "SELECT * FROM users;"

Настройка TLS для продакшена

Для продакшена обязательно используйте TLS. Создаём самоподписанный сертификат для тестирования:

sudo mkdir -p /etc/vault.d/tls
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
    -keyout /etc/vault.d/tls/vault-key.pem \
    -out /etc/vault.d/tls/vault.pem \
    -subj "/C=US/ST=State/L=City/O=Organization/CN=vault.example.com"

sudo chown -R vault:vault /etc/vault.d/tls
sudo chmod 600 /etc/vault.d/tls/vault-key.pem

Обновляем конфигурацию:

listener "tcp" {
  address       = "0.0.0.0:8200"
  cluster_address = "0.0.0.0:8201"
  tls_cert_file = "/etc/vault.d/tls/vault.pem"
  tls_key_file  = "/etc/vault.d/tls/vault-key.pem"
}

Сравнение с альтернативными решениями

Решение Преимущества Недостатки Использование
HashiCorp Vault Богатый функционал, динамические секреты, аудит Сложность настройки, требует обслуживания Крупные проекты, enterprise
AWS Secrets Manager Управляемый сервис, интеграция с AWS Привязка к AWS, дороговизна AWS-инфраструктура
Docker Secrets Простота, встроен в Docker Swarm Только для Docker, базовый функционал Контейнерные приложения
Kubernetes Secrets Нативная интеграция с K8s Base64 кодирование, не настоящее шифрование Kubernetes кластеры
Azure Key Vault Управляемый сервис, интеграция с Azure Привязка к Azure Azure-инфраструктура

Автоматизация и скрипты

Vault отлично интегрируется с системами автоматизации. Пример для Ansible:

- name: Get database password from Vault
  uri:
    url: "{{ vault_addr }}/v1/secret/data/prod/db"
    method: GET
    headers:
      X-Vault-Token: "{{ vault_token }}"
    return_content: yes
  register: vault_response

- name: Deploy application with secret
  template:
    src: app.conf.j2
    dest: /etc/app/app.conf
  vars:
    db_password: "{{ vault_response.json.data.data.password }}"

Для Terraform можно использовать провайдер Vault:

provider "vault" {
  address = "https://vault.example.com:8200"
}

data "vault_generic_secret" "db_creds" {
  path = "secret/prod/db"
}

resource "aws_db_instance" "example" {
  # ... other configuration
  password = data.vault_generic_secret.db_creds.data["password"]
}

Мониторинг и бэкап

Важно мониторить состояние Vault и делать регулярные бэкапы:

#!/bin/bash
# Скрипт для мониторинга Vault
VAULT_STATUS=$(vault status -format=json)
SEALED=$(echo $VAULT_STATUS | jq -r '.sealed')

if [ "$SEALED" = "true" ]; then
    echo "CRITICAL: Vault is sealed!"
    exit 2
fi

echo "OK: Vault is unsealed and running"
exit 0

Бэкап данных:

#!/bin/bash
# Создание снэпшота данных Vault
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/opt/vault/backups"

mkdir -p $BACKUP_DIR
tar -czf $BACKUP_DIR/vault_backup_$DATE.tar.gz -C /opt/vault/data .

# Удаление старых бэкапов (старше 30 дней)
find $BACKUP_DIR -name "vault_backup_*.tar.gz" -mtime +30 -delete

Нестандартные способы использования

Vault можно использовать не только для паролей:

  • Шифрование как сервис — используйте transit engine для шифрования данных в приложениях
  • PKI центр — создание и управление сертификатами
  • One-time passwords — генерация TOTP кодов
  • SSH сертификаты — динамические SSH ключи для серверов

Пример использования transit engine:

vault secrets enable transit
vault write -f transit/keys/my-app-key

# Шифрование данных
vault write transit/encrypt/my-app-key plaintext=$(base64 <<< "secret data")

# Расшифровка
vault write transit/decrypt/my-app-key ciphertext=vault:v1:encrypted_data

Производительность и масштабирование

Для высоконагруженных систем рекомендуется:

  • Использовать Consul или etcd в качестве backend storage
  • Настроить HA (High Availability) кластер
  • Использовать performance replication для географически распределённых команд
  • Настроить мониторинг с помощью Prometheus и Grafana

Конфигурация для HA кластера:

storage "consul" {
  address = "127.0.0.1:8500"
  path    = "vault/"
}

ha_storage "consul" {
  address = "127.0.0.1:8500"
  path    = "vault/"
}

listener "tcp" {
  address     = "0.0.0.0:8200"
  cluster_address = "0.0.0.0:8201"
  tls_cert_file = "/etc/vault.d/tls/vault.pem"
  tls_key_file  = "/etc/vault.d/tls/vault-key.pem"
}

api_addr = "https://vault-node1.example.com:8200"
cluster_addr = "https://vault-node1.example.com:8201"

Безопасность и лучшие практики

Ключевые моменты безопасности:

  • Никогда не используйте root token в продакшене — создайте отдельные токены с ограниченными правами
  • Регулярно ротируйте unseal keys — используйте команду vault operator rekey
  • Включите аудит — логируйте все операции с секретами
  • Используйте принцип минимальных привилегий — давайте только необходимые права
  • Настройте автоматическую отзыв токенов — устанавливайте TTL для всех токенов

Включение аудита:

vault audit enable file file_path=/opt/vault/logs/audit.log

Заключение

HashiCorp Vault — это мощное решение для управления секретами, которое стоит изучить каждому системному администратору и DevOps-инженеру. Да, настройка может показаться сложной, но инвестиции времени окупятся повышенной безопасностью и удобством управления секретами.

Начните с простой файловой настройки для изучения, а затем переходите к более серьёзным backend’ам и HA конфигурациям для продакшена. Vault отлично интегрируется с существующими системами и может стать центральным элементом вашей инфраструктуры безопасности.

Основные сценарии использования:

  • Небольшие проекты — базовое хранение паролей и API ключей
  • Средние проекты — интеграция с CI/CD, автоматизация развёртывания
  • Крупные проекты — динамические секреты, PKI, шифрование как сервис
  • Enterprise — HA кластеры, репликация, интеграция с Active Directory

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


В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.

Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.

Leave a reply

Your email address will not be published. Required fields are marked