Обеспечение 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
. Это решило ошибку.