Можно ли с помощью Hashicorp's Vault сгенерировать секрет, не раскрывая этот секрет пользователю, который его создал?
По строкам:
vault generate secret/my/awesome/secret 32
Если он сгенерирует строку из 32 случайных символов, сохранит ее в Vault и не покажет результирующее значение пользователю, который создал его без них, если он явно не запросит его с помощью
vault kv get
операция?
После беглого чтения документации Vault я был уверен, что это возможно, но теперь, когда я пошел искать подробности о том, как это сделать, я нашел так мало информации, что не уверен, что это возможно [пока].
Заманчиво спросить, каков ваш конкретный вариант использования ... Но вот простой способ сохранить 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 генерировал символы без вызова пользователя, вам придется забыть о печатных символах. Vault имеет первоклассную криптографию, и нет способа ограничить его случайность набором печатаемых ASCII. Существуют различные способы создания вывода в кодировке base64, но в базе 64 есть некоторые шаблоны, которые снизят (и без того низкую) энтропию сгенерированной строки.
Но если вас устраивает чистая случайность, то вы можете злоупотребить функциями секретного бэкэнда транзита. Сначала включите его:
vault secrets enable transit
Попросите Vault сгенерировать ключ и навсегда сохранить его для себя. Я назвал этот ключ serverfault
:
vault write --force transit/keys/serverfault
Теперь, когда у вас есть ключ, создайте хеш Seinfeld (хеш ни о чем), используя алгоритм, который дает 32 байта. Вторая строка (cut|openssl|xxd
) предназначена только для красивой печати, настройте на свой вкус:
vault write --field=hmac transit/hmac/serverfault algorithm=sha2-256 input=AAAA \
| 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 --field=hmac transit/hmac/serverfault algorithm=sha2-256 input=AAAA \
| 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
например) и установите разные политики для каждого пути, чтобы не всем пользователям было разрешено изменять случайное значение (иначе говоря, вращать ключ).