HashiCorp Vault
Для реализации механизмов защиты параметров конфигурации, либо настройки функциональности TDE требуется наличие установленного и интегрированного решения Key/Secret Management System. В СУБД Pangolin реализована интеграция с KMS HashiCorp Vault, который используется в качестве защищенного хранилища ключей засекречивания и настроек, а также, как система управления ключами.
HashiCorp Vault — это инструмент с открытым исходным кодом, который обеспечивает безопасный и надежный способ хранения и распространения секретов, таких как ключи API, токены доступа и пароли.
Доступ к хранилищу секретов осуществляется через плагины, загружаемые СУБД Pangolin при старте экземпляра.
Плагины располагаются в директории LIBDIR/plugins.
Для подключения создается символическая ссылка LIBDIR/libconnector_plugin.so → LIBDIR/plugins/libonekey_plugin.so.
Параметры подключения к системе хранения секретов задаются при помощи утилиты setup_kms_credentials.
Установка и настройка
-
Скачайте и распакуйте дистрибутив Vault, перенесите распакованный дистрибутив в директорию /usr/local/bin/:
unzip vault_${VAULT_VERSION}_linux_amd64.zip
sudo mv ./vault /usr/local/bin/ -
Создайте пользователя Vault:
sudo useradd --system --home /etc/vault --shell /bin/false vault -
Создайте директории для хранения настроек и данных:
sudo mkdir /etc/vault
sudo mkdir -p /var/lib/vault/data -
Создайте службу Vault (скопируйте файл
vault.serviceна сервер в директорию/etc/systemd/system/):sudo cp ./vault.service /etc/systemd/system/ -
Создайте конфигурационный файл Vault (скопируйте файл
config.hclна сервер в директорию/etc/vault/):sudo cp ./config.hcl /etc/vault/ -
Создайте директории
/ca,ca/signedcerts,ca/private:cd ~/ && mkdir ca && mkdir -p ca/signedcerts && mkdir ca/private && cd ca -
Создайте индексные данные БД:
echo '01' > serial && touch index.txt && echo 'unique_subject = yes' > index.txt.attr -
Создайте корневой сертификат/ключ, изменив в файле
caconfig.cnfпуть на корректный к директорииca:- в параметре
dirв секцииlocal_ca; - в параметре
default_keyfileв секцииreq.
- в параметре
-
Скопируйте файл на сервер в директорию
~/ca:export OPENSSL_CONF=~/ca/caconfig.cnf
openssl req -x509 -newkey rsa:2048 -out cacert.pem -outform PEM -days 1825
Введите пароль "test" -
Сгенерируйте ключ, и создайте запрос на серверный сертификат (предварительно добавьте в конец файла
localhost.cnfстроку:IP.2 = HOST, гдеHOST- IP-адрес сервера, на котором разворачиваете Vault. Скопируйте файлlocalhost.cnfв директорию~/ca):export OPENSSL_CONF=~/ca/localhost.cnf
openssl req -newkey rsa:2048 -keyout key.pem -keyform PEM -out req.pem -outform PEM
Введите пароль "test" -
Декодируйте ключ:
openssl rsa < key.pem > server_key.pem -
Сгенерируйте и подпишите серверный сертификат:
export OPENSSL_CONF=~/ca/caconfig.cnf
openssl ca -in req.pem -out server_crt.pem
Введите пароль "test" -
Скопируйте ключ, серверный и корневой сертификаты в директорию
/etc/vault/:sudo cp server_key.pem server_crt.pem cacert.pem /etc/vault/ -
Назначьте владельцем пользователя Vault:
sudo chown -R vault:vault /etc/vault /var/lib/vault -
Настройте автодополнение команд Vault:
vault -autocomplete-install
complete -C /usr/local/bin/vault vault -
Включите запуск Vault при загрузке системы:
sudo systemctl daemon-reload
sudo systemctl enable --now vault -
Запустите Vault:
sudo systemctl start vault -
Проинициализируйте Vault:
sudo -u vault bash -c 'env VAULT_ADDR=https://127.0.0.1:8200 VAULT_CACERT=/etc/vault/cacert.pem /usr/local/bin/vault operator init > /etc/vault/init.file' -
Введите 3 ключа (по одному) в хранилище
Unseal, где {Токен} - используемый корневой токен (смотритеcat /etc/vault/init.file):sudo -u vault bash -c 'env VAULT_ADDR=https://{IP-Address}:{port} VAULT_TOKEN={token} VAULT_CACERT=/etc/vault/cacert.pem /usr/local/bin/vault operator unseal {hash}'
sudo -u vault bash -c 'env VAULT_ADDR=https://{IP-Address}:{port} VAULT_TOKEN={token} VAULT_CACERT=/etc/vault/cacert.pem /usr/local/bin/vault operator unseal ...'
sudo -u vault bash -c 'env VAULT_ADDR=https://{IP-Address}:{port} VAULT_TOKEN={token} VAULT_CACERT=/etc/vault/cacert.pem /usr/local/bin/vault operator unseal ...' -
Разрешите аутентификацию по логину и паролю:
sudo -u vault bash -c 'env VAULT_ADDR=https://127.0.0.1:8200 VAULT_TOKEN={token} VAULT_CACERT=/etc/vault/cacert.pem /usr/local/bin/vault auth enable userpass'
Success! Enabled userpass auth method at: userpass/ -
Установите логин и пароль:
sudo -u vault bash -c 'env VAULT_ADDR=https://127.0.0.1:8200 VAULT_TOKEN={token} VAULT_CACERT=/etc/vault/cacert.pem /usr/local/bin/vault write auth/userpass/users/adminencryption password=test policies=admins'
Success! Data written to: auth/userpass/users/adminencryption -
Через Web UI выполните аутентификацию пользователя на сервере Vault
https://{IP-Address настройки Vault-сервера}:{port}. Для аутентификации используйте токен:
-
Создайте Key-Value-хранилище и разрешите с ним работу, выбрав Secrets -> Enable new engine (1) -> KV (2) -> Next (3) -> Enable engine (4):




