Пост

Установка HashiCorp Vault в Centos 8

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

Установка HashiСorp Vault

Переходим в каталог /tmp

1
$ cd /tmp

Скачиваем финальную версию HashiСorp 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

Настройка HashiСorp Vault

Создаем системные каталоги для HashiСorp Vault

1
$ sudo mkdir -p /etc/vault.d /var/lib/vault/data

/var/lib/vault/data - если тип хранилища файловый.

Позже рассмотрим подключение типа хранилища на СУБД PostgreSQL

Создаем системного пользователя HashiСorp 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
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
37
$ sudo nano /etc/systemd/system/vault.service
[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

Создаем конфигурационный файл для HashiСorp Vault

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
$ sudo nano /etc/vault.d/vault.hcl
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

Настройка SELinux

Добавляем порт HashiCorp Vault в исключения

1
2
3
4
5
6
7
8
9
10
$ 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

Инициализация HashiCorp Vault Server

Добавляем переменные, что б в дальнейшем не вводить ее каждый раз VAULT_ADDR==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
Авторский пост защищен лицензией CC BY 4.0 .

© IT Draft. Некоторые права защищены.