Хранилище - создать секрет, не раскрывая его?

Возможно ли с помощью хранилища Hashicorp сгенерировать секрет, не раскрывая этот секрет пользователю, который его сгенерировал?

По линии:

vault generate secret/my/awesome/secret 32

Где он сгенерирует строку из 32 случайных символов, сохранит ее в Vault и не покажет результирующее значение пользователю, который его создал без них, без явного запроса его с

vault kv get

операция?

После быстрого прочтения документации по Vault я был уверен, что это возможно, но теперь, когда я искал подробности о том, как это сделать, я нахожу настолько мало информации, что не уверен, что это возможно [пока].

1 ответ

Решение

Соблазнительно спросить, каков именно ваш вариант использования... Но вот простой способ сохранить 32 случайных буквенно-цифровых (я полагаю) символа в Vault.

vault write secret/my/awesome/secret - << EOF
{ "key":"$(< /dev/urandom tr -dc A-Za-z0-9 | head -c${1:-32};echo;)" }
EOF

Чтение символов обратно является стандартной операцией K/V:

$ vault read --field=key secret/my/awesome/secret
FA9hxKMejhKyRHVAclPQbNWaLFDPUMky

Проблема этого подхода заключается в том, что он использует Linux "здесь файл", поэтому случайные символы генерируются пользователем, а не Vault. Даже если пользователь не видит его, это может быть проблемой. Злонамеренный пользователь может написать общеизвестную строку вместо случайной. Педантичные читатели также могут утверждать, что энтропия Vault и openssl может быть разной.

Если вы хотите, чтобы Vault генерировал символы без вызова пользователя beign, вам придется забыть о печатных символах. Vault обладает первоклассной криптографией, и нет способа ограничить его случайность набором печатных ASCII. Существуют различные способы получения вывода в кодировке base64, но в base 64 есть несколько шаблонов, которые снижают (уже низкую) энтропию сгенерированной строки.

Но если с тобой все в порядке, то ты можешь злоупотребить функциями транзитного секретного бэкенда. Сначала включите его:

vault secrets enable transit

Попросите Vault сгенерировать ключ и сохранить его для себя навсегда. Я назвал этот ключ serverfault:

vault write --force transit/keys/serverfault

Теперь, когда у вас есть ключ, создайте хэш Seinfeld (хэш ни о чем), используя алгоритм, который генерирует 32 байта. Вторая строка (cut|openssl|xxd) предназначена только для красивой печати, отрегулируйте на свой вкус:

vault write --force --field=hmac transit/hmac/serverfault algorithm=sha2-256 \
   | cut -d: -f3 | openssl base64 -d -A | xxd

00000000: d2e5 8e43 bed4 13be 4488 1823 457b 4575  ...C....D..#E{Eu
00000010: 3030 8059 198e 669a bdaa cbb6 d4e7 8130  00.Y..f........0

Попробуйте несколько раз, вы всегда получите один и тот же результат. Чтобы получить новое, совершенно случайное значение, просто измените ключ HMAC:

vault write --force transit/keys/serverfault/rotate

Команда для получения случайных байтов теперь выдает новое значение:

vault write --force --field=hmac transit/hmac/serverfault algorithm=sha2-256 | \
   cut -d: -f3 | openssl base64 -d -A | xxd

00000000: d2e5 8e43 bed4 13be 4488 1823 457b 4575  ...C....D..#E{Eu
00000010: 3030 8059 198e 669a bdaa cbb6 d4e7 8130  00.Y..f........0

Этот метод также позволяет создавать более одного ключа (с именем production а также test например) и установить разные политики для каждого пути, так что не всем пользователям будет разрешено изменять случайное значение (или повернуть ключ).

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