Оригинал статьи:
HashiСorp Vault — это инструмент с открытым исходным кодом, предназначенный для безопасного хранения секретов и конфиденциальных данных в динамических облачных средах. Он обеспечивает надежное шифрование данных, доступ на основе идентификации с помощью настраиваемых политик
Рассмотрим вариант установки программного обеспечения HashiCorp Vault с файловым типом хранения данных (секретов).
Подготовка
Добавляем hostname и ip в файл /etc/hosts
1 2 3 |
$ sudo nano /etc/hosts […] 192.168.11.200 vault.example.com |
Обновляем ОС, ставим необходимый софт
1 2 |
$ sudo dnf -y update $ sudo dnf -y install unzip nano |
Установка Vault
Переходим в каталог /tmp
1 |
$ cd /tmp |
Скачиваем финальную версию vault, распаковываем ее
1 2 |
$ curl -L https://releases.hashicorp.com/vault/1.6.0/vault_1.6.0_linux_amd64.zip -o /tmp/vault_1.6.0_linux_amd64.zip $ unzip vault_1.6.0_linux_amd64.zip |
Меняем владельца и переносим файл
1 2 |
$ sudo chown root:root vault $ sudo mv vault /usr/local/bin/ |
Проверяем версию
1 2 |
$ vault --version Vault v1.6.0 (7ce0bd9691998e0443bc77e98b1e2a4ab1e965d4) |
Включаем авто заполнение команд
1 2 |
$ vault -autocomplete-install $ complete -C /usr/local/bin/vault vault |
Настройка Vault
Создаем системные каталоги для Vault
1 |
$ sudo mkdir -p /etc/vault.d /var/lib/vault/data |
/var/lib/vault/data — если тип хранилища файловый.
Позже рассмотрим подключение типа хранилища на СУБД PostgreSQL
Создаем системного пользователя vault
1 2 3 |
$ sudo useradd --system --home /etc/vault.d --shell /bin/false vault $ sudo chown -R vault:vault /etc/vault.d /var/lib/vault/ $ sudo chmod 755 /etc/vault.d /var/lib/vault |
Создаем Systemd Unit
1 |
$ sudo nano /etc/systemd/system/vault.service |
[codesyntax lang="php"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
[Unit] Description="HashiCorp Vault - A tool for managing secrets" Documentation=https://www.vaultproject.io/docs/ Requires=network-online.target After=network-online.target ConditionFileNotEmpty=/etc/vault.d/vault.hcl StartLimitIntervalSec=60 StartLimitBurst=3 [Service] User=vault Group=vault ProtectSystem=full ProtectHome=read-only PrivateTmp=yes PrivateDevices=yes SecureBits=keep-caps AmbientCapabilities=CAP_IPC_LOCK Capabilities=CAP_IPC_LOCK+ep CapabilityBoundingSet=CAP_SYSLOG CAP_IPC_LOCK NoNewPrivileges=yes ExecStart=/usr/local/bin/vault server -config=/etc/vault.d/vault.hcl ExecReload=/bin/kill --signal HUP $MAINPID KillMode=process KillSignal=SIGINT Restart=on-failure RestartSec=5 TimeoutStopSec=30 StartLimitInterval=60 StartLimitIntervalSec=60 StartLimitBurst=3 LimitNOFILE=65536 LimitMEMLOCK=infinity [Install] WantedBy=multi-user.target |
[/codesyntax]
Создаем конфигурационный файл для Vault
1 |
$ sudo nano /etc/vault.d/vault.hcl |
[codesyntax lang="php"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
disable_cache = true disable_mlock = true ui = true listener "tcp" { tls_disable = 1 # address = "0.0.0.0:8200" address = "vault.example.com:8200" } # отключаем ssl # listener "tcp" { # tls_disable = 0 # address = "vault.example.com:8200" # tls_cert_file = "/etc/ssl/cert/ vault.example.com .crt" # tls_key_file = "/etc/ssl/private/ vault.example.com .key" # } storage "file" { path = "/var/lib/vault/data" } # api_addr = "http://0.0.0.0:8200" api_addr = "http://vault.example.com:8200" max_lease_ttl = "10h" default_lease_ttl = "10h" cluster_name = "vault" raw_storage_endpoint = true disable_sealwrap = true disable_printable_check = true |
[/codesyntax]
Настройка SeLinux
Добавляем порт Vault в исключения
1 2 3 4 5 |
$ cd /tmp $ sudo grep vault /var/log/audit/audit.log | grep denied | audit2allow -m vaultlocalconf > vaultlocalconf.te $ sudo grep vault /var/log/audit/audit.log | grep denied | audit2allow -M vaultlocalconf ******************** IMPORTANT *********************** To make this policy package active, execute: semodule -i vaultlocalconf.pp $ sudo semodule -i vaultlocalconf.pp |
Добавляем сервис в автозагрузку и запускаем его
1 2 |
$ sudo systemctl daemon-reload $ sudo systemctl enable --now vault |
Проверяем статус
1 |
$ systemctl status vault |
Настройка Firewall
Открываем порт 8200/tcp
1 2 |
$ sudo firewall-cmd --zone=public --add-port=8200/tcp --permanent $ sudo firewall-cmd --reload |
Инициализация Vault Server
Добавляем переменные, что б в дальнейшем не вводить ее каждый раз в -address=http://vault.example.com:8200
1 2 3 4 |
$ export PATH=$PATH:/usr/local/bin $ echo "export PATH=$PATH:/usr/local/bin" >> ~/.bashrc $ export VAULT_ADDR=http://vault.example.com:8200 $ echo "export VAULT_ADDR=http://vault.example.com:8200" >> ~/.bashrc |
Инициализируем сервис с сохранением ключей в файл /etc/vault.d/init.file (не безопастно)
1 2 3 4 5 6 7 8 |
$ vault operator init -n 5 -t 3 | sudo tee /etc/vault.d/init.file Unseal Key 1: +DTPnUxqmspBKng0wVHeHc59pXnZJGKxMsSuX+CrQ91E Unseal Key 2: h8ogFxApCpwRqfK4Fz0frtFM64t2ldFAZLJhvapJBqnl Unseal Key 3: MTbJX9HVN0A1dOd7hH+L1wcEus9M2C0gK9nrqsoXCtYz Unseal Key 4: H4B2mlx+1uRg70uySY/KGQ86hsjlrCiSVD4gyoO6tj5V Unseal Key 5: 3QKfJ/c4v65eEej5K9OvQseo3sETRhN2DZVRXkg5d8Wh Initial Root Token: s.2xxinhG13tTgpHrxb8EyAgL5 […] |
где
-n (-key-share) — Количество общих ключей, на которые нужно разделить сгенерированный главный ключ. Это количество «ключей распечатки», которое нужно сгенерировать.
-t (-key-threshold) — Количество общих ключей, необходимых для восстановления главного ключа. Это должно быть меньше или равно -key-share
Проверяем статус
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ vault status Key Value --- ----- Seal Type shamir Initialized true Sealed true <--- vault запечатан, надо расечатывать (вводить 3 разных Unseal Key) Total Shares 5 <--- всего ключей Threshold 3 <--- ключей, для распечатывания Unseal Progress 0/3 Unseal Nonce n/a Version 1.6.0 Storage Type file <--- тип хранилища файловое HA Enabled false |
Распечатываем хранилище, иначе не получится авторизоваться
1 2 3 4 5 6 |
$ vault operator unseal Unseal Key (will be hidden): $ vault operator unseal Unseal Key (will be hidden): $ vault operator unseal Unseal Key (will be hidden): |
Смотрим статус
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ vault status Key Value --- ----- Seal Type shamir Initialized true Sealed false <--- Распечатано Total Shares 5 Threshold 3 Version 1.6.0 Storage Type file Cluster Name vault Cluster ID d5ec1a04-2988-d1fa-eb16-2bbf6f47d3f2 HA Enabled false |
Авторизируемся
1 2 |
$ vault login Token (will be hidden): s.2xxinhG13tTgpHrxb8EyAgL5 |
Распечатывать хранилище и авторизоваться можно так же через web-интерфейс
http://vault.example.com:8200
Если надо удалить базу (файловую)
1 2 3 |
$ sudo systemctl stop vault $ sudo rm -rf /var/lib/vault/data/* $ sudo systemctl start vault |