Хранилище - создать секрет, не раскрывая его?
Возможно ли с помощью хранилища 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
например) и установить разные политики для каждого пути, так что не всем пользователям будет разрешено изменять случайное значение (или повернуть ключ).