10 KiB
Установка HashiCorp Vault на Ubuntu
Vault — это инструмент от HashiCorp для безопасного хранения секретов и управления ими.
1. Установка Vault
Открываю нужный сервер
wsl
Connecting to infrastructure:
ssh igor@192.168.200.85 -p 22
1.1. Добавление репозитория HashiCorp
- Установите необходимые пакеты:
sudo apt update && sudo apt install -y gnupg software-properties-common curl
- Добавьте официальный GPG-ключ HashiCorp:
curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
- Добавьте репозиторий HashiCorp в систему:
sudo mcedit /etc/apt/sources.list.d/hashicorp.list
Заменяем на:
deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com noble main
Где noble это кодовое имя Ubuntu 24.04
- Обновите списки пакетов:
sudo apt update
- Установите Vault:
sudo apt install -y vault
- Проверьте, что Vault установлен правильно:
vault --version
Выдало: Vault v1.19.4 (322786e236e268532e4b189845971ba67b5cbb23), built 2025-05-14T13:04:47Z
2. Запуск Vault
2.1. Запуск в Dev-режиме (только для тестирования)
If work stop it:
sudo pkill vault
If need delete old data:
sudo rm -rf ~/.vault-token ~/.vault/
For find where stored data read file:
sudo mcedit /etc/vault/config.hcl
In config file find this path: /opt/vault/data
После удаления базы нужно инициализировать Vault заново:
sudo vault operator init
Run in developer mode (in dev mode data stored in RAM):
vault server -dev
WARNING! dev mode is enabled! In this mode, Vault runs entirely in-memory
and starts unsealed with a single unseal key. The root token is already
authenticated to the CLI, so you can immediately begin using Vault.
You may need to set the following environment variables:
$ export VAULT_ADDR='http://127.0.0.1:8200'
The unseal key and root token are displayed below in case you want to
seal/unseal the Vault or re-authenticate.
Unseal Key: TMb6A3QI3wJ9kaEeTYo5wEviP23lugJ3Asek2la6V4s=
Root Token: hvs.GsWHRR7ne7gMTZhuPgZdh91w
Development mode should NOT be used in production installations!
Теперь Vault работает по адресу:
start http://127.0.0.1:8200
Останавливаю нажатием Ctrl + C
2.2. Настройка Vault в режиме сервера
Creating sel signed sertificate:
sudo openssl req -new -x509 -days 365 -nodes \
-out /etc/vault.d/vault.local.crt \
-keyout /etc/vault.d/vault.local.key \
-subj "/CN=yourdomain.local"
Set file owner
sudo chown -R vault:vault /etc/vault.d/
- Создайте конфигурационный файл, Добавьте следующий конфиг:
sudo mkdir -p /etc/vault &&
cd /etc/vault &&
sudo tee config.hcl > /dev/null <<'EOF'
storage "file" {
path = "/opt/vault/data"
}
listener "tcp" {
address = "0.0.0.0:8200"
tls_cert_file = "/etc/vault.d/vault.local.crt"
tls_key_file = "/etc/vault.d/vault.local.key"
}
disable_mlock = true
ui = true
EOF
- Создайте папку для хранения данных:
sudo mkdir -p /opt/vault/data &&
sudo chown vault:vault /opt/vault/data
- Создайте systemd-сервис для Vault:
sudo tee /etc/systemd/system/vault.service > /dev/null <<'EOF'
[Unit]
Description=HashiCorp Vault
After=network-online.target
Requires=network-online.target
[Service]
User=vault
Group=vault
ExecStart=/usr/bin/vault server -config=/etc/vault/config.hcl
ExecReload=/bin/kill --signal HUP \$MAINPID
KillSignal=SIGTERM
Restart=on-failure
LimitMEMLOCK=infinity
ProtectSystem=full
CapabilityBoundingSet=CAP_IPC_LOCK CAP_SETGID CAP_SETUID CAP_SYSLOG CAP_CHOWN
NoNewPrivileges=yes
[Install]
WantedBy=multi-user.target
EOF
Проверяем всё ли записалось:
sudo mcedit /etc/systemd/system/vault.service
- Перезапустите systemd и включите Vault:
sudo systemctl daemon-reload &&
sudo systemctl enable vault &&
sudo systemctl start vault
sudo systemctl restart vault
- Проверьте статус:
sudo systemctl status vault
3. Инициализация и разлочка Vault
- Экспортируйте переменную окружения:
export VAULT_ADDR='http://127.0.0.1:8200'
- Инициализируйте хранилище (сохраните ключи!):
vault operator init
Выдало:
Unseal Key 1: lQlJsb9RI8rSzLrc5iPnx1qJkWZbbXIkrEgnQGe5R6uO
Unseal Key 2: 0qJJXRo570jlH/0Qs/wodXHNI2SF5VgL4jE04JawSPSB
Unseal Key 3: VuYkOkQ8qmwofDmjqsTRQoMqGAH3Jv+nqQylL7Uibbtp
Unseal Key 4: JJJ8Nqj00qzS9u5wNtTtExL/jWlJF9fgaBsiuaf0kFxC
Unseal Key 5: L6lZMp/l7s24EZJAFnWS4Py5jsWOuMioC41g5LhUJKWL
Initial Root Token: hvs.o07DY7tnSPcufxk60pjCXDzn
Vault initialized with 5 key shares and a key threshold of 3. Please securely
distribute the key shares printed above. When the Vault is re-sealed,
restarted, or stopped, you must supply at least 3 of these keys to unseal it
before it can start servicing requests.
Vault does not store the generated root key. Without at least 3 keys to
reconstruct the root key, Vault will remain permanently sealed!
It is possible to generate new unseal keys, provided you have a quorum of
existing unseal keys shares. See "vault operator rekey" for more information.
- Разблокируйте Vault, используя ключ (потом ещё 3 раза выполнить эту команду):
vault operator unseal
- Авторизуйтесь с root-токеном:
vault login hvs.MTFV72PjKXCVh5ZL6yCVE3Yw
- Создаём(включаем) новое хранилище ключ-значение через ssh
export VAULT_TOKEN=hvs.FDMfGORUazCHm7jGrSofBVbx &&
vault secrets enable -path=org-ccalm kv-v2
- Writing to the kv storage (добавил префикс vault. чтобы значения самому подставлять в нужные места в spring)
Заменит(создаст) значение:
vault kv put org-ccalm/jwt vault.server.ssl.key-store-password=MFNX344yh4
Добавит (обновит):
vault kv patch org-ccalm/jwt vault.test=test2
vault kv put org-ccalm/public vault.personal_data.key=7dd2Nek1
- Read data from the kv
vault kv get org-ccalm/jwt
Должно вывести:
Key Value
--- -----
server.ssl.key-store-password M4yh4
- Включаем AppRole для доступа из приложения
vault auth enable approle
- Добавляем политики потом создаём ключ для этой политики
Создаю файл политик
cd ~ &&
sudo tee jwt-policy.hcl > /dev/null <<'EOF'
path "org-ccalm/data/jwt" {
capabilities = ["create", "read", "update", "delete", "list"]
}
path "org-ccalm/data/public" {
capabilities = ["read", "list"]
}
EOF
Apply and delete configiration file:
vault policy write jwt-policy ~/jwt-policy.hcl &&
rm -f jwt-policy.hcl
Создаём AppRole (на 10 лет)
vault write auth/approle/role/org-ccalm-jwt \
secret_id_ttl=0 \
token_ttl=87600h \
token_max_ttl=87600h \
policies="jwt-policy,another-policy,third-policy"
Получаем role_id и secret_id
vault read auth/approle/role/org-ccalm-jwt/role-id
Выдало
Key Value
--- -----
role_id c0064fe2-8f0e-b317-7fe7-66f7405b45a1
На команду
vault write -f auth/approle/role/org-ccalm-jwt/secret-id
Выдало:
Key Value
--- -----
secret_id 24f31c88-7185-0d93-9a51-e221c2925265
secret_id_accessor 22fa68e3-fc73-2008-0a34-3506630b6693
secret_id_num_uses 0
secret_id_ttl 0s
Сохрани role_id и secret_id, они понадобятся Spring Boot.
Хранить ключи лучьше в переменных окружения
export VAULT_ROLE_ID="your-role-id" &&
export VAULT_SECRET_ID="your-secret-id"
Проверяем не больше какого значения можно задать время жизни токена:
vault read sys/mounts/auth/token/tune
По умолчанию max_lease_ttl равен 32 дня!
На год можно увеличить так:
vault write sys/mounts/auth/token/tune max_lease_ttl=8760h
Create data access token with set politics:
vault token create -policy=jwt-policy -ttl=0
Продлевать токен можно так:
vault token renew <твой-токен>
Проверяем хранятся ли токены в хранилище а не в памяти
vault read sys/auth/token/tune
token_type = default-service, значит Vault не хранит токены
Включаем хранение токенов:
vault write sys/auth/token/tune token_type=service
Согласно уроку желательно корневой сертификат создавать на 10 лет допустим: https://www.youtube.com/watch?v=eSDpMUeV2lQ Для полноценного использования pki нужно создать роль!
certstrap --depot-path root init
--organization "GEOVizor"
--organizational-unit "IT"
--country "KZ"
--province "ALM"
--locality "Almaty"
--common-name "DemoCA Root Certificate Authority v1"
--expires "30 years"
--curve P-256
--path-length 2
--passphrase "pace_icy_hum_ward"