Обеспечение REST-вызова для управления Vault Secrets

Я пытался выяснить, как сделать это на некоторое время. По сути, Vault не имеет безопасной опции для своих вызовов REST. Я хочу сделать эти остальные вызовы зашифрованными как можно ближе к точкам a и b. Мои мысли были следующими:

  • Используйте SSH туннель
  • Используйте туннель TLS, такой как Stunnel

В настоящее время у меня есть Vault в контейнере Docker, так что это еще кое-что, чтобы упомянуть. Кто-нибудь сталкивался с такой ситуацией, и как вы с ней справились?

ОБНОВЛЕНИЕ: Итак, используя Python API (HVAC), я получаю следующую ошибку:

requests.exceptions.SSLError: HTTPSConnectionPool(host='0.0.0.0',
port=8200): Max retries exceeded with url: /v1/secret (Caused by
SSLError(SSLError("bad handshake: Error([('SSL routines', 'ssl3_get_record',
'wrong version number')],)",),))

Используя следующие команды:

import os
import hvac
client = hvac.Client(url='https://0.0.0.0:8200', token='my-token-here')

3 ответа

В Vault по умолчанию включен протокол TLS, поэтому все ваши вызовы REST уже зашифрованы. Если у вас возникли проблемы с использованием https, посмотрите документацию VAULT_CACERT а также VAULT_CAPATH переменные среды

из документации хранилища.

VAULT_CACERT

Путь к файлу сертификата CA в кодировке PEM на локальном диске. Этот файл используется для проверки SSL-сертификата сервера Vault. Эта переменная среды имеет приоритет над VAULT_CAPATH.

VAULT_CAPATH Путь к каталогу файлов сертификатов CA в кодировке PEM на локальном диске. Эти сертификаты используются для проверки SSL-сертификата сервера Vault.

Вы можете использовать такие инструменты, как tcpdump или же wireshark чтобы убедиться, что ваши запросы действительно зашифрованы.

Чтобы разработать для Vault, работающего в контейнере, вам необходимо создать файл конфигурации для Vault, который содержит что-то похожее на это (код Chef/Ruby):

config_content = %(
  "storage": {
     ...
  },
  "default_lease_ttl": "768h",
  "max_lease_ttl": "8766h",
  "listener": [
    {"tcp": {
      "address": "0.0.0.0:8200",
      "tls_disable": 0,
      "tls_cert_file": "/vault/certs/my-cert-combined.pem",
      "tls_key_file": "/vault/certs/my-cert.key"
    }}],
  "log_level": "info"
 )

Особенно часть слушателя. Сделайте свое внутреннее хранилище тем, что вы хотите использовать (не по умолчанию для разработчиков в памяти!).

Обратите внимание, что вам нужно будет получить действующий сертификат и его закрытый ключ также в томе, привязанном к контейнеру.

Сохраните этот файл конфигурации в каталоге, который привязывается внутри контейнера к пути / vault / config. Я использую / var / vault / config на своем хосте. Например (подробнее Ruby/Chef):

docker_container 'vault' do
  container_name 'vault'
  tag 'latest'
  port '8200:8200'
  cap_add ['IPC_LOCK']
  restart_policy 'always'
  volumes ['/var/vault:/vault']
  command 'vault server -config /vault/config'
  action :run_if_missing
end

Эта команда указывает Vault искать в / vault / config, и он должен найти там ваш файл конфигурации с расширением.json. Обратите внимание, что важно, чтобы адрес listener->tcp-> файла конфигурации был 0.0.0.0, а не 127.0.0.1, потому что Vault не будет правильно разрешать внешний доступ.

Затем Vault запустится с шифрованием TLS для всех транзакций. Определите VAULT_ADDR, чтобы иметь https://your-host.com:8200/ и вперед.

В моем случае я тестировал его в своей локальной среде. Поэтому вместо вызова защищенного https: https://localhost:8200, Я позвонил в обычный http: http://localhost:8200. Это решило ошибку.

Другие вопросы по тегам