-
Добавьте разрешения для выполнения операций с Key-Value-хранилищем, выбрав: Policies (1) -> default (2) -> Edit policy (3). Добавьте в конец (4) -> нажмите сохранить Save (5):
path "kv/*" {
capabilities = ["create", "update", "read", "delete", "list"]
}



-
Получите клиентский токен для последующих обращений к Vault:
curl --insecure --request POST --data '{"password": "test"}' https://127.0.0.1:8200/v1/auth/userpass/login/adminencryption
{"request_id":"{id}","lease_id":"","renewable":false,"lease_duration":0,"data":null,"wrap_info":null,"warnings":null,"auth":{"client_token":"{token}","policies":["admins","default"],"token_policies":["admins","default"],"metadata":{"username":"adminencryption"},"lease_duration":36000,"renewable":true,"entity_id":"{entity_id}":true}} -
В последующих запросах можно использовать
"client_token":"{token}". Например:curl --insecure --header "X-Vault-Token:{token} --request GET https://{IP-Address}:{port}/v1/kv/data/
Управление
Добавление параметров в хранилище секретов
Перед первоначальной настройкой механизмов защиты конфигурации или прозрачного защитного преобразования в СУБД Pangolin необходимо выполнить добавление параметров в Key/Secret Management System на сервере с установленным HashiCorp Vault.
-
Выполните аутентификацию пользователя на сервере Vault
https://{IP-Address настройки Vault-сервера}:{port}. Для аутентификации используйте клиентский токен:
-
Зайдите в Key-Value-хранилище и нажмите
Create secret(1):
-
В поле Path for this secret (2) укажите путь к параметру
postgresql/CLUSTER_ID/postgresql/ИМЯ_ПАРАМЕТРА, где:CLUSTER_ID- имя кластера (должен быть уникальным для каждого кластера),ИМЯ_ПАРАМЕТРА = secure_config. -
В поле Secret data (3, 4) укажите:
- ключ =
value; - значение =
off;
В случае отсутствия указанного значения параметра при старте БД (в момент соединения с KMS и считывания параметров) возникнет ошибка:
CheckSecureConfig: secure_config parameter does not exist on KMS or has wrong value. - ключ =
-
Сохраните, нажав кнопку Save (5):

Менять значение параметра можно, нажав Create new version справа:

Там же можно удалить параметр, нажав на кнопку Delete secret:

-
Аналогичным образом добавьте остальные параметры, управляемые администраторами безопасности через хранилище секретов в режиме защищенного конфигурирования (в соответствии с заданными локальными параметрами в конфигурационном файле СУБД).
Обновление HashiCorp Vault
Для обновления HashiCorp Vault до версии 1.4.0 необходимо выполнить последовательно следующие действия:
-
Остановить работу vault:
sudo systemctl stop vault -
Скачать дистрибутив vault, распаковать и перенести в директорию
/usr/local/bin/:unzip vault_${VAULT_VERSION}_linux_amd64.zip
sudo mv vault /usr/local/bin/ -
Запустить vault:
sudo systemctl start vault
Диагностика ошибок
В случае перезагрузки (рестарта) сервера с Vault, либо рестарта сервиса Vault, хранилище переходит в состояние SEALED:

Для восстановления:
-
Зайдите на сервер с установленным Vault и выполните команду
cat /etc/vault/init.file:cat /etc/vault/init.file
Unseal Key 1: {hash_unseal_key_1}
Unseal Key 2: {hash_unseal_key_2}
Unseal Key 3: {hash_unseal_key_3}
Unseal Key 4: {hash_unseal_key_4}
Unseal Key 5: {hash_unseal_key_5}
Initial Root Token: {id_root_token}
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 master key. Without at least 3 key to reconstruct the master 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. -
Поочередно введите 3 ключа в
Unsealиз списка (Unseal Key 1,Unseal Key 2,Unseal Key 3):