Установка и настройка Hashicorp Vault
Установка и настройка HashiCorp Vault на Ubuntu включает несколько шагов, от установки самого Vault до его инициализации и настройки. Вот пошаговое руководство по установке и настройке Vault на Ubuntu.
Шаг 1: Установка Vault
- Установите зависимости: Обновите список пакетов и установите необходимые зависимости:
123sudo apt updatesudo apt install -y gnupg software-properties-common curl - Добавьте репозиторий HashiCorp: Добавьте официальный репозиторий HashiCorp для Ubuntu:
123curl -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" - Установите Vault: После добавления репозитория установите Vault:
123sudo apt updatesudo apt install vault - Проверьте установку: Убедитесь, что Vault установлен, проверив его версию:
12vault --version
Шаг 2: Настройка Vault
Vault может работать в различных режимах. Для базовой настройки мы будем запускать Vault в «dev» режиме или в режиме «standalone» для продакшн-среды.
2.1. Настройка для разработки (Development Mode)
В dev-режиме все хранится в памяти, и Vault работает в одноузловом режиме. Это удобно для тестирования и разработки.
Запустите Vault в dev-режиме:
1 2 |
vault server -dev |
После запуска вы получите root-токен доступа. Dev-сервер использует следующие параметры:
- Хранение всех данных в памяти.
- Веб-интерфейс по умолчанию доступен по адресу:
http://127.0.0.1:8200
. - Не требуется инициализация или unsealing.
2.2. Настройка Vault в продакшн-среде
Для продакшн-настроек Vault можно использовать хранилище, например, на базе файловой системы или консенсусные хранилища типа Consul.
- Создайте конфигурационный файл:
Создайте файл конфигурации Vault, например /etc/vault/config.hcl
:
1 2 |
sudo nano /etc/vault/config.hcl |
Пример базовой конфигурации с файловым хранилищем:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# Основные настройки storage "file" { path = "/opt/vault/data" } # Настройка HTTP listener listener "tcp" { address = "0.0.0.0:8200" tls_disable = 1 } # Включение веб-интерфейса ui = true # Укажите, что Vault работает в продакшн-среде disable_mlock = true |
- storage — определяет, как и где Vault хранит данные. В данном примере используется файловая система.
- listener — указывает параметры прослушивания HTTP-трафика. TLS может быть отключен для тестирования, но в продакшн рекомендуется настроить TLS.
- ui — включает веб-интерфейс Vault.
- Запустите Vault как сервис:
Создайте Systemd-юнит для управления Vault как сервисом:
1 2 |
sudo nano /etc/systemd/system/vault.service |
Добавьте следующее содержимое:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
[Unit] Description=Vault Documentation=https://www.vaultproject.io/docs/ After=network-online.target Wants=network-online.target [Service] ExecStart=/usr/bin/vault server -config=/etc/vault/config.hcl ExecReload=/bin/kill --signal HUP $MAINPID Restart=on-failure LimitNOFILE=65536 [Install] WantedBy=multi-user.target |
Теперь перезагрузите systemd, чтобы обнаружить новый сервис:
1 2 |
sudo systemctl daemon-reload |
Запустите и активируйте сервис Vault:
1 2 3 |
sudo systemctl start vault sudo systemctl enable vault |
Шаг 3: Инициализация Vault
Для продакшн-настройки Vault необходимо инициализировать и «разблокировать» (unseal) его после каждой перезагрузки.
- Инициализация: Запустите инициализацию Vault:
12vault operator init- После выполнения команды вы получите ключи разблокировки (unseal keys) и root-токен. Обязательно сохраните эти ключи в безопасном месте!
- Разблокировка (Unseal): Vault требует три из пяти ключей разблокировки (по умолчанию) для «разблокировки» сервера:
1234vault operator unseal <unseal-key-1>vault operator unseal <unseal-key-2>vault operator unseal <unseal-key-3>
Шаг 4: Использование Vault
- Аутентификация с root-токеном: Используйте root-токен для аутентификации в Vault:
12vault login <root-token> - Создание секретов: Добавьте секрет в Vault:
12vault kv put secret/mysecret value="SuperSecretValue" - Получение секретов: Получите секрет:
12vault kv get secret/mysecret
Шаг 5: Настройка TLS
Рекомендуется настроить TLS для безопасности в продакшн-среде. Для этого необходимо:
- Получить сертификат и приватный ключ.
- Обновить конфигурацию Vault, чтобы включить TLS, указав пути к сертификатам.
Пример конфигурации с TLS:
1 2 3 4 5 6 7 8 9 10 11 12 |
listener "tcp" { address = "0.0.0.0:8200" tls_cert_file = "/etc/vault/ssl/vault.crt" tls_key_file = "/etc/vault/ssl/vault.key" } storage "file" { path = "/opt/vault/data" } ui = true |
После этого перезапустите сервис Vault.
Теперь Vault настроен и готов к использованию. Вы можете управлять секретами, токенами доступа и использовать другие возможности, такие как аутентификация через различные бекенды, динамическое управление секретами и политики.
Возможные проблемы и их решения
Ошибка: Get «https://127.0.0.1:8200/v1/sys/seal-status»: tls: failed to verify certificate: x509: cannot validate certificate for 127.0.0.1 because it doesn’t contain any IP SANs
Эта ошибка возникает из-за того, что TLS-сертификат, который используется для соединения с HashiCorp Vault, не содержит IP-адрес (127.0.0.1) в поле Subject Alternative Name (SAN). Это обязательное требование для современных проверок сертификатов, и если IP-адрес отсутствует в SAN, то соединение через IP-адрес будет отвергнуто.
Необходимл создать корректный TLS-сертификат с IP SAN
Для правильной настройки нужно использовать сертификат, в котором IP-адрес 127.0.0.1 указан в поле SAN. Вот пример того, как можно сгенерировать такой сертификат с помощью OpenSSL.
- Создай файл конфигурации OpenSSL
openssl.cnf
с таким содержимым:
1234567891011121314[req]distinguished_name = req_distinguished_namex509_extensions = v3_reqprompt = no[req_distinguished_name]CN = localhost[v3_req]subjectAltName = @alt_names[alt_names]IP.1 = 127.0.0.1 - Затем сгенерируй приватный ключ и самоподписанный сертификат:
12openssl req -x509 -newkey rsa:2048 -keyout vault.key -out vault.crt -days 365 -nodes -config openssl.cnf - После этого ты сможешь указать Vault использовать эти сертификаты, обновив конфигурацию Vault:
123456listener "tcp" {address = "127.0.0.1:8200"tls_cert_file = "/path/to/vault.crt"tls_key_file = "/path/to/vault.key"}
После этого перезапусти Vault с новыми сертификатами.
Ошибка:
WARNING! VAULT_ADDR and -address unset. Defaulting to https://127.0.0.1:8200. Get «https://127.0.0.1:8200/v1/sys/seal-status»: tls: failed to verify certificate: x509: certificate signed by unknown authority
Эта ошибка говорит о том, что Vault пытается установить защищенное HTTPS-соединение с самим собой по адресу https://127.0.0.1:8200
, но сертификат, который используется для этого соединения, не был подписан доверенным центром сертификации (CA). В итоге TLS-соединение не может быть установлено, так как сертификат считается недоверенным.
Возможные решения:
1. Отключение проверки TLS (временно, для отладки)
Для быстрого тестирования можно отключить проверку сертификатов с помощью переменной окружения VAULT_SKIP_VERIFY
. Этот вариант не рекомендуется для production-среды, так как он снижает безопасность, но может быть полезен для отладки.
1 2 3 |
export VAULT_SKIP_VERIFY=true vault status |
Это заставит Vault игнорировать недоверенные сертификаты.
2. Установка переменной окружения VAULT_ADDR
Если проблема связана с неправильным адресом, ты можешь явно задать адрес Vault, установив переменную окружения VAULT_ADDR
, указав http
вместо https
, чтобы избежать необходимости использования сертификата.
1 2 |
export VAULT_ADDR='http://127.0.0.1:8200' |
Теперь попробуй выполнить команду:
1 2 |
vault status |
3. Использование самоподписанных сертификатов
Если ты настраиваешь Vault с самоподписанным сертификатом, тебе нужно добавить этот сертификат в доверенные на твоей системе. Следуй этим шагам:
- Убедись, что ты используешь корректные самоподписанные сертификаты (если не уверен, можно сгенерировать новые, как описано ранее).
- Добавь самоподписанный сертификат в доверенные корневые сертификаты на своей системе.
Для Linux:
1 2 3 |
sudo cp /path/to/vault.crt /usr/local/share/ca-certificates/vault.crt sudo update-ca-certificates |
4. Использование опции -tls-skip-verify
Если ты не хочешь отключать TLS полностью, но хочешь игнорировать проверку сертификата для одной команды, можно использовать флаг -tls-skip-verify
:
1 2 |
vault status -tls-skip-verify |
Как автоматизировать открытие vault после перезапуска?
Автоматизация открытия HashiCorp Vault после перезапуска — это важная задача, особенно в production-среде, чтобы минимизировать необходимость ручного вмешательства. Vault по умолчанию запускается в «запечатанном» состоянии, и его нужно вручную «распечатать» (unseal) с помощью ключей.
Способы автоматизации открытия Vault
1. Использование Shamir Auto-Unseal (с помощью облачного KMS)
HashiCorp Vault поддерживает автоматическое «распечатывание» (auto-unseal) с использованием внешних служб управления ключами (KMS). Это самый безопасный и рекомендуемый способ для production-сред.
Поддерживаемые KMS:
- AWS KMS (Amazon Web Services Key Management Service)
- Azure Key Vault (Microsoft Azure)
- Google Cloud KMS
Пример использования AWS KMS:
- Настройка AWS KMS:
- Создай ключ в AWS KMS.
- Получи его ARN (Amazon Resource Name).
- Конфигурация Vault: В конфигурационном файле
vault.hcl
, добавь следующие строки для включения AWS KMS:
12345seal "awskms" {region = "us-east-1"kms_key_id = "arn:aws:kms:us-east-1:123456789012:key/abcd1234-abcd-1234-abcd-1234abcd1234"}- После перезапуска Vault будет автоматически использовать KMS для хранения и расшифровки ключей, и тебе больше не нужно вручную вводить ключи для распечатывания.
Пример для других KMS:
- Azure и Google Cloud KMS также можно настроить аналогично с использованием своих соответствующих конфигураций.
2. Использование S3 или консул как хранилище для auto-unseal
Для автоматизации открытия можно настроить Vault для использования консульского кластера или S3 для хранения ключей. Но этот метод уже сложнее в плане конфигурации и поддержания, так как требует дополнительно настраивать хранилище ключей.
3. Скрипты для автоматического распечатывания (менее безопасный вариант)
Если использование KMS не является возможным, можно написать автоматизированный скрипт, который будет использовать команды для распечатывания Vault.
Пример bash-скрипта для автоматического распечатывания:
Предположим, у тебя есть несколько «unseal keys», которые нужно ввести для распечатывания Vault. Эти ключи можно хранить в защищенном файле (например, зашифрованном с помощью gpg
), и использовать их в автоматическом процессе.
- Создай файл с ключами: Создай файл с ключами (например,
unseal-keys.txt
), где каждая строка — это один из ключей распечатывания. - Пример скрипта для автоматического распечатывания:
12345678910111213#!/bin/bashVAULT_ADDR='http://127.0.0.1:8200'# Файл с ключами распечатыванияUNSEAL_KEYS_FILE="/path/to/unseal-keys.txt"# Чтение ключей из файла и распечатывание Vaultwhile read -r key; dovault operator unseal "$key"done < "$UNSEAL_KEYS_FILE"echo "Vault successfully unsealed!"
- Настройка службы systemd: Если Vault запускается через
systemd
, можно создатьsystemd
unit для автоматического выполнения скрипта после перезапуска сервера.Создай файл сервиса для автоматического распечатывания Vault, например/etc/systemd/system/vault-unseal.service
:123456789101112[Unit]Description=Auto-unseal VaultAfter=vault.service[Service]Type=oneshotEnvironment="VAULT_ADDR=http://127.0.0.1:8200"ExecStart=/path/to/unseal-script.sh[Install]WantedBy=multi-user.targetЗатем активируй и включи этот сервис:
123sudo systemctl daemon-reloadsudo systemctl enable vault-unseal.service - Для того чтобы служба
vault-unseal.service
стартовала после старта или перезапуска службыvault.service
нужно в Unit файлеvault.service
прописать директивуRequires=vault-unseal.service
в секции [Unit] :123456789101112131415161718[Unit]Description=VaultDocumentation=https://www.vaultproject.io/docs/After=network-online.targetWants=network-online.targetRequires=vault-unseal.service[Service]ExecStart=/usr/bin/vault server -config=/etc/vault.d/vault.hclExecReload=/bin/kill --signal HUP $MAINPIDRestart=on-failureLimitNOFILE=65536[Install]WantedBy=multi-user.target
Recommended Posts
Golang: генерация сертификатов с собственным корневым сертификатом для использования mTLS для работы микросервисов
27.03.2024
Vault как настроить доступ извне?
27.02.2024
Ошибки установки Vault в Gitlab CI пайплайне
26.02.2024