Перейти к основному содержимому

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.

Установка и настройка

  1. Скачайте и распакуйте дистрибутив Vault, перенесите распакованный дистрибутив в директорию /usr/local/bin/:

    unzip vault_${VAULT_VERSION}_linux_amd64.zip

    sudo mv ./vault /usr/local/bin/
  2. Создайте пользователя Vault:

    sudo useradd --system --home /etc/vault --shell /bin/false vault
  3. Создайте директории для хранения настроек и данных:

    sudo mkdir /etc/vault
    sudo mkdir -p /var/lib/vault/data
  4. Создайте службу Vault (скопируйте файл vault.service на сервер в директорию /etc/systemd/system/):

    sudo cp ./vault.service /etc/systemd/system/
  5. Создайте конфигурационный файл Vault (скопируйте файл config.hcl на сервер в директорию /etc/vault/):

    sudo cp ./config.hcl /etc/vault/
  6. Создайте директории /ca, ca/signedcerts, ca/private:

    cd ~/ && mkdir ca && mkdir -p ca/signedcerts && mkdir ca/private && cd ca
  7. Создайте индексные данные БД:

    echo '01' > serial && touch index.txt && echo 'unique_subject = yes' > index.txt.attr
  8. Создайте корневой сертификат/ключ, изменив в файле caconfig.cnf путь на корректный к директории ca:

    • в параметре dir в секции local_ca;
    • в параметре default_keyfile в секции req.
  9. Скопируйте файл на сервер в директорию ~/ca:

    export OPENSSL_CONF=~/ca/caconfig.cnf
    openssl req -x509 -newkey rsa:2048 -out cacert.pem -outform PEM -days 1825
    Введите пароль "test"
  10. Сгенерируйте ключ, и создайте запрос на серверный сертификат (предварительно добавьте в конец файла 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"
  11. Декодируйте ключ:

    openssl rsa < key.pem > server_key.pem
  12. Сгенерируйте и подпишите серверный сертификат:

    export OPENSSL_CONF=~/ca/caconfig.cnf
    openssl ca -in req.pem -out server_crt.pem
    Введите пароль "test"
  13. Скопируйте ключ, серверный и корневой сертификаты в директорию /etc/vault/:

    sudo cp server_key.pem server_crt.pem cacert.pem /etc/vault/
  14. Назначьте владельцем пользователя Vault:

    sudo chown -R vault:vault /etc/vault /var/lib/vault
  15. Настройте автодополнение команд Vault:

    vault -autocomplete-install
    complete -C /usr/local/bin/vault vault
  16. Включите запуск Vault при загрузке системы:

    sudo systemctl daemon-reload
    sudo systemctl enable --now vault
  17. Запустите Vault:

    sudo systemctl start vault
  18. Проинициализируйте 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'
  19. Введите 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 ...'
  20. Разрешите аутентификацию по логину и паролю:

    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/
  21. Установите логин и пароль:

    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
  22. Через Web UI выполните аутентификацию пользователя на сервере Vault https://{IP-Address настройки Vault-сервера}:{port}. Для аутентификации используйте токен:

    Аутентификация пользователя

  23. Создайте Key-Value-хранилище и разрешите с ним работу, выбрав Secrets -> Enable new engine (1) -> KV (2) -> Next (3) -> Enable engine (4):

    Вкладка Secrets

    Secret engines

    Enable secret engine

    Enable KV-engine

  24. Добавьте разрешения для выполнения операций с Key-Value-хранилищем, выбрав: Policies (1) -> default (2) -> Edit policy (3). Добавьте в конец (4) -> нажмите сохранить Save (5):

    path "kv/*" {
    capabilities = ["create", "update", "read", "delete", "list"]
    }

    Вкладка Policies

    ACL policies

    Enable secret engine

    Enable KV-engine

  25. Получите клиентский токен для последующих обращений к 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}}
  26. В последующих запросах можно использовать "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.

  1. Выполните аутентификацию пользователя на сервере Vault https://{IP-Address настройки Vault-сервера}:{port}. Для аутентификации используйте клиентский токен:

    Sign to Vault

  2. Зайдите в Key-Value-хранилище и нажмите Create secret (1):

    Create Secret

  3. В поле Path for this secret (2) укажите путь к параметру postgresql/CLUSTER_ID/postgresql/ИМЯ_ПАРАМЕТРА, где: CLUSTER_ID - имя кластера (должен быть уникальным для каждого кластера), ИМЯ_ПАРАМЕТРА = secure_config.

  4. В поле Secret data (3, 4) укажите:

    • ключ = value;
    • значение = off;

    В случае отсутствия указанного значения параметра при старте БД (в момент соединения с KMS и считывания параметров) возникнет ошибка: CheckSecureConfig: secure_config parameter does not exist on KMS or has wrong value.

  5. Сохраните, нажав кнопку Save (5):

    Create Secret Interface

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

    Change param

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

    Delete param

  6. Аналогичным образом добавьте остальные параметры, управляемые администраторами безопасности через хранилище секретов в режиме защищенного конфигурирования (в соответствии с заданными локальными параметрами в конфигурационном файле СУБД).

Обновление HashiCorp Vault

Для обновления HashiCorp Vault до версии 1.4.0 необходимо выполнить последовательно следующие действия:

  1. Остановить работу vault:

    sudo systemctl stop vault
  2. Скачать дистрибутив vault, распаковать и перенести в директорию /usr/local/bin/:

    unzip vault_${VAULT_VERSION}_linux_amd64.zip
    sudo mv vault /usr/local/bin/
  3. Запустить vault:

    sudo systemctl start vault

Диагностика ошибок

В случае перезагрузки (рестарта) сервера с Vault, либо рестарта сервиса Vault, хранилище переходит в состояние SEALED:

Sealed status

Для восстановления:

  1. Зайдите на сервер с установленным 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.
  2. Поочередно введите 3 ключа в Unseal из списка (Unseal Key 1, Unseal Key 2, Unseal Key 3):

    Unseal keys